diff options
author | Allan MacKinnon <allanmac@google.com> | 2018-06-19 13:57:04 -0700 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-20 01:19:18 +0000 |
commit | 4359d529121fc1f39f882693d641c0133d138d41 (patch) | |
tree | d2c3239162e68d24d5c2cebc8a4f6659860cc2a0 | |
parent | 47c29fa64b3ffc1eec7723d40e9862b2d2a8443f (diff) |
Skia Compute core files
Bug: skia:
Change-Id: I4bba49cf20eff013e581800a3f114c85acd8498c
Reviewed-on: https://skia-review.googlesource.com/135782
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
131 files changed, 93188 insertions, 0 deletions
diff --git a/src/compute/color/color.c b/src/compute/color/color.c new file mode 100644 index 0000000000..3e4b1c8c10 --- /dev/null +++ b/src/compute/color/color.c @@ -0,0 +1,130 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <math.h> +#include "color.h" + +// +// COLOR UTILITIES +// + +// +// CONVERT FROM 0xAARRGGBB WORD ORDER INTO f32[4] +// + +void +color_rgb32_to_rgba_f32(float rgba[4], const uint32_t rgb, const float opacity) +{ + rgba[2] = (float)(rgb & 0xFF) / 255.0f; // b + rgba[1] = (float)(rgb >> 8 & 0xFF) / 255.0f; // g + rgba[0] = (float)(rgb >> 16 & 0xFF) / 255.0f; // r + rgba[3] = opacity; +} + +void +color_argb32_to_rgba_f32(float rgba[4], const uint32_t argb) +{ + rgba[2] = (float)(argb & 0xFF) / 255.0f; // b + rgba[1] = (float)(argb >> 8 & 0xFF) / 255.0f; // g + rgba[0] = (float)(argb >> 16 & 0xFF) / 255.0f; // r + rgba[3] = (float)(argb >> 24 & 0xFF) / 255.0f; // a +} + +// +// { r, g, b, a } ==> { r*a, g*a, b*a, a } +// + +void +color_premultiply_rgba_f32(float rgba[4]) +{ + if (rgba[3] < 1.0f) + { + for (uint32_t ii=0; ii<3; ii++) + rgba[ii] = rgba[ii] * rgba[3]; + } +} + +// +// EXT_framebuffer_sRGB: +// https://www.opengl.org/registry/specs/EXT/framebuffer_sRGB.txt +// +// { cs / 12.92, cs <= 0.04045 +// cl = { +// { ((cs + 0.055)/1.055)^2.4, cs > 0.04045 +// +// +// { 0.0, 0 <= cl +// { 12.92 * cl, 0 < cl < 0.0031308 +// cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1 +// { 1.0, cl >= 1 +// + +void +color_srgb_to_linear_rgb_f32(float rgb[3]) +{ + for (uint32_t ii=0; ii<3; ii++) + { + if (rgb[ii] <= 0.04045f) + { + rgb[ii] = rgb[ii] / 12.92f; + } + else + { + rgb[ii] = powf((rgb[ii] + 0.055f) / 1.055f, 2.4f); + } + } +} + +void +color_linear_to_srgb_rgb_f32(float rgb[3]) +{ + for (uint32_t ii=0; ii<3; ii++) + { + if (rgb[ii] < 0.0031308f) + { + rgb[ii] = rgb[ii] * 12.92f; + } + else + { + rgb[ii] = powf(rgb[ii], 0.41666f) * 1.044f - 0.055f; + } + } +} + +// +// +// + +static +float +lerpf(float const a, float const b, float const t) +{ + return fmaf(t, b, fmaf(-t, a, a)); +} + +// +// +// + +void +color_linear_lerp_rgba_f32(float rgba_m[4], + float const rgba_a[4], + float const rgba_b[4], + float const t) +{ + for (int32_t ii=0; ii<4; ii++) + rgba_m[ii] = lerpf(rgba_a[ii],rgba_b[ii],t); +} + +// +// +// diff --git a/src/compute/color/color.h b/src/compute/color/color.h new file mode 100644 index 0000000000..36f1293b20 --- /dev/null +++ b/src/compute/color/color.h @@ -0,0 +1,69 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// COLOR UTILITIES +// + +#pragma once + +// +// +// + +#include <stdint.h> + +// +// CONVERT FROM 0xAARRGGBB WORD ORDER INTO f32[4] +// + +void color_rgb32_to_rgba_f32(float rgba[4], const uint32_t rgb, const float opacity); + +void color_argb32_to_rgba_f32(float rgba[4], const uint32_t argb); + +// +// PREMULTIPLY +// +// { r, g, b, a } ==> { r*a, g*a, b*a, a } +// + +void color_premultiply_rgba_f32(float rgba[4]); + +// +// SRGB<>LINEAR +// +// EXT_framebuffer_sRGB: +// https://www.opengl.org/registry/specs/EXT/framebuffer_sRGB.txt +// +// { cs / 12.92, cs <= 0.04045 +// cl = { +// { ((cs + 0.055)/1.055)^2.4, cs > 0.04045 +// +// +// { 0.0, 0 <= cl +// { 12.92 * cl, 0 < cl < 0.0031308 +// cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1 +// { 1.0, cl >= 1 +// + +void color_srgb_to_linear_rgb_f32(float rgb[3]); + +void color_linear_to_srgb_rgb_f32(float rgb[3]); + +// +// +// + +void color_linear_lerp_rgba_f32(float rgba_m[4], + float const rgba_a[4], + float const rgba_b[4], + float const t); + +// +// +// diff --git a/src/compute/common/cl/assert_cl.c b/src/compute/common/cl/assert_cl.c new file mode 100644 index 0000000000..91e5620c5f --- /dev/null +++ b/src/compute/common/cl/assert_cl.c @@ -0,0 +1,222 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> +#include <stdio.h> + +// +// +// + +#include "assert_cl.h" + +// +// +// + +#define CL_VAL_TO_STRING(err) case err: return #err + +// +// +// + +#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000 + +// +// +// + +char const * +cl_get_error_string(cl_int const err) +{ + switch (err) + { + CL_VAL_TO_STRING(CL_SUCCESS); + CL_VAL_TO_STRING(CL_DEVICE_NOT_FOUND); + CL_VAL_TO_STRING(CL_DEVICE_NOT_AVAILABLE); + CL_VAL_TO_STRING(CL_COMPILER_NOT_AVAILABLE); + CL_VAL_TO_STRING(CL_MEM_OBJECT_ALLOCATION_FAILURE); + CL_VAL_TO_STRING(CL_OUT_OF_RESOURCES); + CL_VAL_TO_STRING(CL_OUT_OF_HOST_MEMORY); + CL_VAL_TO_STRING(CL_PROFILING_INFO_NOT_AVAILABLE); + CL_VAL_TO_STRING(CL_MEM_COPY_OVERLAP); + CL_VAL_TO_STRING(CL_IMAGE_FORMAT_MISMATCH); + CL_VAL_TO_STRING(CL_IMAGE_FORMAT_NOT_SUPPORTED); + CL_VAL_TO_STRING(CL_BUILD_PROGRAM_FAILURE); + CL_VAL_TO_STRING(CL_MAP_FAILURE); + CL_VAL_TO_STRING(CL_MISALIGNED_SUB_BUFFER_OFFSET); + CL_VAL_TO_STRING(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST); + CL_VAL_TO_STRING(CL_COMPILE_PROGRAM_FAILURE); + CL_VAL_TO_STRING(CL_LINKER_NOT_AVAILABLE); + CL_VAL_TO_STRING(CL_LINK_PROGRAM_FAILURE); + CL_VAL_TO_STRING(CL_DEVICE_PARTITION_FAILED); + CL_VAL_TO_STRING(CL_KERNEL_ARG_INFO_NOT_AVAILABLE); + CL_VAL_TO_STRING(CL_INVALID_VALUE); + CL_VAL_TO_STRING(CL_INVALID_DEVICE_TYPE); + CL_VAL_TO_STRING(CL_INVALID_PLATFORM); + CL_VAL_TO_STRING(CL_INVALID_DEVICE); + CL_VAL_TO_STRING(CL_INVALID_CONTEXT); + CL_VAL_TO_STRING(CL_INVALID_QUEUE_PROPERTIES); + CL_VAL_TO_STRING(CL_INVALID_COMMAND_QUEUE); + CL_VAL_TO_STRING(CL_INVALID_HOST_PTR); + CL_VAL_TO_STRING(CL_INVALID_MEM_OBJECT); + CL_VAL_TO_STRING(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR); + CL_VAL_TO_STRING(CL_INVALID_IMAGE_SIZE); + CL_VAL_TO_STRING(CL_INVALID_SAMPLER); + CL_VAL_TO_STRING(CL_INVALID_BINARY); + CL_VAL_TO_STRING(CL_INVALID_BUILD_OPTIONS); + CL_VAL_TO_STRING(CL_INVALID_PROGRAM); + CL_VAL_TO_STRING(CL_INVALID_PROGRAM_EXECUTABLE); + CL_VAL_TO_STRING(CL_INVALID_KERNEL_NAME); + CL_VAL_TO_STRING(CL_INVALID_KERNEL_DEFINITION); + CL_VAL_TO_STRING(CL_INVALID_KERNEL); + CL_VAL_TO_STRING(CL_INVALID_ARG_INDEX); + CL_VAL_TO_STRING(CL_INVALID_ARG_VALUE); + CL_VAL_TO_STRING(CL_INVALID_ARG_SIZE); + CL_VAL_TO_STRING(CL_INVALID_KERNEL_ARGS); + CL_VAL_TO_STRING(CL_INVALID_WORK_DIMENSION); + CL_VAL_TO_STRING(CL_INVALID_WORK_GROUP_SIZE); + CL_VAL_TO_STRING(CL_INVALID_WORK_ITEM_SIZE); + CL_VAL_TO_STRING(CL_INVALID_GLOBAL_OFFSET); + CL_VAL_TO_STRING(CL_INVALID_EVENT_WAIT_LIST); + CL_VAL_TO_STRING(CL_INVALID_EVENT); + CL_VAL_TO_STRING(CL_INVALID_OPERATION); + CL_VAL_TO_STRING(CL_INVALID_GL_OBJECT); + CL_VAL_TO_STRING(CL_INVALID_BUFFER_SIZE); + CL_VAL_TO_STRING(CL_INVALID_MIP_LEVEL); + CL_VAL_TO_STRING(CL_INVALID_GLOBAL_WORK_SIZE); + CL_VAL_TO_STRING(CL_INVALID_PROPERTY); + CL_VAL_TO_STRING(CL_INVALID_IMAGE_DESCRIPTOR); + CL_VAL_TO_STRING(CL_INVALID_COMPILER_OPTIONS); + CL_VAL_TO_STRING(CL_INVALID_LINKER_OPTIONS); + CL_VAL_TO_STRING(CL_INVALID_DEVICE_PARTITION_COUNT); + // CL_VAL_TO_STRING(CL_INVALID_PIPE_SIZE); + // CL_VAL_TO_STRING(CL_INVALID_DEVICE_QUEUE); + + // + // Extensions: + // + // cl_khr_gl_sharing + // + CL_VAL_TO_STRING(CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR); + + // + // + // + default: + return "UNKNOWN ERROR CODE"; + } +} + +// +// +// + +cl_int +assert_cl(cl_int const code, char const * const file, int const line, bool const abort) +{ + if (code != CL_SUCCESS) + { + char const * const cl_err_str = cl_get_error_string(code); + + fprintf(stderr, + "\"%s\", line %d: cl_assert (%d) = \"%s\"", + file,line,code,cl_err_str); + + if (abort) + { + // stop profiling and reset device here if necessary + exit(code); + } + } + + return code; +} + +// +// +// + +void +cl_get_event_info(cl_event event, + cl_int * const status, + cl_command_type * const type) +{ + if (status != NULL) { + cl(GetEventInfo(event, + CL_EVENT_COMMAND_EXECUTION_STATUS, + sizeof(*status), + status, + NULL)); + } + + if (type != NULL) { + cl(GetEventInfo(event, + CL_EVENT_COMMAND_TYPE, + sizeof(*type), + type, + NULL)); + } +} + + +char const * +cl_get_event_command_status_string(cl_int const status) +{ + switch (status) + { + CL_VAL_TO_STRING(CL_QUEUED); + CL_VAL_TO_STRING(CL_SUBMITTED); + CL_VAL_TO_STRING(CL_RUNNING); + CL_VAL_TO_STRING(CL_COMPLETE); + + default: + return "UNKNOWN COMMAND STATUS"; + } +} + +char const * +cl_get_event_command_type_string(cl_command_type const type) +{ + switch (type) + { + CL_VAL_TO_STRING(CL_COMMAND_NDRANGE_KERNEL); + CL_VAL_TO_STRING(CL_COMMAND_TASK); + CL_VAL_TO_STRING(CL_COMMAND_NATIVE_KERNEL); + CL_VAL_TO_STRING(CL_COMMAND_READ_BUFFER); + CL_VAL_TO_STRING(CL_COMMAND_WRITE_BUFFER); + CL_VAL_TO_STRING(CL_COMMAND_COPY_BUFFER); + CL_VAL_TO_STRING(CL_COMMAND_READ_IMAGE); + CL_VAL_TO_STRING(CL_COMMAND_WRITE_IMAGE); + CL_VAL_TO_STRING(CL_COMMAND_COPY_IMAGE); + CL_VAL_TO_STRING(CL_COMMAND_COPY_BUFFER_TO_IMAGE); + CL_VAL_TO_STRING(CL_COMMAND_COPY_IMAGE_TO_BUFFER); + CL_VAL_TO_STRING(CL_COMMAND_MAP_BUFFER); + CL_VAL_TO_STRING(CL_COMMAND_MAP_IMAGE); + CL_VAL_TO_STRING(CL_COMMAND_UNMAP_MEM_OBJECT); + CL_VAL_TO_STRING(CL_COMMAND_MARKER); + CL_VAL_TO_STRING(CL_COMMAND_ACQUIRE_GL_OBJECTS); + CL_VAL_TO_STRING(CL_COMMAND_RELEASE_GL_OBJECTS); + CL_VAL_TO_STRING(CL_COMMAND_READ_BUFFER_RECT); + CL_VAL_TO_STRING(CL_COMMAND_WRITE_BUFFER_RECT); + CL_VAL_TO_STRING(CL_COMMAND_COPY_BUFFER_RECT); + CL_VAL_TO_STRING(CL_COMMAND_USER); + CL_VAL_TO_STRING(CL_COMMAND_BARRIER); + CL_VAL_TO_STRING(CL_COMMAND_MIGRATE_MEM_OBJECTS); + CL_VAL_TO_STRING(CL_COMMAND_FILL_BUFFER); + CL_VAL_TO_STRING(CL_COMMAND_FILL_IMAGE); + CL_VAL_TO_STRING(CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR); + + default: + return "UNKNOWN EVENT COMMAND TYPE"; + } +} diff --git a/src/compute/common/cl/assert_cl.h b/src/compute/common/cl/assert_cl.h new file mode 100644 index 0000000000..5481f3850f --- /dev/null +++ b/src/compute/common/cl/assert_cl.h @@ -0,0 +1,56 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> +#include <stdbool.h> + +// +// +// + +char const * +cl_get_error_string(cl_int const err); + +cl_int +assert_cl(cl_int const code, + char const * const file, + int const line, + bool const abort); + +// +// +// + +#define cl(...) assert_cl((cl##__VA_ARGS__), __FILE__, __LINE__, true); +#define cl_ok(err) assert_cl(err, __FILE__, __LINE__, true); + +// +// +// + +void +cl_get_event_info(cl_event event, + cl_int * const status, + cl_command_type * const type); + +char const * +cl_get_event_command_status_string(cl_int const status); + +char const * +cl_get_event_command_type_string(cl_command_type const type); + +// +// +// + diff --git a/src/compute/common/cl/find_cl.c b/src/compute/common/cl/find_cl.c new file mode 100644 index 0000000000..613d2b9903 --- /dev/null +++ b/src/compute/common/cl/find_cl.c @@ -0,0 +1,210 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +// +// +// + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +// +// +// + +#include "find_cl.h" +#include "assert_cl.h" +#include "macros.h" + +// +// search platforms and devices for a match +// + +cl_int +clFindIdsByName(char const * const target_platform_substring, + char const * const target_device_substring, + cl_platform_id * const platform_id, + cl_device_id * const device_id, + size_t const matched_device_name_size, + char * const matched_device_name, + size_t * const matched_device_name_size_ret, + bool const is_verbose) +{ + bool match_platform=false, match_device=false; + + // + // get number of platforms + // + cl_uint platform_count; + + cl(GetPlatformIDs(0,NULL,&platform_count)); + + cl_platform_id * const platform_ids = ALLOCA(sizeof(*platform_ids) * platform_count); + + cl(GetPlatformIDs(platform_count,platform_ids,NULL)); + + // + // search platforms + // + for (cl_uint ii=0; ii<platform_count; ii++) + { + size_t platform_name_size; + + cl(GetPlatformInfo(platform_ids[ii], + CL_PLATFORM_NAME, + 0, + NULL, + &platform_name_size)); + + char * const platform_name = ALLOCA(platform_name_size); + + cl(GetPlatformInfo(platform_ids[ii], + CL_PLATFORM_NAME, + platform_name_size, + platform_name, + NULL)); + + + if (!match_platform && (strstr(platform_name,target_platform_substring) != NULL)) + { + match_platform = true; + *platform_id = platform_ids[ii]; + } + + if (is_verbose) { + fprintf(stdout,"%2u: %s\n",ii,platform_name); + } + + // + // find devices for current platform + // + cl_uint device_count; + cl_int cl_err; + + cl_err = clGetDeviceIDs(platform_ids[ii], + CL_DEVICE_TYPE_ALL, + 0, + NULL, + &device_count); + + cl_device_id * const device_ids = ALLOCA(sizeof(*device_ids) * device_count); + + cl_err = clGetDeviceIDs(platform_ids[ii], + CL_DEVICE_TYPE_ALL, + device_count, + device_ids, + NULL); + + if (cl_err != CL_DEVICE_NOT_FOUND) + cl_ok(cl_err); + + for (cl_uint jj=0; jj<device_count; jj++) + { + size_t device_name_size; + size_t driver_version_size; + + cl(GetDeviceInfo(device_ids[jj], + CL_DEVICE_NAME, + 0, + NULL, + &device_name_size)); + + cl(GetDeviceInfo(device_ids[jj], + CL_DRIVER_VERSION, + 0, + NULL, + &driver_version_size)); + + char * const device_name = ALLOCA(device_name_size); + char * const driver_version = ALLOCA(driver_version_size); + + cl(GetDeviceInfo(device_ids[jj], + CL_DEVICE_NAME, + device_name_size, + device_name, + NULL)); + + cl(GetDeviceInfo(device_ids[jj], + CL_DRIVER_VERSION, + driver_version_size, + driver_version, + NULL)); + + if (!match_device && match_platform && (strstr(device_name,target_device_substring) != NULL)) + { + match_device = true; + *device_id = device_ids[jj]; + + if (matched_device_name != NULL) + { + size_t bytes = 0; + + if (matched_device_name_size >= 1) + matched_device_name[matched_device_name_size-1] = 0; + + if (matched_device_name_size > 1) + { + bytes = MIN_MACRO(device_name_size,matched_device_name_size-1); + + memcpy(matched_device_name,device_name,bytes); + } + + if (matched_device_name_size_ret != NULL) + *matched_device_name_size_ret = bytes; + } + + if (is_verbose) { + fprintf(stdout," >>>"); + } + } + else if (is_verbose) + { + fprintf(stdout," "); + } + + if (is_verbose) + { + fprintf(stdout, + " %1u: %s [ %s ]\n", + jj, + device_name, + driver_version); + } + } + } + + if (is_verbose) { + fprintf(stdout,"\n"); + } + + // + // get target platform and device + // + if (!match_platform) + { + if (is_verbose) + fprintf(stderr,"no match for target platform substring %s\n",target_platform_substring); + + return CL_INVALID_PLATFORM; + } + if (!match_device) + { + if (is_verbose) + fprintf(stderr,"no match for target device substring %s\n",target_device_substring); + + return CL_DEVICE_NOT_FOUND; + } + + return CL_SUCCESS; +} + +// +// +// + diff --git a/src/compute/common/cl/find_cl.h b/src/compute/common/cl/find_cl.h new file mode 100644 index 0000000000..5143e39f85 --- /dev/null +++ b/src/compute/common/cl/find_cl.h @@ -0,0 +1,35 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> +#include <stdbool.h> + +// +// +// + +cl_int +clFindIdsByName(char const * const target_platform_substring, + char const * const target_device_substring, + cl_platform_id * const platform_id, + cl_device_id * const device_id, + size_t const matched_device_name_size, + char * const matched_device_name, + size_t * const matched_device_name_size_ret, + bool const is_verbose); + +// +// +// + diff --git a/src/compute/common/macros.h b/src/compute/common/macros.h new file mode 100644 index 0000000000..35f658f315 --- /dev/null +++ b/src/compute/common/macros.h @@ -0,0 +1,44 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0])) + +// +// +// + +#define MAX_MACRO(a,b) (((a) > (b)) ? (a) : (b)) +#define MIN_MACRO(a,b) (((a) < (b)) ? (a) : (b)) +#define GTE_MACRO(a,b) ((a) >= (b)) +#define LT_MACRO(a,b) ((a) < (b)) + +// +// +// + +#define BITS_TO_MASK(n) (((uint32_t)1<<(n))-1) +#define BITS_TO_MASK_64(n) (((uint64_t)1<<(n))-1) + +#define BITS_TO_MASK_AT(n,b) (BITS_TO_MASK(n)<<(b)) +#define BITS_TO_MASK_AT_64(n,b) (BITS_TO_MASK_64(n)<<(b)) + +// +// +// + +#define ALLOCA(n) _alloca(n) + +// +// +// diff --git a/src/compute/common/util.c b/src/compute/common/util.c new file mode 100644 index 0000000000..69710125a3 --- /dev/null +++ b/src/compute/common/util.c @@ -0,0 +1,86 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#include <intrin.h> + +// +// +// + +#include "util.h" + +// +// +// + +bool +is_pow2_u32(uint32_t n) +{ + return (n & (n-1)) == 0; +} + +// +// +// + +uint32_t +pow2_ru_u32(uint32_t n) +{ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + + return n; +} + +// +// +// + +uint32_t +pow2_rd_u32(uint32_t n) +{ + return 1u << msb_idx_u32(n); +} + +// +// ASSUMES NON-ZERO +// + +uint32_t +msb_idx_u32(uint32_t n) +{ + +#ifdef _MSC_VER + + uint32_t index; + + _BitScanReverse(&index,n); + + return index; + +#elif defined(__GNUC__) + +#error "BUSTED msb_index()" + return 31 - __builtin_clz(mask); + +#else + +#error "No msb_index()" + +#endif + +} + +// +// +// diff --git a/src/compute/common/util.h b/src/compute/common/util.h new file mode 100644 index 0000000000..7d5a7b4600 --- /dev/null +++ b/src/compute/common/util.h @@ -0,0 +1,31 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <stdint.h> +#include <stdbool.h> + +// +// +// + +bool is_pow2_u32(uint32_t n); +uint32_t pow2_ru_u32(uint32_t n); +uint32_t pow2_rd_u32(uint32_t n); +uint32_t msb_idx_u32(uint32_t n); // 0-based bit position + +// +// +// + + diff --git a/src/compute/hs/cl/bench/main.c b/src/compute/hs/cl/bench/main.c new file mode 100644 index 0000000000..3b9ef6e1c7 --- /dev/null +++ b/src/compute/hs/cl/bench/main.c @@ -0,0 +1,678 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdio.h> +#include <string.h> +#include <time.h> + +// +// CPU bench +// + +#ifdef _MSC_VER +#include <windows.h> +#else +#include <sys/time.h> +#endif + +// +// squelch OpenCL 1.2 deprecation warning +// + +#ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS +#endif + +#include "macros.h" +#include "assert_cl.h" +#include "find_cl.h" +#include "hs_cl_launcher.h" + +// +// The quality of the RNG doesn't matter. The same number of +// instructions will be run no matter what the key distribution looks +// like. So here is something small and fast. +// + +static +uint32_t +hs_rand_u32() +{ + static uint32_t seed = 0xDEADBEEF; + + // Numerical Recipes + seed = seed * 1664525 + 1013904223; + + return seed; +} + +// +// +// + +static +void +hs_fill_rand(uint32_t * vin_h, uint32_t const count, uint32_t const words) +{ +#if 1 + for (uint32_t ii=0; ii<count*words; ii++) + vin_h[ii] = hs_rand_u32(); +#elif 0 // in-order + memset(vin_h,0,count*words*sizeof(uint32_t)); + for (uint32_t ii=0; ii<count; ii++) + vin_h[ii*words] = ii; +#else // reverse order + memset(vin_h,0,count*words*sizeof(uint32_t)); + for (uint32_t ii=0; ii<count; ii++) + vin_h[ii*words] = count - 1 - ii; +#endif +} + +// +// +// + +char const * hs_cpu_sort_u32(uint32_t * a, uint32_t const count); +char const * hs_cpu_sort_u64(uint64_t * a, uint32_t const count); + +// +// +// + +static +char const * +hs_cpu_sort(void * sorted_h, + uint32_t const count, + struct hs_info const * const info, + double * const cpu_ns) +{ + char const * algo; + + LARGE_INTEGER t0,t1,freq; + + QueryPerformanceCounter(&t0); + + if (info->words == 1) + algo = hs_cpu_sort_u32(sorted_h,count); + else + algo = hs_cpu_sort_u64(sorted_h,count); + + QueryPerformanceCounter(&t1); + QueryPerformanceFrequency(&freq); + + // nanoseconds + *cpu_ns = (double)((t1.QuadPart - t0.QuadPart) * 1000 * 1000 * 1000) / (double)freq.QuadPart; + + return algo; +} + +static +bool +hs_verify_linear(void * sorted_h, void * vout_h, const uint32_t count, struct hs_info const * const info) +{ + return memcmp(sorted_h, vout_h, sizeof(uint32_t) * info->words * count) == 0; +} + +static +void +hs_transpose_slabs_u32(uint32_t * vout_h, const uint32_t count, struct hs_info const * const info) +{ + uint32_t const slab_keys = info->keys * info->lanes; + size_t const slab_size = sizeof(uint32_t) * info->words * slab_keys; + uint32_t * const slab = _alloca(slab_size); + uint32_t slab_count = count / slab_keys; + + while (slab_count-- > 0) + { + memcpy(slab,vout_h,slab_size); + + for (uint32_t row=0; row<info->keys; row++) + for (uint32_t col=0; col<info->lanes; col++) + vout_h[col * info->keys + row] = slab[row * info->lanes + col]; + + vout_h += slab_keys; + } +} + +static +void +hs_transpose_slabs_u64(uint64_t * vout_h, const uint32_t count, struct hs_info const * const info) +{ + uint32_t const slab_keys = info->keys * info->lanes; + size_t const slab_size = sizeof(uint32_t) * info->words * slab_keys; + uint64_t * const slab = _alloca(slab_size); + uint32_t slab_count = count / slab_keys; + + while (slab_count-- > 0) + { + memcpy(slab,vout_h,slab_size); + + for (uint32_t row=0; row<info->keys; row++) + for (uint32_t col=0; col<info->lanes; col++) + vout_h[col * info->keys + row] = slab[row * info->lanes + col]; + + vout_h += slab_keys; + } +} + +static +void +hs_transpose_slabs(void * vout_h, const uint32_t count, struct hs_info const * const info) +{ + if (info->words == 1) + hs_transpose_slabs_u32(vout_h,count,info); + else + hs_transpose_slabs_u64(vout_h,count,info); +} + +// +// +// + +static +void +hs_debug_u32( + uint32_t const * vout_h, + uint32_t const count, + struct hs_info const * const info) +{ + uint32_t const slab = info->keys * info->lanes; + uint32_t const slabs = (count + slab - 1) / slab; + + for (uint32_t ss=0; ss<slabs; ss++) { + fprintf(stderr,"%u\n",ss); + for (uint32_t cc=0; cc<info->keys; cc++) { + for (uint32_t rr=0; rr<info->lanes; rr++) + fprintf(stderr,"%8X ",*vout_h++); + fprintf(stderr,"\n"); + } + } +} + +static +void +hs_debug_u64(uint64_t const * vout_h, + uint32_t const count, + struct hs_info const * const info) +{ + uint32_t const slab = info->keys * info->lanes; + uint32_t const slabs = (count + slab - 1) / slab; + + for (uint32_t ss=0; ss<slabs; ss++) { + fprintf(stderr,"%u\n",ss); + for (uint32_t cc=0; cc<info->keys; cc++) { + for (uint32_t rr=0; rr<info->lanes; rr++) + fprintf(stderr,"%16llX ",*vout_h++); + fprintf(stderr,"\n"); + } + } +} + +// +// Used for benchmarking on out-of-order queues. Attaching an event +// to a kernel on an OOQ with profiling enabled will result in a +// synchronization point and block concurrent execution of kernels. +// +// The workaround that enables measuring the entire runtime of the +// sort is to launch a dummy kernel with an event, a barrier without +// an event, then the call to hs_sort(), followed by a final dummy +// kernel with an event. +// +// The end time of the first dummy and start time of the second dummy +// will provide a conservative estimate of the total execution time of +// the hs_sort() routine. +// +// Note that once kernels are enqueued they are scheduled with only +// microseconds between them so this should only be a small number of +// microseconds longer than the true hs_sort() execution time. +// + +#define HS_DUMMY_KERNEL_PROGRAM "kernel void hs_dummy_kernel() { ; }" + +static cl_kernel hs_dummy_kernel; + +static +void +hs_dummy_kernel_create(cl_context context, cl_device_id device_id) +{ + cl_int err; + + char const * strings[] = { HS_DUMMY_KERNEL_PROGRAM }; + size_t const strings_sizeof[] = { sizeof(HS_DUMMY_KERNEL_PROGRAM) + 1 }; + + cl_program program = clCreateProgramWithSource(context, + 1, + strings, + strings_sizeof, + &err); cl_ok(err); + cl(BuildProgram(program, + 1, + &device_id, + NULL, + NULL, + NULL)); + + hs_dummy_kernel = clCreateKernel(program,"hs_dummy_kernel",&err); cl_ok(err); + + cl(ReleaseProgram(program)); +} + +static +void +hs_dummy_kernel_release() +{ + cl(ReleaseKernel(hs_dummy_kernel)); +} + +static +void +hs_dummy_kernel_enqueue(cl_command_queue cq, cl_event * const event) +{ + size_t const global_work_size = 1; + + cl(EnqueueNDRangeKernel(cq, + hs_dummy_kernel, + 1, + NULL, + &global_work_size, + NULL, + 0, + NULL, + event)); +} + +// +// +// + +static +void +hs_bench(cl_context context, + cl_command_queue cq, + char const * const device_name, + struct hs_info const * const info, + uint32_t const count_lo, + uint32_t const count_hi, + uint32_t const count_step, + uint32_t const loops, + uint32_t const warmup, + bool const linearize) +{ + // + // return if nothing to do + // + if (count_hi <= 1) + return; + + // + // size the arrays + // + uint32_t count_hi_padded_in, count_hi_padded_out; + + hs_pad(count_hi,&count_hi_padded_in,&count_hi_padded_out); + + // + // SIZE + // + size_t const key_size = sizeof(uint32_t) * info->words; + + size_t const size_hi = count_hi * key_size; + size_t const size_hi_in = count_hi_padded_in * key_size; + size_t const size_hi_out = count_hi_padded_out * key_size; + + // + // ALLOCATE + // + cl_int cl_err; + + void * sorted_h = malloc(size_hi_in); + + cl_mem random = clCreateBuffer(context, + CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, + size_hi_in, + NULL,&cl_err); cl_ok(cl_err); + + cl_mem vin = clCreateBuffer(context, + CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, + size_hi_in, + NULL,&cl_err); cl_ok(cl_err); + + cl_mem vout = clCreateBuffer(context, + CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, + size_hi_out, + NULL,&cl_err); cl_ok(cl_err); + // + // BLOCKING MAP AND INIT KEYS + // + { + void * random_h = clEnqueueMapBuffer(cq, + random, + CL_TRUE, + CL_MAP_WRITE_INVALIDATE_REGION, + 0,size_hi_in, + 0,NULL,NULL, + &cl_err); cl_ok(cl_err); + + // fill with random numbers + hs_fill_rand(random_h,count_hi,info->words); + + // + // UNMAP + // + cl(EnqueueUnmapMemObject(cq,random,random_h,0,NULL,NULL)); + } + + // + // BENCHMARK + // + for (uint32_t count=count_lo; count<=count_hi; count+=count_step) + { + // compute padding before sorting + uint32_t count_padded_in, count_padded_out; + + hs_pad(count,&count_padded_in,&count_padded_out); + + cl_ulong elapsed_ns_min = ULONG_MAX; + cl_ulong elapsed_ns_max = 0; + cl_ulong elapsed_ns_sum = 0; + +#if 1 + cl(EnqueueCopyBuffer(cq,random,vin,0,0,count * key_size,0,NULL,NULL)); + cl(Finish(cq)); +#endif + + for (uint32_t ii=0; ii<warmup+loops; ii++) + { + if (ii == warmup) + { + elapsed_ns_min = ULONG_MAX; + elapsed_ns_max = 0; + elapsed_ns_sum = 0; + } + + // + // initialize vin on every loop -- shouldn't need to do this + // +#if 0 + cl(EnqueueCopyBuffer(cq,random,vin,0,0,count * key_size,0,NULL,NULL)); + cl(Finish(cq)); +#endif + + // + // sort vin + // + cl_event start, end; + + hs_dummy_kernel_enqueue(cq,&start); + + cl(EnqueueBarrierWithWaitList(cq,0,NULL,NULL)); + + // note hs_sort enqueues a final barrier + hs_sort(cq, + vin,vout, + count, + count_padded_in, + count_padded_out, + linearize); + + hs_dummy_kernel_enqueue(cq,&end); + + cl(Finish(cq)); + + // + // measure duration + // + cl_ulong t_start=0, t_end=0; + + // start + cl(GetEventProfilingInfo(start, + CL_PROFILING_COMMAND_END, + sizeof(cl_ulong), + &t_start, + NULL)); + cl(ReleaseEvent(start)); + + // end + cl(GetEventProfilingInfo(end, + CL_PROFILING_COMMAND_START, + sizeof(cl_ulong), + &t_end, + NULL)); + cl(ReleaseEvent(end)); + + cl_ulong const t = t_end - t_start; + + elapsed_ns_min = MIN_MACRO(elapsed_ns_min,t); + elapsed_ns_max = MAX_MACRO(elapsed_ns_max,t); + elapsed_ns_sum += t; + } + + // + // COPY KEYS BACK FOR VERIFICATION + // + size_t const size_padded_in = count_padded_in * key_size; + + void * vin_h = clEnqueueMapBuffer(cq, + vin, + CL_FALSE, + CL_MAP_READ, + 0,size_padded_in, + 0,NULL,NULL, + &cl_err); cl_ok(cl_err); + + void * vout_h = clEnqueueMapBuffer(cq, + vout, + CL_FALSE, + CL_MAP_READ, + 0,size_padded_in, + 0,NULL,NULL, + &cl_err); cl_ok(cl_err); + cl(Finish(cq)); + + // + // SORT THE UNTOUCHED RANDOM INPUT + // + memcpy(sorted_h,vin_h,size_padded_in); + + double cpu_ns; + + char const * const algo = hs_cpu_sort(sorted_h,count_padded_in,info,&cpu_ns); + + // + // EXPLICITLY TRANSPOSE THE CPU SORTED SLABS IF NOT LINEARIZING + // + if (!linearize) { + hs_transpose_slabs(vout_h,count_padded_in,info); + } + + // + // VERIFY + // + bool const verified = hs_verify_linear(sorted_h,vout_h,count_padded_in,info); + +#ifndef NDEBUG + if (!verified) + { + if (info->words == 1) + hs_debug_u32(vout_h,count,info); + else // ulong + hs_debug_u64(vout_h,count,info); + } +#endif + + cl(EnqueueUnmapMemObject(cq,vin, vin_h, 0,NULL,NULL)); + cl(EnqueueUnmapMemObject(cq,vout,vout_h,0,NULL,NULL)); + + cl(Finish(cq)); + + // + // REPORT + // + fprintf(stdout,"%s, %s, %s, %s, %8u, %8u, %8u, CPU, %s, %9.2f, %6.2f, GPU, %9u, %7.3f, %7.3f, %7.3f, %6.2f, %6.2f\n", + device_name, + (info->words == 1) ? "uint" : "ulong", + linearize ? "linear" : "slab", + verified ? " OK " : "*FAIL*", + count, + count_padded_in, + count_padded_out, + // CPU + algo, + cpu_ns / 1000000.0, // milliseconds + 1000.0 * count / cpu_ns, // mkeys / sec + // GPU + loops, + elapsed_ns_sum / 1000000.0 / loops, // avg msecs + elapsed_ns_min / 1000000.0, // min msecs + elapsed_ns_max / 1000000.0, // max msecs + 1000.0 * count * loops / elapsed_ns_sum, // mkeys / sec - avg + 1000.0 * count / elapsed_ns_min); // mkeys / sec - max + + // quit early if not verified + if (!verified) + break; + } + + // + // dispose + // + cl(ReleaseMemObject(vout)); + cl(ReleaseMemObject(vin)); + cl(ReleaseMemObject(random)); + free(sorted_h); +} + +// +// +// + +int +main(int argc, char** argv) +{ + char const * const target_platform_substring = "Intel"; + char const * const target_device_substring = "Graphics"; + + // + // find platform and device ids + // + cl_platform_id platform_id; + cl_device_id device_id; + +#define HS_DEVICE_NAME_SIZE 64 + + char device_name[HS_DEVICE_NAME_SIZE]; + size_t device_name_size; + + cl(FindIdsByName(target_platform_substring, + target_device_substring, + &platform_id, + &device_id, + HS_DEVICE_NAME_SIZE, + device_name, + &device_name_size, + true)); + // + // create context + // + cl_context_properties context_properties[] = + { + CL_CONTEXT_PLATFORM, (cl_context_properties)platform_id, + 0 + }; + + cl_int cl_err; + cl_context context = clCreateContext(context_properties, + 1, + &device_id, + NULL, + NULL, + &cl_err); + cl_ok(cl_err); + + // + // create command queue + // + cl_command_queue_properties const props = CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE; + +#if 0 // OPENCL 2.0 + cl_queue_properties queue_properties[] = + { + CL_QUEUE_PROPERTIES, (cl_queue_properties)props, + 0 + }; + + cl_command_queue cq = clCreateCommandQueueWithProperties(context, + device_id, + queue_properties, + &cl_err); cl_ok(cl_err); +#else // OPENCL 1.2 + cl_command_queue cq = clCreateCommandQueue(context, + device_id, + props, + &cl_err); cl_ok(cl_err); +#endif + + // + // create kernels + // + fprintf(stdout,"Creating... "); + + struct hs_info info; + + hs_create(context,device_id,&info); + + fprintf(stdout,"done.\n"); + + // + // create dummy kernel for profiling + // + hs_dummy_kernel_create(context,device_id); + + // + // + // +#ifdef NDEBUG +#define HS_BENCH_LOOPS 50 +#define HS_BENCH_WARMUP 10 +#else +#define HS_BENCH_LOOPS 1 +#define HS_BENCH_WARMUP 0 +#endif + + // + // sort sizes and loops + // + uint32_t const kpb = info.keys * info.lanes; + + uint32_t const count_lo = (argc <= 1) ? kpb : strtoul(argv[1],NULL,0); + uint32_t const count_hi = (argc <= 2) ? count_lo : strtoul(argv[2],NULL,0); + uint32_t const count_step = (argc <= 3) ? count_lo : strtoul(argv[3],NULL,0); + uint32_t const loops = (argc <= 4) ? HS_BENCH_LOOPS : strtoul(argv[4],NULL,0); + uint32_t const warmup = (argc <= 5) ? HS_BENCH_WARMUP : strtoul(argv[5],NULL,0); + bool const linearize = (argc <= 6) ? true : strtoul(argv[6],NULL,0); + + // + // benchmark + // + hs_bench(context,cq,device_name,&info,count_lo,count_hi,count_step,loops,warmup,linearize); + + // + // release everything + // + hs_dummy_kernel_release(); + hs_release(); + + cl(ReleaseCommandQueue(cq)); + cl(ReleaseContext(context)); + + return 0; +} diff --git a/src/compute/hs/cl/bench/sort.cpp b/src/compute/hs/cl/bench/sort.cpp new file mode 100644 index 0000000000..861c498ae4 --- /dev/null +++ b/src/compute/hs/cl/bench/sort.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// Sort 1m 64-bit keys: +// +// std::sort(std::execution::par_unseq)() : 23 msecs +// std::sort() : 88 msecs +// qsort() : 166 msecs +// + +#define HS_USE_PARALLEL_SORT +// #define HS_USE_STD_SORT +// #define HS_USE_QSORT + +// +// +// + +#if defined ( HS_USE_PARALLEL_SORT ) +#include <execution> +#elif defined ( HS_USE_STD_SORT ) +#include <algorithm> +#elif defined ( HS_USE_QSORT ) +#include <stdlib.h> +#include <stdint.h> +#endif + +// +// qsort comparators +// + +#if defined ( HS_USE_QSORT ) + +static +int +hs_qsort_compare_u32(void const * a, void const * b) +{ + if (*(uint32_t*)a == *(uint32_t*)b) + return 0; + else if (*(uint32_t*)a < *(uint32_t*)b) + return -1; + else + return 1; +} + +static +int +hs_qsort_compare_u64(void const * a, void const * b) +{ + if (*(uint64_t*)a == *(uint64_t*)b) + return 0; + else if (*(uint64_t*)a < *(uint64_t*)b) + return -1; + else + return 1; +} + +#endif + +// +// +// + +extern "C" +char const * +hs_cpu_sort_u32(uint32_t * a, uint32_t const count) +{ +#if defined ( HS_USE_PARALLEL_SORT ) + std::sort(std::execution::par_unseq,a,a+count); + return "std::sort(std::execution::par_unseq)()"; +#elif defined ( HS_USE_STD_SORT ) + std::sort(a,a+count); + return "std:sort()"; +#elif defined ( HS_USE_QSORT ) + qsort(a,count,sizeof(*a),hs_qsort_compare_u32); + return "qsort()"; +#endif +} + +extern "C" +char const * +hs_cpu_sort_u64(uint64_t * a, uint32_t const count) +{ +#if defined ( HS_USE_PARALLEL_SORT ) + std::sort(std::execution::par_unseq,a,a+count); + return "std::sort(std::execution::par_unseq)()"; +#elif defined ( HS_USE_STD_SORT ) + std::sort(a,a+count); + return "std::sort()"; +#elif defined ( HS_USE_QSORT ) + qsort(a,count,sizeof(*a),hs_qsort_compare_u64); + return "qsort()"; +#endif +} + +// +// +// diff --git a/src/compute/hs/cl/gen9/make_all.bat b/src/compute/hs/cl/gen9/make_all.bat new file mode 100644 index 0000000000..fac82b41a0 --- /dev/null +++ b/src/compute/hs/cl/gen9/make_all.bat @@ -0,0 +1,16 @@ +@ECHO OFF
+
+SET HS_GEN=..\..\..\..\spinel\bin\x64\Debug\hs_gen
+
+REM --- 32-bit keys ---
+
+REM CMD /C %HS_GEN% -a 2 -t 1 -w 8 -r 24 -s 32768 -S 65536 -b 28 -B 56 -m 1 -M 1 -f 1 -F 1 -c 1 -C 1 -z
+REM CMD /C %HS_GEN% -a 2 -t 1 -w 8 -r 32 -s 21504 -S 65536 -b 16 -B 48 -m 1 -M 1 -f 1 -F 1 -c 1 -C 1 -z
+REM CMD /C %HS_GEN% -a 2 -t 1 -w 8 -r 32 -s 8192 -S 65536 -b 8 -B 56 -m 1 -M 1 -f 0 -F 0 -c 0 -C 0 -z
+
+REM --- 64-bit keys
+
+CMD /C %HS_GEN% -a 2 -t 2 -w 8 -r 16 -s 21504 -S 65536 -b 16 -B 48 -m 1 -M 1 -f 1 -F 1 -c 1 -C 1 -z
+REM CMD /C %HS_GEN% -a 2 -t 2 -w 8 -r 16 -s 32768 -S 65536 -b 28 -B 56 -m 1 -M 1 -f 0 -F 0 -c 0 -C 0 -z
+
+CMD /C make_inl_cl.bat hs_cl.cl
diff --git a/src/compute/hs/cl/gen9/make_inl_cl.bat b/src/compute/hs/cl/gen9/make_inl_cl.bat new file mode 100644 index 0000000000..76cb6e569e --- /dev/null +++ b/src/compute/hs/cl/gen9/make_inl_cl.bat @@ -0,0 +1,78 @@ +
+@ECHO OFF
+
+::
+::
+::
+
+SET OPENCL_STD=-cl-std=CL1.2
+SET OPENCL_PRE=__OPENCL_C_VERSION__=120
+
+:: SET OPENCL_STD=-cl-std=CL2.0
+:: SET OPENCL_PRE=__OPENCL_C_VERSION__=200
+
+::
+::
+::
+
+SET IOC=ioc64
+
+::
+::
+::
+
+SET IOC_IR_OPTS_OPT=%OPENCL_STD% -cl-single-precision-constant -cl-denorms-are-zero -cl-mad-enable -cl-no-signed-zeros -cl-fast-relaxed-math -cl-kernel-arg-info
+
+SET IOC_IR_OPTS_DBG=%OPENCL_STD% -cl-kernel-arg-info -g
+
+SET IOC_IR_OPTS=%IOC_IR_OPTS_OPT%
+
+::
+::
+::
+
+SET PRE_DIR=%~p1
+
+CD %PRE_DIR%
+
+SET PRE_CL=%~n1
+SET PRE_CL=%PRE_CL%.pre.cl
+
+SET PRE_SRC_INL=%~n1
+SET PRE_SRC_INL=%PRE_SRC_INL%.pre.src.inl
+
+SET PRE_BIN_IR=%~n1
+SET PRE_BIN_IR=%PRE_BIN_IR%.pre.ir
+
+SET PRE_BIN_INL=%~n1
+SET PRE_BIN_INL=%PRE_BIN_INL%.pre.bin.inl
+
+::
+:: *.pre.cl
+:: *.pre.src.inl
+::
+
+CMD /C clang-format -style=Mozilla -i %1
+CMD /C cl -I . -I "%INTELOCLSDKROOT%\include" -D %OPENCL_PRE% -EP %1 -P -Fi"%PRE_CL%"
+CMD /C clang-format -style=Mozilla -i %PRE_CL%
+CMD /C dos2unix -q %PRE_CL%
+CMD /C xxd -i %PRE_CL% %PRE_SRC_INL%
+
+echo %PRE_CL%
+echo %PRE_SRC_INL%
+
+::
+:: *.pre.cl
+:: *.pre.src.inl
+::
+
+CMD /C touch %PRE_BIN_IR%
+ECHO ON
+@CMD /C %IOC% -cmd=build -bo="%IOC_IR_OPTS%" -device=gpu -input=%PRE_CL% -ir=%PRE_BIN_IR%
+@ECHO OFF
+CMD /C xxd -i %PRE_BIN_IR% %PRE_BIN_INL%
+
+echo %PRE_BIN_IR%
+echo %PRE_BIN_INL%
+
+
diff --git a/src/compute/hs/cl/hs_cl_launcher.c b/src/compute/hs/cl/hs_cl_launcher.c new file mode 100644 index 0000000000..b0b9e4091b --- /dev/null +++ b/src/compute/hs/cl/hs_cl_launcher.c @@ -0,0 +1,1141 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> + +// +// +// + +#include "hs_cl_launcher.h" +#include "assert_cl.h" +#include "macros.h" +#include "util.h" + +// +// +// + +typedef uint32_t uint; +typedef uint64_t ulong; + +// +// +// + +#include "hs_cl.h" + +// +// +// + +#if 0 // #ifndef NDEBUG +#define HS_KERNEL_SOURCE +#else +#define HS_KERNEL_BINARY +#endif + +// +// #define HS_KERNEL_SPIRV +// + +// +// +// + +#ifdef NDEBUG + +#define HS_LAUNCH_TRACE(k,g,l) + +#else + +#include <stdio.h> + +#define HS_KERNEL_NAME_MAX 20 + +static +void +hs_launch_trace(cl_kernel kernel, + size_t const global_work_size, + size_t const local_work_size) +{ + if (kernel == NULL) + return; + + char name[HS_KERNEL_NAME_MAX]; + + cl(GetKernelInfo(kernel,CL_KERNEL_FUNCTION_NAME,HS_KERNEL_NAME_MAX,name,NULL)); + + fprintf(stderr,"%-19s ( %6zu, %4zu )\n",name,global_work_size,local_work_size); +} + +#define HS_LAUNCH_TRACE(k,g,l) hs_launch_trace(k,g,l) + +#endif + +// +// +// + +#ifdef NDEBUG + +#define HS_EVENT_NEXT() NULL +#define HS_EVENT_PROFILE(cq) + +#else + +#define HS_EVENTS_MAX 128 + +static cl_event events[HS_EVENTS_MAX]; +static uint32_t events_count; + +static +cl_event * +hs_event_next() +{ + if (events_count + 1 >= HS_EVENTS_MAX) // no events can be recorded? + { + return NULL; + } + else // return next event slot + { + return events + events_count++; + } +} + +static +void +hs_event_profile(cl_command_queue cq) +{ + cl(Finish(cq)); + + cl_command_queue_properties props; + + cl(GetCommandQueueInfo(cq, + CL_QUEUE_PROPERTIES, + sizeof(props), + &props, + NULL)); + + cl_ulong t_min=UINT64_MAX, t_max=0; + + for (uint32_t ee=0; ee<events_count; ee++) + { + cl_event event = events[ee]; + + // + // profiling + // + cl_ulong t_start=0, t_end=0; + + if (props & CL_QUEUE_PROFILING_ENABLE) + { + // start + cl(GetEventProfilingInfo(event, + CL_PROFILING_COMMAND_START, + sizeof(cl_ulong), + &t_start, + NULL)); + // end + cl(GetEventProfilingInfo(event, + CL_PROFILING_COMMAND_END, + sizeof(cl_ulong), + &t_end, + NULL)); + + t_min = MIN_MACRO(t_min,t_start); + t_max = MAX_MACRO(t_max,t_end); + } + + // + // status + // + cl_int status; + cl_command_type type; + + cl_get_event_info(event,&status,&type); + + fprintf(stdout,"%-3u, %-13s, %-28s, %20llu, %20llu, %20llu, %20llu\n", + ee, + cl_get_event_command_status_string(status), + cl_get_event_command_type_string(type), + t_start,t_end,t_end-t_start,t_max-t_min); + + // release + cl(ReleaseEvent(event)); + } +} + +#define HS_EVENT_NEXT() hs_event_next() +#define HS_EVENT_PROFILE(cq) hs_event_profile(cq); + +#endif + +// +// +// + +struct hs_state +{ + cl_mem vin; + cl_mem vout; + + // bx.ru is number of rounded up warps in vin + struct { + uint32_t ru; + } bx; + + // these values change on each iteration + union { + struct { + uint32_t full; + uint32_t frac; + } bs; // warps + struct { + uint32_t full; + uint32_t na; + } bc; // warps + struct { + uint32_t full; + uint32_t frac; + } fm; // rows + }; +}; + +// +// +// + +#define HS_THREADS_PER_BLOCK (HS_BS_WARPS * HS_LANES_PER_WARP) +#define HS_KEYS_PER_WARP (HS_KEYS_PER_LANE * HS_LANES_PER_WARP) + +#define HS_BS_KEYS_PER_BLOCK (HS_KEYS_PER_WARP * HS_BS_WARPS) +#define HS_BS_BLOCK_SIZE (HS_BS_KEYS_PER_BLOCK * sizeof(HS_KEY_TYPE)) + +#define HS_BC_KEYS_PER_BLOCK (HS_KEYS_PER_WARP << HS_BC_WARPS_LOG2_MAX) +#define HS_BC_BLOCK_SIZE (HS_BC_KEYS_PER_BLOCK * sizeof(HS_KEY_TYPE)) + +// +// +// + +#if defined( HS_KERNEL_SOURCE ) + +#include "hs_cl.pre.src.inl" + +#elif defined( HS_KERNEL_BINARY ) + +#include "hs_cl.pre.bin.inl" + +#elif defined( HS_KERNEL_SPIRV ) + +#include "hs_cl.pre.spv.inl" + +#endif + +// +// +// + +struct hs_transpose_kernel +{ + cl_kernel kernel; + char const * name; +}; + +#define HS_TRANSPOSE_KERNEL_DECLARE(n) { .name = #n } + +static struct hs_transpose_kernel transpose_kernels[] = + { + HS_TRANSPOSE_KERNEL_DECLARE(hs_kernel_transpose) + }; + +// +// +// + +struct hs_bs_kernel +{ + cl_kernel kernel; + char const * name; +}; + +#define HS_BS_KERNEL_DECLARE(n) { .name = #n } + +static struct hs_bs_kernel bs_kernels[] = + { +#if 0 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_0), +#endif +#if 1 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_1), +#endif +#if 2 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_2), +#endif +#if 3 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_3), +#endif +#if 4 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_4), +#endif +#if 5 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_5), +#endif +#if 6 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_6), +#endif +#if 7 <= HS_BS_WARPS_LOG2_RU + HS_BS_KERNEL_DECLARE(hs_kernel_bs_7), +#endif + }; + +// +// +// + +struct hs_bc_kernel +{ + cl_kernel kernel; + char const * name; +}; + +#define HS_BC_KERNEL_DECLARE(n) { .name = #n } + +static struct hs_bc_kernel bc_kernels[] = + { +#if (0 >= HS_BC_WARPS_LOG2_MIN) && (0 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_0), +#endif +#if (1 >= HS_BC_WARPS_LOG2_MIN) && (1 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_1), +#endif +#if (2 >= HS_BC_WARPS_LOG2_MIN) && (2 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_2), +#endif +#if (3 >= HS_BC_WARPS_LOG2_MIN) && (3 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_3), +#endif +#if (4 >= HS_BC_WARPS_LOG2_MIN) && (4 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_4), +#endif +#if (5 >= HS_BC_WARPS_LOG2_MIN) && (5 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_5), +#endif +#if (6 >= HS_BC_WARPS_LOG2_MIN) && (6 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_6), +#endif +#if (7 >= HS_BC_WARPS_LOG2_MIN) && (7 <= HS_BC_WARPS_LOG2_MAX) + HS_BC_KERNEL_DECLARE(hs_kernel_bc_7), +#endif + }; + +// +// +// + +struct hs_fm_kernel +{ + cl_kernel kernel; + char const * name; + uint32_t const log2; +}; + +#define HS_FM_KERNEL_DECLARE(n,l) { .name = #n, .log2 = l } + +static struct hs_fm_kernel fm_kernels[] = + { +#ifdef HS_FM_BLOCKS_LOG2_0 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_0,HS_FM_BLOCKS_LOG2_0), +#endif +#ifdef HS_FM_BLOCKS_LOG2_1 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_1,HS_FM_BLOCKS_LOG2_1), +#endif +#ifdef HS_FM_BLOCKS_LOG2_2 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_2,HS_FM_BLOCKS_LOG2_2), +#endif +#ifdef HS_FM_BLOCKS_LOG2_3 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_3,HS_FM_BLOCKS_LOG2_3), +#endif +#ifdef HS_FM_BLOCKS_LOG2_4 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_4,HS_FM_BLOCKS_LOG2_4), +#endif +#ifdef HS_FM_BLOCKS_LOG2_5 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_5,HS_FM_BLOCKS_LOG2_5), +#endif +#ifdef HS_FM_BLOCKS_LOG2_6 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_6,HS_FM_BLOCKS_LOG2_6), +#endif +#ifdef HS_FM_BLOCKS_LOG2_7 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_7,HS_FM_BLOCKS_LOG2_7), +#endif +#ifdef HS_FM_BLOCKS_LOG2_8 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_8,HS_FM_BLOCKS_LOG2_8), +#endif +#ifdef HS_FM_BLOCKS_LOG2_9 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_9,HS_FM_BLOCKS_LOG2_9), +#endif +#ifdef HS_FM_BLOCKS_LOG2_10 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_10,HS_FM_BLOCKS_LOG2_10), +#endif +#ifdef HS_FM_BLOCKS_LOG2_11 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_11,HS_FM_BLOCKS_LOG2_11), +#endif +#ifdef HS_FM_BLOCKS_LOG2_12 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_12,HS_FM_BLOCKS_LOG2_12), +#endif +#ifdef HS_FM_BLOCKS_LOG2_13 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_13,HS_FM_BLOCKS_LOG2_13), +#endif +#ifdef HS_FM_BLOCKS_LOG2_14 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_14,HS_FM_BLOCKS_LOG2_14), +#endif +#ifdef HS_FM_BLOCKS_LOG2_15 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_15,HS_FM_BLOCKS_LOG2_15), +#endif +#ifdef HS_FM_BLOCKS_LOG2_16 + HS_FM_KERNEL_DECLARE(hs_kernel_fm_16,HS_FM_BLOCKS_LOG2_16), +#endif + }; + +// +// +// + +struct hs_hm_kernel +{ + cl_kernel kernel; + char const * name; + uint32_t const log2; +}; + +#define HS_HM_KERNEL_DECLARE(n,l) { .name = #n, .log2 = l } + +static struct hs_hm_kernel hm_kernels[] = + { +#ifdef HS_HM_BLOCKS_LOG2_0 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_0,HS_HM_BLOCKS_LOG2_0), +#endif +#ifdef HS_HM_BLOCKS_LOG2_1 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_1,HS_HM_BLOCKS_LOG2_1), +#endif +#ifdef HS_HM_BLOCKS_LOG2_2 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_2,HS_HM_BLOCKS_LOG2_2), +#endif +#ifdef HS_HM_BLOCKS_LOG2_3 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_3,HS_HM_BLOCKS_LOG2_3), +#endif +#ifdef HS_HM_BLOCKS_LOG2_4 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_4,HS_HM_BLOCKS_LOG2_4), +#endif +#ifdef HS_HM_BLOCKS_LOG2_5 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_5,HS_HM_BLOCKS_LOG2_5), +#endif +#ifdef HS_HM_BLOCKS_LOG2_6 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_6,HS_HM_BLOCKS_LOG2_6), +#endif +#ifdef HS_HM_BLOCKS_LOG2_7 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_7,HS_HM_BLOCKS_LOG2_7), +#endif +#ifdef HS_HM_BLOCKS_LOG2_8 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_8,HS_HM_BLOCKS_LOG2_8), +#endif +#ifdef HS_HM_BLOCKS_LOG2_9 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_9,HS_HM_BLOCKS_LOG2_9), +#endif +#ifdef HS_HM_BLOCKS_LOG2_10 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_10,HS_HM_BLOCKS_LOG2_10), +#endif +#ifdef HS_HM_BLOCKS_LOG2_11 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_11,HS_HM_BLOCKS_LOG2_11), +#endif +#ifdef HS_HM_BLOCKS_LOG2_12 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_12,HS_HM_BLOCKS_LOG2_12), +#endif +#ifdef HS_HM_BLOCKS_LOG2_13 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_13,HS_HM_BLOCKS_LOG2_13), +#endif +#ifdef HS_HM_BLOCKS_LOG2_14 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_14,HS_HM_BLOCKS_LOG2_14), +#endif +#ifdef HS_HM_BLOCKS_LOG2_15 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_15,HS_HM_BLOCKS_LOG2_15), +#endif +#ifdef HS_HM_BLOCKS_LOG2_16 + HS_HM_KERNEL_DECLARE(hs_kernel_hm_16,HS_HM_BLOCKS_LOG2_16), +#endif + }; + +// +// +// + +static +void +hs_barrier(cl_command_queue cq) +{ + cl(EnqueueBarrierWithWaitList(cq,0,NULL,NULL)); +} + +// +// +// + +static +void +hs_launch_transpose(struct hs_state const * const state, + cl_command_queue cq, + cl_kernel kernel, + size_t const global_work_size, + size_t const local_work_size) +{ + HS_LAUNCH_TRACE(kernel,global_work_size,local_work_size); + + cl(SetKernelArg(kernel,0,sizeof(state->vout),&state->vout)); + + cl(EnqueueNDRangeKernel(cq, + kernel, + 1, + NULL, + &global_work_size, + &local_work_size, + 0, + NULL, + HS_EVENT_NEXT())); +} + +// +// +// + +static +void +hs_launch_bs(struct hs_state const * const state, + cl_command_queue cq, + cl_kernel kernel_full, + cl_kernel kernel_frac, + size_t const global_work_size_full, + size_t const local_work_size_full, + size_t const local_work_size_frac) + +{ + HS_LAUNCH_TRACE(kernel_full,global_work_size_full,local_work_size_full); + HS_LAUNCH_TRACE(kernel_frac,local_work_size_frac,local_work_size_frac); + + if (kernel_full != NULL) + { + cl(SetKernelArg(kernel_full,0,sizeof(state->vin), &state->vin)); + cl(SetKernelArg(kernel_full,1,sizeof(state->vout),&state->vout)); + + cl(EnqueueNDRangeKernel(cq, + kernel_full, + 1, + NULL, + &global_work_size_full, + &local_work_size_full, + 0, + NULL, + HS_EVENT_NEXT())); + } + + if (kernel_frac != NULL) + { + cl(SetKernelArg(kernel_frac,0,sizeof(state->vin), &state->vin)); + cl(SetKernelArg(kernel_frac,1,sizeof(state->vout),&state->vout)); + + cl(EnqueueNDRangeKernel(cq, + kernel_frac, + 1, + &global_work_size_full, + &local_work_size_frac, + &local_work_size_frac, + 0, + NULL, + HS_EVENT_NEXT())); + } +} + +// +// +// + +static +void +hs_launch_bc(struct hs_state const * const state, + cl_command_queue cq, + cl_kernel kernel, + size_t const global_work_size, + size_t const local_work_size) +{ + HS_LAUNCH_TRACE(kernel,global_work_size,local_work_size); + + cl(SetKernelArg(kernel,0,sizeof(state->vout),&state->vout)); + + cl(EnqueueNDRangeKernel(cq, + kernel, + 1, + NULL, + &global_work_size, + &local_work_size, + 0, + NULL, + HS_EVENT_NEXT())); +} + +// +// +// + +static +void +hs_launch_fm(struct hs_state const * const state, + cl_command_queue cq, + cl_kernel kernel, + size_t const global_work_size) +{ + HS_LAUNCH_TRACE(kernel,global_work_size,0); + + cl(SetKernelArg(kernel,0,sizeof(state->vout), &state->vout)); + cl(SetKernelArg(kernel,1,sizeof(state->fm.full),&state->fm.full)); + cl(SetKernelArg(kernel,2,sizeof(state->fm.frac),&state->fm.frac)); + + cl(EnqueueNDRangeKernel(cq, + kernel, + 1, + NULL, + &global_work_size, + NULL, + 0, + NULL, + HS_EVENT_NEXT())); +} + +// +// +// + +static +void +hs_launch_hm(struct hs_state const * const state, + cl_command_queue cq, + cl_kernel kernel, + size_t const global_work_size) +{ + HS_LAUNCH_TRACE(kernel,global_work_size,0); + + cl(SetKernelArg(kernel,0,sizeof(state->vout),&state->vout)); + + cl(EnqueueNDRangeKernel(cq, + kernel, + 1, + NULL, + &global_work_size, + NULL, + 0, + NULL, + HS_EVENT_NEXT())); +} + +// +// +// + +static +void +hs_transpose_launcher(struct hs_state * const state, + cl_command_queue cq) +{ + // transpose each slab + size_t const global_work_size = state->bx.ru * HS_LANES_PER_WARP; + size_t const local_work_size = HS_LANES_PER_WARP; // FIXME -- might not always want to specify this + + hs_launch_transpose(state, + cq, + transpose_kernels[0].kernel, + global_work_size, + local_work_size); +} + +// +// +// + +static +void +hs_bs_launcher(struct hs_state * const state, + uint32_t const warps_in, + cl_command_queue cq) +{ + // warps_in is already rounded up + uint32_t const full = (warps_in / HS_BS_WARPS) * HS_BS_WARPS; + uint32_t const frac = warps_in - full; + + // + // FIXME -- launch on different queues + // + cl_kernel kernel_full = (full == 0) ? NULL : bs_kernels[HS_BS_WARPS_LOG2_RU].kernel; + cl_kernel kernel_frac = (frac == 0) ? NULL : bs_kernels[msb_idx_u32(frac)].kernel; + + hs_launch_bs(state, + cq, + kernel_full, + kernel_frac, + full * HS_LANES_PER_WARP, + HS_BS_WARPS * HS_LANES_PER_WARP, + frac * HS_LANES_PER_WARP); +} + +// +// +// + +static +void +hs_bc_launcher(struct hs_state * const state, + uint32_t const down_warps, + uint32_t const down_warps_log2, + cl_command_queue cq) +{ + // block clean the minimal number of down_warps_log2 spans + uint32_t const frac_ru = (1u << down_warps_log2) - 1; + state->bc.full = (down_warps + frac_ru) & ~frac_ru; + + // launch block slab sorting grid + size_t const global_work_size = state->bc.full * HS_LANES_PER_WARP; + size_t const local_work_size = HS_LANES_PER_WARP << down_warps_log2; + + // + // we better be capable of cleaning at least two warps !!! + // + hs_launch_bc(state, + cq, + bc_kernels[down_warps_log2].kernel, + global_work_size, + local_work_size); +} + +// +// +// + +static +uint32_t +hs_hm_launcher(struct hs_state * const state, + uint32_t const down_warps, + uint32_t const down_warps_log2_in, + cl_command_queue cq) +{ + // how many scaled half-merge spans are there? + uint32_t const frac_ru = (1 << down_warps_log2_in) - 1; + uint32_t const spans_ru = (down_warps + frac_ru) >> down_warps_log2_in; + + // get the kernel record + struct hs_hm_kernel const * const hm = hm_kernels + down_warps_log2_in - HS_BC_WARPS_LOG2_MAX - 1; + + // how large is the grid? + size_t const global_work_size = HS_LANES_PER_WARP * HS_KEYS_PER_LANE * (spans_ru << hm->log2); + size_t const local_work_size = HS_LANES_PER_WARP; + + // launch the hm kernel + hs_launch_hm(state, + cq, + hm->kernel, + global_work_size); + + return hm->log2; +} + +// +// FIXME -- some of this logic can be skipped if BS is a power-of-two +// + +static +uint32_t +hs_fm_launcher(struct hs_state * const state, + uint32_t const up_scale_log2, + uint32_t * const down_warps, + cl_command_queue cq) +{ + // get the kernel record + struct hs_fm_kernel const * const fm = fm_kernels + up_scale_log2 - 1; + + // number of warps in a full-sized scaled flip-merge span + uint32_t const full_span_warps = HS_BS_WARPS << up_scale_log2; + + // how many full-sized scaled flip-merge spans are there? + state->fm.full = state->bx.ru / full_span_warps; + state->fm.frac = 0; + + // initialize down_warps + *down_warps = state->fm.full * full_span_warps; + + // how many half-size scaled + fractional scaled spans are there? + uint32_t const span_rem = state->bx.ru - state->fm.full * full_span_warps; + uint32_t const half_span_warps = full_span_warps >> 1; + + if (span_rem > half_span_warps) + { + uint32_t const frac_rem = span_rem - half_span_warps; + uint32_t const frac_rem_pow2 = pow2_ru_u32(frac_rem); + + if (frac_rem_pow2 >= half_span_warps) + { + *down_warps += full_span_warps; + state->fm.full += 1; + } + else + { + uint32_t const frac_interleaved = frac_rem_pow2 >> fm->log2; + + *down_warps += half_span_warps + frac_rem_pow2; + state->fm.frac = MAX_MACRO(1,frac_interleaved); + } + } + + // size the grid + uint32_t const spans_frac = MIN_MACRO(state->fm.frac,1); + uint32_t const spans_total = state->fm.full + spans_frac; + uint32_t const scale = spans_total << fm->log2; + size_t const global_work_size = HS_LANES_PER_WARP * HS_KEYS_PER_LANE * scale; + size_t const local_work_size = HS_LANES_PER_WARP; + + // + // launch the fm kernel + // + hs_launch_fm(state, + cq, + fm->kernel, + global_work_size); + + return fm->log2; +} + +// +// +// + +static +void +hs_keyset_launcher(cl_mem mem, + uint32_t const offset, + uint32_t const span, + cl_command_queue cq) +{ + + + // + // DOES NOT TEST FOR SPAN = 0 + // + HS_KEY_TYPE const pattern = (HS_KEY_TYPE)-1L; + + cl(EnqueueFillBuffer(cq, + mem, + &pattern, + sizeof(HS_KEY_TYPE), + offset * sizeof(HS_KEY_TYPE), + span * sizeof(HS_KEY_TYPE), + 0, + NULL, + HS_EVENT_NEXT())); +} + +// +// all grids will be computed as a function of the minimum number of warps +// + +void +hs_pad(uint32_t const count, + uint32_t * const count_padded_in, + uint32_t * const count_padded_out) +{ + // + // round up the count to warps + // + uint32_t const warps_ru = (count + HS_KEYS_PER_WARP - 1) / HS_KEYS_PER_WARP; + uint32_t const blocks = warps_ru / HS_BS_WARPS; + uint32_t const warps_mod = warps_ru % HS_BS_WARPS; + uint32_t const warps_mod_ru = MIN_MACRO(pow2_ru_u32(warps_mod),HS_BS_WARPS); + + *count_padded_in = (blocks * HS_BS_WARPS + warps_mod_ru) * HS_KEYS_PER_WARP; + *count_padded_out = *count_padded_in; + + // + // more than a single block sort? + // + if (warps_ru > HS_BS_WARPS) + { + // more than one block + uint32_t const blocks_lo = pow2_rd_u32(blocks); + uint32_t const warps_lo = blocks_lo * HS_BS_WARPS; + uint32_t const warps_rem = warps_ru - warps_lo; + + if (warps_rem > 0) + { + uint32_t const warps_rem_ru = pow2_ru_u32(warps_rem); + uint32_t const warps_hi = MAX_MACRO(warps_rem_ru,blocks_lo << HS_FM_BLOCKS_LOG2_1); + uint32_t const warps_padded_out = MIN_MACRO(warps_lo+warps_hi,warps_lo*2); // clamp non-pow2 blocks + + *count_padded_out = warps_padded_out * HS_KEYS_PER_WARP; + } + } +} + +// +// +// + +void +hs_sort(cl_command_queue cq, // out-of-order cq + cl_mem vin, + cl_mem vout, + uint32_t const count, + uint32_t const count_padded_in, + uint32_t const count_padded_out, + bool const linearize) +{ +#ifndef NDEBUG + events_count = 0; +#endif + + // + // FIXME -- get rid of this vestigial structure + // + struct hs_state state = { .vin = vin, .vout = vout }; + + // how many rounded-up key slabs are there? + state.bx.ru = (count + HS_KEYS_PER_WARP - 1) / HS_KEYS_PER_WARP; + + // + // init padding with max-valued keys + // + bool const split = state.vout != state.vin; // FIXME -- careful this comparison might not always be correct + bool keyset = false; + + if (!split) + { + uint32_t const vin_span = count_padded_out - count; + + if (vin_span > 0) + { + hs_keyset_launcher(state.vin, + count,vin_span, + cq); + keyset = true; + } + } + else + { + uint32_t const vin_span = count_padded_in - count; + + if (vin_span > 0) + { + hs_keyset_launcher(state.vin, + count,vin_span, + cq); + keyset = true; + } + + uint32_t const vout_span = count_padded_out - count_padded_in; + + if (vout_span > 0) + { + hs_keyset_launcher(state.vout, + count_padded_in,vout_span, + cq); + keyset = true; + } + } + + if (keyset) + { + hs_barrier(cq); + } + + // + // sort blocks + // + uint32_t const warps_in = count_padded_in / HS_KEYS_PER_WARP; + + hs_bs_launcher(&state,warps_in,cq); + + hs_barrier(cq); + + // + // we're done if only a single bs kernel block was required + // + if (state.bx.ru > HS_BS_WARPS) + { + // + // otherwise... merge sorted spans of warps until done + // + uint32_t up_scale_log2 = 1; + + while (true) + { + uint32_t down_warps; + + // flip merge warps -- return span of warps that must be cleaned + uint32_t down_warps_log2 = hs_fm_launcher(&state, + up_scale_log2, + &down_warps, + cq); + + hs_barrier(cq); + + // if span is gt largest slab block cleaner then half merge + while (down_warps_log2 > HS_BC_WARPS_LOG2_MAX) + { + down_warps_log2 = hs_hm_launcher(&state, + down_warps, + down_warps_log2, + cq); + + hs_barrier(cq); + } + + // launch clean slab grid -- is it the final launch? + hs_bc_launcher(&state, + down_warps, + down_warps_log2, + cq); + + hs_barrier(cq); + + // was this the final block clean? + if (((uint32_t)HS_BS_WARPS << up_scale_log2) >= state.bx.ru) + break; + + // otherwise, merge twice as many slabs + up_scale_log2 += 1; + } + } + + if (linearize) + { + // launch linearize; + hs_transpose_launcher(&state,cq); + + hs_barrier(cq); + } + + HS_EVENT_PROFILE(cq); +} + +// +// +// + +void +hs_create(cl_context context, + cl_device_id device_id, + struct hs_info * const info) +{ + // + // create and build the program from source or a precompiled binary + // + if (info != NULL) + { + info->words = HS_KEY_WORDS; + info->keys = HS_KEYS_PER_LANE; + info->lanes = HS_LANES_PER_WARP; + } + +#if defined( HS_KERNEL_SOURCE ) + + cl_int err; + + size_t const strings_sizeof[] = { sizeof(hs_cl_pre_cl) }; + char const * strings[] = { (char*)hs_cl_pre_cl }; + + cl_program program = clCreateProgramWithSource(context, + 1, + strings, + strings_sizeof, + &err); + cl_ok(err); + + char const * const options = + "-cl-std=CL2.0 -cl-fast-relaxed-math " + "-cl-no-signed-zeros -cl-mad-enable " + "-cl-denorms-are-zero " + "-cl-kernel-arg-info"; + + cl(BuildProgram(program, + 1, + &device_id, + options, + NULL, + NULL)); + +#elif defined( HS_KERNEL_BINARY ) + + cl_int status, err; + + size_t const bins_sizeof[] = { sizeof(hs_cl_pre_ir) }; + unsigned char const * bins[] = { hs_cl_pre_ir }; + + cl_program program = clCreateProgramWithBinary(context, + 1, + &device_id, + bins_sizeof, + bins, + &status, + &err); + cl_ok(err); + + cl(BuildProgram(program, + 1, + &device_id, + NULL, + NULL, + NULL)); +#endif + + // + // create all the kernels and release the program + // +#define HS_CREATE_KERNELS(ks) \ + for (uint32_t ii=0; ii<ARRAY_LENGTH(ks); ii++) { \ + ks[ii].kernel = clCreateKernel(program,ks[ii].name,&err); \ + cl_ok(err); \ + } + + HS_CREATE_KERNELS(bs_kernels); + HS_CREATE_KERNELS(bc_kernels); + HS_CREATE_KERNELS(fm_kernels); + HS_CREATE_KERNELS(hm_kernels); + HS_CREATE_KERNELS(transpose_kernels); + + cl(ReleaseProgram(program)); +} + +// +// +// + +void +hs_release() +{ +#define HS_RELEASE_KERNELS(ks) \ + for (uint32_t ii=0; ii<ARRAY_LENGTH(ks); ii++) \ + cl(ReleaseKernel(ks[ii].kernel)) + + HS_RELEASE_KERNELS(bs_kernels); + HS_RELEASE_KERNELS(bc_kernels); + HS_RELEASE_KERNELS(fm_kernels); + HS_RELEASE_KERNELS(hm_kernels); + HS_RELEASE_KERNELS(transpose_kernels); +} + +// +// +// diff --git a/src/compute/hs/cl/hs_cl_launcher.h b/src/compute/hs/cl/hs_cl_launcher.h new file mode 100644 index 0000000000..049657cc2f --- /dev/null +++ b/src/compute/hs/cl/hs_cl_launcher.h @@ -0,0 +1,78 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> +#include <stdint.h> +#include <stdbool.h> + +// +// Returns some useful info about algorithm's configuration for the +// target architecture. +// + +struct hs_info +{ + uint32_t words; // words-per-key (1 = uint, 2 = ulong) + uint32_t keys; // keys-per-lane + uint32_t lanes; // lanes-per-warp +}; + +// +// +// + +void +hs_create(cl_context context, + cl_device_id device_id, + struct hs_info * const info); + +// +// +// + +void +hs_release(); + +// +// Size the buffers. +// + +void +hs_pad(uint32_t const count, + uint32_t * const count_padded_in, + uint32_t * const count_padded_out); + +// +// Sort the keys in the vin buffer and store them in the vout buffer. +// +// The vin and vout buffers can be the same buffer. +// +// If it is necessary, a barrier should be enqueued before running +// hs_sort(). +// +// A final barrier will enqueued before returning. +// + +void +hs_sort(cl_command_queue cq, // out-of-order cq + cl_mem vin, + cl_mem vout, + uint32_t const count, + uint32_t const count_padded_in, + uint32_t const count_padded_out, + bool const linearize); + +// +// +// diff --git a/src/compute/hs/gen/Makefile b/src/compute/hs/gen/Makefile new file mode 100644 index 0000000000..4370f9ec3b --- /dev/null +++ b/src/compute/hs/gen/Makefile @@ -0,0 +1,30 @@ +#
+# Copyright 2016 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can
+# be found in the LICENSE file.
+#
+
+#BINS = hotsort_cuda.cubin hotsort_igp.hsw.ir hotsort_igp.bdw.ir
+#SRCS = hotsort_cuda.cu hotsort_igp.hsw.cl hotsort_igp.bdw.cl
+
+GEN_SRCS = hs_igp.cl hs_igp.h
+GEN_BINS = hs_igp.ir
+
+#
+#
+#
+
+all: $(GEN_BINS)
+
+clean:
+ -rm -f $(GEN_SRCS) $(GEN_BINS)
+
+$(GEN_SRCS):
+ ..\bin\x64\Debug\hs_gen -a 2 -s 32768 -w 8 -t 2 -b 28 -r 16 -f 1 -F 2 -c 1 -C 2 -z
+ astyle -ns2 $(addprefix ./, $(GEN_SRCS))
+
+
+hs_igp.ir: hs_igp.cl
+ ioc32 -cmd=build -input=hs_igp.cl -device=gpu
+
diff --git a/src/compute/hs/gen/gen.h b/src/compute/hs/gen/gen.h new file mode 100644 index 0000000000..4043a8df5c --- /dev/null +++ b/src/compute/hs/gen/gen.h @@ -0,0 +1,312 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <stdio.h> +#include <stdint.h> + +// +// +// + +#define MERGE_LEVELS_MAX_LOG2 7 // merge up to 128 warps +#define MERGE_LEVELS_MAX_SIZE (1 << MERGE_LEVELS_MAX_LOG2) // ((1 << MERGE_MAX_LOG2) - 1) // incorrect debug error + +// +// +// + +struct hsg_config +{ + struct { + + struct { + uint32_t lo; + uint32_t hi; + } flip; + + struct { + uint32_t lo; + uint32_t hi; + } half; + + uint32_t max_log2; + + } merge; + + struct { + uint32_t warps_min; + uint32_t warps_max; + uint32_t warps_mod; + + uint32_t smem_min; + uint32_t smem_quantum; + + uint32_t smem_bs; + uint32_t smem_bc; + } block; + + struct { + uint32_t lanes; + uint32_t skpw_bs; + } warp; + + struct { + uint32_t regs; + uint32_t xtra; + } thread; + + struct { + uint32_t words; + } type; +}; + +// +// +// + +struct hsg_level +{ + uint32_t count; // networks >= 2 + + uint32_t diffs [2]; + uint32_t diff_masks [2]; + uint32_t evenodds [2]; + uint32_t evenodd_masks[2]; + uint32_t networks [2]; + + union { + uint64_t b64; + uint32_t b32a2[2]; + } active; +}; + + +struct hsg_merge +{ + uint32_t offsets [MERGE_LEVELS_MAX_SIZE]; + uint32_t networks[MERGE_LEVELS_MAX_SIZE]; + + struct hsg_level levels[MERGE_LEVELS_MAX_LOG2]; + + uint32_t index; + + uint32_t warps; + + uint32_t rows_bs; + uint32_t rows_bc; + + uint32_t skpw_bc; +}; + +// +// +// + +#define HSG_FILE_NAME_SIZE 80 + +struct hsg_file +{ + FILE * file; + char const * prefix; + char name[HSG_FILE_NAME_SIZE]; +}; + +// +// +// + +typedef enum hsg_kernel_type { + + HSG_KERNEL_TYPE_SORT_BLOCK, + + HSG_KERNEL_TYPE_COUNT + +} hsg_kernel_type; + +// +// +// + +typedef enum hsg_file_type { + + HSG_FILE_TYPE_HEADER, + HSG_FILE_TYPE_SOURCE, + + HSG_FILE_TYPE_COUNT + +} hsg_file_type; + +// +// +// + +#define HSG_OP_EXPAND_ALL() \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_EXIT) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_END) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BEGIN) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_ELSE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FILE_HEADER) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FILE_FOOTER) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_DUMMY_KERNEL) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_TRANSPOSE_KERNEL_PROTO) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_TRANSPOSE_KERNEL_PREAMBLE) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_TRANSPOSE_KERNEL_BODY) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_KERNEL_PROTO) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_KERNEL_PREAMBLE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BC_KERNEL_PROTO) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BC_KERNEL_PREAMBLE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_KERNEL_PROTO) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_KERNEL_PREAMBLE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_HM_KERNEL_PROTO) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_HM_KERNEL_PREAMBLE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BX_REG_GLOBAL_LOAD) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BX_REG_GLOBAL_STORE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_LEFT) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_REG_GLOBAL_STORE_LEFT) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_RIGHT) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_REG_GLOBAL_STORE_RIGHT) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_HM_REG_GLOBAL_LOAD) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_HM_REG_GLOBAL_STORE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_WARP_FLIP) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_WARP_HALF) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_CMP_FLIP) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_CMP_HALF) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_CMP_XCHG) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_REG_SHARED_STORE_V) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_REG_SHARED_LOAD_V) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BC_REG_SHARED_LOAD_V) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BX_REG_SHARED_STORE_LEFT) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_REG_SHARED_STORE_RIGHT) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_REG_SHARED_LOAD_LEFT) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_REG_SHARED_LOAD_RIGHT) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BC_REG_GLOBAL_LOAD_LEFT) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BLOCK_SYNC) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_FRAC_PRED) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_MERGE_H_PREAMBLE) \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BC_MERGE_H_PREAMBLE) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BX_MERGE_H_PRED) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_BS_ACTIVE_PRED) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_FM_MERGE_RIGHT_PRED) \ + \ + HSG_OP_EXPAND_X(HSG_OP_TYPE_COUNT) + +// +// +// + +#undef HSG_OP_EXPAND_X +#define HSG_OP_EXPAND_X(t) t , + +typedef enum hsg_op_type { + + HSG_OP_EXPAND_ALL() + +} hsg_op_type; + +// +// +// + +struct hsg_op +{ + hsg_op_type type; + + union { + + struct { + int32_t a; + int32_t b; + int32_t c; + }; + + struct { + int32_t n; + int32_t v; + }; + + struct { + int32_t m; + int32_t w; + }; + + }; +}; + +// +// +// + +typedef void (*hsg_target_pfn)(struct hsg_file * const files, + struct hsg_merge const * const merge, + struct hsg_op const * const ops, + uint32_t const depth); + +// +// +// + +extern struct hsg_config hsg_config; +extern struct hsg_merge hsg_merge[MERGE_LEVELS_MAX_LOG2]; + +// +// +// + +extern +void +hsg_target_debug (struct hsg_file * const files, + struct hsg_merge const * const merge, + struct hsg_op const * const ops, + uint32_t const depth); + +extern +void +hsg_target_cuda_sm3x(struct hsg_file * const files, + struct hsg_merge const * const merge, + struct hsg_op const * const ops, + uint32_t const depth); + +extern +void +hsg_target_igp_genx (struct hsg_file * const files, + struct hsg_merge const * const merge, + struct hsg_op const * const ops, + uint32_t const depth); +// +// +// diff --git a/src/compute/hs/gen/main.c b/src/compute/hs/gen/main.c new file mode 100644 index 0000000000..a79c34c08e --- /dev/null +++ b/src/compute/hs/gen/main.c @@ -0,0 +1,1842 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include <getopt.h> + +// +// +// + +#include "networks.h" +#include "macros.h" +#include "util.h" + +// +// +// + +#define HSG_INDENT 2 + +// +// +// + +#undef HSG_OP_EXPAND_X +#define HSG_OP_EXPAND_X(t) #t , + +static +char const * const +hsg_op_type_string[] = + { + HSG_OP_EXPAND_ALL() + }; + +// +// +// + +#define EXIT() (struct hsg_op){ HSG_OP_TYPE_EXIT } + +#define END() (struct hsg_op){ HSG_OP_TYPE_END } +#define BEGIN() (struct hsg_op){ HSG_OP_TYPE_BEGIN } +#define ELSE() (struct hsg_op){ HSG_OP_TYPE_ELSE } + +#define STORE_SLAB_EARLY_EXIT() (struct hsg_op){ HSG_OP_TYPE_STORE_SLAB_EARLY_EXIT } + +#define FILE_HEADER() (struct hsg_op){ HSG_OP_TYPE_FILE_HEADER } +#define FILE_FOOTER() (struct hsg_op){ HSG_OP_TYPE_FILE_FOOTER } + +#define TRANSPOSE_KERNEL_PROTO() (struct hsg_op){ HSG_OP_TYPE_TRANSPOSE_KERNEL_PROTO } +#define TRANSPOSE_KERNEL_PREAMBLE() (struct hsg_op){ HSG_OP_TYPE_TRANSPOSE_KERNEL_PREAMBLE } +#define TRANSPOSE_KERNEL_BODY() (struct hsg_op){ HSG_OP_TYPE_TRANSPOSE_KERNEL_BODY } + +#define BS_KERNEL_PROTO(i) (struct hsg_op){ HSG_OP_TYPE_BS_KERNEL_PROTO, { i } } +#define BS_KERNEL_PREAMBLE(i) (struct hsg_op){ HSG_OP_TYPE_BS_KERNEL_PREAMBLE, { i } } + +#define BC_KERNEL_PROTO(i) (struct hsg_op){ HSG_OP_TYPE_BC_KERNEL_PROTO, { i } } +#define BC_KERNEL_PREAMBLE(i) (struct hsg_op){ HSG_OP_TYPE_BC_KERNEL_PREAMBLE, { i } } + +#define FM_KERNEL_PROTO(l,s) (struct hsg_op){ HSG_OP_TYPE_FM_KERNEL_PROTO, { l, s } } +#define FM_KERNEL_PREAMBLE(w,s) (struct hsg_op){ HSG_OP_TYPE_FM_KERNEL_PREAMBLE, { w, s } } + +#define HM_KERNEL_PROTO(d,w) (struct hsg_op){ HSG_OP_TYPE_HM_KERNEL_PROTO, { d, w } } +#define HM_KERNEL_PREAMBLE(w,s) (struct hsg_op){ HSG_OP_TYPE_HM_KERNEL_PREAMBLE, { w, s } } + +#define BX_REG_GLOBAL_LOAD(n,v) (struct hsg_op){ HSG_OP_TYPE_BX_REG_GLOBAL_LOAD, { n, v } } +#define BX_REG_GLOBAL_STORE(n) (struct hsg_op){ HSG_OP_TYPE_BX_REG_GLOBAL_STORE, { n } } + +#define FM_REG_GLOBAL_LOAD_LEFT(n,i) (struct hsg_op){ HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_LEFT, { n, i } } +#define FM_REG_GLOBAL_STORE_LEFT(n,i) (struct hsg_op){ HSG_OP_TYPE_FM_REG_GLOBAL_STORE_LEFT, { n, i } } +#define FM_REG_GLOBAL_LOAD_RIGHT(n,i) (struct hsg_op){ HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_RIGHT, { n, i } } +#define FM_REG_GLOBAL_STORE_RIGHT(n,i) (struct hsg_op){ HSG_OP_TYPE_FM_REG_GLOBAL_STORE_RIGHT, { n, i } } + +#define HM_REG_GLOBAL_LOAD(n,i) (struct hsg_op){ HSG_OP_TYPE_HM_REG_GLOBAL_LOAD, { n, i } } +#define HM_REG_GLOBAL_STORE(n,i) (struct hsg_op){ HSG_OP_TYPE_HM_REG_GLOBAL_STORE, { n, i } } + +#define WARP_FLIP(f) (struct hsg_op){ HSG_OP_TYPE_WARP_FLIP, { f } } +#define WARP_HALF(h) (struct hsg_op){ HSG_OP_TYPE_WARP_HALF, { h } } + +#define CMP_FLIP(a,b,c) (struct hsg_op){ HSG_OP_TYPE_CMP_FLIP, { a, b, c } } +#define CMP_HALF(a,b) (struct hsg_op){ HSG_OP_TYPE_CMP_HALF, { a, b } } + +#define CMP_XCHG(a,b,p) (struct hsg_op){ HSG_OP_TYPE_CMP_XCHG, { a, b, p } } + +#define BS_REG_SHARED_STORE_V(m,i,r) (struct hsg_op){ HSG_OP_TYPE_BS_REG_SHARED_STORE_V, { m, i, r } } +#define BS_REG_SHARED_LOAD_V(m,i,r) (struct hsg_op){ HSG_OP_TYPE_BS_REG_SHARED_LOAD_V, { m, i, r } } +#define BC_REG_SHARED_LOAD_V(m,i,r) (struct hsg_op){ HSG_OP_TYPE_BC_REG_SHARED_LOAD_V, { m, i, r } } + +#define BX_REG_SHARED_STORE_LEFT(r,i,p) (struct hsg_op){ HSG_OP_TYPE_BX_REG_SHARED_STORE_LEFT, { r, i, p } } +#define BS_REG_SHARED_STORE_RIGHT(r,i,p) (struct hsg_op){ HSG_OP_TYPE_BS_REG_SHARED_STORE_RIGHT, { r, i, p } } + +#define BS_REG_SHARED_LOAD_LEFT(r,i,p) (struct hsg_op){ HSG_OP_TYPE_BS_REG_SHARED_LOAD_LEFT, { r, i, p } } +#define BS_REG_SHARED_LOAD_RIGHT(r,i,p) (struct hsg_op){ HSG_OP_TYPE_BS_REG_SHARED_LOAD_RIGHT, { r, i, p } } + +#define BC_REG_GLOBAL_LOAD_LEFT(r,i,p) (struct hsg_op){ HSG_OP_TYPE_BC_REG_GLOBAL_LOAD_LEFT, { r, i, p } } + +#define REG_F_PREAMBLE(s) (struct hsg_op){ HSG_OP_TYPE_REG_F_PREAMBLE, { s } } +#define REG_SHARED_STORE_F(r,i,s) (struct hsg_op){ HSG_OP_TYPE_REG_SHARED_STORE_F, { r, i, s } } +#define REG_SHARED_LOAD_F(r,i,s) (struct hsg_op){ HSG_OP_TYPE_REG_SHARED_LOAD_F, { r, i, s } } +#define REG_GLOBAL_STORE_F(r,i,s) (struct hsg_op){ HSG_OP_TYPE_REG_GLOBAL_STORE_F, { r, i, s } } + +#define BLOCK_SYNC() (struct hsg_op){ HSG_OP_TYPE_BLOCK_SYNC } + +#define BS_FRAC_PRED(m,w) (struct hsg_op){ HSG_OP_TYPE_BS_FRAC_PRED, { m, w } } + +#define BS_MERGE_H_PREAMBLE(i) (struct hsg_op){ HSG_OP_TYPE_BS_MERGE_H_PREAMBLE, { i } } +#define BC_MERGE_H_PREAMBLE(i) (struct hsg_op){ HSG_OP_TYPE_BC_MERGE_H_PREAMBLE, { i } } + +#define BX_MERGE_H_PRED(p) (struct hsg_op){ HSG_OP_TYPE_BX_MERGE_H_PRED, { p } } + +#define BS_ACTIVE_PRED(m,l) (struct hsg_op){ HSG_OP_TYPE_BS_ACTIVE_PRED, { m, l } } + +#define FM_MERGE_RIGHT_PRED(n,s) (struct hsg_op){ HSG_OP_TYPE_FM_MERGE_RIGHT_PRED, { n, s } } + +// +// DEFAULTS +// + +struct hsg_config hsg_config = // FIXME -- how useful is this? + { + .merge = { + .flip = { + .lo = 1, + .hi = 1 + }, + .half = { + .lo = 1, + .hi = 1 + }, + + .max_log2 = 27 // 2^27th = 128m + }, + + .block = { + .warps_min = 1, // min warps for a block that uses smem barriers + .warps_max = UINT32_MAX, // max warps for the entire multiprocessor + .warps_mod = 2, // the number of warps necessary to load balance horizontal merging + + .smem_min = 0, + .smem_quantum = 1, + + .smem_bs = 49152, + .smem_bc = UINT32_MAX // implies field not set + }, + + .warp = { + .lanes = 32, + }, + + .thread = { + .regs = 24, + .xtra = 0 + }, + + .type = { + .words = 2 + } + }; + +// +// ZERO HSG_MERGE STRUCT +// + +struct hsg_merge hsg_merge[MERGE_LEVELS_MAX_LOG2] = { 0 }; + +// +// +// + +static const hsg_target_pfn hsg_target_pfns[] = + { + hsg_target_debug, + hsg_target_cuda_sm3x, + hsg_target_igp_genx, + // hsg_target_adreno_5xx, + // hsg_target_amd_gcn, + // hsg_target_x86_sse, + // hsg_target_x86_avx2, + }; + +static const char * hsg_target_pfn_string[] = + { + "hs_debug", + "hs_cuda", + "hs_cl" + }; + +static const char * hsg_file_type_string[][2] = + { + { ".h", ".txt" }, + { ".h", ".cu" }, + { ".h", ".cl" } + }; + +// +// +// + +#define HSG_TARGET_PFN_COUNT ARRAY_LENGTH(hsg_target_pfns) + +// +// +// + +static hsg_op_type hsg_op_type_counts[HSG_OP_TYPE_COUNT] = { 0 }; + +// +// +// + +static +void +hsg_op_debug() +{ + for (hsg_op_type t=HSG_OP_TYPE_EXIT; t<HSG_OP_TYPE_COUNT; t++) + fprintf(stderr,"%-37s : %u\n",hsg_op_type_string[t],hsg_op_type_counts[t]); +} + +// +// +// + +static +void +hsg_config_init_shared() +{ + // + // The assumption here is that a proper smem_bs value was provided + // that represents the maximum fraction of the multiprocessor's + // available shared memory that can be accessed by the initial block + // sorting kernel. + // + // With CUDA devices this is 48KB out of 48KB, 64KB or 96KB. + // + // Intel subslices are a little trickier and the minimum allocation + // is 4KB and the maximum is 64KB on pre-Skylake IGPs. Sizes are + // allocated in 1KB increments. If a maximum of two block sorters + // can occupy a subslice then each should be assigned 32KB of shared + // memory. + // + // News Flash: apparently GEN9+ IGPs can allocate 1KB of SMEM per + // workgroup so all the previously written logic to support this + // issue is being removed. + // + uint32_t const bs_keys = hsg_config.block.smem_bs / (hsg_config.type.words * sizeof(uint32_t)); + + hsg_config.warp.skpw_bs = bs_keys / hsg_merge[0].warps; +} + +static +void +hsg_merge_levels_init_shared(struct hsg_merge * const merge) +{ + { + // + // What is the max amount of shared in each possible bs block config? + // + // The provided smem_bs size will be allocated for each sorting block. + // + uint32_t const bs_threads = merge->warps * hsg_config.warp.lanes; + uint32_t const bs_keys = hsg_config.block.smem_bs / (hsg_config.type.words * sizeof(uint32_t)); + uint32_t const bs_kpt = bs_keys / bs_threads; + uint32_t const bs_kpt_mod = (bs_kpt / hsg_config.block.warps_mod) * hsg_config.block.warps_mod; + uint32_t const bs_rows_even = bs_kpt_mod & ~1; // must be even because flip merge only works on row pairs + + // this is a showstopper + if (bs_rows_even < 2) + { + fprintf(stderr,"Error: need at least 2 rows of shared memory.\n"); + exit(-1); + } + + // clamp to number of registers + merge->rows_bs = min(bs_rows_even, hsg_config.thread.regs); + } + + // + // smem key allocation rule for BC kernels is that a single block + // can't allocate more than smem_bs and must allocate at least + // smem_min in smem_quantum steps. + // + // Note that BC blocks will always be less than or equal to BS + // blocks. + // + { + // + // if merge->warps is not pow2 then we're going to skip creating a bc elsewhere + // + uint32_t const bc_warps_min = max(merge->warps,hsg_config.block.warps_min); + uint32_t const bc_threads = bc_warps_min * hsg_config.warp.lanes; + uint32_t const bc_block_rd = (((hsg_config.block.smem_bc * bc_warps_min) / hsg_config.block.warps_max) / + hsg_config.block.smem_quantum) * hsg_config.block.smem_quantum; + uint32_t const bc_block_max = max(bc_block_rd,hsg_config.block.smem_min); + uint32_t const bc_block_smem = min(bc_block_max,hsg_config.block.smem_bs); + + // what is the max amount of shared in each possible bc block config? + uint32_t const bc_keys = bc_block_smem / (hsg_config.type.words * sizeof(uint32_t)); + uint32_t const bc_kpt = bc_keys / bc_threads; + uint32_t const bc_kpt_mod = (bc_kpt / hsg_config.block.warps_mod) * hsg_config.block.warps_mod; + + merge->rows_bc = min(bc_kpt_mod, hsg_config.thread.regs); + merge->skpw_bc = bc_keys / bc_warps_min; + } +} + +// +// +// + +static +void +hsg_merge_levels_init_1(struct hsg_merge * const merge, uint32_t const warps, uint32_t const level, uint32_t const offset) +{ + uint32_t const even_odd = warps & 1; + + merge->levels[level].evenodds[even_odd]++; + merge->levels[level].networks[even_odd] = warps; + + if (warps == 1) + return; + + merge->levels[level].active.b64 |= BITS_TO_MASK_AT_64(warps,offset); + + uint32_t const count = merge->levels[level].count++; + uint32_t const index = (1 << level) + count; + uint32_t const bit = 1 << count; + + merge->levels[level].evenodd_masks[even_odd] |= bit; + + if (count > 0) + { + // offset from network to left of this network + uint32_t const diff = offset - merge->offsets[index-1]; + + uint32_t const diff_0 = merge->levels[level].diffs[0]; + uint32_t const diff_1 = merge->levels[level].diffs[1]; + + uint32_t diff_idx = UINT32_MAX; + + if ((diff_0 == 0) || (diff_0 == diff)) { + diff_idx = 0; + } else if ((diff_1 == 0) || (diff_1 == diff)) { + diff_idx = 1; + } else { + fprintf(stderr, "*** MORE THAN TWO DIFFS ***\n"); + exit(-1); + } + + merge->levels[level].diffs [diff_idx] = diff; + merge->levels[level].diff_masks[diff_idx] |= 1 << (count-1); + } + + merge->networks[index] = warps; + merge->offsets [index] = offset; + + uint32_t const l = (warps+1)/2; // lower/larger on left + uint32_t const r = (warps+0)/2; // higher/smaller on right + + hsg_merge_levels_init_1(merge,l,level+1,offset); + hsg_merge_levels_init_1(merge,r,level+1,offset+l); +} + +static +void +hsg_merge_levels_debug(struct hsg_merge * const merge) +{ + for (uint32_t level=0; level<MERGE_LEVELS_MAX_LOG2; level++) + { + uint32_t count = merge->levels[level].count; + + if (count == 0) + break; + + fprintf(stderr, + "%-4u : %016llX \n", + count, + merge->levels[level].active.b64); + + fprintf(stderr, + "%-4u : %08X (%2u)\n" + "%-4u : %08X (%2u)\n", + merge->levels[level].diffs[0], + merge->levels[level].diff_masks[0], + __popcnt(merge->levels[level].diff_masks[0]), + merge->levels[level].diffs[1], + merge->levels[level].diff_masks[1], + __popcnt(merge->levels[level].diff_masks[1])); + + fprintf(stderr, + "EVEN : %08X (%2u)\n" + "ODD : %08X (%2u)\n", + merge->levels[level].evenodd_masks[0], + __popcnt(merge->levels[level].evenodd_masks[0]), + merge->levels[level].evenodd_masks[1], + __popcnt(merge->levels[level].evenodd_masks[1])); + + for (uint32_t ii=0; ii<2; ii++) + { + if (merge->levels[level].networks[ii] > 1) + { + fprintf(stderr, + "%-4s : ( %2u x %2u )\n", + (ii == 0) ? "EVEN" : "ODD", + merge->levels[level].evenodds[ii], + merge->levels[level].networks[ii]); + } + } + + uint32_t index = 1 << level; + + while (count-- > 0) + { + fprintf(stderr, + "[ %2u %2u ] ", + merge->offsets [index], + merge->networks[index]); + + index += 1; + } + + fprintf(stderr,"\n\n"); + } +} + +static +void +hsg_merge_levels_hint(struct hsg_merge * const merge, bool const autotune) +{ + // clamp against merge levels + for (uint32_t level=0; level<MERGE_LEVELS_MAX_LOG2; level++) + { + // max network + uint32_t const n_max = max(merge->levels[level].networks[0], + merge->levels[level].networks[1]); + + if (n_max <= (merge->rows_bs + hsg_config.thread.xtra)) + break; + + if (autotune) + { + hsg_config.thread.xtra = n_max - merge->rows_bs; + + uint32_t const r_total = hsg_config.thread.regs + hsg_config.thread.xtra; + uint32_t const r_limit = (hsg_config.type.words == 1) ? 120 : 58; + + if (r_total <= r_limit) + { + fprintf(stderr,"autotune: %u + %u\n", + hsg_config.thread.regs, + hsg_config.thread.xtra); + break; + } + else + { + fprintf(stderr,"skipping autotune: %u + %u > %u\n", + hsg_config.thread.regs, + hsg_config.thread.xtra, + r_limit); + exit(-1); + } + } + + fprintf(stderr,"*** HINT *** Try extra registers: %u\n", + n_max - merge->rows_bs); + + exit(-1); + } +} + +// +// +// + +static +struct hsg_op * +hsg_op(struct hsg_op * ops, struct hsg_op const opcode) +{ + hsg_op_type_counts[opcode.type] += 1; + + *ops = opcode; + + return ops+1; +} + +static +struct hsg_op * +hsg_exit(struct hsg_op * ops) +{ + return hsg_op(ops,EXIT()); +} + +static +struct hsg_op * +hsg_end(struct hsg_op * ops) +{ + return hsg_op(ops,END()); +} + +static +struct hsg_op * +hsg_begin(struct hsg_op * ops) +{ + return hsg_op(ops,BEGIN()); +} + +static +struct hsg_op * +hsg_else(struct hsg_op * ops) +{ + return hsg_op(ops,ELSE()); +} + +static +struct hsg_op * +hsg_network_copy(struct hsg_op * ops, + struct hsg_network const * const nets, + uint32_t const idx, + uint32_t const prefix) +{ + uint32_t const len = nets[idx].length; + struct hsg_op const * const cxa = nets[idx].network; + + for (uint32_t ii=0; ii<len; ii++) + { + const struct hsg_op * const cx = cxa + ii; + + ops = hsg_op(ops,CMP_XCHG(cx->a,cx->b,prefix)); + } + + return ops; +} + +static +struct hsg_op * +hsg_thread_sort(struct hsg_op * ops) +{ + uint32_t const idx = hsg_config.thread.regs / 2 - 1; + + return hsg_network_copy(ops,hsg_networks_sorting,idx,UINT32_MAX); +} + +static +struct hsg_op * +hsg_thread_merge_prefix(struct hsg_op * ops, uint32_t const network, uint32_t const prefix) +{ + if (network <= 1) + return ops; + + return hsg_network_copy(ops,hsg_networks_merging,network-2,prefix); +} + +static +struct hsg_op * +hsg_thread_merge(struct hsg_op * ops, uint32_t const network) +{ + return hsg_thread_merge_prefix(ops,network,UINT32_MAX); +} + +static +struct hsg_op * +hsg_thread_merge_offset_prefix(struct hsg_op * ops, uint32_t const offset, uint32_t const network, uint32_t const prefix) +{ + if (network <= 1) + return ops; + + uint32_t const idx = network - 2; + uint32_t const len = hsg_networks_merging[idx].length; + struct hsg_op const * const cxa = hsg_networks_merging[idx].network; + + for (uint32_t ii=0; ii<len; ii++) + { + struct hsg_op const * const cx = cxa + ii; + + ops = hsg_op(ops,CMP_XCHG(offset + cx->a,offset + cx->b,prefix)); + } + + return ops; +} + +static +struct hsg_op * +hsg_thread_merge_offset(struct hsg_op * ops, uint32_t const offset, uint32_t const network) +{ + return hsg_thread_merge_offset_prefix(ops,offset,network,UINT32_MAX); +} + +static +struct hsg_op * +hsg_thread_merge_left_right_prefix(struct hsg_op * ops, uint32_t const left, uint32_t const right, uint32_t const prefix) +{ + for (uint32_t l=left,r=left+1; r<=left+right; l--,r++) + { + ops = hsg_op(ops,CMP_XCHG(l,r,prefix)); + } + + return ops; +} + +static +struct hsg_op * +hsg_thread_merge_left_right(struct hsg_op * ops, uint32_t const left, uint32_t const right) +{ + return hsg_thread_merge_left_right_prefix(ops,left,right,UINT32_MAX); +} + +static +struct hsg_op * +hsg_warp_half_network(struct hsg_op * ops) +{ + uint32_t const n = hsg_config.thread.regs; + + for (uint32_t r=1; r<=n; r++) + ops = hsg_op(ops,CMP_HALF(r-1,r)); + + return ops; +} + +static +struct hsg_op * +hsg_warp_half_downto(struct hsg_op * ops, uint32_t h) +{ + // + // *** from h: downto[f/2,1) + // **** lane_half(h) + // + for (; h > 1; h/=2) + { + ops = hsg_begin(ops); + + ops = hsg_op(ops,WARP_HALF(h)); + ops = hsg_warp_half_network(ops); + + ops = hsg_end(ops); + } + + return ops; +} + +static +struct hsg_op * +hsg_warp_flip_network(struct hsg_op * ops) +{ + uint32_t const n = hsg_config.thread.regs; + + for (uint32_t r=1; r<=n/2; r++) + ops = hsg_op(ops,CMP_FLIP(r-1,r,n+1-r)); + + return ops; +} + +static +struct hsg_op * +hsg_warp_flip(struct hsg_op * ops, uint32_t f) +{ + ops = hsg_begin(ops); + + ops = hsg_op(ops,WARP_FLIP(f)); + ops = hsg_warp_flip_network(ops); + + ops = hsg_end(ops); + + return ops; +} + +static +struct hsg_op * +hsg_bx_warp_load(struct hsg_op * ops, const int32_t vin_or_vout) +{ + uint32_t const n = hsg_config.thread.regs; + + for (uint32_t r=1; r<=n; r++) + ops = hsg_op(ops,BX_REG_GLOBAL_LOAD(r,vin_or_vout)); + + return ops; +} + +static +struct hsg_op * +hsg_bx_warp_store(struct hsg_op * ops) +{ + uint32_t const n = hsg_config.thread.regs; + + for (uint32_t r=1; r<=n; r++) + ops = hsg_op(ops,BX_REG_GLOBAL_STORE(r)); + + return ops; +} + +// +// +// + +static +struct hsg_op * +hsg_warp_transpose(struct hsg_op * ops) +{ + // func proto + ops = hsg_op(ops,TRANSPOSE_KERNEL_PROTO()); + + // begin + ops = hsg_begin(ops); + + // preamble + ops = hsg_op(ops,TRANSPOSE_KERNEL_PREAMBLE()); + + // load + ops = hsg_bx_warp_load(ops,1); // 1 = load from vout[] + + // emit transpose blend and remap macros ... + ops = hsg_op(ops,TRANSPOSE_KERNEL_BODY()); + + // ... done! + ops = hsg_end(ops); + + return ops; +} + +// +// +// + +static +struct hsg_op * +hsg_warp_half(struct hsg_op * ops, uint32_t const h) +{ + // + // *** from h: downto[f/2,1) + // **** lane_half(h) + // *** thread_merge + // + ops = hsg_warp_half_downto(ops,h); + ops = hsg_thread_merge(ops,hsg_config.thread.regs); + + return ops; +} + +static +struct hsg_op * +hsg_warp_merge(struct hsg_op * ops) +{ + // + // * from f: upto[2,warp.lanes] + // ** lane_flip(f) + // *** from h: downto[f/2,1) + // **** lane_half(h) + // *** thread_merge + // + uint32_t const level = hsg_config.warp.lanes; + + for (uint32_t f=2; f<=level; f*=2) + { + ops = hsg_warp_flip(ops,f); + ops = hsg_warp_half(ops,f/2); + } + + return ops; +} + +// +// +// + +static +struct hsg_op * +hsg_bc_half_merge_level(struct hsg_op * ops, + struct hsg_merge const * const merge, + uint32_t const r_lo, + uint32_t const s_count) +{ + // guaranteed to be an even network + uint32_t const net_even = merge->levels[0].networks[0]; + + // min of warps in block and remaining horizontal rows + uint32_t const active = min(s_count, net_even); + + // conditional on blockIdx.x + if (active < merge->warps) + ops = hsg_op(ops,BX_MERGE_H_PRED(active)); // FIXME BX_MERGE + + // body begin + ops = hsg_begin(ops); + + // scale for min block + uint32_t const scale = net_even >= hsg_config.block.warps_min ? 1 : hsg_config.block.warps_min / net_even; + + // loop if more smem rows than warps + for (uint32_t rr=0; rr<s_count; rr+=active) + { + // body begin + ops = hsg_begin(ops); + + // skip down slab + uint32_t const gmem_base = r_lo - 1 + rr; + + // load registers horizontally -- striding across slabs + for (uint32_t ll=1; ll<=net_even; ll++) + ops = hsg_op(ops,BC_REG_GLOBAL_LOAD_LEFT(ll,gmem_base+(ll-1)*hsg_config.thread.regs,0)); + + // merge all registers + ops = hsg_thread_merge_prefix(ops,net_even,0); + + // if we're looping then there is a base + uint32_t const smem_base = rr * net_even * scale; + + // store all registers + for (uint32_t ll=1; ll<=net_even; ll++) + ops = hsg_op(ops,BX_REG_SHARED_STORE_LEFT(ll,smem_base+ll-1,0)); + + // body end + ops = hsg_end(ops); + } + + // body end + ops = hsg_end(ops); + + return ops; +} + +static +struct hsg_op * +hsg_bc_half_merge(struct hsg_op * ops, struct hsg_merge const * const merge) +{ + // + // will only be called with merge->warps >= 2 + // + uint32_t const warps = max(merge->warps,hsg_config.block.warps_min); + + // guaranteed to be an even network + uint32_t const net_even = merge->levels[0].networks[0]; + + // set up left SMEM pointer + ops = hsg_op(ops,BC_MERGE_H_PREAMBLE(merge->index)); + + // trim to number of warps in block -- FIXME -- try make this a + // multiple of local processor count (Intel = 8, NVIDIA = 4) + uint32_t const s_max = merge->rows_bc; + + // for all the registers + for (uint32_t r_lo = 1; r_lo <= hsg_config.thread.regs; r_lo += s_max) + { + // compute store count + uint32_t const r_rem = hsg_config.thread.regs + 1 - r_lo; + uint32_t const s_count = min(s_max,r_rem); + + // block sync -- can skip if first + if (r_lo > 1) + ops = hsg_op(ops,BLOCK_SYNC()); + + // merge loop + ops = hsg_bc_half_merge_level(ops,merge,r_lo,s_count); + + // block sync + ops = hsg_op(ops,BLOCK_SYNC()); + + // load rows from shared + for (uint32_t c=0; c<s_count; c++) + ops = hsg_op(ops,BC_REG_SHARED_LOAD_V(warps,r_lo+c,c)); + } + + return ops; +} + +// +// +// + +static +struct hsg_op * +hsg_bs_flip_merge_level(struct hsg_op * ops, + struct hsg_merge const * const merge, + uint32_t const level, + uint32_t const s_pairs) +{ + // + // Note there are a number of ways to flip merge these warps. There + // is a magic number in the merge structure that indicates which + // warp to activate as well as what network size to invoke. + // + // This more complex scheme was used in the past. + // + // The newest scheme is far dumber/simpler and simply directs a warp + // to gather up the network associated with a row and merge them. + // + // This scheme may use more registers per thread but not all + // compilers are high quality. + // + // If there are more warps than smem row pairs to merge then we + // disable the spare warps. + // + // If there are more row pairs than warps then each warp works on + // an equal number of rows. + // + // Note that it takes two warps to flip merge two smem rows. + // + // FIXME -- We may want to apply the warp smem "mod" value here to + // attempt to balance the load>merge>store operations across the + // multiprocessor cores. + // + // FIXME -- the old scheme attempted to keep all the warps active + // but the iteration logic was more complex. See 2016 checkins. + // + + // where are we in computed merge? + uint32_t const count = merge->levels[level].count; + uint32_t const index = 1 << level; + + uint32_t s_rows = s_pairs * 2; + uint32_t base = 0; + + while (s_rows > 0) + { + uint32_t active = merge->warps; + + // disable warps if necessary + if (merge->warps > s_rows) { + active = s_rows; + ops = hsg_op(ops,BX_MERGE_H_PRED(active)); + } + + // body begin + ops = hsg_begin(ops); + + // how many equal number of rows to merge? + uint32_t loops = s_rows / active; + + // decrement + s_rows -= loops * active; + + for (uint32_t ss=0; ss<loops; ss++) + { + // load all registers + for (uint32_t ii=0; ii<count; ii++) + { + // body begin + ops = hsg_begin(ops); + + uint32_t const offset = merge->offsets [index+ii]; + uint32_t const network = merge->networks[index+ii]; + uint32_t const lo = (network + 1) / 2; + + for (uint32_t ll=1; ll<=lo; ll++) + ops = hsg_op(ops,BS_REG_SHARED_LOAD_LEFT(ll,base+offset+ll-1,ii)); + + for (uint32_t rr=lo+1; rr<=network; rr++) + ops = hsg_op(ops,BS_REG_SHARED_LOAD_RIGHT(rr,base+offset+rr-1,ii)); + + // compare left and right + ops = hsg_thread_merge_left_right_prefix(ops,lo,network-lo,ii); + + // right merging network + ops = hsg_thread_merge_offset_prefix(ops,lo,network-lo,ii); + + // left merging network + ops = hsg_thread_merge_prefix(ops,lo,ii); + + for (uint32_t ll=1; ll<=lo; ll++) + ops = hsg_op(ops,BX_REG_SHARED_STORE_LEFT(ll,base+offset+ll-1,ii)); + + for (uint32_t rr=lo+1; rr<=network; rr++) + ops = hsg_op(ops,BS_REG_SHARED_STORE_RIGHT(rr,base+offset+rr-1,ii)); + + // body end + ops = hsg_end(ops); + } + + base += active * merge->warps; + } + + // body end + ops = hsg_end(ops); + } + + return ops; +} + +static +struct hsg_op * +hsg_bs_flip_merge(struct hsg_op * ops, struct hsg_merge const * const merge) +{ + // set up horizontal smem pointer + ops = hsg_op(ops,BS_MERGE_H_PREAMBLE(merge->index)); + + // begin merge + uint32_t level = MERGE_LEVELS_MAX_LOG2; + + while (level-- > 0) + { + uint32_t const count = merge->levels[level].count; + + if (count == 0) + continue; + + uint32_t const r_mid = hsg_config.thread.regs/2 + 1; + uint32_t const s_pairs_max = merge->rows_bs/2; // this is warp mod + + // for all the registers + for (uint32_t r_lo=1; r_lo<r_mid; r_lo+=s_pairs_max) + { + uint32_t r_hi = hsg_config.thread.regs + 1 - r_lo; + + // compute store count + uint32_t const s_pairs = min(s_pairs_max,r_mid - r_lo); + + // store rows to shared + for (uint32_t c=0; c<s_pairs; c++) + { + ops = hsg_op(ops,BS_REG_SHARED_STORE_V(merge->index,r_lo+c,c*2+0)); + ops = hsg_op(ops,BS_REG_SHARED_STORE_V(merge->index,r_hi-c,c*2+1)); + } + + // block sync + ops = hsg_op(ops,BLOCK_SYNC()); + + // merge loop + ops = hsg_bs_flip_merge_level(ops,merge,level,s_pairs); + + // block sync + ops = hsg_op(ops,BLOCK_SYNC()); + + // load rows from shared + for (uint32_t c=0; c<s_pairs; c++) + { + ops = hsg_op(ops,BS_REG_SHARED_LOAD_V(merge->index,r_lo+c,c*2+0)); + ops = hsg_op(ops,BS_REG_SHARED_LOAD_V(merge->index,r_hi-c,c*2+1)); + } + } + + // conditionally clean -- no-op if equal to number of warps/block + if (merge->levels[level].active.b64 != BITS_TO_MASK_64(merge->warps)) + ops = hsg_op(ops,BS_ACTIVE_PRED(merge->index,level)); + + // clean warp + ops = hsg_begin(ops); + ops = hsg_warp_half(ops,hsg_config.warp.lanes); + ops = hsg_end(ops); + } + + return ops; +} + +/* + +// +// DELETE ME WHEN READY +// + +static +struct hsg_op * +hsg_bs_flip_merge_all(struct hsg_op * ops, const struct hsg_merge * const merge) +{ + for (uint32_t merge_idx=0; merge_idx<MERGE_LEVELS_MAX_LOG2; merge_idx++) + { + const struct hsg_merge* const m = merge + merge_idx; + + if (m->warps < 2) + break; + + ops = hsg_op(ops,BS_FRAC_PRED(merge_idx,m->warps)); + ops = hsg_begin(ops); + ops = hsg_bs_flip_merge(ops,m); + ops = hsg_end(ops); + } + + return ops; +} +*/ + +// +// GENERATE SORT KERNEL +// + +static +struct hsg_op * +hsg_bs_sort(struct hsg_op * ops, const struct hsg_merge * const merge) +{ + // func proto + ops = hsg_op(ops,BS_KERNEL_PROTO(merge->index)); + + // begin + ops = hsg_begin(ops); + + // shared declare + ops = hsg_op(ops,BS_KERNEL_PREAMBLE(merge->index)); + + // load + ops = hsg_bx_warp_load(ops,0); // 0 = load from vin[] + + // thread sorting network + ops = hsg_thread_sort(ops); + + // warp merging network + ops = hsg_warp_merge(ops); + + // slab merging network + if (merge->warps > 1) + ops = hsg_bs_flip_merge(ops,merge); + + // store + ops = hsg_bx_warp_store(ops); + + // end + ops = hsg_end(ops); + + return ops; +} + +// +// GENERATE SORT KERNELS +// + +static +struct hsg_op * +hsg_bs_sort_all(struct hsg_op * ops) +{ + for (uint32_t merge_idx=0; merge_idx<MERGE_LEVELS_MAX_LOG2; merge_idx++) + { + const struct hsg_merge* const m = hsg_merge + merge_idx; + + if (m->warps == 0) + break; + + ops = hsg_bs_sort(ops,m); + } + + return ops; +} + +// +// GENERATE CLEAN KERNEL FOR A POWER-OF-TWO +// + +static +struct hsg_op * +hsg_bc_clean(struct hsg_op * ops, const struct hsg_merge * const merge) +{ + // func proto + ops = hsg_op(ops,BC_KERNEL_PROTO(merge->index)); + + // begin + ops = hsg_begin(ops); + + // shared declare + ops = hsg_op(ops,BC_KERNEL_PREAMBLE(merge->index)); + + // if warps == 1 then smem isn't used for merging + if (merge->warps == 1) + { + // load slab directly + ops = hsg_bx_warp_load(ops,1); // load from vout[] + } + else + { + // block merging network -- strided load of slabs + ops = hsg_bc_half_merge(ops,merge); + } + + // clean warp + ops = hsg_begin(ops); + ops = hsg_warp_half(ops,hsg_config.warp.lanes); + ops = hsg_end(ops); + + // store + ops = hsg_bx_warp_store(ops); + + // end + ops = hsg_end(ops); + + return ops; +} + +// +// GENERATE CLEAN KERNELS +// + +static +struct hsg_op * +hsg_bc_clean_all(struct hsg_op * ops) +{ + for (uint32_t merge_idx=0; merge_idx<MERGE_LEVELS_MAX_LOG2; merge_idx++) + { + const struct hsg_merge* const m = hsg_merge + merge_idx; + + if (m->warps == 0) + break; + + // only generate pow2 clean kernels less than or equal to max + // warps in block with the assumption that we would've generated + // a wider sort kernel if we could've so a wider clean kernel + // isn't a feasible size + if (!is_pow2_u32(m->warps)) + continue; + + ops = hsg_bc_clean(ops,m); + } + + return ops; +} + +// +// GENERATE FLIP MERGE KERNEL +// + +static +struct hsg_op * +hsg_fm_thread_load_left(struct hsg_op * ops, uint32_t const n) +{ + uint32_t const mid = n/2; + + for (uint32_t r=1; r<=mid; r++) + ops = hsg_op(ops,FM_REG_GLOBAL_LOAD_LEFT(r,r-1)); + + return ops; +} + +static +struct hsg_op * +hsg_fm_thread_store_left(struct hsg_op * ops, uint32_t const n) +{ + uint32_t const mid = n/2; + + for (uint32_t r=mid; r>=1; r--) + ops = hsg_op(ops,FM_REG_GLOBAL_STORE_LEFT(r,r-1)); + + return ops; +} + +static +struct hsg_op * +hsg_fm_thread_load_right(struct hsg_op * ops, uint32_t const n, uint32_t const span_right) +{ + uint32_t const mid = n / 2; + uint32_t const first = mid + 1; + uint32_t const last = mid + span_right; + + for (uint32_t r=first; r<=last; r++) + ops = hsg_op(ops,FM_REG_GLOBAL_LOAD_RIGHT(r,r-first)); + + return ops; +} + +static +struct hsg_op * +hsg_fm_thread_store_right(struct hsg_op * ops, uint32_t const n, uint32_t const span_right) +{ + uint32_t const mid = n / 2; + uint32_t const first = mid + 1; + uint32_t const last = mid + span_right; + + for (uint32_t r=last; r>=first; r--) + ops = hsg_op(ops,FM_REG_GLOBAL_STORE_RIGHT(r,r-first)); + + return ops; +} + +static +struct hsg_op * +hsg_fm_thread_merge_right(struct hsg_op * ops, uint32_t const n, uint32_t const span_right) +{ + // conditional + ops = hsg_op(ops,FM_MERGE_RIGHT_PRED(n/2,span_right)); + + // begin + ops = hsg_begin(ops); + + // load + ops = hsg_fm_thread_load_right(ops,n,span_right); + + // compare left and right + ops = hsg_thread_merge_left_right(ops,n/2,span_right); + + // right merging network + ops = hsg_thread_merge_offset(ops,n/2,span_right); + + // store + ops = hsg_fm_thread_store_right(ops,n,span_right); + + // end + ops = hsg_end(ops); + + return ops; +} + +static +struct hsg_op * +hsg_fm_thread_merge_right_all(struct hsg_op * ops, uint32_t const span) +{ + ops = hsg_fm_thread_merge_right(ops,span,span/2); + + for (uint32_t span_pow2 = pow2_ru_u32(span) / 4; span_pow2 >= 1; span_pow2 /= 2) + { + ops = hsg_fm_thread_merge_right(ops,span,span_pow2); + } + + return ops; +} + +static +struct hsg_op * +hsg_fm_merge(struct hsg_op * ops, uint32_t const level, uint32_t const span, uint32_t const fm_scale) +{ + // func proto + ops = hsg_op(ops,FM_KERNEL_PROTO(level,fm_scale)); + + // begin + ops = hsg_begin(ops); + + // shared declare + ops = hsg_op(ops,FM_KERNEL_PREAMBLE(span,fm_scale)); + + // load + ops = hsg_fm_thread_load_left(ops,span); + + // right merging network + ops = hsg_fm_thread_merge_right_all(ops,span); + + // left merging network + ops = hsg_thread_merge(ops,span/2); + + // store + ops = hsg_fm_thread_store_left(ops,span); + + // end + ops = hsg_end(ops); + + return ops; +} + +// +// GENERATE HALF MERGE KERNELS +// + +static +struct hsg_op * +hsg_hm_thread_load(struct hsg_op * ops, uint32_t const n) +{ + for (uint32_t r=1; r<=n; r++) + ops = hsg_op(ops,HM_REG_GLOBAL_LOAD(r,r-1)); + + return ops; +} + +static +struct hsg_op * +hsg_hm_thread_store(struct hsg_op * ops, uint32_t const n) +{ + for (uint32_t r=n; r>=1; r--) + ops = hsg_op(ops,HM_REG_GLOBAL_STORE(r,r-1)); + + return ops; +} + +static +struct hsg_op * +hsg_hm_merge(struct hsg_op * ops, uint32_t const level, uint32_t const span, uint32_t const hm_scale) +{ + // func proto + ops = hsg_op(ops,HM_KERNEL_PROTO(level,level-msb_idx_u32(span))); + + // begin + ops = hsg_begin(ops); + + // declarations + ops = hsg_op(ops,HM_KERNEL_PREAMBLE(span,hm_scale)); + + // load + ops = hsg_hm_thread_load(ops,span); + + // thread merging network + ops = hsg_thread_merge(ops,span); + + // store + ops = hsg_hm_thread_store(ops,span); + + // end + ops = hsg_end(ops); + + return ops; +} + +// +// +// + +static +struct hsg_op * +hsg_fm_merge_level(struct hsg_op * ops, uint32_t const level) +{ + uint32_t const bc_max = pow2_rd_u32(hsg_merge[0].warps); + uint32_t const bc_max_log2 = msb_idx_u32(bc_max); + + uint32_t const fm_level = (level <= bc_max_log2) ? hsg_config.merge.flip.lo : min(level - bc_max_log2,hsg_config.merge.flip.hi); + uint32_t const fm_scale = level - fm_level; + + ops = hsg_fm_merge(ops, + level, + hsg_merge[0].warps * (1u << fm_level), + fm_scale); + + return ops; +} + +// +// +// + +static +struct hsg_op * +hsg_hm_merge_level(struct hsg_op * ops, uint32_t const level) +{ + uint32_t const bc_max = pow2_rd_u32(hsg_merge[0].warps); + uint32_t const bc_max_log2 = msb_idx_u32(bc_max); + + uint32_t const fm_log2_max = bc_max_log2 + hsg_config.merge.flip.hi; + + if (level > fm_log2_max) + { + uint32_t const down_warps_log2 = level - fm_log2_max; + uint32_t const hm_level = max(hsg_config.merge.half.lo,min(hsg_config.merge.half.hi,down_warps_log2)); + + ops = hsg_hm_merge(ops, + level - hsg_config.merge.flip.hi, + bc_max * (1u << hm_level), + down_warps_log2 - hm_level); + } + + return ops; +} + +// +// GENERATE MERGE KERNELS +// + +static +struct hsg_op * +hsg_xm_merge_all(struct hsg_op * ops) +{ + uint32_t const keys_per_block = hsg_merge[0].warps * hsg_config.warp.lanes * hsg_config.thread.regs; + uint32_t const blocks = ((1U << hsg_config.merge.max_log2) + keys_per_block - 1) / keys_per_block; + uint32_t const blocks_ru = pow2_ru_u32(blocks); + uint32_t const blocks_log2 = msb_idx_u32(blocks_ru); + + for (uint32_t level=1; level<=blocks_log2; level+=1) + { + // + // GENERATE FLIP MERGE KERNELS + // + ops = hsg_fm_merge_level(ops,level); + + // + // GENERATE HALF MERGE KERNELS + // + ops = hsg_hm_merge_level(ops,level); + } + + return ops; +} + +// +// +// + +void +hsg_target_indent(struct hsg_file * const files, uint32_t const depth) +{ + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%*s", + depth*HSG_INDENT,""); +} + +void +hsg_target_debug(struct hsg_file * const files, + const struct hsg_merge * const merge, + const struct hsg_op * const ops, + uint32_t const depth) +{ + + hsg_target_indent(files,depth); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s\n", + hsg_op_type_string[ops->type]); +} + +// +// +// + +static +struct hsg_file* +hsg_files_open(const char * prefix, const char ** suffix) +{ +#define STR_BUF_SIZE 80 + + struct hsg_file * files = malloc(sizeof(struct hsg_file) * HSG_FILE_TYPE_COUNT); + + for (int32_t ii=0; ii<HSG_FILE_TYPE_COUNT; ii++) + { + char * name = files[ii].name; + + // save prefix + files[ii].prefix = prefix; + + // build filename + strcpy_s(name,STR_BUF_SIZE,prefix); + strcat_s(name,STR_BUF_SIZE,suffix[ii]); + + // open file + fopen_s(&files[ii].file,name,"w+"); + } + + return files; +} + +static +void +hsg_files_close(struct hsg_file * files) +{ + for (int32_t ii=0; ii<HSG_FILE_TYPE_COUNT; ii++) + fclose(files[ii].file); +} + +// +// +// + +static +const struct hsg_op * +hsg_op_translate_depth(hsg_target_pfn target_pfn, + struct hsg_file * const files, + const struct hsg_merge * const merge, + const struct hsg_op * ops, + uint32_t const depth) +{ + while (ops->type != HSG_OP_TYPE_EXIT) + { + switch (ops->type) + { + case HSG_OP_TYPE_END: + target_pfn(files,merge,ops,depth-1); + return ops + 1; + + case HSG_OP_TYPE_BEGIN: + target_pfn(files,merge,ops,depth); + ops = hsg_op_translate_depth(target_pfn,files,merge,ops+1,depth+1); + break; + + default: + target_pfn(files,merge,ops++,depth); + } + } + + return ops; +} + +static +void +hsg_op_translate(hsg_target_pfn target_pfn, + struct hsg_file * const files, + const struct hsg_merge * const merge, + const struct hsg_op * ops) +{ + hsg_op_translate_depth(target_pfn,files,merge,ops,0); +} + +// +// +// + +int +main(int argc, char * argv[]) +{ + // + // INIT + // + for (uint32_t ii=0; ii<=MERGE_LEVELS_MAX_LOG2; ii++) + { + hsg_merge[ii].index = ii; + hsg_merge[ii].warps = 32 / (1u << ii); + } + + // + // PROCESS OPTIONS + // + int32_t arch = 0; + int32_t opt = 0; + + bool quiet = false; + bool autotune = false; + + while ((opt = getopt(argc,argv,"hqa:g:G:s:S:w:b:B:m:M:k:r:x:t:f:F:c:C:z")) != EOF) + { + switch (opt) + { + case 'h': + fprintf(stderr,"Help goes here...\n"); + return -1; + + case 'q': + quiet = true; + break; + + case 'a': + arch = atoi(optarg); + break; + + case 'g': + hsg_config.block.smem_min = atoi(optarg); + break; + + case 'G': + hsg_config.block.smem_quantum = atoi(optarg); + break; + + case 's': + hsg_config.block.smem_bs = atoi(optarg); + + // set smem_bc if not already set + if (hsg_config.block.smem_bc == UINT32_MAX) + hsg_config.block.smem_bc = hsg_config.block.smem_bs; + break; + + case 'S': + hsg_config.block.smem_bc = atoi(optarg); + break; + + case 'w': + hsg_config.warp.lanes = atoi(optarg); + break; + + case 'b': + // maximum warps in a workgroup / cta / thread block + { + uint32_t const warps = atoi(optarg); + uint32_t const warps_ru_pow2 = pow2_ru_u32(warps); + + // set warps_max if not already set + if (hsg_config.block.warps_max == UINT32_MAX) + hsg_config.block.warps_max = warps_ru_pow2; + + // must always be even + if ((warps&1) != 0) + { + fprintf(stderr,"Error: -b must be even.\n"); + exit(-1); + } + + hsg_merge[0].warps = warps; + + for (uint32_t ii=1; ii<=MERGE_LEVELS_MAX_LOG2; ii++) + hsg_merge[ii].warps = warps_ru_pow2 / (1u << ii); + } + break; + + case 'B': + // maximum warps that can fit in a multiprocessor + hsg_config.block.warps_max = atoi(optarg); + break; + + case 'm': + // blocks using smem barriers must at least this many warps + hsg_config.block.warps_min = atoi(optarg); + break; + + case 'M': + // the number of warps necessary to load balance horizontal merging + hsg_config.block.warps_mod = atoi(optarg); + break; + + case 'k': + hsg_config.merge.max_log2 = atoi(optarg); + break; + + case 'r': + { + uint32_t const regs = atoi(optarg); + + if ((regs&1) != 0) + { + fprintf(stderr,"Error: -r must be even.\n"); + exit(-1); + } + + hsg_config.thread.regs = regs; + } + break; + + case 'x': + hsg_config.thread.xtra = atoi(optarg); + break; + + case 't': + hsg_config.type.words = atoi(optarg); + break; + + case 'f': + hsg_config.merge.flip.lo = atoi(optarg); + break; + + case 'F': + hsg_config.merge.flip.hi = atoi(optarg); + break; + + case 'c': + hsg_config.merge.half.lo = atoi(optarg); + break; + + case 'C': + hsg_config.merge.half.hi = atoi(optarg); + break; + + case 'z': + autotune = true; + break; + } + } + + // + // WHICH ARCH TARGET? + // + hsg_target_pfn hsg_target_pfn = (arch < HSG_TARGET_PFN_COUNT) ? hsg_target_pfns[arch] : hsg_target_debug; + + // + // OPEN FILES + // + struct hsg_file * files = hsg_files_open(hsg_target_pfn_string[arch],hsg_file_type_string[arch]); + + // + // INIT F_KEYS + // + hsg_config_init_shared(); + + // + // INIT MERGE MAGIC + // + for (uint32_t ii=0; ii<MERGE_LEVELS_MAX_LOG2; ii++) + { + struct hsg_merge * const merge = hsg_merge + ii; + + if (merge->warps == 0) + break; + + fprintf(stderr,">>> Generating: %1u %5u %5u %3u %3u ...\n", + hsg_config.type.words, + hsg_config.block.smem_bs, + hsg_config.block.smem_bc, + hsg_config.thread.regs, + merge->warps); + + hsg_merge_levels_init_shared(merge); + + hsg_merge_levels_init_1(merge,merge->warps,0,0); + + hsg_merge_levels_hint(merge,autotune); + + // + // THESE ARE FOR DEBUG/INSPECTION + // + + if (!quiet) + { + hsg_merge_levels_debug(merge); + } + } + + if (!quiet) + fprintf(stderr,"\n\n"); + + // + // + // + uint32_t const op_count = 1024*1024; // 2^20 ops for now! + struct hsg_op * const ops_begin = malloc(op_count * sizeof(*ops_begin)); + struct hsg_op * ops = ops_begin; + + // + // APPEND HEADER + // + ops = hsg_op(ops,FILE_HEADER()); + + // + // GENERATE TRANSPOSE KERNEL + // + ops = hsg_warp_transpose(ops); + + // + // GENERATE SORT KERNEL + // + ops = hsg_bs_sort_all(ops); + + // + // GENERATE CLEAN KERNELS + // + ops = hsg_bc_clean_all(ops); + + // + // GENERATE MERGE KERNELS + // + ops = hsg_xm_merge_all(ops); + + // + // APPEND FOOTER + // + ops = hsg_op(ops,FILE_FOOTER()); + + // + // ... WE'RE DONE! + // + ops = hsg_exit(ops); + + // + // APPLY TARGET TRANSLATOR TO ACCUMULATED OPS + // + hsg_op_translate(hsg_target_pfn,files,hsg_merge,ops_begin); + + // + // + // + if (!quiet) + hsg_op_debug(); + + // + // + // + hsg_files_close(files); + + return 0; +} + +// +// +// diff --git a/src/compute/hs/gen/networks.h b/src/compute/hs/gen/networks.h new file mode 100644 index 0000000000..4a71891e2d --- /dev/null +++ b/src/compute/hs/gen/networks.h @@ -0,0 +1,40 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#pragma once + +// +// +// + +#include "gen.h" + +// +// +// + +struct hsg_network +{ + uint32_t const length; + struct hsg_op const * network; +}; + +// +// +// + +extern struct hsg_network const hsg_networks_sorting[]; +extern struct hsg_network const hsg_networks_merging[]; + +// +// +// diff --git a/src/compute/hs/gen/networks_merging.c b/src/compute/hs/gen/networks_merging.c new file mode 100644 index 0000000000..90dca03c21 --- /dev/null +++ b/src/compute/hs/gen/networks_merging.c @@ -0,0 +1,23708 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// This file was generated using the odd-merge rule. +// + +#include "networks.h" +#include "macros.h" + +// +// +// + +#define M(n) static struct hsg_op const mn##n[] +#define X(a,b) { HSG_OP_TYPE_CMP_XCHG, { a, b }} + +// +// +// + +#define LM(n) { ARRAY_LENGTH(mn##n), mn##n } + +// +// +// + +M(2) = { + X(1,2) +}; +M(3) = { + X(1,2), X(2,3), X(1,2) +}; +M(4) = { + X(1,3), X(2,4), X(1,2), X(3,4) +}; +M(5) = { + X(1,3), X(3,5), X(1,3), X(2,4), X(2,3), X(4,5), X(1,2), X(3,4) +}; +M(6) = { + X(1,3), X(3,5), X(1,3), X(2,4), X(4,6), X(2,4), X(1,2), X(3,4), X(5,6) +}; +M(7) = { + X(1,5), X(3,7), X(1,3), X(5,7), X(2,4), X(4,6), X(2,4), X(2,3), X(4,5), + X(6,7), X(1,2), X(3,4), X(5,6) +}; +M(8) = { + X(1,5), X(3,7), X(1,3), X(5,7), X(2,6), X(4,8), X(2,4), X(6,8), X(1,2), + X(3,4), X(5,6), X(7,8) +}; +M(9) = { + X(1,5), X(5,9), X(1,5), X(3,7), X(3,5), X(7,9), X(1,3), X(5,7), X(2,6), + X(4,8), X(2,4), X(6,8), X(2,3), X(4,5), X(6,7), X(8,9), X(1,2), X(3,4), X(5,6), + X(7,8) +}; +M(10) = { + X(1,5), X(5,9), X(1,5), X(3,7), X(3,5), X(7,9), X(1,3), X(5,7), X(2,6), + X(6,10), X(2,6), X(4,8), X(4,6), X(8,10), X(2,4), X(6,8), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10) +}; +M(11) = { + X(1,5), X(5,9), X(1,5), X(3,7), X(7,11), X(3,7), X(1,3), X(5,7), X(9,11), + X(2,6), X(6,10), X(2,6), X(4,8), X(4,6), X(8,10), X(2,4), X(6,8), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10) +}; +M(12) = { + X(1,5), X(5,9), X(1,5), X(3,7), X(7,11), X(3,7), X(1,3), X(5,7), X(9,11), + X(2,6), X(6,10), X(2,6), X(4,8), X(8,12), X(4,8), X(2,4), X(6,8), X(10,12), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12) +}; +M(13) = { + X(1,9), X(5,13), X(1,5), X(9,13), X(3,7), X(7,11), X(3,7), X(3,5), X(7,9), + X(11,13), X(1,3), X(5,7), X(9,11), X(2,6), X(6,10), X(2,6), X(4,8), X(8,12), + X(4,8), X(2,4), X(6,8), X(10,12), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12) +}; +M(14) = { + X(1,9), X(5,13), X(1,5), X(9,13), X(3,7), X(7,11), X(3,7), X(3,5), X(7,9), + X(11,13), X(1,3), X(5,7), X(9,11), X(2,10), X(6,14), X(2,6), X(10,14), X(4,8), + X(8,12), X(4,8), X(4,6), X(8,10), X(12,14), X(2,4), X(6,8), X(10,12), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14) +}; +M(15) = { + X(1,9), X(5,13), X(1,5), X(9,13), X(3,11), X(7,15), X(3,7), X(11,15), X(1,3), + X(5,7), X(9,11), X(13,15), X(2,10), X(6,14), X(2,6), X(10,14), X(4,8), X(8,12), + X(4,8), X(4,6), X(8,10), X(12,14), X(2,4), X(6,8), X(10,12), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14) +}; +M(16) = { + X(1,9), X(5,13), X(1,5), X(9,13), X(3,11), X(7,15), X(3,7), X(11,15), X(1,3), + X(5,7), X(9,11), X(13,15), X(2,10), X(6,14), X(2,6), X(10,14), X(4,12), + X(8,16), X(4,8), X(12,16), X(2,4), X(6,8), X(10,12), X(14,16), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16) +}; +M(17) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(5,9), X(13,17), X(1,5), X(9,13), X(3,11), + X(7,15), X(3,7), X(11,15), X(3,5), X(7,9), X(11,13), X(15,17), X(1,3), X(5,7), + X(9,11), X(13,15), X(2,10), X(6,14), X(2,6), X(10,14), X(4,12), X(8,16), + X(4,8), X(12,16), X(2,4), X(6,8), X(10,12), X(14,16), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16) +}; +M(18) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(5,9), X(13,17), X(1,5), X(9,13), X(3,11), + X(7,15), X(3,7), X(11,15), X(3,5), X(7,9), X(11,13), X(15,17), X(1,3), X(5,7), + X(9,11), X(13,15), X(2,10), X(10,18), X(2,10), X(6,14), X(6,10), X(14,18), + X(2,6), X(10,14), X(4,12), X(8,16), X(4,8), X(12,16), X(4,6), X(8,10), + X(12,14), X(16,18), X(2,4), X(6,8), X(10,12), X(14,16), X(1,2), X(3,4), X(5,6), + X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18) +}; +M(19) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(5,9), X(13,17), X(1,5), X(9,13), X(3,11), + X(11,19), X(3,11), X(7,15), X(7,11), X(15,19), X(3,7), X(11,15), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(2,10), X(10,18), X(2,10), X(6,14), + X(6,10), X(14,18), X(2,6), X(10,14), X(4,12), X(8,16), X(4,8), X(12,16), + X(4,6), X(8,10), X(12,14), X(16,18), X(2,4), X(6,8), X(10,12), X(14,16), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18) +}; +M(20) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(5,9), X(13,17), X(1,5), X(9,13), X(3,11), + X(11,19), X(3,11), X(7,15), X(7,11), X(15,19), X(3,7), X(11,15), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(2,10), X(10,18), X(2,10), X(6,14), + X(6,10), X(14,18), X(2,6), X(10,14), X(4,12), X(12,20), X(4,12), X(8,16), + X(8,12), X(16,20), X(4,8), X(12,16), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20) +}; +M(21) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(13,21), X(5,13), X(1,5), X(9,13), + X(17,21), X(3,11), X(11,19), X(3,11), X(7,15), X(7,11), X(15,19), X(3,7), + X(11,15), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(2,10), X(10,18), X(2,10), X(6,14), X(6,10), + X(14,18), X(2,6), X(10,14), X(4,12), X(12,20), X(4,12), X(8,16), X(8,12), + X(16,20), X(4,8), X(12,16), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20) +}; +M(22) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(13,21), X(5,13), X(1,5), X(9,13), + X(17,21), X(3,11), X(11,19), X(3,11), X(7,15), X(7,11), X(15,19), X(3,7), + X(11,15), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(2,10), X(10,18), X(2,10), X(6,14), X(14,22), + X(6,14), X(2,6), X(10,14), X(18,22), X(4,12), X(12,20), X(4,12), X(8,16), + X(8,12), X(16,20), X(4,8), X(12,16), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(1,2), X(3,4), X(5,6), + X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22) +}; +M(23) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(13,21), X(5,13), X(1,5), X(9,13), + X(17,21), X(3,11), X(11,19), X(3,11), X(7,15), X(15,23), X(7,15), X(3,7), + X(11,15), X(19,23), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(2,10), X(10,18), X(2,10), X(6,14), X(14,22), X(6,14), X(2,6), X(10,14), + X(18,22), X(4,12), X(12,20), X(4,12), X(8,16), X(8,12), X(16,20), X(4,8), + X(12,16), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22) +}; +M(24) = { + X(1,9), X(9,17), X(1,9), X(5,13), X(13,21), X(5,13), X(1,5), X(9,13), + X(17,21), X(3,11), X(11,19), X(3,11), X(7,15), X(15,23), X(7,15), X(3,7), + X(11,15), X(19,23), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(2,10), X(10,18), X(2,10), X(6,14), X(14,22), X(6,14), X(2,6), X(10,14), + X(18,22), X(4,12), X(12,20), X(4,12), X(8,16), X(16,24), X(8,16), X(4,8), + X(12,16), X(20,24), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24) +}; +M(25) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,13), X(13,21), X(5,13), X(5,9), + X(13,17), X(21,25), X(1,5), X(9,13), X(17,21), X(3,11), X(11,19), X(3,11), + X(7,15), X(15,23), X(7,15), X(3,7), X(11,15), X(19,23), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(2,10), X(10,18), X(2,10), X(6,14), X(14,22), X(6,14), + X(2,6), X(10,14), X(18,22), X(4,12), X(12,20), X(4,12), X(8,16), X(16,24), + X(8,16), X(4,8), X(12,16), X(20,24), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24) +}; +M(26) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,13), X(13,21), X(5,13), X(5,9), + X(13,17), X(21,25), X(1,5), X(9,13), X(17,21), X(3,11), X(11,19), X(3,11), + X(7,15), X(15,23), X(7,15), X(3,7), X(11,15), X(19,23), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(2,18), X(10,26), X(2,10), X(18,26), X(6,14), X(14,22), + X(6,14), X(6,10), X(14,18), X(22,26), X(2,6), X(10,14), X(18,22), X(4,12), + X(12,20), X(4,12), X(8,16), X(16,24), X(8,16), X(4,8), X(12,16), X(20,24), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26) +}; +M(27) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,13), X(13,21), X(5,13), X(5,9), + X(13,17), X(21,25), X(1,5), X(9,13), X(17,21), X(3,19), X(11,27), X(3,11), + X(19,27), X(7,15), X(15,23), X(7,15), X(7,11), X(15,19), X(23,27), X(3,7), + X(11,15), X(19,23), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(2,18), X(10,26), X(2,10), X(18,26), X(6,14), X(14,22), X(6,14), + X(6,10), X(14,18), X(22,26), X(2,6), X(10,14), X(18,22), X(4,12), X(12,20), + X(4,12), X(8,16), X(16,24), X(8,16), X(4,8), X(12,16), X(20,24), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26) +}; +M(28) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,13), X(13,21), X(5,13), X(5,9), + X(13,17), X(21,25), X(1,5), X(9,13), X(17,21), X(3,19), X(11,27), X(3,11), + X(19,27), X(7,15), X(15,23), X(7,15), X(7,11), X(15,19), X(23,27), X(3,7), + X(11,15), X(19,23), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(2,18), X(10,26), X(2,10), X(18,26), X(6,14), X(14,22), X(6,14), + X(6,10), X(14,18), X(22,26), X(2,6), X(10,14), X(18,22), X(4,20), X(12,28), + X(4,12), X(20,28), X(8,16), X(16,24), X(8,16), X(8,12), X(16,20), X(24,28), + X(4,8), X(12,16), X(20,24), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28) +}; +M(29) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,21), X(13,29), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(11,27), X(3,11), X(19,27), + X(7,15), X(15,23), X(7,15), X(7,11), X(15,19), X(23,27), X(3,7), X(11,15), + X(19,23), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(2,18), + X(10,26), X(2,10), X(18,26), X(6,14), X(14,22), X(6,14), X(6,10), X(14,18), + X(22,26), X(2,6), X(10,14), X(18,22), X(4,20), X(12,28), X(4,12), X(20,28), + X(8,16), X(16,24), X(8,16), X(8,12), X(16,20), X(24,28), X(4,8), X(12,16), + X(20,24), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28) +}; +M(30) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,21), X(13,29), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(11,27), X(3,11), X(19,27), + X(7,15), X(15,23), X(7,15), X(7,11), X(15,19), X(23,27), X(3,7), X(11,15), + X(19,23), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(2,18), + X(10,26), X(2,10), X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), X(2,6), + X(10,14), X(18,22), X(26,30), X(4,20), X(12,28), X(4,12), X(20,28), X(8,16), + X(16,24), X(8,16), X(8,12), X(16,20), X(24,28), X(4,8), X(12,16), X(20,24), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30) +}; +M(31) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,21), X(13,29), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(11,27), X(3,11), X(19,27), + X(7,23), X(15,31), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), X(27,31), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(2,18), X(10,26), X(2,10), X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), + X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), X(12,28), X(4,12), X(20,28), + X(8,16), X(16,24), X(8,16), X(8,12), X(16,20), X(24,28), X(4,8), X(12,16), + X(20,24), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30) +}; +M(32) = { + X(1,17), X(9,25), X(1,9), X(17,25), X(5,21), X(13,29), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(11,27), X(3,11), X(19,27), + X(7,23), X(15,31), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), X(27,31), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(2,18), X(10,26), X(2,10), X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), + X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), X(12,28), X(4,12), X(20,28), + X(8,24), X(16,32), X(8,16), X(24,32), X(4,8), X(12,16), X(20,24), X(28,32), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32) +}; +M(33) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(13,29), X(5,13), X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(11,27), X(3,11), X(19,27), + X(7,23), X(15,31), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), X(27,31), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(2,18), X(10,26), X(2,10), X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), + X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), X(12,28), X(4,12), X(20,28), + X(8,24), X(16,32), X(8,16), X(24,32), X(4,8), X(12,16), X(20,24), X(28,32), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32) +}; +M(34) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(13,29), X(5,13), X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(11,27), X(3,11), X(19,27), + X(7,23), X(15,31), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), X(27,31), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(2,18), X(18,34), X(2,18), X(10,26), X(10,18), X(26,34), X(2,10), X(18,26), + X(6,22), X(14,30), X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), X(30,34), + X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), X(12,28), X(4,12), X(20,28), + X(8,24), X(16,32), X(8,16), X(24,32), X(4,8), X(12,16), X(20,24), X(28,32), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34) +}; +M(35) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(13,29), X(5,13), X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(19,35), X(3,19), X(11,27), + X(11,19), X(27,35), X(3,11), X(19,27), X(7,23), X(15,31), X(7,15), X(23,31), + X(7,11), X(15,19), X(23,27), X(31,35), X(3,7), X(11,15), X(19,23), X(27,31), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(2,18), X(18,34), X(2,18), X(10,26), X(10,18), X(26,34), X(2,10), + X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), + X(30,34), X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), X(12,28), X(4,12), + X(20,28), X(8,24), X(16,32), X(8,16), X(24,32), X(4,8), X(12,16), X(20,24), + X(28,32), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34) +}; +M(36) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(13,29), X(5,13), X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), + X(1,5), X(9,13), X(17,21), X(25,29), X(3,19), X(19,35), X(3,19), X(11,27), + X(11,19), X(27,35), X(3,11), X(19,27), X(7,23), X(15,31), X(7,15), X(23,31), + X(7,11), X(15,19), X(23,27), X(31,35), X(3,7), X(11,15), X(19,23), X(27,31), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(2,18), X(18,34), X(2,18), X(10,26), X(10,18), X(26,34), X(2,10), + X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), + X(30,34), X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), X(20,36), X(4,20), + X(12,28), X(12,20), X(28,36), X(4,12), X(20,28), X(8,24), X(16,32), X(8,16), + X(24,32), X(8,12), X(16,20), X(24,28), X(32,36), X(4,8), X(12,16), X(20,24), + X(28,32), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36) +}; +M(37) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), + X(11,27), X(11,19), X(27,35), X(3,11), X(19,27), X(7,23), X(15,31), X(7,15), + X(23,31), X(7,11), X(15,19), X(23,27), X(31,35), X(3,7), X(11,15), X(19,23), + X(27,31), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(2,18), X(18,34), X(2,18), X(10,26), X(10,18), + X(26,34), X(2,10), X(18,26), X(6,22), X(14,30), X(6,14), X(22,30), X(6,10), + X(14,18), X(22,26), X(30,34), X(2,6), X(10,14), X(18,22), X(26,30), X(4,20), + X(20,36), X(4,20), X(12,28), X(12,20), X(28,36), X(4,12), X(20,28), X(8,24), + X(16,32), X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), X(32,36), X(4,8), + X(12,16), X(20,24), X(28,32), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36) +}; +M(38) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), + X(11,27), X(11,19), X(27,35), X(3,11), X(19,27), X(7,23), X(15,31), X(7,15), + X(23,31), X(7,11), X(15,19), X(23,27), X(31,35), X(3,7), X(11,15), X(19,23), + X(27,31), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(2,18), X(18,34), X(2,18), X(10,26), X(10,18), + X(26,34), X(2,10), X(18,26), X(6,22), X(22,38), X(6,22), X(14,30), X(14,22), + X(30,38), X(6,14), X(22,30), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(4,20), X(20,36), X(4,20), X(12,28), X(12,20), X(28,36), X(4,12), X(20,28), + X(8,24), X(16,32), X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), X(32,36), + X(4,8), X(12,16), X(20,24), X(28,32), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38) +}; +M(39) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), + X(11,27), X(11,19), X(27,35), X(3,11), X(19,27), X(7,23), X(23,39), X(7,23), + X(15,31), X(15,23), X(31,39), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(2,18), X(18,34), X(2,18), X(10,26), + X(10,18), X(26,34), X(2,10), X(18,26), X(6,22), X(22,38), X(6,22), X(14,30), + X(14,22), X(30,38), X(6,14), X(22,30), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(4,20), X(20,36), X(4,20), X(12,28), X(12,20), X(28,36), X(4,12), + X(20,28), X(8,24), X(16,32), X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), + X(32,36), X(4,8), X(12,16), X(20,24), X(28,32), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38) +}; +M(40) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(9,17), X(25,33), X(1,9), X(17,25), + X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), X(21,29), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), + X(11,27), X(11,19), X(27,35), X(3,11), X(19,27), X(7,23), X(23,39), X(7,23), + X(15,31), X(15,23), X(31,39), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(2,18), X(18,34), X(2,18), X(10,26), + X(10,18), X(26,34), X(2,10), X(18,26), X(6,22), X(22,38), X(6,22), X(14,30), + X(14,22), X(30,38), X(6,14), X(22,30), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(4,20), X(20,36), X(4,20), X(12,28), X(12,20), X(28,36), X(4,12), + X(20,28), X(8,24), X(24,40), X(8,24), X(16,32), X(16,24), X(32,40), X(8,16), + X(24,32), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40) +}; +M(41) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), + X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), X(11,27), X(11,19), + X(27,35), X(3,11), X(19,27), X(7,23), X(23,39), X(7,23), X(15,31), X(15,23), + X(31,39), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(2,18), X(18,34), X(2,18), X(10,26), + X(10,18), X(26,34), X(2,10), X(18,26), X(6,22), X(22,38), X(6,22), X(14,30), + X(14,22), X(30,38), X(6,14), X(22,30), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(4,20), X(20,36), X(4,20), X(12,28), X(12,20), X(28,36), X(4,12), + X(20,28), X(8,24), X(24,40), X(8,24), X(16,32), X(16,24), X(32,40), X(8,16), + X(24,32), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40) +}; +M(42) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), + X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), X(11,27), X(11,19), + X(27,35), X(3,11), X(19,27), X(7,23), X(23,39), X(7,23), X(15,31), X(15,23), + X(31,39), X(7,15), X(23,31), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(2,18), X(18,34), X(2,18), X(10,26), + X(26,42), X(10,26), X(2,10), X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), + X(14,30), X(14,22), X(30,38), X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(4,20), + X(20,36), X(4,20), X(12,28), X(12,20), X(28,36), X(4,12), X(20,28), X(8,24), + X(24,40), X(8,24), X(16,32), X(16,24), X(32,40), X(8,16), X(24,32), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42) +}; +M(43) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), + X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), + X(11,27), X(3,11), X(19,27), X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), + X(15,23), X(31,39), X(7,15), X(23,31), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(2,18), X(18,34), X(2,18), X(10,26), X(26,42), X(10,26), X(2,10), + X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), X(14,30), X(14,22), X(30,38), + X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(4,20), X(20,36), X(4,20), X(12,28), + X(12,20), X(28,36), X(4,12), X(20,28), X(8,24), X(24,40), X(8,24), X(16,32), + X(16,24), X(32,40), X(8,16), X(24,32), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), + X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), + X(40,41), X(42,43), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42) +}; +M(44) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(13,21), X(29,37), X(5,13), + X(21,29), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), + X(11,27), X(3,11), X(19,27), X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), + X(15,23), X(31,39), X(7,15), X(23,31), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(2,18), X(18,34), X(2,18), X(10,26), X(26,42), X(10,26), X(2,10), + X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), X(14,30), X(14,22), X(30,38), + X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(4,20), X(20,36), X(4,20), X(12,28), + X(28,44), X(12,28), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), + X(16,32), X(16,24), X(32,40), X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44) +}; +M(45) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(29,45), X(13,29), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), X(11,27), X(3,11), X(19,27), + X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), X(15,23), X(31,39), X(7,15), + X(23,31), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), + X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(2,18), X(18,34), X(2,18), X(10,26), X(26,42), X(10,26), X(2,10), + X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), X(14,30), X(14,22), X(30,38), + X(6,14), X(22,30), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(4,20), X(20,36), X(4,20), X(12,28), + X(28,44), X(12,28), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), + X(16,32), X(16,24), X(32,40), X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44) +}; +M(46) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(29,45), X(13,29), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), X(11,27), X(3,11), X(19,27), + X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), X(15,23), X(31,39), X(7,15), + X(23,31), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), + X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(2,18), X(18,34), X(2,18), X(10,26), X(26,42), X(10,26), X(2,10), + X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), X(14,30), X(30,46), X(14,30), + X(6,14), X(22,30), X(38,46), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(4,20), X(20,36), X(4,20), X(12,28), X(28,44), X(12,28), X(4,12), + X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), X(16,32), X(16,24), X(32,40), + X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46) +}; +M(47) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(29,45), X(13,29), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), X(11,27), X(3,11), X(19,27), + X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), X(31,47), X(15,31), X(7,15), + X(23,31), X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(2,18), X(18,34), X(2,18), X(10,26), + X(26,42), X(10,26), X(2,10), X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), + X(14,30), X(30,46), X(14,30), X(6,14), X(22,30), X(38,46), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(4,20), X(20,36), X(4,20), X(12,28), + X(28,44), X(12,28), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), + X(16,32), X(16,24), X(32,40), X(8,16), X(24,32), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), + X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), + X(40,41), X(42,43), X(44,45), X(46,47), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46) +}; +M(48) = { + X(1,17), X(17,33), X(1,17), X(9,25), X(25,41), X(9,25), X(1,9), X(17,25), + X(33,41), X(5,21), X(21,37), X(5,21), X(13,29), X(29,45), X(13,29), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), X(11,27), X(3,11), X(19,27), + X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), X(31,47), X(15,31), X(7,15), + X(23,31), X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(2,18), X(18,34), X(2,18), X(10,26), + X(26,42), X(10,26), X(2,10), X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), + X(14,30), X(30,46), X(14,30), X(6,14), X(22,30), X(38,46), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(4,20), X(20,36), X(4,20), X(12,28), + X(28,44), X(12,28), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), + X(16,32), X(32,48), X(16,32), X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48) +}; +M(49) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,21), X(21,37), X(5,21), + X(13,29), X(29,45), X(13,29), X(5,13), X(21,29), X(37,45), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), X(11,27), + X(3,11), X(19,27), X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), X(31,47), + X(15,31), X(7,15), X(23,31), X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(2,18), X(18,34), X(2,18), X(10,26), X(26,42), X(10,26), + X(2,10), X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), X(14,30), X(30,46), + X(14,30), X(6,14), X(22,30), X(38,46), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(4,20), X(20,36), X(4,20), X(12,28), X(28,44), X(12,28), + X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), X(16,32), X(32,48), + X(16,32), X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48) +}; +M(50) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,21), X(21,37), X(5,21), + X(13,29), X(29,45), X(13,29), X(5,13), X(21,29), X(37,45), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(3,19), X(19,35), X(3,19), X(11,27), X(27,43), X(11,27), + X(3,11), X(19,27), X(35,43), X(7,23), X(23,39), X(7,23), X(15,31), X(31,47), + X(15,31), X(7,15), X(23,31), X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(2,34), X(18,50), X(2,18), X(34,50), X(10,26), X(26,42), + X(10,26), X(10,18), X(26,34), X(42,50), X(2,10), X(18,26), X(34,42), X(6,22), + X(22,38), X(6,22), X(14,30), X(30,46), X(14,30), X(6,14), X(22,30), X(38,46), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(4,20), X(20,36), X(4,20), X(12,28), + X(28,44), X(12,28), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), + X(16,32), X(32,48), X(16,32), X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50) +}; +M(51) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,21), X(21,37), X(5,21), + X(13,29), X(29,45), X(13,29), X(5,13), X(21,29), X(37,45), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(3,35), X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), + X(11,27), X(11,19), X(27,35), X(43,51), X(3,11), X(19,27), X(35,43), X(7,23), + X(23,39), X(7,23), X(15,31), X(31,47), X(15,31), X(7,15), X(23,31), X(39,47), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(2,34), X(18,50), X(2,18), X(34,50), X(10,26), X(26,42), X(10,26), + X(10,18), X(26,34), X(42,50), X(2,10), X(18,26), X(34,42), X(6,22), X(22,38), + X(6,22), X(14,30), X(30,46), X(14,30), X(6,14), X(22,30), X(38,46), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(4,20), X(20,36), X(4,20), X(12,28), X(28,44), + X(12,28), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), X(16,32), + X(32,48), X(16,32), X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50) +}; +M(52) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,21), X(21,37), X(5,21), + X(13,29), X(29,45), X(13,29), X(5,13), X(21,29), X(37,45), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(3,35), X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), + X(11,27), X(11,19), X(27,35), X(43,51), X(3,11), X(19,27), X(35,43), X(7,23), + X(23,39), X(7,23), X(15,31), X(31,47), X(15,31), X(7,15), X(23,31), X(39,47), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(2,34), X(18,50), X(2,18), X(34,50), X(10,26), X(26,42), X(10,26), + X(10,18), X(26,34), X(42,50), X(2,10), X(18,26), X(34,42), X(6,22), X(22,38), + X(6,22), X(14,30), X(30,46), X(14,30), X(6,14), X(22,30), X(38,46), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(4,36), X(20,52), X(4,20), X(36,52), X(12,28), + X(28,44), X(12,28), X(12,20), X(28,36), X(44,52), X(4,12), X(20,28), X(36,44), + X(8,24), X(24,40), X(8,24), X(16,32), X(32,48), X(16,32), X(8,16), X(24,32), + X(40,48), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52) +}; +M(53) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,37), X(21,53), X(5,21), + X(37,53), X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(3,35), X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), X(11,27), + X(11,19), X(27,35), X(43,51), X(3,11), X(19,27), X(35,43), X(7,23), X(23,39), + X(7,23), X(15,31), X(31,47), X(15,31), X(7,15), X(23,31), X(39,47), X(7,11), + X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), + X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(2,34), X(18,50), X(2,18), + X(34,50), X(10,26), X(26,42), X(10,26), X(10,18), X(26,34), X(42,50), X(2,10), + X(18,26), X(34,42), X(6,22), X(22,38), X(6,22), X(14,30), X(30,46), X(14,30), + X(6,14), X(22,30), X(38,46), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(4,36), + X(20,52), X(4,20), X(36,52), X(12,28), X(28,44), X(12,28), X(12,20), X(28,36), + X(44,52), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), X(16,32), + X(32,48), X(16,32), X(8,16), X(24,32), X(40,48), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52) +}; +M(54) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,37), X(21,53), X(5,21), + X(37,53), X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(3,35), X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), X(11,27), + X(11,19), X(27,35), X(43,51), X(3,11), X(19,27), X(35,43), X(7,23), X(23,39), + X(7,23), X(15,31), X(31,47), X(15,31), X(7,15), X(23,31), X(39,47), X(7,11), + X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), + X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(2,34), X(18,50), X(2,18), + X(34,50), X(10,26), X(26,42), X(10,26), X(10,18), X(26,34), X(42,50), X(2,10), + X(18,26), X(34,42), X(6,38), X(22,54), X(6,22), X(38,54), X(14,30), X(30,46), + X(14,30), X(14,22), X(30,38), X(46,54), X(6,14), X(22,30), X(38,46), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(4,36), X(20,52), + X(4,20), X(36,52), X(12,28), X(28,44), X(12,28), X(12,20), X(28,36), X(44,52), + X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), X(8,24), X(16,32), X(32,48), + X(16,32), X(8,16), X(24,32), X(40,48), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54) +}; +M(55) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,37), X(21,53), X(5,21), + X(37,53), X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(3,35), X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), X(11,27), + X(11,19), X(27,35), X(43,51), X(3,11), X(19,27), X(35,43), X(7,39), X(23,55), + X(7,23), X(39,55), X(15,31), X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), + X(7,15), X(23,31), X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(2,34), X(18,50), X(2,18), X(34,50), X(10,26), X(26,42), X(10,26), X(10,18), + X(26,34), X(42,50), X(2,10), X(18,26), X(34,42), X(6,38), X(22,54), X(6,22), + X(38,54), X(14,30), X(30,46), X(14,30), X(14,22), X(30,38), X(46,54), X(6,14), + X(22,30), X(38,46), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(4,36), X(20,52), X(4,20), X(36,52), X(12,28), X(28,44), X(12,28), + X(12,20), X(28,36), X(44,52), X(4,12), X(20,28), X(36,44), X(8,24), X(24,40), + X(8,24), X(16,32), X(32,48), X(16,32), X(8,16), X(24,32), X(40,48), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), + X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), + X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54) +}; +M(56) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,25), X(25,41), X(9,25), X(9,17), + X(25,33), X(41,49), X(1,9), X(17,25), X(33,41), X(5,37), X(21,53), X(5,21), + X(37,53), X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), + X(21,29), X(37,45), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(3,35), X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), X(11,27), + X(11,19), X(27,35), X(43,51), X(3,11), X(19,27), X(35,43), X(7,39), X(23,55), + X(7,23), X(39,55), X(15,31), X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), + X(7,15), X(23,31), X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(2,34), X(18,50), X(2,18), X(34,50), X(10,26), X(26,42), X(10,26), X(10,18), + X(26,34), X(42,50), X(2,10), X(18,26), X(34,42), X(6,38), X(22,54), X(6,22), + X(38,54), X(14,30), X(30,46), X(14,30), X(14,22), X(30,38), X(46,54), X(6,14), + X(22,30), X(38,46), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(4,36), X(20,52), X(4,20), X(36,52), X(12,28), X(28,44), X(12,28), + X(12,20), X(28,36), X(44,52), X(4,12), X(20,28), X(36,44), X(8,40), X(24,56), + X(8,24), X(40,56), X(16,32), X(32,48), X(16,32), X(16,24), X(32,40), X(48,56), + X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56) +}; +M(57) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), X(21,29), + X(37,45), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(3,35), + X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), X(11,27), X(11,19), X(27,35), + X(43,51), X(3,11), X(19,27), X(35,43), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,31), X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), X(7,15), X(23,31), + X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(2,34), X(18,50), X(2,18), X(34,50), + X(10,26), X(26,42), X(10,26), X(10,18), X(26,34), X(42,50), X(2,10), X(18,26), + X(34,42), X(6,38), X(22,54), X(6,22), X(38,54), X(14,30), X(30,46), X(14,30), + X(14,22), X(30,38), X(46,54), X(6,14), X(22,30), X(38,46), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(4,36), X(20,52), X(4,20), + X(36,52), X(12,28), X(28,44), X(12,28), X(12,20), X(28,36), X(44,52), X(4,12), + X(20,28), X(36,44), X(8,40), X(24,56), X(8,24), X(40,56), X(16,32), X(32,48), + X(16,32), X(16,24), X(32,40), X(48,56), X(8,16), X(24,32), X(40,48), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56) +}; +M(58) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), X(21,29), + X(37,45), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(3,35), + X(19,51), X(3,19), X(35,51), X(11,27), X(27,43), X(11,27), X(11,19), X(27,35), + X(43,51), X(3,11), X(19,27), X(35,43), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,31), X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), X(7,15), X(23,31), + X(39,47), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(2,34), X(18,50), X(2,18), X(34,50), + X(10,42), X(26,58), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), X(50,58), + X(6,38), X(22,54), X(6,22), X(38,54), X(14,30), X(30,46), X(14,30), X(14,22), + X(30,38), X(46,54), X(6,14), X(22,30), X(38,46), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(4,36), X(20,52), X(4,20), X(36,52), X(12,28), + X(28,44), X(12,28), X(12,20), X(28,36), X(44,52), X(4,12), X(20,28), X(36,44), + X(8,40), X(24,56), X(8,24), X(40,56), X(16,32), X(32,48), X(16,32), X(16,24), + X(32,40), X(48,56), X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58) +}; +M(59) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), X(21,29), + X(37,45), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(3,35), + X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(3,11), + X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), X(15,31), + X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), X(7,15), X(23,31), X(39,47), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(2,34), X(18,50), X(2,18), + X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), + X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), X(14,30), X(30,46), X(14,30), + X(14,22), X(30,38), X(46,54), X(6,14), X(22,30), X(38,46), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(4,36), X(20,52), X(4,20), X(36,52), + X(12,28), X(28,44), X(12,28), X(12,20), X(28,36), X(44,52), X(4,12), X(20,28), + X(36,44), X(8,40), X(24,56), X(8,24), X(40,56), X(16,32), X(32,48), X(16,32), + X(16,24), X(32,40), X(48,56), X(8,16), X(24,32), X(40,48), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58) +}; +M(60) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,29), X(29,45), X(13,29), X(13,21), X(29,37), X(45,53), X(5,13), X(21,29), + X(37,45), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(3,35), + X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(3,11), + X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), X(15,31), + X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), X(7,15), X(23,31), X(39,47), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(2,34), X(18,50), X(2,18), + X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), + X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), X(14,30), X(30,46), X(14,30), + X(14,22), X(30,38), X(46,54), X(6,14), X(22,30), X(38,46), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(4,36), X(20,52), X(4,20), X(36,52), + X(12,44), X(28,60), X(12,28), X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), + X(8,40), X(24,56), X(8,24), X(40,56), X(16,32), X(32,48), X(16,32), X(16,24), + X(32,40), X(48,56), X(8,16), X(24,32), X(40,48), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60) +}; +M(61) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,31), X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), X(7,15), X(23,31), + X(39,47), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(2,34), X(18,50), X(2,18), + X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), + X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), X(14,30), X(30,46), X(14,30), + X(14,22), X(30,38), X(46,54), X(6,14), X(22,30), X(38,46), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(4,36), X(20,52), X(4,20), X(36,52), + X(12,44), X(28,60), X(12,28), X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), + X(8,40), X(24,56), X(8,24), X(40,56), X(16,32), X(32,48), X(16,32), X(16,24), + X(32,40), X(48,56), X(8,16), X(24,32), X(40,48), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60) +}; +M(62) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,31), X(31,47), X(15,31), X(15,23), X(31,39), X(47,55), X(7,15), X(23,31), + X(39,47), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(2,34), X(18,50), X(2,18), + X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), + X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), X(14,46), X(30,62), X(14,30), + X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(4,36), X(20,52), X(4,20), + X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), X(4,12), X(20,28), X(36,44), + X(52,60), X(8,40), X(24,56), X(8,24), X(40,56), X(16,32), X(32,48), X(16,32), + X(16,24), X(32,40), X(48,56), X(8,16), X(24,32), X(40,48), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62) +}; +M(63) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(2,34), X(18,50), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), + X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), + X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(4,36), X(20,52), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(24,56), X(8,24), X(40,56), + X(16,32), X(32,48), X(16,32), X(16,24), X(32,40), X(48,56), X(8,16), X(24,32), + X(40,48), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), + X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), + X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), + X(56,57), X(58,59), X(60,61), X(62,63), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62) +}; +M(64) = { + X(1,33), X(17,49), X(1,17), X(33,49), X(9,41), X(25,57), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(2,34), X(18,50), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), + X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), + X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(4,36), X(20,52), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(24,56), X(8,24), X(40,56), + X(16,48), X(32,64), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64) +}; +M(65) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(2,34), X(18,50), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), + X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), + X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(4,36), X(20,52), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(24,56), X(8,24), X(40,56), + X(16,48), X(32,64), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64) +}; +M(66) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(19,51), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), X(34,50), + X(10,42), X(26,58), X(10,26), X(42,58), X(10,18), X(26,34), X(42,50), X(58,66), + X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(22,54), X(6,22), X(38,54), + X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(4,36), X(20,52), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(24,56), X(8,24), X(40,56), + X(16,48), X(32,64), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66) +}; +M(67) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), X(51,67), X(3,19), X(35,51), + X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), + X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(10,18), X(26,34), X(42,50), + X(58,66), X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(22,54), X(6,22), + X(38,54), X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), + X(54,62), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), + X(62,66), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(4,36), X(20,52), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), + X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(24,56), X(8,24), + X(40,56), X(16,48), X(32,64), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), + X(56,64), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66) +}; +M(68) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(21,53), X(5,21), X(37,53), + X(13,45), X(29,61), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), X(51,67), X(3,19), X(35,51), + X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), + X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), + X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(10,18), X(26,34), X(42,50), + X(58,66), X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(22,54), X(6,22), + X(38,54), X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), + X(54,62), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), + X(62,66), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), + X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), + X(60,68), X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(24,56), X(8,24), + X(40,56), X(16,48), X(32,64), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), + X(56,64), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68) +}; +M(69) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(37,69), X(5,37), X(21,53), + X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), X(45,61), + X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), X(51,67), X(3,19), + X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), + X(59,67), X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), + X(39,55), X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), + X(55,63), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), + X(63,67), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), + X(50,66), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(10,18), + X(26,34), X(42,50), X(58,66), X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), + X(22,54), X(6,22), X(38,54), X(14,46), X(30,62), X(14,30), X(46,62), X(6,14), + X(22,30), X(38,46), X(54,62), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), + X(52,68), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), X(12,20), + X(28,36), X(44,52), X(60,68), X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), + X(24,56), X(8,24), X(40,56), X(16,48), X(32,64), X(16,32), X(48,64), X(8,16), + X(24,32), X(40,48), X(56,64), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(62,64), X(66,68), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68) +}; +M(70) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(37,69), X(5,37), X(21,53), + X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), X(45,61), + X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), X(51,67), X(3,19), + X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), + X(59,67), X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(23,55), X(7,23), + X(39,55), X(15,47), X(31,63), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), + X(55,63), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), + X(63,67), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), + X(50,66), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), X(10,18), + X(26,34), X(42,50), X(58,66), X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), + X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), X(14,46), + X(30,62), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(6,14), + X(22,30), X(38,46), X(54,62), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(4,36), X(36,68), X(4,36), X(20,52), + X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), + X(12,20), X(28,36), X(44,52), X(60,68), X(4,12), X(20,28), X(36,44), X(52,60), + X(8,40), X(24,56), X(8,24), X(40,56), X(16,48), X(32,64), X(16,32), X(48,64), + X(8,16), X(24,32), X(40,48), X(56,64), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70) +}; +M(71) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(37,69), X(5,37), X(21,53), + X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), X(45,61), + X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), X(51,67), X(3,19), + X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), + X(59,67), X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(39,71), X(7,39), + X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), X(31,63), X(15,31), + X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), X(7,15), X(23,31), X(39,47), + X(55,63), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(2,34), X(34,66), X(2,34), X(18,50), + X(18,34), X(50,66), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), + X(10,18), X(26,34), X(42,50), X(58,66), X(2,10), X(18,26), X(34,42), X(50,58), + X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), + X(14,46), X(30,62), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), + X(6,14), X(22,30), X(38,46), X(54,62), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(4,36), X(36,68), X(4,36), + X(20,52), X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), + X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(4,12), X(20,28), X(36,44), + X(52,60), X(8,40), X(24,56), X(8,24), X(40,56), X(16,48), X(32,64), X(16,32), + X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70) +}; +M(72) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(25,57), X(9,25), X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), + X(1,9), X(17,25), X(33,41), X(49,57), X(5,37), X(37,69), X(5,37), X(21,53), + X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), X(45,61), + X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), X(53,61), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), X(51,67), X(3,19), + X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), + X(59,67), X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), X(39,71), X(7,39), + X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), X(31,63), X(15,31), + X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), X(7,15), X(23,31), X(39,47), + X(55,63), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(2,34), X(34,66), X(2,34), X(18,50), + X(18,34), X(50,66), X(2,18), X(34,50), X(10,42), X(26,58), X(10,26), X(42,58), + X(10,18), X(26,34), X(42,50), X(58,66), X(2,10), X(18,26), X(34,42), X(50,58), + X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), + X(14,46), X(30,62), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), + X(6,14), X(22,30), X(38,46), X(54,62), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(4,36), X(36,68), X(4,36), + X(20,52), X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), + X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(4,12), X(20,28), X(36,44), + X(52,60), X(8,40), X(40,72), X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), + X(40,56), X(16,48), X(32,64), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), + X(64,72), X(8,16), X(24,32), X(40,48), X(56,64), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72) +}; +M(73) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), + X(53,61), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(61,65), X(69,73), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), + X(51,67), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), + X(27,35), X(43,51), X(59,67), X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), + X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), + X(31,63), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), X(7,15), + X(23,31), X(39,47), X(55,63), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), X(34,50), + X(10,42), X(26,58), X(10,26), X(42,58), X(10,18), X(26,34), X(42,50), X(58,66), + X(2,10), X(18,26), X(34,42), X(50,58), X(6,38), X(38,70), X(6,38), X(22,54), + X(22,38), X(54,70), X(6,22), X(38,54), X(14,46), X(30,62), X(14,30), X(46,62), + X(14,22), X(30,38), X(46,54), X(62,70), X(6,14), X(22,30), X(38,46), X(54,62), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), + X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), + X(60,68), X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), X(40,72), X(8,40), + X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(32,64), X(16,32), + X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(8,16), X(24,32), X(40,48), + X(56,64), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72) +}; +M(74) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), + X(53,61), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(61,65), X(69,73), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), + X(51,67), X(3,19), X(35,51), X(11,43), X(27,59), X(11,27), X(43,59), X(11,19), + X(27,35), X(43,51), X(59,67), X(3,11), X(19,27), X(35,43), X(51,59), X(7,39), + X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), + X(31,63), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), X(7,15), + X(23,31), X(39,47), X(55,63), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), X(34,50), + X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), + X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), X(14,46), X(30,62), X(14,30), + X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(6,14), X(22,30), X(38,46), + X(54,62), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), + X(62,66), X(70,74), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), + X(52,68), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), X(12,20), + X(28,36), X(44,52), X(60,68), X(4,12), X(20,28), X(36,44), X(52,60), X(8,40), + X(40,72), X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), + X(32,64), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(8,16), + X(24,32), X(40,48), X(56,64), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74) +}; +M(75) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), + X(53,61), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(61,65), X(69,73), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), + X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), + X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), + X(7,15), X(23,31), X(39,47), X(55,63), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), + X(34,50), X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), + X(42,58), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), + X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), X(14,46), X(30,62), + X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(6,14), X(22,30), + X(38,46), X(54,62), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(4,36), X(36,68), X(4,36), X(20,52), + X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(28,60), X(12,28), X(44,60), + X(12,20), X(28,36), X(44,52), X(60,68), X(4,12), X(20,28), X(36,44), X(52,60), + X(8,40), X(40,72), X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), + X(16,48), X(32,64), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), + X(8,16), X(24,32), X(40,48), X(56,64), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74) +}; +M(76) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(29,61), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(5,13), X(21,29), X(37,45), + X(53,61), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), + X(61,65), X(69,73), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(3,35), X(35,67), X(3,35), X(19,51), X(19,35), + X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), + X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), + X(15,47), X(31,63), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), + X(7,15), X(23,31), X(39,47), X(55,63), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), + X(34,50), X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), + X(42,58), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), + X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), X(14,46), X(30,62), + X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(6,14), X(22,30), + X(38,46), X(54,62), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(4,36), X(36,68), X(4,36), X(20,52), + X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(44,76), X(12,44), X(28,60), + X(28,44), X(60,76), X(12,28), X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), + X(40,56), X(16,48), X(32,64), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), + X(64,72), X(8,16), X(24,32), X(40,48), X(56,64), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76) +}; +M(77) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), + X(29,61), X(29,45), X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(19,35), X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), + X(27,43), X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), + X(39,55), X(15,47), X(31,63), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(7,15), X(23,31), X(39,47), X(55,63), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(2,34), X(34,66), X(2,34), + X(18,50), X(18,34), X(50,66), X(2,18), X(34,50), X(10,42), X(42,74), X(10,42), + X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), + X(6,22), X(38,54), X(14,46), X(30,62), X(14,30), X(46,62), X(14,22), X(30,38), + X(46,54), X(62,70), X(6,14), X(22,30), X(38,46), X(54,62), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), X(36,52), + X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), + X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(32,64), X(16,32), + X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(8,16), X(24,32), X(40,48), + X(56,64), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(72,76), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76) +}; +M(78) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), + X(29,61), X(29,45), X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(19,35), X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), + X(27,43), X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), + X(39,55), X(15,47), X(31,63), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(7,15), X(23,31), X(39,47), X(55,63), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(2,34), X(34,66), X(2,34), + X(18,50), X(18,34), X(50,66), X(2,18), X(34,50), X(10,42), X(42,74), X(10,42), + X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), + X(6,22), X(38,54), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), + X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), + X(36,52), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), + X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), + X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(32,64), + X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(8,16), X(24,32), + X(40,48), X(56,64), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78) +}; +M(79) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), + X(29,61), X(29,45), X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(19,35), X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), + X(27,43), X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), + X(39,55), X(15,47), X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), X(15,31), + X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(2,34), X(34,66), X(2,34), X(18,50), + X(18,34), X(50,66), X(2,18), X(34,50), X(10,42), X(42,74), X(10,42), X(26,58), + X(26,42), X(58,74), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), + X(38,54), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), X(14,30), + X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), X(36,52), + X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), + X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(32,64), X(16,32), + X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(8,16), X(24,32), X(40,48), + X(56,64), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(72,76), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78) +}; +M(80) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(17,33), X(49,65), X(1,17), X(33,49), + X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), X(41,57), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), + X(21,53), X(21,37), X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), + X(29,61), X(29,45), X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(19,35), X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), + X(27,43), X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), + X(39,55), X(15,47), X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), X(15,31), + X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(2,34), X(34,66), X(2,34), X(18,50), + X(18,34), X(50,66), X(2,18), X(34,50), X(10,42), X(42,74), X(10,42), X(26,58), + X(26,42), X(58,74), X(10,26), X(42,58), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), + X(38,54), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), X(14,30), + X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), X(36,52), + X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), X(44,60), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), + X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(48,80), X(16,48), + X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80) +}; +M(81) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(21,37), + X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), + X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(19,35), X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), + X(27,43), X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), + X(39,55), X(15,47), X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), X(15,31), + X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), + X(67,69), X(71,73), X(75,77), X(79,81), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(2,34), X(34,66), X(2,34), X(18,50), X(18,34), X(50,66), X(2,18), X(34,50), + X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), + X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), X(14,46), X(46,78), X(14,46), + X(30,62), X(30,46), X(62,78), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(74,78), X(4,36), X(36,68), X(4,36), X(20,52), + X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(44,76), X(12,44), X(28,60), + X(28,44), X(60,76), X(12,28), X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), + X(40,56), X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), X(64,80), X(16,32), + X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80) +}; +M(82) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(21,37), + X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), + X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(19,35), X(51,67), X(3,19), X(35,51), X(11,43), X(43,75), X(11,43), X(27,59), + X(27,43), X(59,75), X(11,27), X(43,59), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), + X(39,55), X(15,47), X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), X(15,31), + X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), + X(67,69), X(71,73), X(75,77), X(79,81), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), + X(42,58), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), + X(54,70), X(6,22), X(38,54), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), + X(62,78), X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(74,78), X(4,36), X(36,68), X(4,36), X(20,52), + X(20,36), X(52,68), X(4,20), X(36,52), X(12,44), X(44,76), X(12,44), X(28,60), + X(28,44), X(60,76), X(12,28), X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), + X(40,56), X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), X(64,80), X(16,32), + X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), + X(68,70), X(72,74), X(76,78), X(80,82), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82) +}; +M(83) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(21,37), + X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), + X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(51,83), X(19,51), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), + X(27,59), X(27,43), X(59,75), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), + X(59,67), X(75,83), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), + X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), + X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(2,34), X(34,66), X(2,34), + X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), X(42,74), + X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), + X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), X(14,30), X(46,62), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(4,36), X(36,68), X(4,36), X(20,52), X(20,36), X(52,68), X(4,20), + X(36,52), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), + X(44,60), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), + X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(48,80), + X(16,48), X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), + X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), + X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), + X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), + X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82) +}; +M(84) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(21,37), + X(53,69), X(5,21), X(37,53), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), + X(61,77), X(13,29), X(45,61), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(3,35), X(35,67), X(3,35), X(19,51), + X(51,83), X(19,51), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), + X(27,59), X(27,43), X(59,75), X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), + X(59,67), X(75,83), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), + X(39,71), X(7,39), X(23,55), X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), + X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(2,34), X(34,66), X(2,34), + X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), X(42,74), + X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), X(6,22), X(38,54), + X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), X(14,30), X(46,62), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), + X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), + X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), + X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(48,80), X(16,48), X(32,64), + X(32,48), X(64,80), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(72,76), X(80,84), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84) +}; +M(85) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), + X(21,53), X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), + X(29,45), X(61,77), X(13,29), X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), X(59,75), + X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), + X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), X(47,79), X(15,47), X(31,63), + X(31,47), X(63,79), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), + X(63,67), X(71,75), X(79,83), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(2,34), + X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), + X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(22,38), X(54,70), + X(6,22), X(38,54), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), + X(14,30), X(46,62), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), + X(20,52), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), + X(28,44), X(60,76), X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), + X(8,40), X(24,56), X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(48,80), + X(16,48), X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84) +}; +M(86) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), + X(21,53), X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), + X(29,45), X(61,77), X(13,29), X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), X(59,75), + X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), + X(23,39), X(55,71), X(7,23), X(39,55), X(15,47), X(47,79), X(15,47), X(31,63), + X(31,47), X(63,79), X(15,31), X(47,63), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), + X(63,67), X(71,75), X(79,83), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(2,34), + X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), + X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), + X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), + X(62,78), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), X(36,52), + X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), + X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), X(24,40), + X(56,72), X(8,24), X(40,56), X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), + X(64,80), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86) +}; +M(87) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), + X(21,53), X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), + X(29,45), X(61,77), X(13,29), X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), X(59,75), + X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), + X(42,58), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), + X(22,54), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), + X(30,46), X(62,78), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), + X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), + X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), + X(24,40), X(56,72), X(8,24), X(40,56), X(16,48), X(48,80), X(16,48), X(32,64), + X(32,48), X(64,80), X(16,32), X(48,64), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(72,76), X(80,84), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86) +}; +M(88) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(25,41), X(57,73), X(9,25), + X(41,57), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), + X(21,53), X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), + X(29,45), X(61,77), X(13,29), X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), X(59,75), + X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), + X(42,58), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), + X(22,54), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), + X(30,46), X(62,78), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), + X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), + X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), + X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), + X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88) +}; +M(89) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), X(61,77), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), X(59,75), + X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(2,34), X(34,66), + X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), + X(42,74), X(10,42), X(26,58), X(26,42), X(58,74), X(10,26), X(42,58), X(10,18), + X(26,34), X(42,50), X(58,66), X(74,82), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), + X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), + X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(4,36), + X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), + X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), X(44,60), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), + X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88) +}; +M(90) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), X(61,77), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(27,43), X(59,75), + X(11,27), X(43,59), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(2,34), X(34,66), + X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), + X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), X(10,26), X(42,58), X(74,90), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,38), X(38,70), + X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), X(70,86), X(14,46), + X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), X(14,30), X(46,62), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), + X(62,66), X(70,74), X(78,82), X(86,90), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(4,36), + X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), + X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), X(60,76), X(12,28), X(44,60), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), + X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), + X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90) +}; +M(91) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), X(61,77), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(59,91), X(27,59), + X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), X(55,87), X(23,55), X(7,23), + X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), + X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), + X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), + X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), + X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(28,44), + X(60,76), X(12,28), X(44,60), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(8,40), X(40,72), X(8,40), + X(24,56), X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), + X(16,48), X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90) +}; +M(92) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(29,45), X(61,77), X(13,29), + X(45,61), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), X(3,19), + X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(59,91), X(27,59), + X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), X(55,87), X(23,55), X(7,23), + X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), X(31,63), X(31,47), X(63,79), + X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), + X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(30,46), X(62,78), + X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), + X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), + X(28,60), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), + X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), + X(86,88), X(90,92), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92) +}; +M(93) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), + X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(73,77), X(81,85), X(89,93), X(3,35), X(35,67), X(3,35), X(19,51), + X(51,83), X(19,51), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), + X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(7,11), + X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), + X(79,83), X(87,91), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), + X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), + X(58,90), X(26,58), X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), + X(22,54), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), + X(30,46), X(62,78), X(14,30), X(46,62), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(4,36), X(36,68), X(4,36), X(20,52), + X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), + X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), + X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92) +}; +M(94) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), + X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(73,77), X(81,85), X(89,93), X(3,35), X(35,67), X(3,35), X(19,51), + X(51,83), X(19,51), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), + X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(31,47), X(63,79), X(15,31), X(47,63), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(7,11), + X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), + X(79,83), X(87,91), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), + X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), + X(58,90), X(26,58), X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), + X(22,54), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), + X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(4,36), + X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), + X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), + X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(8,40), + X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), + X(16,48), X(48,80), X(16,48), X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), + X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94) +}; +M(95) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), + X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(73,77), X(81,85), X(89,93), X(3,35), X(35,67), X(3,35), X(19,51), + X(51,83), X(19,51), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), + X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), + X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), X(10,26), + X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), + X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), + X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(4,36), X(36,68), X(4,36), X(20,52), + X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), + X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), + X(32,64), X(32,48), X(64,80), X(16,32), X(48,64), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94) +}; +M(96) = { + X(1,33), X(33,65), X(1,33), X(17,49), X(49,81), X(17,49), X(1,17), X(33,49), + X(65,81), X(9,41), X(41,73), X(9,41), X(25,57), X(57,89), X(25,57), X(9,25), + X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), X(5,21), X(37,53), + X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), + X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), + X(65,69), X(73,77), X(81,85), X(89,93), X(3,35), X(35,67), X(3,35), X(19,51), + X(51,83), X(19,51), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), + X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), + X(2,34), X(34,66), X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), X(10,26), + X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), + X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), + X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(4,36), X(36,68), X(4,36), X(20,52), + X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), + X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), + X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96) +}; +M(97) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), + X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), + X(29,61), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), + X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), + X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(59,91), + X(27,59), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), X(55,87), X(23,55), + X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), X(31,63), X(63,95), + X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(2,34), X(34,66), + X(2,34), X(18,50), X(50,82), X(18,50), X(2,18), X(34,50), X(66,82), X(10,42), + X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), X(10,26), X(42,58), X(74,90), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,38), X(38,70), + X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), X(70,86), X(14,46), + X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), + X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), + X(28,60), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), + X(32,64), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96) +}; +M(98) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), + X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), + X(29,61), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), + X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(3,35), X(35,67), X(3,35), X(19,51), X(51,83), X(19,51), + X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), X(59,91), + X(27,59), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), X(55,87), X(23,55), + X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), X(31,63), X(63,95), + X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(2,66), X(34,98), + X(2,34), X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), + X(2,18), X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), + X(26,58), X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(6,38), X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), + X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), + X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(4,36), X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), X(36,52), + X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), X(28,60), X(12,28), + X(44,60), X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), X(8,24), X(40,56), + X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), X(32,64), X(16,32), + X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98) +}; +M(99) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), + X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), + X(29,61), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), + X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), + X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), + X(43,75), X(11,43), X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,38), + X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), X(70,86), + X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), + X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(4,36), + X(36,68), X(4,36), X(20,52), X(52,84), X(20,52), X(4,20), X(36,52), X(68,84), + X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), + X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(8,40), + X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), X(8,24), X(40,56), X(72,88), + X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), + X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), + X(86,88), X(90,92), X(94,96), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98) +}; +M(100) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,37), X(37,69), X(5,37), X(21,53), X(53,85), X(21,53), + X(5,21), X(37,53), X(69,85), X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), + X(29,61), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), + X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), + X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), + X(43,75), X(11,43), X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), + X(55,87), X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,38), + X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), X(70,86), + X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), + X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(4,68), + X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), + X(32,64), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100) +}; +M(101) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,45), + X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), X(77,93), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), + X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), + X(11,43), X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(11,19), + X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), X(55,87), + X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), X(31,63), + X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), + X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), + X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), + X(87,89), X(91,93), X(95,97), X(99,101), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,38), + X(38,70), X(6,38), X(22,54), X(54,86), X(22,54), X(6,22), X(38,54), X(70,86), + X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), + X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(4,68), + X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), + X(32,64), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(1,2), X(3,4), X(5,6), + X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), + X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), + X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), + X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), + X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), + X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100) +}; +M(102) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,45), + X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), X(77,93), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), + X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), + X(11,43), X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(11,19), + X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(7,39), X(39,71), X(7,39), X(23,55), X(55,87), + X(23,55), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), X(31,63), + X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), + X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), + X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), + X(87,89), X(91,93), X(95,97), X(99,101), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), + X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), + X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(4,68), + X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), + X(32,64), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), + X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), + X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), + X(92,94), X(96,98), X(100,102), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), + X(86,88), X(90,92), X(94,96), X(98,100), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102) +}; +M(103) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,45), + X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), X(77,93), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), + X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), + X(11,43), X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(11,19), + X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), + X(55,87), X(23,55), X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), + X(15,47), X(47,79), X(15,47), X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), + X(79,95), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), X(10,26), + X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,70), X(38,102), + X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), X(54,70), + X(86,102), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), + X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(4,68), + X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,40), X(40,72), X(8,40), X(24,56), X(56,88), X(24,56), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), + X(32,64), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), + X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), + X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), + X(92,94), X(96,98), X(100,102), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), + X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), + X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), + X(86,88), X(90,92), X(94,96), X(98,100), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), + X(97,98), X(99,100), X(101,102) +}; +M(104) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,41), X(41,73), X(9,41), + X(25,57), X(57,89), X(25,57), X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,45), + X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), X(77,93), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), + X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), + X(11,43), X(27,59), X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(11,19), + X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), + X(55,87), X(23,55), X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), + X(15,47), X(47,79), X(15,47), X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), + X(79,95), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), + X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), X(10,26), + X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,70), X(38,102), + X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), X(54,70), + X(86,102), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), + X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(4,68), + X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,72), X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), + X(24,56), X(24,40), X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), + X(48,80), X(16,48), X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104) +}; +M(105) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), + X(77,93), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(3,67), + X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), + X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), + X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(11,19), X(27,35), X(43,51), + X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), + X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), + X(15,47), X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(15,23), + X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), + X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), + X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), + X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), + X(34,50), X(66,82), X(10,42), X(42,74), X(10,42), X(26,58), X(58,90), X(26,58), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), + X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), + X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(4,68), + X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), + X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(8,72), X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), + X(24,56), X(24,40), X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), + X(48,80), X(16,48), X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), + X(97,98), X(99,100), X(101,102), X(103,104) +}; +M(106) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), + X(77,93), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(3,67), + X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), + X(83,99), X(3,19), X(35,51), X(67,83), X(11,43), X(43,75), X(11,43), X(27,59), + X(59,91), X(27,59), X(11,27), X(43,59), X(75,91), X(11,19), X(27,35), X(43,51), + X(59,67), X(75,83), X(91,99), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), + X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), + X(15,47), X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(15,23), + X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), + X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), + X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), + X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), + X(34,50), X(66,82), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), + X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), + X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(6,70), X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), + X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), + X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), + X(4,20), X(36,52), X(68,84), X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), + X(28,60), X(12,28), X(44,60), X(76,92), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(8,72), X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), + X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106) +}; +M(107) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), + X(77,93), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(3,67), + X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), + X(83,99), X(3,19), X(35,51), X(67,83), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,59), X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), + X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), + X(55,87), X(23,55), X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), + X(15,47), X(47,79), X(15,47), X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), + X(79,95), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(2,66), X(34,98), X(2,34), X(66,98), X(18,50), + X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), X(66,82), + X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), X(26,58), + X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), + X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), + X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), + X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(4,68), X(36,100), X(4,36), X(68,100), X(20,52), + X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), + X(12,44), X(44,76), X(12,44), X(28,60), X(60,92), X(28,60), X(12,28), X(44,60), + X(76,92), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(8,72), X(40,104), X(8,40), + X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), X(56,72), X(88,104), + X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), X(64,96), + X(32,64), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), + X(97,98), X(99,100), X(101,102), X(103,104), X(105,106) +}; +M(108) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,45), X(45,77), X(13,45), X(29,61), X(61,93), X(29,61), X(13,29), X(45,61), + X(77,93), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), + X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(3,67), + X(35,99), X(3,35), X(67,99), X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), + X(83,99), X(3,19), X(35,51), X(67,83), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,59), X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), + X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), + X(55,87), X(23,55), X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), + X(15,47), X(47,79), X(15,47), X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), + X(79,95), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), + X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(2,66), X(34,98), X(2,34), X(66,98), X(18,50), + X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), X(66,82), + X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), X(26,58), + X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), + X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), + X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), X(30,62), X(62,94), + X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(4,68), X(36,100), X(4,36), X(68,100), X(20,52), + X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), + X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), X(40,104), + X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), X(56,72), + X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), + X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), + X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108) +}; +M(109) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), + X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), + X(67,83), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), + X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), + X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), + X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), + X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), + X(97,99), X(101,103), X(105,107), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), + X(66,82), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), + X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), + X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,46), X(46,78), X(14,46), + X(30,62), X(62,94), X(30,62), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), + X(4,20), X(36,52), X(68,84), X(12,76), X(44,108), X(12,44), X(76,108), + X(28,60), X(60,92), X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), + X(44,60), X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(8,72), X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), + X(24,56), X(24,40), X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), + X(48,80), X(16,48), X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108) +}; +M(110) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), + X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), + X(67,83), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), + X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), + X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), + X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,47), X(47,79), X(15,47), + X(31,63), X(63,95), X(31,63), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), + X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), + X(97,99), X(101,103), X(105,107), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), + X(66,82), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), + X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), + X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,78), X(46,110), + X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), X(62,78), + X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), X(20,52), + X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), + X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), X(40,104), + X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), X(56,72), + X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), X(32,64), + X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), + X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110) +}; +M(111) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), + X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), + X(67,83), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), + X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), + X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), + X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,79), X(47,111), + X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), X(63,79), + X(95,111), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(2,66), + X(34,98), X(2,34), X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), + X(82,98), X(2,18), X(34,50), X(66,82), X(10,74), X(42,106), X(10,42), + X(74,106), X(26,58), X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), + X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,54), + X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), + X(14,78), X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), + X(30,46), X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), + X(20,52), X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), + X(68,84), X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), + X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,48), X(48,80), X(16,48), + X(32,64), X(64,96), X(32,64), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(108,110), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110) +}; +M(112) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,49), X(49,81), X(17,49), X(17,33), + X(49,65), X(81,97), X(1,17), X(33,49), X(65,81), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), + X(81,89), X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), + X(53,85), X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), + X(19,51), X(51,83), X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), + X(67,83), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), + X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), + X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), + X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,79), X(47,111), + X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), X(63,79), + X(95,111), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(2,66), + X(34,98), X(2,34), X(66,98), X(18,50), X(50,82), X(18,50), X(18,34), X(50,66), + X(82,98), X(2,18), X(34,50), X(66,82), X(10,74), X(42,106), X(10,42), + X(74,106), X(26,58), X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), + X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,54), + X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), + X(14,78), X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), + X(30,46), X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), + X(20,52), X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), + X(68,84), X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), + X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), + X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112) +}; +M(113) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), + X(51,83), X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), + X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), X(27,59), + X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), X(39,103), X(7,39), + X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), X(55,71), X(87,103), + X(7,23), X(39,55), X(71,87), X(15,79), X(47,111), X(15,47), X(79,111), + X(31,63), X(63,95), X(31,63), X(31,47), X(63,79), X(95,111), X(15,31), + X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), + X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(2,66), X(34,98), X(2,34), X(66,98), X(18,50), + X(50,82), X(18,50), X(18,34), X(50,66), X(82,98), X(2,18), X(34,50), X(66,82), + X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), X(26,58), + X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), + X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), + X(6,22), X(38,54), X(70,86), X(14,78), X(46,110), X(14,46), X(78,110), + X(30,62), X(62,94), X(30,62), X(30,46), X(62,78), X(94,110), X(14,30), + X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(4,68), X(36,100), X(4,36), X(68,100), X(20,52), X(52,84), X(20,52), X(20,36), + X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), X(12,76), X(44,108), + X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), X(28,44), X(60,76), + X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(8,72), X(40,104), X(8,40), X(72,104), + X(24,56), X(56,88), X(24,56), X(24,40), X(56,72), X(88,104), X(8,24), X(40,56), + X(72,88), X(16,80), X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), + X(32,64), X(32,48), X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112) +}; +M(114) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), X(19,51), + X(51,83), X(19,51), X(19,35), X(51,67), X(83,99), X(3,19), X(35,51), X(67,83), + X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), X(27,59), + X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), X(39,103), X(7,39), + X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), X(55,71), X(87,103), + X(7,23), X(39,55), X(71,87), X(15,79), X(47,111), X(15,47), X(79,111), + X(31,63), X(63,95), X(31,63), X(31,47), X(63,79), X(95,111), X(15,31), + X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), + X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), + X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), + X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), X(26,58), + X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), X(10,18), + X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), X(22,54), X(22,38), + X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,78), X(46,110), + X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), X(62,78), + X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), X(20,52), + X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), X(68,84), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), + X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), X(40,104), + X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), X(56,72), + X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), X(48,112), X(16,48), + X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), X(96,112), + X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), + X(108,112), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114) +}; +M(115) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), X(19,83), + X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), X(27,59), + X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(11,19), + X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), + X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), + X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,79), X(47,111), + X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), X(63,79), + X(95,111), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), + X(2,18), X(34,50), X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), + X(74,106), X(26,58), X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(106,114), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,54), + X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), + X(14,78), X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), + X(30,46), X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), + X(20,52), X(52,84), X(20,52), X(20,36), X(52,68), X(84,100), X(4,20), X(36,52), + X(68,84), X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), + X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), + X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114) +}; +M(116) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,53), X(53,85), + X(21,53), X(21,37), X(53,69), X(85,101), X(5,21), X(37,53), X(69,85), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(3,67), X(35,99), X(3,35), X(67,99), X(19,83), + X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), X(59,91), X(27,59), + X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), X(75,91), X(11,19), + X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(7,71), + X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), X(23,55), X(23,39), + X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,79), X(47,111), + X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), X(63,79), + X(95,111), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), + X(2,18), X(34,50), X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), + X(74,106), X(26,58), X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), + X(10,26), X(42,58), X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(106,114), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,54), + X(54,86), X(22,54), X(22,38), X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), + X(14,78), X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), + X(30,46), X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), + X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), + X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), + X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), + X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), + X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116) +}; +M(117) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), X(53,117), + X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), X(3,35), + X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), + X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), + X(75,91), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), + X(23,55), X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), + X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(2,66), X(34,98), + X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), + X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), + X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,54), X(54,86), + X(22,54), X(22,38), X(54,70), X(86,102), X(6,22), X(38,54), X(70,86), X(14,78), + X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), + X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), + X(94,98), X(102,106), X(110,114), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(4,68), X(36,100), X(4,36), X(68,100), X(20,84), + X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), + X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(12,20), + X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), + X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), + X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), + X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116) +}; +M(118) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), X(53,117), + X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), X(3,35), + X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), + X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), + X(75,91), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,55), X(55,87), + X(23,55), X(23,39), X(55,71), X(87,103), X(7,23), X(39,55), X(71,87), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), + X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), + X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), + X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(2,66), X(34,98), + X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), + X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), + X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), + X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), + X(60,92), X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), + X(76,92), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(8,72), X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), + X(24,56), X(24,40), X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), + X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118) +}; +M(119) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), X(53,117), + X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), X(3,35), + X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), + X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), + X(75,91), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), + X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), + X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), + X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), X(62,78), X(94,110), + X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), + X(106,110), X(114,118), X(4,68), X(36,100), X(4,36), X(68,100), X(20,84), + X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), + X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(12,20), + X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,56), X(56,88), X(24,56), X(24,40), + X(56,72), X(88,104), X(8,24), X(40,56), X(72,88), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), + X(96,112), X(16,32), X(48,64), X(80,96), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118) +}; +M(120) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,57), X(57,89), X(25,57), X(25,41), X(57,73), X(89,105), + X(9,25), X(41,57), X(73,89), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), X(53,117), + X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), + X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), X(29,45), + X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), X(3,35), + X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), + X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), + X(75,91), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), + X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), X(58,90), + X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), X(74,90), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), + X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), X(62,78), X(94,110), + X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), + X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), + X(106,110), X(114,118), X(4,68), X(36,100), X(4,36), X(68,100), X(20,84), + X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), X(60,92), X(28,60), + X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), X(76,92), X(12,20), + X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), X(16,48), + X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), X(96,112), + X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(96,104), X(112,120), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), + X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), + X(108,112), X(116,120), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120) +}; +M(121) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), + X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), + X(75,91), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,58), + X(58,90), X(26,58), X(26,42), X(58,74), X(90,106), X(10,26), X(42,58), + X(74,90), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), + X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,60), + X(60,92), X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), X(44,60), + X(76,92), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), + X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120) +}; +M(122) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,59), + X(59,91), X(27,59), X(27,43), X(59,75), X(91,107), X(11,27), X(43,59), + X(75,91), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(2,66), X(34,98), X(2,34), + X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), + X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(4,68), X(36,100), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), + X(28,60), X(60,92), X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), + X(44,60), X(76,92), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), + X(32,48), X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122) +}; +M(123) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,91), + X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(2,66), X(34,98), + X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), + X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(4,68), X(36,100), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), + X(28,60), X(60,92), X(28,60), X(28,44), X(60,76), X(92,108), X(12,28), + X(44,60), X(76,92), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), + X(32,48), X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122) +}; +M(124) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,61), X(61,93), X(29,61), + X(29,45), X(61,77), X(93,109), X(13,29), X(45,61), X(77,93), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(3,67), X(35,99), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,91), + X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), X(31,63), X(31,47), + X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(2,66), X(34,98), + X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(46,110), X(14,46), X(78,110), X(30,62), X(62,94), X(30,62), X(30,46), + X(62,78), X(94,110), X(14,30), X(46,62), X(78,94), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(4,68), X(36,100), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), + X(28,92), X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), + X(32,48), X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124) +}; +M(125) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), + X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(3,67), X(35,99), X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), + X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), + X(31,63), X(31,47), X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(7,11), + X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), + X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), X(10,74), + X(42,106), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), + X(10,26), X(42,58), X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(6,70), X(38,102), + X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), + X(30,62), X(62,94), X(30,62), X(30,46), X(62,78), X(94,110), X(14,30), + X(46,62), X(78,94), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(4,68), X(36,100), X(4,36), X(68,100), + X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), + X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), + X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), X(64,80), + X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124) +}; +M(126) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), + X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(3,67), X(35,99), X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), + X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,63), X(63,95), + X(31,63), X(31,47), X(63,79), X(95,111), X(15,31), X(47,63), X(79,95), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(7,11), + X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), + X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), X(10,74), + X(42,106), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), + X(10,26), X(42,58), X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(6,70), X(38,102), + X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), + X(30,94), X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), + X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126) +}; +M(127) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), + X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(3,67), X(35,99), X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), + X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), + X(123,127), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), + X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), + X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), + X(78,94), X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,64), X(64,96), X(32,64), X(32,48), + X(64,80), X(96,112), X(16,32), X(48,64), X(80,96), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126) +}; +M(128) = { + X(1,65), X(33,97), X(1,33), X(65,97), X(17,81), X(49,113), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), X(9,41), + X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), X(41,57), + X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(5,69), X(37,101), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), X(101,117), + X(13,77), X(45,109), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), + X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(3,67), X(35,99), X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), + X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), + X(123,127), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(2,66), X(34,98), X(2,34), X(66,98), X(18,82), + X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(6,70), + X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), + X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), + X(78,94), X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(4,68), X(36,100), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128) +}; +M(129) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(37,101), + X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), X(77,109), + X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(3,67), X(35,99), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,91), + X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(2,66), X(34,98), X(2,34), X(66,98), + X(18,82), X(50,114), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), + X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), X(58,122), + X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), + X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), + X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(14,30), + X(46,62), X(78,94), X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(4,68), X(36,100), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), + X(28,92), X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), + X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128) +}; +M(130) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(37,101), + X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), X(77,109), + X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(3,67), X(35,99), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), X(27,91), + X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), + X(54,118), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), + X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), + X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(4,68), X(36,100), X(4,36), X(68,100), X(20,84), X(52,116), + X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), + X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), + X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(8,72), X(40,104), + X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(8,24), + X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), X(16,48), X(80,112), + X(32,96), X(64,128), X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), + X(112,128), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130) +}; +M(131) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(37,101), + X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), X(77,109), + X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(3,67), X(67,131), + X(3,67), X(35,99), X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(51,115), + X(19,51), X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), X(3,19), + X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), + X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), + X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), + X(26,90), X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), + X(106,122), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), + X(22,86), X(54,118), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(4,68), X(36,100), X(4,36), X(68,100), X(20,84), + X(52,116), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), + X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(8,72), + X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), X(16,48), + X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(16,32), X(48,64), + X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130) +}; +M(132) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(37,101), + X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), X(77,109), + X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(3,67), X(67,131), + X(3,67), X(35,99), X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(51,115), + X(19,51), X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), X(3,19), + X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), X(75,107), + X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), X(71,103), + X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), + X(26,90), X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), + X(106,122), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), + X(22,86), X(54,118), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), + X(20,36), X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), + X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), + X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(12,20), + X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), + X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), + X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132) +}; +M(133) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(3,67), + X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), + X(51,115), X(19,51), X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), + X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), + X(71,87), X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), + X(63,127), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(6,70), X(38,102), X(6,38), X(70,102), X(22,86), + X(54,118), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), + X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), + X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), + X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), + X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), + X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(16,32), + X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132) +}; +M(134) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(3,67), + X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), + X(51,115), X(19,51), X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(7,71), X(39,103), X(7,39), + X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(7,23), X(39,55), + X(71,87), X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), + X(63,127), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(4,68), X(68,132), X(4,68), X(36,100), + X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), + X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), + X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), + X(124,128), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134) +}; +M(135) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(3,67), + X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), + X(51,115), X(19,51), X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(7,71), X(71,135), X(7,71), + X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(7,23), + X(39,55), X(71,87), X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), + X(31,95), X(63,127), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), + X(111,127), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), + X(87,95), X(103,111), X(119,127), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(4,68), X(68,132), X(4,68), X(36,100), + X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), + X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(8,72), X(40,104), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), + X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), + X(124,128), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134) +}; +M(136) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(41,105), + X(9,41), X(73,105), X(25,89), X(57,121), X(25,57), X(89,121), X(9,25), + X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), X(41,49), X(57,65), + X(73,81), X(89,97), X(105,113), X(121,129), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(3,67), + X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), + X(51,115), X(19,51), X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), + X(3,19), X(35,51), X(67,83), X(99,115), X(11,75), X(43,107), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(7,71), X(71,135), X(7,71), + X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), X(55,119), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(7,23), + X(39,55), X(71,87), X(103,119), X(15,79), X(47,111), X(15,47), X(79,111), + X(31,95), X(63,127), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), + X(111,127), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), + X(87,95), X(103,111), X(119,127), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(4,68), X(68,132), X(4,68), X(36,100), + X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), + X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), + X(104,136), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), + X(24,40), X(56,72), X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), + X(104,120), X(16,80), X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), + X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136) +}; +M(137) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(43,107), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), + X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), + X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), X(55,71), + X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(42,106), X(10,42), X(74,106), X(26,90), + X(58,122), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(4,68), X(68,132), X(4,68), X(36,100), + X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), + X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), + X(68,84), X(100,116), X(12,76), X(44,108), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), + X(104,136), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), + X(24,40), X(56,72), X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), + X(104,120), X(16,80), X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), + X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136) +}; +M(138) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(43,107), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), + X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), + X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), X(55,71), + X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), + X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), + X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), X(74,90), + X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), X(38,102), + X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), + X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), + X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), + X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), + X(126,134), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), + X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), + X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), + X(12,28), X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(16,32), + X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), + X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138) +}; +M(139) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), + X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), + X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), + X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), + X(30,94), X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), + X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), + X(44,108), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), + X(12,28), X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(16,32), + X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), + X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), + X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138) +}; +M(140) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(45,109), X(13,45), + X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), + X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), + X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), + X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), + X(30,94), X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), + X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), + X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), + X(28,92), X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), + X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), + X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140) +}; +M(141) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), + X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), + X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), + X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), + X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), X(74,90), + X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), X(38,102), + X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), + X(70,86), X(102,118), X(14,78), X(46,110), X(14,46), X(78,110), X(30,94), + X(62,126), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), + X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), + X(126,134), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), + X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), + X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), + X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), + X(28,92), X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), + X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), + X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), + X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), + X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140) +}; +M(142) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), + X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), + X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), + X(15,79), X(47,111), X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), X(34,50), + X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), + X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), X(74,90), + X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), X(38,102), + X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), + X(70,86), X(102,118), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), + X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), X(46,62), X(78,94), + X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), X(4,68), + X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), + X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), X(76,140), + X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), + X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(48,112), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(16,32), + X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142) +}; +M(143) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), + X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), + X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), + X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), + X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), X(31,47), X(63,79), + X(95,111), X(127,143), X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), + X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(78,142), X(14,78), X(46,110), + X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), + X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), X(46,62), + X(78,94), X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), + X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), + X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), + X(92,108), X(124,140), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), + X(56,72), X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(48,112), X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), + X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142) +}; +M(144) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(49,113), X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), + X(113,129), X(1,17), X(33,49), X(65,81), X(97,113), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), + X(9,25), X(41,57), X(73,89), X(105,121), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(5,69), X(69,133), + X(5,69), X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), + X(53,117), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), X(117,133), + X(5,21), X(37,53), X(69,85), X(101,117), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), + X(45,61), X(77,93), X(109,125), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), X(99,115), + X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), X(11,43), + X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), X(23,39), + X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), X(103,119), + X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), + X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), X(31,47), X(63,79), + X(95,111), X(127,143), X(15,31), X(47,63), X(79,95), X(111,127), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), + X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(78,142), X(14,78), X(46,110), + X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), + X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), X(46,62), + X(78,94), X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), + X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), + X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), + X(92,108), X(124,140), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), + X(56,72), X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), + X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), + X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144) +}; +M(145) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(5,21), X(37,53), X(69,85), + X(101,117), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), + X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(29,45), + X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), X(109,125), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), + X(99,115), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), + X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), + X(103,135), X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), + X(23,39), X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), X(31,47), + X(63,79), X(95,111), X(127,143), X(15,31), X(47,63), X(79,95), X(111,127), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(2,66), X(66,130), + X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(50,114), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(2,18), + X(34,50), X(66,82), X(98,114), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), + X(74,90), X(106,122), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), + X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), + X(38,54), X(70,86), X(102,118), X(14,78), X(78,142), X(14,78), X(46,110), + X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), + X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), X(46,62), + X(78,94), X(110,126), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), + X(4,36), X(68,100), X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), + X(52,68), X(84,100), X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), + X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), + X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), + X(92,108), X(124,140), X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), + X(56,72), X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), + X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), + X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), + X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144) +}; +M(146) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(5,21), X(37,53), X(69,85), + X(101,117), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), + X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(29,45), + X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), X(109,125), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(51,115), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(3,19), X(35,51), X(67,83), + X(99,115), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), + X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), + X(103,135), X(7,39), X(71,103), X(23,87), X(55,119), X(23,55), X(87,119), + X(23,39), X(55,71), X(87,103), X(119,135), X(7,23), X(39,55), X(71,87), + X(103,119), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(63,127), X(31,63), X(95,127), X(31,47), + X(63,79), X(95,111), X(127,143), X(15,31), X(47,63), X(79,95), X(111,127), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(2,66), X(66,130), + X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), + X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), + X(42,58), X(74,90), X(106,122), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), X(22,38), X(54,70), + X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), + X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), X(4,68), + X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), + X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), X(76,140), + X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), + X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146) +}; +M(147) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(5,21), X(37,53), X(69,85), + X(101,117), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), + X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(29,45), + X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), X(109,125), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), + X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), + X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), + X(55,119), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), + X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(2,66), X(66,130), + X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), + X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), + X(42,58), X(74,90), X(106,122), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), X(22,38), X(54,70), + X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), + X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), X(4,68), + X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), + X(20,84), X(52,116), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(4,20), X(36,52), X(68,84), X(100,116), X(12,76), X(76,140), + X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), + X(12,28), X(44,60), X(76,92), X(108,124), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146) +}; +M(148) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(53,117), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(5,21), X(37,53), X(69,85), + X(101,117), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), + X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), X(29,45), + X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), X(109,125), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), + X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), + X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), + X(55,119), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), + X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(2,66), X(66,130), + X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(58,122), + X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(10,26), + X(42,58), X(74,90), X(106,122), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), X(22,38), X(54,70), + X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), X(102,118), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), + X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), X(4,68), + X(68,132), X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), + X(20,84), X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), + X(84,116), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), + X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), + X(28,92), X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(12,28), X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), + X(104,136), X(8,40), X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), + X(24,40), X(56,72), X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), + X(104,120), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), + X(64,80), X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), + X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148) +}; +M(149) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), + X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), + X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), + X(55,119), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), + X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(2,66), X(66,130), X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), + X(74,138), X(10,74), X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), + X(26,90), X(58,122), X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), + X(122,138), X(10,26), X(42,58), X(74,90), X(106,122), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(54,118), X(22,54), X(86,118), + X(22,38), X(54,70), X(86,102), X(118,134), X(6,22), X(38,54), X(70,86), + X(102,118), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), + X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), + X(62,78), X(94,110), X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), + X(28,44), X(60,76), X(92,108), X(124,140), X(12,28), X(44,60), X(76,92), + X(108,124), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), + X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(80,144), X(16,80), + X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), X(64,128), + X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), X(16,32), + X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148) +}; +M(150) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), + X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), + X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), + X(55,119), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), + X(7,23), X(39,55), X(71,87), X(103,119), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(2,66), X(66,130), X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), + X(74,138), X(10,74), X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), + X(26,90), X(58,122), X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), + X(122,138), X(10,26), X(42,58), X(74,90), X(106,122), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), + X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), + X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), X(46,62), X(78,94), + X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), + X(28,44), X(60,76), X(92,108), X(124,140), X(12,28), X(44,60), X(76,92), + X(108,124), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), + X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), X(80,144), X(16,80), + X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), X(64,128), + X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), X(16,32), + X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150) +}; +M(151) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), + X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), + X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), + X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), + X(63,127), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), + X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(2,66), X(66,130), X(2,66), X(34,98), X(34,66), X(98,130), + X(2,34), X(66,98), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), + X(114,146), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), X(106,138), + X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), X(26,42), + X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), + X(46,62), X(78,94), X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(4,68), X(68,132), X(4,68), + X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), + X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), + X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), X(60,124), + X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), X(12,28), + X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), + X(72,104), X(24,88), X(56,120), X(24,56), X(88,120), X(24,40), X(56,72), + X(88,104), X(120,136), X(8,24), X(40,56), X(72,88), X(104,120), X(16,80), + X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), + X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150) +}; +M(152) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(57,121), X(25,57), X(89,121), X(25,41), X(57,73), X(89,105), + X(121,137), X(9,25), X(41,57), X(73,89), X(105,121), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), + X(113,121), X(129,137), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), + X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), + X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), + X(107,123), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), + X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), + X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), + X(63,127), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), + X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(2,66), X(66,130), X(2,66), X(34,98), X(34,66), X(98,130), + X(2,34), X(66,98), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), + X(114,146), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), X(106,138), + X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), X(26,42), + X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), + X(46,62), X(78,94), X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(4,68), X(68,132), X(4,68), + X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), + X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), + X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), X(60,124), + X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), X(12,28), + X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), + X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), + X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), + X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), + X(144,152), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152) +}; +M(153) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), X(51,83), + X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), + X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), X(7,71), + X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), X(87,151), + X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), + X(123,127), X(131,135), X(139,143), X(147,151), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(2,66), X(66,130), X(2,66), X(34,98), X(34,66), X(98,130), + X(2,34), X(66,98), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), + X(114,146), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), X(106,138), + X(10,42), X(74,106), X(26,90), X(58,122), X(26,58), X(90,122), X(26,42), + X(58,74), X(90,106), X(122,138), X(10,26), X(42,58), X(74,90), X(106,122), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), + X(46,62), X(78,94), X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(4,68), X(68,132), X(4,68), + X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), + X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), + X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), X(60,124), + X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), X(12,28), + X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), + X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), + X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), + X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), + X(144,152), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152) +}; +M(154) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), X(51,83), + X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), + X(11,43), X(75,107), X(27,91), X(59,123), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(11,27), X(43,59), X(75,91), X(107,123), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(7,71), X(71,135), X(7,71), + X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), X(87,151), + X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), + X(123,127), X(131,135), X(139,143), X(147,151), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(2,66), X(66,130), X(2,66), X(34,98), X(34,66), X(98,130), + X(2,34), X(66,98), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), + X(114,146), X(18,50), X(82,114), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), X(106,138), + X(10,42), X(74,106), X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), + X(122,154), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(62,126), + X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(14,30), + X(46,62), X(78,94), X(110,126), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(60,124), X(28,60), X(92,124), + X(28,44), X(60,76), X(92,108), X(124,140), X(12,28), X(44,60), X(76,92), + X(108,124), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), + X(152,154), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154) +}; +M(155) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), X(51,83), + X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), + X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), X(59,91), + X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), X(71,135), X(7,71), + X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), X(87,151), + X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), X(62,78), + X(94,110), X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(4,68), X(68,132), + X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), + X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), + X(60,124), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), + X(12,28), X(44,60), X(76,92), X(108,124), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), + X(120,152), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), + X(64,80), X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154) +}; +M(156) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(61,125), X(29,61), X(93,125), + X(29,45), X(61,77), X(93,109), X(125,141), X(13,29), X(45,61), X(77,93), + X(109,125), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), + X(109,117), X(125,133), X(141,149), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(3,67), X(67,131), X(3,67), X(35,99), X(35,67), X(99,131), + X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), X(51,115), X(51,83), + X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), X(107,139), + X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), X(59,91), + X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), X(71,135), X(7,71), + X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), X(23,87), X(87,151), + X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), X(15,79), + X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), X(63,127), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(15,31), + X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), X(62,78), + X(94,110), X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(4,68), X(68,132), + X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), + X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), + X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), + X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), + X(120,152), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), + X(64,80), X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156) +}; +M(157) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), + X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), + X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), + X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), + X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), + X(31,95), X(63,127), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), + X(127,143), X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(62,126), X(30,62), X(94,126), X(30,46), X(62,78), + X(94,110), X(126,142), X(14,30), X(46,62), X(78,94), X(110,126), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(4,68), X(68,132), + X(4,68), X(36,100), X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), + X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), + X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), + X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), + X(120,152), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(64,128), X(32,64), X(96,128), X(32,48), + X(64,80), X(96,112), X(128,144), X(16,32), X(48,64), X(80,96), X(112,128), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156) +}; +M(158) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), + X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), + X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), + X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), + X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), + X(31,95), X(63,127), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), + X(127,143), X(15,31), X(47,63), X(79,95), X(111,127), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(2,66), X(66,130), X(2,66), + X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158) +}; +M(159) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), + X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), + X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), + X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), + X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(2,66), X(66,130), + X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(64,128), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(16,32), X(48,64), X(80,96), X(112,128), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158) +}; +M(160) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(33,65), X(97,129), X(1,33), X(65,97), + X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), X(17,49), + X(81,113), X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), + X(73,137), X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), + X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), + X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), X(37,101), X(37,69), + X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), + X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), + X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), + X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), + X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), + X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(2,66), X(66,130), + X(2,66), X(34,98), X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), + X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), + X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160) +}; +M(161) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), + X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), + X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), + X(125,129), X(133,137), X(141,145), X(149,153), X(157,161), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), + X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), + X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), + X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), + X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(2,66), X(66,130), X(2,66), X(34,98), + X(34,66), X(98,130), X(2,34), X(66,98), X(18,82), X(82,146), X(18,82), + X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), X(26,90), + X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(6,70), + X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), + X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), + X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), + X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160) +}; +M(162) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), + X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), + X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), + X(125,129), X(133,137), X(141,145), X(149,153), X(157,161), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(35,67), X(99,131), X(3,35), X(67,99), X(19,83), X(83,147), X(19,83), + X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(7,71), + X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), X(7,39), X(71,103), + X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), X(23,55), + X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(2,66), X(66,130), X(2,66), X(34,98), + X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(18,34), + X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), X(34,50), X(66,82), + X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(42,74), + X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), X(26,90), X(58,122), + X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), X(102,134), + X(6,38), X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), + X(118,150), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), + X(14,46), X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), + X(126,158), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), + X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), X(36,68), + X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162) +}; +M(163) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), + X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), + X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), + X(125,129), X(133,137), X(141,145), X(149,153), X(157,161), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), + X(119,151), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), + X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), + X(10,74), X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(94,158), + X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), + X(36,68), X(100,132), X(4,36), X(68,100), X(20,84), X(84,148), X(20,84), + X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), + X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), + X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), + X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), + X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), + X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), + X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162) +}; +M(164) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(37,69), X(101,133), X(5,37), X(69,101), X(21,85), X(85,149), + X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), + X(45,109), X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), + X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), + X(69,73), X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), + X(125,129), X(133,137), X(141,145), X(149,153), X(157,161), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), + X(119,151), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), + X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), + X(10,74), X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), + X(38,102), X(38,70), X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), X(30,94), X(94,158), + X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), + X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), + X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), + X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), + X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), + X(8,40), X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), + X(120,152), X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), + X(128,160), X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164) +}; +M(165) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), + X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), + X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), + X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), + X(119,151), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(2,66), X(66,130), X(2,66), + X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), X(26,90), + X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), X(38,102), X(38,70), + X(102,134), X(6,38), X(70,102), X(22,86), X(86,150), X(22,86), X(54,118), + X(54,86), X(118,150), X(22,54), X(86,118), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), + X(110,142), X(14,46), X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), + X(62,94), X(126,158), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), + X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), + X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), + X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(156,164), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(8,72), X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), + X(72,104), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), + X(80,112), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), + X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164) +}; +M(166) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), + X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), + X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), + X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(39,71), X(103,135), + X(7,39), X(71,103), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), + X(119,151), X(23,55), X(87,119), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(2,66), X(66,130), X(2,66), + X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), + X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), X(26,90), + X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), + X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), + X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), + X(86,102), X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), + X(14,46), X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), + X(126,158), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), + X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(52,84), + X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), + X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), X(76,108), + X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), + X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(12,20), + X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), + X(140,148), X(156,164), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), X(72,136), + X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166) +}; +M(167) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), + X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), + X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), + X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), + X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), + X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), + X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), + X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(127,135), X(143,151), X(159,167), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), X(38,102), + X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), + X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), + X(110,142), X(14,46), X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), + X(62,94), X(126,158), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), + X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), + X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), + X(72,136), X(8,72), X(40,104), X(40,72), X(104,136), X(8,40), X(72,104), + X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), + X(88,120), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), + X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), + X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), + X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), + X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), + X(152,156), X(160,164), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166) +}; +M(168) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(41,73), X(105,137), X(9,41), X(73,105), X(25,89), + X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(9,17), X(25,33), + X(41,49), X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), + X(153,161), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(5,69), X(69,133), X(5,69), + X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), + X(69,85), X(101,117), X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), + X(45,77), X(109,141), X(13,45), X(77,109), X(29,93), X(93,157), X(29,93), + X(61,125), X(61,93), X(125,157), X(29,61), X(93,125), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), X(61,69), + X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), X(19,35), + X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), X(43,75), + X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), + X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), + X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), + X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), + X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(127,135), X(143,151), X(159,167), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), X(38,102), + X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), + X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), + X(110,142), X(14,46), X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), + X(62,94), X(126,158), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), + X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), + X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), + X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), + X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168) +}; +M(169) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), X(13,45), + X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), + X(39,103), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), + X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), + X(87,103), X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(143,151), X(159,167), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), + X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(42,74), X(106,138), X(10,42), X(74,106), X(26,90), X(90,154), + X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(6,70), X(70,134), X(6,70), X(38,102), + X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), + X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), + X(110,142), X(14,46), X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), + X(62,94), X(126,158), X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(12,76), X(76,140), X(12,76), X(44,108), X(44,76), X(108,140), X(12,44), + X(76,108), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), + X(28,60), X(92,124), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(8,72), + X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), + X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168) +}; +M(170) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), X(13,45), + X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(43,75), X(107,139), X(11,43), X(75,107), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(3,11), + X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), + X(131,139), X(147,155), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), + X(39,103), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), + X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), + X(87,103), X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(47,79), X(111,143), + X(15,47), X(79,111), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(143,151), X(159,167), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), + X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), + X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), + X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), + X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), + X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), + X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), + X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), + X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), + X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), + X(88,104), X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), + X(128,160), X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), + X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170) +}; +M(171) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), X(13,45), + X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), + X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), + X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), + X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), + X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), + X(44,76), X(108,140), X(12,44), X(76,108), X(28,92), X(92,156), X(28,92), + X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), + X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), + X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), + X(88,104), X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), X(112,144), + X(16,48), X(80,112), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), + X(128,160), X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), + X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), + X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170) +}; +M(172) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(45,77), X(109,141), X(13,45), + X(77,109), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(5,13), X(21,29), X(37,45), X(53,61), + X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), + X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), + X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), + X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), + X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), + X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), + X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), X(78,110), + X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), + X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), + X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), + X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), + X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), + X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), + X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172) +}; +M(173) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), + X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), + X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), + X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), + X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), + X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), + X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), + X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(46,78), X(110,142), X(14,46), + X(78,110), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), + X(30,62), X(94,126), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), + X(126,134), X(142,150), X(158,166), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), + X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), + X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), + X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), + X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), + X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), + X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172) +}; +M(174) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), + X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), + X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), + X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(47,79), X(111,143), X(15,47), X(79,111), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), + X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), + X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), X(50,82), X(114,146), + X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), + X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), + X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), + X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), + X(126,158), X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), + X(158,174), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(166,174), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), + X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), + X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), + X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), + X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), + X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), + X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), + X(16,80), X(48,112), X(48,80), X(112,144), X(16,48), X(80,112), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), + X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), + X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174) +}; +M(175) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), + X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), + X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), + X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(2,66), X(66,130), X(2,66), X(34,98), + X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(18,34), + X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), X(34,50), X(66,82), + X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), + X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(26,42), X(58,74), + X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), + X(170,174), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), + X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), + X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), + X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), + X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), + X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), + X(56,72), X(88,104), X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(48,80), + X(112,144), X(16,48), X(80,112), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174) +}; +M(176) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(49,81), X(113,145), + X(17,49), X(81,113), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(9,73), X(73,137), + X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), X(137,169), + X(25,89), X(89,153), X(25,89), X(57,121), X(57,89), X(121,153), X(25,57), + X(89,121), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(1,9), X(17,25), X(33,41), + X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), + X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), X(85,101), + X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), + X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), + X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), X(17,21), X(25,29), + X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), X(83,115), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), X(43,107), + X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), + X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), X(119,151), + X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), X(79,143), + X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(2,66), X(66,130), X(2,66), X(34,98), + X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(50,82), X(114,146), X(18,50), X(82,114), X(18,34), + X(50,66), X(82,98), X(114,130), X(146,162), X(2,18), X(34,50), X(66,82), + X(98,114), X(130,146), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), + X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), X(26,42), X(58,74), + X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), + X(170,174), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), + X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), + X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), + X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), + X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), + X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), + X(56,72), X(88,104), X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), + X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), + X(96,112), X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176) +}; +M(177) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), + X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), + X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), + X(19,83), X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), + X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), + X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), + X(91,155), X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), + X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), + X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), + X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), + X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), + X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), + X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), + X(50,82), X(114,146), X(18,50), X(82,114), X(18,34), X(50,66), X(82,98), + X(114,130), X(146,162), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), + X(122,154), X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), X(6,70), X(38,102), + X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), X(22,38), + X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), + X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(4,68), X(68,132), + X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), + X(20,84), X(84,148), X(20,84), X(52,116), X(52,84), X(116,148), X(20,52), + X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), X(76,140), X(12,76), + X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), + X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), + X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), + X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), + X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), + X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), + X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), + X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176) +}; +M(178) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), + X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), + X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), + X(19,83), X(83,147), X(19,83), X(51,115), X(51,83), X(115,147), X(19,51), + X(83,115), X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(11,75), X(75,139), X(11,75), + X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), + X(91,155), X(27,91), X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), + X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), + X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(55,87), + X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), X(119,135), + X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(15,79), + X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), + X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), + X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), + X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), + X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), + X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), X(10,74), + X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), X(6,70), + X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), + X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), X(86,118), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), X(46,110), + X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(6,10), + X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), + X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), + X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(52,84), + X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(12,76), + X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), + X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), + X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), + X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), + X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), + X(88,104), X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), + X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), + X(176,178), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178) +}; +M(179) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), + X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), + X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), + X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), + X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), X(59,75), X(91,107), + X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(155,163), X(171,179), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), + X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), + X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), + X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), + X(159,175), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), + X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), + X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(52,84), X(116,148), X(20,52), X(84,116), X(20,36), X(52,68), + X(84,100), X(116,132), X(148,164), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), X(8,72), + X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), X(88,120), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), X(16,80), X(48,112), + X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), + X(64,80), X(96,112), X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178) +}; +M(180) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(53,85), X(117,149), X(21,53), X(85,117), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), + X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), + X(61,93), X(125,157), X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), X(13,17), X(21,25), + X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), + X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(3,67), X(67,131), + X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), + X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), + X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), + X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), X(59,75), X(91,107), + X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(155,163), X(171,179), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), X(87,103), + X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), + X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), + X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), + X(127,159), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), + X(159,175), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), + X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), + X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), + X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), X(118,150), X(22,54), + X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), X(78,142), X(14,78), + X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), + X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), + X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), + X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(56,88), X(120,152), X(24,56), + X(88,120), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(8,24), + X(40,56), X(72,88), X(104,120), X(136,152), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180) +}; +M(181) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), + X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), + X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), + X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), + X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(3,67), X(67,131), X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(163,171), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), + X(39,103), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), + X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), + X(87,103), X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), + X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), + X(63,95), X(127,159), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), + X(127,143), X(159,175), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(2,66), X(66,130), X(2,66), + X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), + X(122,154), X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), + X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), + X(138,146), X(154,162), X(170,178), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), + X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(54,86), + X(118,150), X(22,54), X(86,118), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(14,78), + X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), + X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), + X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(4,68), X(68,132), + X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), + X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), + X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), + X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180) +}; +M(182) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), + X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), + X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), + X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), + X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(3,67), X(67,131), X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(163,171), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), + X(39,103), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), + X(55,119), X(55,87), X(119,151), X(23,55), X(87,119), X(23,39), X(55,71), + X(87,103), X(119,135), X(151,167), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), + X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), + X(63,95), X(127,159), X(31,63), X(95,127), X(31,47), X(63,79), X(95,111), + X(127,143), X(159,175), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(2,66), X(66,130), X(2,66), + X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), + X(122,154), X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), + X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), + X(138,146), X(154,162), X(170,178), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), + X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), + X(54,118), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), + X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(166,174), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(4,68), X(68,132), + X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), + X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), + X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), + X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), + X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), + X(176,178), X(180,182), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182) +}; +M(183) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), + X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), + X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), + X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), + X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(3,67), X(67,131), X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(163,171), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), + X(39,103), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), + X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), + X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(2,66), X(66,130), X(2,66), X(34,98), + X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), + X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), + X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(170,178), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), + X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), + X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), + X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), + X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(4,68), X(68,132), + X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), + X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), + X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(56,88), X(120,152), X(24,56), X(88,120), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), + X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), + X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), + X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), + X(176,178), X(180,182), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181), X(182,183), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182) +}; +M(184) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(57,89), X(121,153), X(25,57), X(89,121), X(25,41), X(57,73), + X(89,105), X(121,137), X(153,169), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(5,69), X(69,133), X(5,69), X(37,101), X(101,165), + X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), + X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(5,21), + X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), + X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), X(29,61), + X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), X(45,53), + X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), + X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(3,67), X(67,131), X(3,67), X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(59,91), X(123,155), X(27,59), X(91,123), X(27,43), X(59,75), + X(91,107), X(123,139), X(155,171), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(3,11), X(19,27), + X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), + X(147,155), X(163,171), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), + X(39,103), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), + X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), + X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), + X(95,127), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(2,66), X(66,130), X(2,66), X(34,98), + X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), + X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), + X(26,58), X(90,122), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(170,178), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), + X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), + X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), + X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), + X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(4,68), X(68,132), + X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), + X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), + X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184) +}; +M(185) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), + X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(59,91), X(123,155), + X(27,59), X(91,123), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), + X(155,163), X(171,179), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), + X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), + X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), + X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(143,151), X(159,167), X(175,183), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(183,185), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), + X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), + X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), X(10,74), + X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(58,90), X(122,154), X(26,58), X(90,122), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(6,70), X(70,134), X(6,70), + X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), + X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), + X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), + X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), + X(126,158), X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), + X(158,174), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(174,182), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), + X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), + X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), + X(170,174), X(178,182), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), + X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), + X(92,124), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), + X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184) +}; +M(186) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), + X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(59,91), X(123,155), + X(27,59), X(91,123), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), + X(155,163), X(171,179), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), + X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), + X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), + X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(143,151), X(159,167), X(175,183), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(183,185), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), + X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), + X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), X(10,74), + X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), + X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), + X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), + X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), + X(62,94), X(126,158), X(30,62), X(94,126), X(30,46), X(62,78), X(94,110), + X(126,142), X(158,174), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), + X(126,134), X(142,150), X(158,166), X(174,182), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), + X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), X(150,154), + X(158,162), X(166,170), X(174,178), X(182,186), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), + X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), + X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), + X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), X(28,44), + X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), X(8,72), X(40,104), + X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), + X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), + X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), + X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), + X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), + X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), + X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186) +}; +M(187) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), + X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), + X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), + X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), + X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), + X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), + X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), + X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), + X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(60,92), X(124,156), X(28,60), X(92,124), + X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(8,72), X(72,136), + X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186) +}; +M(188) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(61,93), X(125,157), + X(29,61), X(93,125), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(3,67), X(67,131), X(3,67), X(35,99), + X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), + X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), + X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), + X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), + X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), + X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), + X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), + X(94,126), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), + X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), + X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(8,72), X(72,136), + X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(176,180), X(184,188), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188) +}; +M(189) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), + X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), + X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), + X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), + X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(2,66), X(66,130), X(2,66), + X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), + X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), + X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), + X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), + X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(62,94), X(126,158), X(30,62), X(94,126), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), + X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), + X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(8,72), X(72,136), + X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(176,180), X(184,188), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188) +}; +M(190) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), + X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), + X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), + X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), + X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(63,95), X(127,159), X(31,63), X(95,127), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(2,66), X(66,130), X(2,66), + X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), + X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), + X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), + X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), + X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), + X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), X(36,100), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), + X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), + X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(8,72), X(72,136), + X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(64,96), X(128,160), X(32,64), X(96,128), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(176,180), X(184,188), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190) +}; +M(191) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), + X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), + X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), + X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), + X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), + X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), + X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), + X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(162,178), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), + X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), + X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), + X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), + X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), + X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), + X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), + X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(64,96), X(128,160), X(32,64), X(96,128), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190) +}; +M(192) = { + X(1,65), X(65,129), X(1,65), X(33,97), X(97,161), X(33,97), X(1,33), X(65,97), + X(129,161), X(17,81), X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), + X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(9,73), X(73,137), X(9,73), X(41,105), X(105,169), + X(41,105), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(5,69), X(69,133), X(5,69), X(37,101), + X(101,165), X(37,101), X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), + X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(3,67), X(67,131), X(3,67), + X(35,99), X(99,163), X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), + X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), + X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), + X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), + X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), + X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), + X(107,123), X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), + X(2,66), X(66,130), X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), + X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), + X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(162,178), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), + X(42,106), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), + X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), + X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), + X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), + X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(4,68), X(68,132), X(4,68), + X(36,100), X(100,164), X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), + X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), + X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), + X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), + X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192) +}; +M(193) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), X(5,69), + X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), + X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), + X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(3,67), X(67,131), X(3,67), X(35,99), X(99,163), + X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), + X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), X(75,139), + X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), + X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), + X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), + X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(2,66), X(66,130), + X(2,66), X(34,98), X(98,162), X(34,98), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), + X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), + X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(6,70), X(70,134), X(6,70), X(38,102), X(102,166), + X(38,102), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), + X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), + X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), + X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), + X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), + X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), + X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192) +}; +M(194) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), X(5,69), + X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), + X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), + X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(3,67), X(67,131), X(3,67), X(35,99), X(99,163), + X(35,99), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), + X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), X(75,139), + X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(7,71), + X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), X(7,39), X(71,103), + X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), + X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), + X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), + X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), + X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), + X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), + X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), + X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), + X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), + X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), + X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), + X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), + X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), + X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), + X(192,194), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194) +}; +M(195) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), X(5,69), + X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), + X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), + X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), + X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), X(115,131), + X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), + X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), + X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(171,187), X(11,19), X(27,35), X(43,51), + X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), + X(171,179), X(187,195), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), + X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), + X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), + X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), + X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(4,68), X(68,132), X(4,68), X(36,100), X(100,164), + X(36,100), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), + X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), + X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), X(8,40), + X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), + X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), + X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), + X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), + X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), + X(192,194), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194) +}; +M(196) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), X(5,69), + X(69,133), X(5,69), X(37,101), X(101,165), X(37,101), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), + X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), X(109,173), + X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), + X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), + X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), + X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), X(115,131), + X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), X(43,107), + X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), + X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(171,187), X(11,19), X(27,35), X(43,51), + X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), + X(171,179), X(187,195), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), + X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(6,70), X(70,134), + X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), + X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), + X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), + X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), + X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), + X(194,196), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196) +}; +M(197) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), X(101,165), X(37,101), + X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(173,181), + X(189,197), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), + X(51,115), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), + X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), + X(155,163), X(171,179), X(187,195), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), + X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), + X(179,181), X(183,185), X(187,189), X(191,193), X(195,197), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), + X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), + X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(6,70), + X(70,134), X(6,70), X(38,102), X(102,166), X(38,102), X(6,38), X(70,102), + X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), + X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), + X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), + X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), + X(194,196), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(196,197), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196) +}; +M(198) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), X(101,165), X(37,101), + X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(173,181), + X(189,197), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), + X(51,115), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), + X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), + X(155,163), X(171,179), X(187,195), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,71), X(71,135), X(7,71), X(39,103), X(103,167), X(39,103), + X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), + X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), X(7,23), X(39,55), + X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), + X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(3,5), X(7,9), X(11,13), + X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), + X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), + X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), + X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), + X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), + X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), + X(179,181), X(183,185), X(187,189), X(191,193), X(195,197), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), + X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), + X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), + X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), + X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), + X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), + X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), + X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), + X(190,198), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), + X(52,116), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), + X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), + X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), + X(156,164), X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), + X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198) +}; +M(199) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), X(101,165), X(37,101), + X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(173,181), + X(189,197), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), + X(51,115), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), + X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), + X(155,163), X(171,179), X(187,195), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), + X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), + X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), + X(63,127), X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), X(79,95), + X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(191,199), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), + X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), + X(183,191), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(178,194), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), + X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), + X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), + X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), + X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), + X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), + X(190,198), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), + X(52,116), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), + X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), + X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), + X(156,164), X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,72), X(72,136), X(8,72), X(40,104), X(104,168), X(40,104), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), + X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), + X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197), X(198,199), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198) +}; +M(200) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,73), + X(73,137), X(9,73), X(41,105), X(105,169), X(41,105), X(9,41), X(73,105), + X(137,169), X(25,89), X(89,153), X(25,89), X(57,121), X(121,185), X(57,121), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), X(101,165), X(37,101), + X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), X(133,165), X(21,85), + X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(13,77), + X(77,141), X(13,77), X(45,109), X(109,173), X(45,109), X(13,45), X(77,109), + X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), + X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), + X(93,101), X(109,117), X(125,133), X(141,149), X(157,165), X(173,181), + X(189,197), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), + X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), + X(51,115), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,75), X(75,139), X(11,75), X(43,107), X(107,171), + X(43,107), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(11,27), + X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(11,19), X(27,35), + X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), + X(155,163), X(171,179), X(187,195), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), + X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), + X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), + X(63,127), X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), X(79,95), + X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), X(47,55), X(63,71), + X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(191,199), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), + X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), + X(183,191), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(178,194), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,74), X(74,138), X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), + X(58,122), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), + X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), + X(78,142), X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), + X(142,174), X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), + X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), + X(190,198), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), + X(52,116), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), + X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), + X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), + X(156,164), X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), + X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(184,200), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), + X(64,128), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200) +}; +M(201) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), + X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), + X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), + X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(179,195), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), X(75,139), + X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(7,135), + X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), X(39,71), + X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), + X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), + X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), + X(95,127), X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), + X(175,191), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(143,151), X(159,167), X(175,183), X(191,199), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), + X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,74), X(74,138), + X(10,74), X(42,106), X(106,170), X(42,106), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), + X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), + X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), X(44,108), + X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), + X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), + X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(184,200), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), + X(64,128), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(196,197), X(198,199), X(200,201), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200) +}; +M(202) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), + X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), + X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), + X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(179,195), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,75), X(75,139), + X(11,75), X(43,107), X(107,171), X(43,107), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(7,135), + X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), X(39,71), + X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), X(87,151), + X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), X(79,143), + X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), + X(95,127), X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), + X(175,191), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), + X(111,119), X(127,135), X(143,151), X(159,167), X(175,183), X(191,199), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), + X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), + X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(26,42), + X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), + X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), + X(54,118), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(182,198), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), X(110,174), + X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), + X(158,166), X(174,182), X(190,198), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), + X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), X(150,154), + X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), X(198,202), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), + X(52,116), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(12,76), X(76,140), X(12,76), X(44,108), X(108,172), + X(44,108), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), + X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), + X(156,164), X(172,180), X(188,196), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), + X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(184,200), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), + X(64,128), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), + X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), + X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), X(196,198), + X(200,202), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202) +}; +M(203) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), + X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), + X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), + X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(179,195), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(179,187), X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), + X(55,119), X(23,55), X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), + X(119,135), X(151,167), X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), + X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), + X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), + X(183,191), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), X(151,155), + X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), X(199,203), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), + X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), + X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), + X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), + X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), + X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), + X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(174,182), X(190,198), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(194,198), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), + X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), + X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(180,196), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,76), X(76,140), + X(12,76), X(44,108), X(108,172), X(44,108), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(8,136), + X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), X(40,72), + X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), + X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(8,24), + X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), + X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), + X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), + X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202) +}; +M(204) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,77), X(77,141), X(13,77), X(45,109), + X(109,173), X(45,109), X(13,45), X(77,109), X(141,173), X(29,93), X(93,157), + X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), X(157,189), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), + X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,83), X(83,147), + X(19,83), X(51,115), X(115,179), X(51,115), X(19,51), X(83,115), X(147,179), + X(19,35), X(51,67), X(83,99), X(115,131), X(147,163), X(179,195), X(3,19), + X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,91), X(91,155), X(27,91), + X(59,123), X(123,187), X(59,123), X(27,59), X(91,123), X(155,187), X(27,43), + X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), X(11,27), X(43,59), + X(75,91), X(107,123), X(139,155), X(171,187), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(179,187), X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), + X(55,119), X(23,55), X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), + X(119,135), X(151,167), X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(15,79), X(79,143), X(15,79), X(47,111), X(111,175), + X(47,111), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), X(31,95), + X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(7,15), X(23,31), X(39,47), X(55,63), + X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), + X(183,191), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), X(151,155), + X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), X(199,203), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,82), + X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), + X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), + X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), + X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), + X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), + X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), X(14,78), X(46,110), + X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(174,182), X(190,198), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(194,198), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), + X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), + X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(180,196), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(12,140), X(76,204), + X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), + X(172,204), X(12,44), X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), + X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), X(156,188), X(28,44), + X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(180,188), X(196,204), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), + X(56,120), X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(184,200), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(16,80), X(80,144), X(16,80), X(48,112), X(112,176), + X(48,112), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(176,180), X(184,188), X(192,196), X(200,204), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204) +}; +M(205) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), + X(45,109), X(109,173), X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), + X(61,125), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), + X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), X(115,131), + X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), X(107,171), + X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), + X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), + X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), + X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), + X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), + X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(175,191), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), + X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), X(175,183), + X(191,199), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), + X(201,203), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(178,194), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), + X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,78), X(78,142), + X(14,78), X(46,110), X(110,174), X(46,110), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), + X(190,194), X(198,202), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), + X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), + X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), X(20,52), + X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), + X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), + X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), X(8,136), + X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), X(40,72), + X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), + X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(8,24), + X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), X(80,144), + X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), X(144,176), + X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), + X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(200,204), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), + X(188,189), X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), + X(200,201), X(202,203), X(204,205), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204) +}; +M(206) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), + X(45,109), X(109,173), X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), + X(61,125), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), + X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), X(115,131), + X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), X(107,171), + X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), + X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), + X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,79), + X(79,143), X(15,79), X(47,111), X(111,175), X(47,111), X(15,47), X(79,111), + X(143,175), X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), + X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), X(79,95), X(111,127), + X(143,159), X(175,191), X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), + X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), X(175,183), + X(191,199), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), + X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), + X(201,203), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(178,194), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), + X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), + X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), + X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), + X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), + X(192,200), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206) +}; +M(207) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), + X(45,109), X(109,173), X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), + X(61,125), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), + X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), X(115,131), + X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), X(107,171), + X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), + X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), + X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(178,194), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), + X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,80), + X(80,144), X(16,80), X(48,112), X(112,176), X(48,112), X(16,48), X(80,112), + X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), + X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), + X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), + X(192,200), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), + X(204,205), X(206,207), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206) +}; +M(208) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,81), + X(81,145), X(17,81), X(49,113), X(113,177), X(49,113), X(17,49), X(81,113), + X(145,177), X(17,33), X(49,65), X(81,97), X(113,129), X(145,161), X(177,193), + X(1,17), X(33,49), X(65,81), X(97,113), X(129,145), X(161,177), X(9,137), + X(73,201), X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), + X(105,137), X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), + X(25,89), X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), + X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), + X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(1,9), X(17,25), + X(33,41), X(49,57), X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), + X(145,153), X(161,169), X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), + X(5,37), X(69,101), X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), + X(117,181), X(53,117), X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), + X(85,101), X(117,133), X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), + X(101,117), X(133,149), X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), + X(45,109), X(109,173), X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), + X(77,109), X(141,173), X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), + X(61,125), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), + X(141,157), X(173,189), X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), + X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), X(165,173), + X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), + X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), + X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), X(51,115), + X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), X(115,131), + X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), X(107,171), + X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), + X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), + X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,82), X(82,146), X(18,82), X(50,114), X(114,178), X(50,114), X(18,50), + X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), + X(178,194), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), + X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), + X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,86), X(86,150), + X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,144), + X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), + X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208) +}; +M(209) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), + X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), + X(51,115), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), + X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), + X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), + X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), X(131,133), + X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), X(155,157), + X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), X(179,181), + X(183,185), X(187,189), X(191,193), X(195,197), X(199,201), X(203,205), + X(207,209), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), + X(193,195), X(197,199), X(201,203), X(205,207), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), + X(2,34), X(66,98), X(130,162), X(18,82), X(82,146), X(18,82), X(50,114), + X(114,178), X(50,114), X(18,50), X(82,114), X(146,178), X(18,34), X(50,66), + X(82,98), X(114,130), X(146,162), X(178,194), X(2,18), X(34,50), X(66,82), + X(98,114), X(130,146), X(162,178), X(10,138), X(74,202), X(10,74), X(138,202), + X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), + X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), + X(58,122), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), + X(122,138), X(154,170), X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), + X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), + X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), + X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(182,198), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), + X(190,206), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), + X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), + X(4,36), X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), + X(116,180), X(52,116), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), + X(84,100), X(116,132), X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(12,140), X(76,204), X(12,76), X(140,204), + X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), + X(76,108), X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), + X(60,124), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), + X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), + X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), + X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), + X(152,168), X(184,200), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), + X(96,128), X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), + X(192,208), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), + X(204,205), X(206,207), X(208,209), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208) +}; +M(210) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), + X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,83), X(83,147), X(19,83), X(51,115), X(115,179), + X(51,115), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), + X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), + X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), + X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), X(131,133), + X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), X(155,157), + X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), X(179,181), + X(183,185), X(187,189), X(191,193), X(195,197), X(199,201), X(203,205), + X(207,209), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), + X(193,195), X(197,199), X(201,203), X(205,207), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), + X(2,34), X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), + X(50,114), X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), + X(106,170), X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), + X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(202,210), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), + X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), + X(182,198), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), + X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), + X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), + X(190,194), X(198,202), X(206,210), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), X(52,116), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,144), + X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), + X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), + X(208,210), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210) +}; +M(211) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), + X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), X(51,115), + X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), X(83,115), + X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), + X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), X(107,171), + X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), X(203,211), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), + X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), + X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(199,203), X(207,211), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(26,42), + X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(186,194), X(202,210), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), + X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), + X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), + X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(182,198), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), + X(190,206), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,84), X(84,148), X(20,84), X(52,116), X(116,180), + X(52,116), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), + X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), + X(140,172), X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), + X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), + X(156,172), X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(196,204), X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), + X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), + X(24,88), X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), + X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), + X(184,200), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), + X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), + X(208,210), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210) +}; +M(212) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,85), X(85,149), X(21,85), X(53,117), X(117,181), X(53,117), + X(21,53), X(85,117), X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), + X(149,165), X(181,197), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), + X(165,181), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(3,131), X(67,195), X(3,67), X(131,195), + X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), X(3,35), + X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), X(51,115), + X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), X(83,115), + X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), X(163,179), + X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), X(107,171), + X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), X(139,171), + X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), X(203,211), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), X(39,103), + X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), X(23,87), + X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(7,11), X(15,19), X(23,27), + X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), + X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(199,203), X(207,211), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,90), X(90,154), X(26,90), + X(58,122), X(122,186), X(58,122), X(26,58), X(90,122), X(154,186), X(26,42), + X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(186,194), X(202,210), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), + X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), + X(134,166), X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), + X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(182,198), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), + X(190,206), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,144), + X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), + X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212) +}; +M(213) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,93), + X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), + X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(189,205), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), + X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(199,203), X(207,211), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), + X(2,34), X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), + X(50,114), X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), + X(106,170), X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), + X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(202,210), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,86), X(86,150), X(22,86), X(54,118), X(118,182), X(54,118), X(22,54), + X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), + X(182,198), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), + X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), + X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), + X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), X(6,10), X(14,18), + X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), + X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), + X(190,194), X(198,202), X(206,210), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), + X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), + X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), X(28,92), + X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(12,20), + X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), + X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(8,136), X(72,200), X(8,72), + X(136,200), X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), + X(8,40), X(72,104), X(136,168), X(24,88), X(88,152), X(24,88), X(56,120), + X(120,184), X(56,120), X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), + X(88,104), X(120,136), X(152,168), X(184,200), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(16,144), X(80,208), X(16,80), X(144,208), + X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), + X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), + X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), X(80,96), X(112,128), + X(144,160), X(176,192), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), + X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), + X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), X(192,196), + X(200,204), X(208,212), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212) +}; +M(214) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,93), + X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), + X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(189,205), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,87), X(87,151), X(23,87), X(55,119), X(119,183), X(55,119), X(23,55), + X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), + X(183,199), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), + X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), + X(159,191), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(7,11), X(15,19), + X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), + X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), + X(143,147), X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), + X(191,195), X(199,203), X(207,211), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), + X(2,34), X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), + X(50,114), X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), + X(106,170), X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), + X(138,170), X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), + X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(202,210), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(194,202), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), + X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), + X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), + X(158,166), X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,144), + X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), + X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), + X(212,214), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214) +}; +M(215) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,93), + X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), + X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(189,205), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), X(55,119), + X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), + X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), X(202,210), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), + X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,88), + X(88,152), X(24,88), X(56,120), X(120,184), X(56,120), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(16,144), + X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), + X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), + X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), + X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), + X(212,214), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214) +}; +M(216) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,89), X(89,153), X(25,89), + X(57,121), X(121,185), X(57,121), X(25,57), X(89,121), X(153,185), X(25,41), + X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), X(9,25), X(41,57), + X(73,89), X(105,121), X(137,153), X(169,185), X(9,17), X(25,33), X(41,49), + X(57,65), X(73,81), X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), + X(169,177), X(185,193), X(201,209), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(5,133), X(69,197), X(5,69), X(133,197), X(37,101), + X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), X(69,101), + X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,93), + X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), X(93,125), + X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), X(189,205), + X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(13,21), + X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), + X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(1,5), X(9,13), X(17,21), + X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), + X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), X(55,119), + X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), + X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), X(202,210), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), + X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), + X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), + X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), + X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), + X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), + X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(208,216), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216) +}; +M(217) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), X(55,119), + X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), + X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), + X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), X(131,133), + X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), X(155,157), + X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), X(179,181), + X(183,185), X(187,189), X(191,193), X(195,197), X(199,201), X(203,205), + X(207,209), X(211,213), X(215,217), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), + X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,90), X(90,154), X(26,90), X(58,122), X(122,186), X(58,122), X(26,58), + X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(186,202), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), X(202,210), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), + X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), + X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), + X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), + X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), + X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), + X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(208,216), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216) +}; +M(218) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,91), X(91,155), X(27,91), X(59,123), X(123,187), X(59,123), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), X(55,119), + X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(3,5), X(7,9), X(11,13), X(15,17), + X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), + X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), + X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), + X(111,113), X(115,117), X(119,121), X(123,125), X(127,129), X(131,133), + X(135,137), X(139,141), X(143,145), X(147,149), X(151,153), X(155,157), + X(159,161), X(163,165), X(167,169), X(171,173), X(175,177), X(179,181), + X(183,185), X(187,189), X(191,193), X(195,197), X(199,201), X(203,205), + X(207,209), X(211,213), X(215,217), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), + X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), + X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), + X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), X(30,94), + X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), X(30,46), + X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), + X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), + X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), + X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), + X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), + X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(208,216), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), + X(208,210), X(212,214), X(216,218), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218) +}; +M(219) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), X(123,187), + X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), X(155,187), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), X(55,119), + X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), + X(199,203), X(207,211), X(215,219), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(217,219), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), + X(2,34), X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), + X(50,114), X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), + X(106,170), X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), + X(138,170), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), + X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), + X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), + X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), + X(158,166), X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,92), X(92,156), X(28,92), X(60,124), X(124,188), X(60,124), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), + X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), X(204,212), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), + X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), + X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), + X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), + X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), + X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(208,216), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), + X(208,210), X(212,214), X(216,218), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(218,219), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218) +}; +M(220) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,93), X(93,157), X(29,93), X(61,125), X(125,189), X(61,125), X(29,61), + X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), X(125,141), X(157,173), + X(189,205), X(13,29), X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), + X(13,21), X(29,37), X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), + X(125,133), X(141,149), X(157,165), X(173,181), X(189,197), X(205,213), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(3,131), X(67,195), X(3,67), + X(131,195), X(35,99), X(99,163), X(35,99), X(35,67), X(99,131), X(163,195), + X(3,35), X(67,99), X(131,163), X(19,147), X(83,211), X(19,83), X(147,211), + X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), X(179,211), X(19,51), + X(83,115), X(147,179), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), X(139,203), X(43,107), + X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), X(11,43), X(75,107), + X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), X(123,187), + X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), X(155,187), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), X(39,103), X(103,167), + X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), X(71,103), X(135,167), + X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), X(55,119), + X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(15,143), + X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), X(47,79), + X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,95), X(95,159), + X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(7,11), X(15,19), X(23,27), X(31,35), + X(39,43), X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), + X(199,203), X(207,211), X(215,219), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(217,219), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), + X(2,34), X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), + X(50,114), X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), + X(82,114), X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), + X(106,170), X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), + X(138,170), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), + X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), + X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), + X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,94), X(94,158), + X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), X(94,126), X(158,190), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), + X(158,166), X(174,182), X(190,198), X(206,214), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), + X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), + X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), + X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), + X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), + X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), + X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), + X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), X(156,188), X(12,28), + X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(204,220), X(4,12), + X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), + X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), + X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), + X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), + X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), + X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), + X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), + X(176,208), X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), + X(64,128), X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), + X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), + X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(208,216), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), + X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), + X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), X(192,196), + X(200,204), X(208,212), X(216,220), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(218,220), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220) +}; +M(221) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), + X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), + X(95,127), X(159,191), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), + X(191,207), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(127,135), X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), X(195,197), + X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), X(219,221), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), + X(70,102), X(134,166), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,94), X(94,158), X(30,94), X(62,126), X(126,190), X(62,126), X(30,62), + X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), + X(190,206), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), + X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), X(206,214), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(202,206), X(210,214), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), + X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), + X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), + X(96,128), X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), + X(192,208), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), X(208,216), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(212,216), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220) +}; +M(222) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), + X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,95), X(95,159), X(31,95), X(63,127), X(127,191), X(63,127), X(31,63), + X(95,127), X(159,191), X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), + X(191,207), X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(127,135), X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), X(195,197), + X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), X(219,221), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), X(34,98), + X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), + X(70,102), X(134,166), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), + X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), X(36,100), + X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), X(20,148), + X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), + X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), + X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), + X(172,204), X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), + X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), + X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,96), X(96,160), X(32,96), X(64,128), X(128,192), X(64,128), X(32,64), + X(96,128), X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), + X(192,208), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), + X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), X(208,216), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(212,216), X(4,6), X(8,10), + X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), + X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), + X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), + X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), + X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), + X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), + X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), X(196,198), + X(200,202), X(204,206), X(208,210), X(212,214), X(216,218), X(220,222), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), + X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), + X(218,220), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222) +}; +M(223) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), + X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), + X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), + X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), + X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), + X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), + X(6,38), X(70,102), X(134,166), X(22,150), X(86,214), X(22,86), X(150,214), + X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), + X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), + X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), + X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), + X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(214,222), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(194,198), X(202,206), + X(210,214), X(218,222), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), + X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), + X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), X(28,156), + X(92,220), X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), + X(124,156), X(188,220), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(204,220), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(8,136), + X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), X(40,72), + X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), + X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), X(176,208), + X(16,48), X(80,112), X(144,176), X(32,96), X(96,160), X(32,96), X(64,128), + X(128,192), X(64,128), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), + X(96,112), X(128,144), X(160,176), X(192,208), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(16,24), X(32,40), X(48,56), X(64,72), + X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), X(160,168), + X(176,184), X(192,200), X(208,216), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), + X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), + X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), + X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), X(192,196), + X(200,204), X(208,212), X(216,220), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), + X(208,210), X(212,214), X(216,218), X(220,222), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222) +}; +M(224) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,97), X(97,161), X(33,97), + X(33,65), X(97,129), X(161,193), X(1,33), X(65,97), X(129,161), X(17,145), + X(81,209), X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), + X(113,145), X(177,209), X(17,49), X(81,113), X(145,177), X(1,17), X(33,49), + X(65,81), X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), + X(9,73), X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), + X(169,201), X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), + X(153,217), X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), + X(25,57), X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), + X(137,153), X(169,185), X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), + X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(2,130), X(66,194), X(2,66), X(130,194), X(34,98), X(98,162), + X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), X(66,98), X(130,162), + X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), + X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), + X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), + X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), + X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), + X(6,38), X(70,102), X(134,166), X(22,150), X(86,214), X(22,86), X(150,214), + X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), + X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), + X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), + X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), + X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(214,222), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(194,198), X(202,206), + X(210,214), X(218,222), X(4,132), X(68,196), X(4,68), X(132,196), X(36,100), + X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), X(4,36), X(68,100), + X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), + X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), + X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), X(28,156), + X(92,220), X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), + X(124,156), X(188,220), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(204,220), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(8,136), + X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), X(40,104), X(40,72), + X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), + X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), X(176,208), + X(16,48), X(80,112), X(144,176), X(32,160), X(96,224), X(32,96), X(160,224), + X(64,128), X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), + X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), + X(176,192), X(208,224), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224) +}; +M(225) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), + X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), + X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), + X(219,221), X(223,225), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,98), X(98,162), X(34,98), X(34,66), X(98,130), X(162,194), X(2,34), + X(66,98), X(130,162), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), + X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), + X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), + X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), + X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), + X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), + X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), + X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), + X(174,206), X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), + X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), + X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(4,132), X(68,196), X(4,68), + X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), X(100,132), X(164,196), + X(4,36), X(68,100), X(132,164), X(20,148), X(84,212), X(20,84), X(148,212), + X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), + X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), + X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), + X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), + X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), X(124,188), + X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), X(156,188), + X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), X(204,220), + X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), + X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), X(196,204), + X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), X(40,104), X(104,168), + X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), X(72,104), X(136,168), + X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), + X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), X(8,24), + X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), + X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), X(48,80), + X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), X(96,224), + X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), X(128,160), + X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(184,192), X(200,208), X(216,224), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), + X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), + X(218,219), X(220,221), X(222,223), X(224,225), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224) +}; +M(226) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,99), X(99,163), X(35,99), + X(35,67), X(99,131), X(163,195), X(3,35), X(67,99), X(131,163), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), + X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), + X(219,221), X(223,225), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), + X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), + X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(170,178), X(186,194), X(202,210), X(218,226), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), X(38,102), X(38,70), + X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), + X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), + X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), + X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(206,222), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(222,226), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), + X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), + X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), + X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), X(216,218), + X(220,222), X(224,226), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226) +}; +M(227) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), + X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(203,207), + X(211,215), X(219,223), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(210,226), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), + X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), + X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), + X(138,146), X(154,162), X(170,178), X(186,194), X(202,210), X(218,226), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), + X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), + X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), + X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), + X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(214,222), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), + X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), + X(190,194), X(198,202), X(206,210), X(214,218), X(222,226), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,100), X(100,164), X(36,100), X(36,68), + X(100,132), X(164,196), X(4,36), X(68,100), X(132,164), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), + X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), + X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), X(216,218), + X(220,222), X(224,226), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), + X(226,227), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226) +}; +M(228) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,101), X(101,165), X(37,101), X(37,69), X(101,133), X(165,197), X(5,37), + X(69,101), X(133,165), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), + X(45,109), X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), + X(29,157), X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), + X(61,93), X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), + X(45,61), X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), + X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), + X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), + X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(203,207), + X(211,215), X(219,223), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(210,226), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), + X(42,106), X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), + X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), + X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), + X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), + X(138,146), X(154,162), X(170,178), X(186,194), X(202,210), X(218,226), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), X(38,102), X(102,166), + X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), X(70,102), X(134,166), + X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), + X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), + X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), + X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), + X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(214,222), X(6,10), X(14,18), X(22,26), + X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), + X(94,98), X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), + X(142,146), X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), + X(190,194), X(198,202), X(206,210), X(214,218), X(222,226), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), X(164,228), + X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), X(20,84), + X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), + X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), + X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), + X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), + X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), + X(224,228), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228) +}; +M(229) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), + X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(203,207), + X(211,215), X(219,223), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), + X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), X(221,223), + X(225,227), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), + X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), X(50,66), + X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(202,210), X(218,226), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,102), X(102,166), X(38,102), X(38,70), X(102,134), X(166,198), X(6,38), + X(70,102), X(134,166), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), + X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), + X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), + X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(194,198), X(202,206), + X(210,214), X(218,222), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), + X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), + X(52,68), X(84,100), X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), + X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), + X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), + X(136,200), X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), + X(8,40), X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), + X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), + X(88,120), X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), + X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), + X(112,176), X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), + X(144,176), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), + X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), + X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), + X(216,224), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(176,180), X(184,188), X(192,196), X(200,204), + X(208,212), X(216,220), X(224,228), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), + X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), + X(218,219), X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228) +}; +M(230) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), + X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,103), X(103,167), X(39,103), X(39,71), X(103,135), X(167,199), X(7,39), + X(71,103), X(135,167), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), + X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), + X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(203,207), + X(211,215), X(219,223), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), + X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), X(221,223), + X(225,227), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), + X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), X(50,66), + X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), X(106,138), + X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(202,210), X(218,226), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), + X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), + X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(214,230), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), + X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), X(46,110), + X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), + X(158,166), X(174,182), X(190,198), X(206,214), X(222,230), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), + X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), + X(188,196), X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), + X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), + X(224,228), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), + X(212,214), X(216,218), X(220,222), X(224,226), X(228,230), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(226,228), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230) +}; +M(231) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), + X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), + X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(215,231), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), + X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), + X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(170,178), X(186,194), X(202,210), X(218,226), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), + X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), + X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), + X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), + X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), + X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), + X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), + X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), + X(206,214), X(222,230), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), X(164,228), + X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), X(20,84), + X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), + X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), + X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), + X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,104), X(104,168), X(40,104), X(40,72), X(104,136), X(168,200), X(8,40), + X(72,104), X(136,168), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), + X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), + X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), + X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), + X(224,228), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), + X(212,214), X(216,218), X(220,222), X(224,226), X(228,230), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(226,228), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), + X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), + X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), X(226,227), + X(228,229), X(230,231), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230) +}; +M(232) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,105), X(105,169), X(41,105), X(41,73), X(105,137), X(169,201), + X(9,41), X(73,105), X(137,169), X(25,153), X(89,217), X(25,89), X(153,217), + X(57,121), X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), + X(89,121), X(153,185), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), + X(169,185), X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), + X(89,97), X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), + X(185,193), X(201,209), X(217,225), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), X(171,203), + X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), + X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), + X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(215,231), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), + X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), + X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), + X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), + X(42,74), X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), + X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), + X(154,162), X(170,178), X(186,194), X(202,210), X(218,226), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), + X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), + X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), + X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), + X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), + X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), + X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), + X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), + X(206,214), X(222,230), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(4,132), + X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), X(164,228), + X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), X(20,84), + X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), X(180,212), + X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), X(116,132), + X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), X(140,204), + X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), X(12,44), + X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), + X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), + X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), + X(218,220), X(222,224), X(226,228), X(230,232), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232) +}; +M(233) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), + X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(225,229), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), + X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(215,231), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), + X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), + X(219,221), X(223,225), X(227,229), X(231,233), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), + X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), X(221,223), + X(225,227), X(229,231), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), + X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), + X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), + X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), + X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,106), X(106,170), X(42,106), X(42,74), + X(106,138), X(170,202), X(10,42), X(74,106), X(138,170), X(26,154), X(90,218), + X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), + X(186,218), X(26,58), X(90,122), X(154,186), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(186,194), X(202,210), X(218,226), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(194,202), X(210,218), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), + X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(174,182), X(190,198), X(206,214), X(222,230), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(214,222), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), + X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), + X(114,118), X(122,126), X(130,134), X(138,142), X(146,150), X(154,158), + X(162,166), X(170,174), X(178,182), X(186,190), X(194,198), X(202,206), + X(210,214), X(218,222), X(226,230), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,164), X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), + X(196,228), X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), + X(52,116), X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), + X(20,36), X(52,68), X(84,100), X(116,132), X(148,164), X(180,196), X(212,228), + X(4,20), X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,108), X(108,172), X(44,108), + X(44,76), X(108,140), X(172,204), X(12,44), X(76,108), X(140,172), X(28,156), + X(92,220), X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), + X(124,156), X(188,220), X(28,60), X(92,124), X(156,188), X(12,28), X(44,60), + X(76,92), X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), + X(44,52), X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), + X(156,164), X(172,180), X(188,196), X(204,212), X(220,228), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(8,136), + X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), X(168,232), + X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), X(24,88), + X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), + X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), + X(152,168), X(184,200), X(216,232), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), + X(48,112), X(112,176), X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), + X(80,112), X(144,176), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), + X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(226,228), X(230,232), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), + X(226,227), X(228,229), X(230,231), X(232,233), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232) +}; +M(234) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), + X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(225,229), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,107), X(107,171), X(43,107), X(43,75), X(107,139), + X(171,203), X(11,43), X(75,107), X(139,171), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), + X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(215,231), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), X(47,111), + X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), + X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), + X(219,221), X(223,225), X(227,229), X(231,233), X(1,3), X(5,7), X(9,11), + X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), + X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), + X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), + X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), + X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), + X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), + X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), + X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), X(221,223), + X(225,227), X(229,231), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), + X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), + X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), + X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), + X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), + X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,110), X(110,174), + X(46,110), X(46,78), X(110,142), X(174,206), X(14,46), X(78,110), X(142,174), + X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), + X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(14,30), + X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(14,22), + X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), + X(142,150), X(158,166), X(174,182), X(190,198), X(206,214), X(222,230), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(214,222), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), + X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), + X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), X(150,154), + X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), X(198,202), + X(206,210), X(214,218), X(222,226), X(230,234), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), + X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), + X(188,196), X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), X(216,218), + X(220,222), X(224,226), X(228,230), X(232,234), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(230,232), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230), X(231,232), X(233,234) +}; +M(235) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), + X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(225,229), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), + X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), + X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), + X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), X(151,155), + X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), X(199,203), + X(207,211), X(215,219), X(223,227), X(231,235), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(233,235), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(210,226), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), + X(90,106), X(122,138), X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), + X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), + X(182,214), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), + X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), + X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), + X(190,198), X(206,214), X(222,230), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(222,226), X(230,234), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,108), X(108,172), X(44,108), X(44,76), X(108,140), X(172,204), + X(12,44), X(76,108), X(140,172), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), + X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), + X(188,196), X(204,212), X(220,228), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), X(216,218), + X(220,222), X(224,226), X(228,230), X(232,234), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(230,232), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), + X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), + X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), X(226,227), + X(228,229), X(230,231), X(232,233), X(234,235), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234) +}; +M(236) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,109), X(109,173), X(45,109), + X(45,77), X(109,141), X(173,205), X(13,45), X(77,109), X(141,173), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(5,9), X(13,17), + X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), + X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), + X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), + X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(1,5), + X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), + X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), + X(129,133), X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), + X(177,181), X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), + X(225,229), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), + X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), + X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), + X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), X(151,155), + X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), X(199,203), + X(207,211), X(215,219), X(223,227), X(231,235), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(233,235), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(210,226), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), + X(90,106), X(122,138), X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), + X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), + X(182,214), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), + X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), + X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), + X(190,198), X(206,214), X(222,230), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(222,226), X(230,234), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), X(76,108), + X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), + X(232,236), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(228,232), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), X(226,228), + X(230,232), X(234,236), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230), X(231,232), X(233,234), X(235,236) +}; +M(237) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), X(45,109), + X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), X(93,221), + X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), X(125,157), + X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(233,237), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), + X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), + X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), + X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), X(151,155), + X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), X(199,203), + X(207,211), X(215,219), X(223,227), X(231,235), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), + X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), + X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(233,235), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(210,226), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), + X(90,106), X(122,138), X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), + X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), + X(182,214), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,110), X(110,174), X(46,110), X(46,78), X(110,142), X(174,206), + X(14,46), X(78,110), X(142,174), X(30,158), X(94,222), X(30,94), X(158,222), + X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), + X(94,126), X(158,190), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), + X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), + X(190,198), X(206,214), X(222,230), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(6,10), X(14,18), X(22,26), X(30,34), + X(38,42), X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(222,226), X(230,234), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), X(76,108), + X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), + X(232,236), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(228,232), X(2,4), X(6,8), X(10,12), X(14,16), + X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), + X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), + X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), + X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), X(130,132), + X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), X(154,156), + X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), X(178,180), + X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), X(202,204), + X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), X(226,228), + X(230,232), X(234,236), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), + X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), + X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), X(226,227), + X(228,229), X(230,231), X(232,233), X(234,235), X(236,237), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236) +}; +M(238) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), X(45,109), + X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), X(93,221), + X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), X(125,157), + X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(233,237), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), + X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,111), X(111,175), + X(47,111), X(47,79), X(111,143), X(175,207), X(15,47), X(79,111), X(143,175), + X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), + X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(15,31), + X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), + X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), + X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), + X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), + X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), X(151,155), + X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), X(199,203), + X(207,211), X(215,219), X(223,227), X(231,235), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(3,5), + X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), + X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), + X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), + X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), + X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), + X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), + X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), + X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), + X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), X(1,3), X(5,7), + X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), + X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), + X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(233,235), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,114), + X(114,178), X(50,114), X(50,82), X(114,146), X(178,210), X(18,50), X(82,114), + X(146,178), X(18,34), X(50,66), X(82,98), X(114,130), X(146,162), X(178,194), + X(210,226), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), + X(194,210), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), + X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), + X(90,106), X(122,138), X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), + X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), + X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), + X(182,214), X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), + X(118,134), X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), X(14,46), X(78,110), + X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), + X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), + X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), + X(222,238), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(206,222), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), + X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), + X(198,206), X(214,222), X(230,238), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(234,238), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), X(76,108), + X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), X(48,112), + X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), X(32,40), + X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), X(144,152), + X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(8,12), X(16,20), + X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), + X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), + X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), + X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), + X(232,236), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(228,232), X(4,6), X(8,10), X(12,14), X(16,18), + X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), + X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), + X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), + X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), + X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), + X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), + X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), + X(208,210), X(212,214), X(216,218), X(220,222), X(224,226), X(228,230), + X(232,234), X(236,238), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238) +}; +M(239) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), X(45,109), + X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), X(93,221), + X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), X(125,157), + X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(233,237), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), + X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), + X(227,231), X(235,239), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), + X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), X(50,66), + X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), + X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), + X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), + X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), + X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), + X(226,230), X(234,238), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), + X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), + X(52,68), X(84,100), X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), + X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), + X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), + X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), + X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), + X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), + X(136,200), X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), + X(136,168), X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(216,232), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,112), X(112,176), + X(48,112), X(48,80), X(112,144), X(176,208), X(16,48), X(80,112), X(144,176), + X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), + X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(16,32), + X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(16,24), + X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), X(112,120), X(128,136), + X(144,152), X(160,168), X(176,184), X(192,200), X(208,216), X(224,232), + X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), + X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), X(200,208), + X(216,224), X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), + X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), + X(112,116), X(120,124), X(128,132), X(136,140), X(144,148), X(152,156), + X(160,164), X(168,172), X(176,180), X(184,188), X(192,196), X(200,204), + X(208,212), X(216,220), X(224,228), X(232,236), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(4,6), + X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), + X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), + X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), + X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), X(120,122), + X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), X(144,146), + X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), X(168,170), + X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), X(192,194), + X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), X(216,218), + X(220,222), X(224,226), X(228,230), X(232,234), X(236,238), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(226,228), X(230,232), X(234,236), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), + X(188,189), X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), + X(200,201), X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), + X(212,213), X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), + X(224,225), X(226,227), X(228,229), X(230,231), X(232,233), X(234,235), + X(236,237), X(238,239), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), X(237,238) +}; +M(240) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,113), X(113,177), X(49,113), X(49,81), X(113,145), + X(177,209), X(17,49), X(81,113), X(145,177), X(17,33), X(49,65), X(81,97), + X(113,129), X(145,161), X(177,193), X(209,225), X(1,17), X(33,49), X(65,81), + X(97,113), X(129,145), X(161,177), X(193,209), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), X(133,197), + X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), X(133,165), + X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), X(117,181), + X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), X(149,181), + X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), X(213,229), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), X(45,109), + X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), X(93,221), + X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), X(125,157), + X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), X(93,109), + X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), X(37,45), + X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), X(149,157), + X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(1,5), X(9,13), + X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), + X(81,85), X(89,93), X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), + X(137,141), X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), + X(185,189), X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), + X(233,237), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), + X(115,147), X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), + X(83,99), X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), + X(67,83), X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), + X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), + X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), + X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), + X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), + X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), + X(171,187), X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), + X(227,231), X(235,239), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), + X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), + X(82,210), X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), + X(114,146), X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), X(50,66), + X(82,98), X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), + X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), + X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), + X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), + X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), + X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), + X(170,186), X(202,218), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), + X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), + X(226,230), X(234,238), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), + X(52,84), X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), + X(52,68), X(84,100), X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), + X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), + X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), + X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), + X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), + X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), + X(136,200), X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), + X(136,168), X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(216,232), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,176), X(112,240), + X(48,112), X(176,240), X(16,48), X(80,112), X(144,176), X(208,240), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), + X(96,112), X(128,144), X(160,176), X(192,208), X(224,240), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), + X(228,232), X(236,240), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), + X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), X(239,240) +}; +M(241) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(213,229), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), + X(229,233), X(237,241), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), + X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), + X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), + X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), + X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), + X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(215,231), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), X(47,111), + X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), X(95,223), + X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), X(127,159), + X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), X(95,111), + X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), X(79,95), + X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), + X(235,239), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), + X(239,241), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), + X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), + X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), X(237,239), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), X(34,98), + X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), X(82,210), + X(18,82), X(146,210), X(50,114), X(114,178), X(50,114), X(50,82), X(114,146), + X(178,210), X(18,50), X(82,114), X(146,178), X(18,34), X(50,66), X(82,98), + X(114,130), X(146,162), X(178,194), X(210,226), X(2,18), X(34,50), X(66,82), + X(98,114), X(130,146), X(162,178), X(194,210), X(10,138), X(74,202), X(10,74), + X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), X(74,106), + X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), + X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(202,218), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), + X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), + X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), + X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), X(118,182), + X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), X(150,182), + X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), X(214,230), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), + X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), X(46,110), + X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), X(94,222), + X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), + X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), + X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), X(38,46), + X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), + X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), + X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), + X(84,212), X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), + X(116,148), X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), + X(84,100), X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), + X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), + X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), + X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), + X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), + X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), + X(172,188), X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), + X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), + X(136,200), X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), + X(136,168), X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(216,232), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,176), X(112,240), + X(48,112), X(176,240), X(16,48), X(80,112), X(144,176), X(208,240), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), + X(96,112), X(128,144), X(160,176), X(192,208), X(224,240), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), + X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), + X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), + X(132,136), X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), + X(180,184), X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), + X(228,232), X(236,240), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), + X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), + X(218,219), X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), + X(230,231), X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240) +}; +M(242) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(213,229), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), + X(229,233), X(237,241), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,115), X(115,179), X(51,115), X(51,83), X(115,147), + X(179,211), X(19,51), X(83,115), X(147,179), X(19,35), X(51,67), X(83,99), + X(115,131), X(147,163), X(179,195), X(211,227), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), + X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), + X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), + X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), + X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(203,219), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), X(119,183), + X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), X(151,183), + X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), X(215,231), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), X(47,111), + X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), X(95,223), + X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), X(127,159), + X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), X(95,111), + X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), X(79,95), + X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), X(23,31), X(39,47), + X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), + X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), X(3,7), X(11,15), + X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), + X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), + X(235,239), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), + X(239,241), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), + X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), + X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), + X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), + X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), + X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), + X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), + X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), + X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), X(237,239), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), X(34,98), + X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), X(82,210), + X(18,82), X(146,210), X(50,178), X(114,242), X(50,114), X(178,242), X(18,50), + X(82,114), X(146,178), X(210,242), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(162,178), X(194,210), X(226,242), X(10,138), X(74,202), X(10,74), + X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), X(74,106), + X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), + X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), + X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(234,238), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), X(76,108), + X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,176), X(112,240), X(48,112), + X(176,240), X(16,48), X(80,112), X(144,176), X(208,240), X(32,160), X(96,224), + X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), X(128,160), + X(192,224), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(192,208), X(224,240), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), + X(236,240), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), + X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), + X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), + X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), + X(216,218), X(220,222), X(224,226), X(228,230), X(232,234), X(236,238), + X(240,242), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), + X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), + X(241,242) +}; +M(243) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(213,229), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), + X(229,233), X(237,241), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), + X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), + X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), + X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), + X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), + X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(231,235), X(239,243), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(235,239), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(233,235), X(237,239), X(241,243), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), X(34,98), + X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), X(82,210), + X(18,82), X(146,210), X(50,178), X(114,242), X(50,114), X(178,242), X(18,50), + X(82,114), X(146,178), X(210,242), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(162,178), X(194,210), X(226,242), X(10,138), X(74,202), X(10,74), + X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), X(74,106), + X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), + X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), + X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(234,238), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,116), X(116,180), X(52,116), X(52,84), X(116,148), + X(180,212), X(20,52), X(84,116), X(148,180), X(20,36), X(52,68), X(84,100), + X(116,132), X(148,164), X(180,196), X(212,228), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), X(76,108), + X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(4,12), X(20,28), X(36,44), X(52,60), X(68,76), X(84,92), + X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), X(180,188), + X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), X(136,200), + X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), X(136,168), + X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), X(120,184), + X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), X(152,184), + X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), X(216,232), + X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), X(200,216), + X(16,144), X(80,208), X(16,80), X(144,208), X(48,176), X(112,240), X(48,112), + X(176,240), X(16,48), X(80,112), X(144,176), X(208,240), X(32,160), X(96,224), + X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), X(128,160), + X(192,224), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), X(96,112), + X(128,144), X(160,176), X(192,208), X(224,240), X(16,32), X(48,64), X(80,96), + X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), X(24,32), X(40,48), + X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), + X(168,176), X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), X(12,16), + X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), + X(84,88), X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), + X(236,240), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), + X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), + X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), + X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), + X(216,218), X(220,222), X(224,226), X(228,230), X(232,234), X(236,238), + X(240,242), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), + X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), + X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), + X(194,195), X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), + X(206,207), X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), + X(218,219), X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), + X(230,231), X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), + X(242,243), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), + X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), + X(241,242) +}; +M(244) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,117), + X(117,181), X(53,117), X(53,85), X(117,149), X(181,213), X(21,53), X(85,117), + X(149,181), X(21,37), X(53,69), X(85,101), X(117,133), X(149,165), X(181,197), + X(213,229), X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), + X(197,213), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), X(5,9), + X(13,17), X(21,25), X(29,33), X(37,41), X(45,49), X(53,57), X(61,65), X(69,73), + X(77,81), X(85,89), X(93,97), X(101,105), X(109,113), X(117,121), X(125,129), + X(133,137), X(141,145), X(149,153), X(157,161), X(165,169), X(173,177), + X(181,185), X(189,193), X(197,201), X(205,209), X(213,217), X(221,225), + X(229,233), X(237,241), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), + X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), + X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), + X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), + X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), + X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), + X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), + X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), + X(203,211), X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), X(51,59), + X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,119), + X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), X(23,55), X(87,119), + X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), X(151,167), X(183,199), + X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), + X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(231,235), X(239,243), X(3,7), X(11,15), X(19,23), X(27,31), + X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(235,239), X(1,3), + X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), + X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), + X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), + X(101,103), X(105,107), X(109,111), X(113,115), X(117,119), X(121,123), + X(125,127), X(129,131), X(133,135), X(137,139), X(141,143), X(145,147), + X(149,151), X(153,155), X(157,159), X(161,163), X(165,167), X(169,171), + X(173,175), X(177,179), X(181,183), X(185,187), X(189,191), X(193,195), + X(197,199), X(201,203), X(205,207), X(209,211), X(213,215), X(217,219), + X(221,223), X(225,227), X(229,231), X(233,235), X(237,239), X(241,243), + X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), X(34,98), + X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), X(82,210), + X(18,82), X(146,210), X(50,178), X(114,242), X(50,114), X(178,242), X(18,50), + X(82,114), X(146,178), X(210,242), X(2,18), X(34,50), X(66,82), X(98,114), + X(130,146), X(162,178), X(194,210), X(226,242), X(10,138), X(74,202), X(10,74), + X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), X(74,106), + X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), + X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), + X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), + X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), + X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), + X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), + X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), X(34,42), X(50,58), + X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,118), + X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), X(22,54), X(86,118), + X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), X(150,166), X(182,198), + X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), + X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), + X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(2,6), X(10,14), X(18,22), X(26,30), + X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(234,238), + X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), X(36,100), + X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), X(84,212), + X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), X(180,244), X(20,52), + X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), X(68,84), X(100,116), + X(132,148), X(164,180), X(196,212), X(228,244), X(12,140), X(76,204), X(12,76), + X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), X(12,44), X(76,108), + X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), X(156,220), X(60,124), + X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), X(28,60), X(92,124), + X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), X(156,172), X(188,204), + X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), X(140,156), X(172,188), + X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), X(76,84), X(92,100), + X(108,116), X(124,132), X(140,148), X(156,164), X(172,180), X(188,196), + X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), X(36,44), X(52,60), + X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), X(164,172), + X(180,188), X(196,204), X(212,220), X(228,236), X(8,136), X(72,200), X(8,72), + X(136,200), X(40,168), X(104,232), X(40,104), X(168,232), X(8,40), X(72,104), + X(136,168), X(200,232), X(24,152), X(88,216), X(24,88), X(152,216), X(56,120), + X(120,184), X(56,120), X(56,88), X(120,152), X(184,216), X(24,56), X(88,120), + X(152,184), X(24,40), X(56,72), X(88,104), X(120,136), X(152,168), X(184,200), + X(216,232), X(8,24), X(40,56), X(72,88), X(104,120), X(136,152), X(168,184), + X(200,216), X(16,144), X(80,208), X(16,80), X(144,208), X(48,176), X(112,240), + X(48,112), X(176,240), X(16,48), X(80,112), X(144,176), X(208,240), X(32,160), + X(96,224), X(32,96), X(160,224), X(64,128), X(128,192), X(64,128), X(64,96), + X(128,160), X(192,224), X(32,64), X(96,128), X(160,192), X(32,48), X(64,80), + X(96,112), X(128,144), X(160,176), X(192,208), X(224,240), X(16,32), X(48,64), + X(80,96), X(112,128), X(144,160), X(176,192), X(208,224), X(8,16), X(24,32), + X(40,48), X(56,64), X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), + X(152,160), X(168,176), X(184,192), X(200,208), X(216,224), X(232,240), + X(8,12), X(16,20), X(24,28), X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), + X(72,76), X(80,84), X(88,92), X(96,100), X(104,108), X(112,116), X(120,124), + X(128,132), X(136,140), X(144,148), X(152,156), X(160,164), X(168,172), + X(176,180), X(184,188), X(192,196), X(200,204), X(208,212), X(216,220), + X(224,228), X(232,236), X(240,244), X(4,8), X(12,16), X(20,24), X(28,32), + X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(236,240), X(2,4), + X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), + X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), + X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), + X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), + X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), + X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), + X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), + X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), + X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), X(238,240), + X(242,244), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), + X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), + X(241,242), X(243,244) +}; +M(245) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(241,245), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), + X(19,51), X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), + X(75,203), X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), + X(11,43), X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), + X(71,199), X(7,71), X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), + X(7,39), X(71,103), X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), + X(151,215), X(55,119), X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), + X(23,55), X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), + X(151,167), X(183,199), X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), + X(47,175), X(111,239), X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), + X(207,239), X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), + X(63,127), X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(231,239), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), + X(199,203), X(207,211), X(215,219), X(223,227), X(231,235), X(239,243), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), + X(227,231), X(235,239), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), + X(239,241), X(243,245), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), + X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), + X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), X(114,242), X(50,114), + X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(226,242), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), + X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), + X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), + X(150,214), X(54,118), X(118,182), X(54,118), X(54,86), X(118,150), X(182,214), + X(22,54), X(86,118), X(150,182), X(22,38), X(54,70), X(86,102), X(118,134), + X(150,166), X(182,198), X(214,230), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(198,214), X(14,142), X(78,206), X(14,78), X(142,206), + X(46,174), X(110,238), X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), + X(206,238), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), + X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(214,222), X(230,238), X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), + X(46,50), X(54,58), X(62,66), X(70,74), X(78,82), X(86,90), X(94,98), + X(102,106), X(110,114), X(118,122), X(126,130), X(134,138), X(142,146), + X(150,154), X(158,162), X(166,170), X(174,178), X(182,186), X(190,194), + X(198,202), X(206,210), X(214,218), X(222,226), X(230,234), X(238,242), X(2,6), + X(10,14), X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), + X(74,78), X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), + X(130,134), X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), + X(178,182), X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), + X(226,230), X(234,238), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), + X(184,216), X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(184,200), X(216,232), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), + X(200,208), X(216,224), X(232,240), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), X(232,236), + X(240,244), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(228,232), X(236,240), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(230,232), X(234,236), X(238,240), X(242,244), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243), + X(244,245), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), + X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), + X(241,242), X(243,244) +}; +M(246) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(241,245), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), + X(19,51), X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), + X(75,203), X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), + X(11,43), X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), + X(71,199), X(7,71), X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), + X(7,39), X(71,103), X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), + X(151,215), X(55,119), X(119,183), X(55,119), X(55,87), X(119,151), X(183,215), + X(23,55), X(87,119), X(151,183), X(23,39), X(55,71), X(87,103), X(119,135), + X(151,167), X(183,199), X(215,231), X(7,23), X(39,55), X(71,87), X(103,119), + X(135,151), X(167,183), X(199,215), X(15,143), X(79,207), X(15,79), X(143,207), + X(47,175), X(111,239), X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), + X(207,239), X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), + X(63,127), X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(231,239), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), + X(199,203), X(207,211), X(215,219), X(223,227), X(231,235), X(239,243), X(3,7), + X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), + X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), + X(131,135), X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), + X(179,183), X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), + X(227,231), X(235,239), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), + X(27,29), X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), + X(59,61), X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), + X(91,93), X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), + X(239,241), X(243,245), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(2,130), X(66,194), X(2,66), X(130,194), X(34,162), + X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), X(194,226), + X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), X(114,242), X(50,114), + X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), X(2,18), X(34,50), + X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(226,242), X(10,138), + X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), X(170,234), + X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), X(26,90), + X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), X(186,218), + X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), X(122,138), + X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), X(106,122), + X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), X(58,66), + X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), X(170,178), + X(186,194), X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), X(34,42), + X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), + X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), + X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), + X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), + X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), X(22,54), X(86,118), + X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), + X(166,182), X(198,214), X(230,246), X(14,142), X(78,206), X(14,78), X(142,206), + X(46,174), X(110,238), X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), + X(206,238), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), + X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), + X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), + X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), + X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), + X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), X(206,214), + X(222,230), X(238,246), X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), + X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(230,238), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), + X(184,216), X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(184,200), X(216,232), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), + X(200,208), X(216,224), X(232,240), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), X(232,236), + X(240,244), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(228,232), X(236,240), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), + X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), + X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), + X(180,182), X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), + X(204,206), X(208,210), X(212,214), X(216,218), X(220,222), X(224,226), + X(228,230), X(232,234), X(236,238), X(240,242), X(244,246), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(226,228), X(230,232), X(234,236), X(238,240), X(242,244), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(243,244), X(245,246) +}; +M(247) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(241,245), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), + X(19,51), X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), + X(75,203), X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), + X(11,43), X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), + X(71,199), X(7,71), X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), + X(7,39), X(71,103), X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), + X(151,215), X(55,183), X(119,247), X(55,119), X(183,247), X(23,55), X(87,119), + X(151,183), X(215,247), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), + X(167,183), X(199,215), X(231,247), X(15,143), X(79,207), X(15,79), X(143,207), + X(47,175), X(111,239), X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), + X(207,239), X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), + X(63,127), X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(127,135), X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), + X(223,231), X(239,247), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), + X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), + X(183,191), X(199,207), X(215,223), X(231,239), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), + X(235,239), X(243,247), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(245,247), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), + X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), X(114,242), + X(50,114), X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(226,242), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), + X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), + X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), + X(186,218), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), + X(122,138), X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(186,194), X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), + X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), X(22,54), + X(86,118), X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(198,214), X(230,246), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), X(14,46), X(78,110), + X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), + X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), + X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), + X(222,238), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), + X(206,214), X(222,230), X(238,246), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(230,238), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,120), X(120,184), X(56,120), X(56,88), X(120,152), + X(184,216), X(24,56), X(88,120), X(152,184), X(24,40), X(56,72), X(88,104), + X(120,136), X(152,168), X(184,200), X(216,232), X(8,24), X(40,56), X(72,88), + X(104,120), X(136,152), X(168,184), X(200,216), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(8,16), X(24,32), X(40,48), X(56,64), X(72,80), X(88,96), + X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), X(184,192), + X(200,208), X(216,224), X(232,240), X(8,12), X(16,20), X(24,28), X(32,36), + X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), X(232,236), + X(240,244), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), X(44,48), X(52,56), + X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), X(100,104), X(108,112), + X(116,120), X(124,128), X(132,136), X(140,144), X(148,152), X(156,160), + X(164,168), X(172,176), X(180,184), X(188,192), X(196,200), X(204,208), + X(212,216), X(220,224), X(228,232), X(236,240), X(4,6), X(8,10), X(12,14), + X(16,18), X(20,22), X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), + X(48,50), X(52,54), X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), + X(80,82), X(84,86), X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), + X(108,110), X(112,114), X(116,118), X(120,122), X(124,126), X(128,130), + X(132,134), X(136,138), X(140,142), X(144,146), X(148,150), X(152,154), + X(156,158), X(160,162), X(164,166), X(168,170), X(172,174), X(176,178), + X(180,182), X(184,186), X(188,190), X(192,194), X(196,198), X(200,202), + X(204,206), X(208,210), X(212,214), X(216,218), X(220,222), X(224,226), + X(228,230), X(232,234), X(236,238), X(240,242), X(244,246), X(2,4), X(6,8), + X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), + X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), + X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), + X(102,104), X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), + X(126,128), X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), + X(150,152), X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), + X(174,176), X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), + X(198,200), X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), + X(222,224), X(226,228), X(230,232), X(234,236), X(238,240), X(242,244), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243), + X(244,245), X(246,247), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), + X(239,240), X(241,242), X(243,244), X(245,246) +}; +M(248) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,121), + X(121,185), X(57,121), X(57,89), X(121,153), X(185,217), X(25,57), X(89,121), + X(153,185), X(25,41), X(57,73), X(89,105), X(121,137), X(153,169), X(185,201), + X(217,233), X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), + X(201,217), X(9,17), X(25,33), X(41,49), X(57,65), X(73,81), X(89,97), + X(105,113), X(121,129), X(137,145), X(153,161), X(169,177), X(185,193), + X(201,209), X(217,225), X(233,241), X(1,9), X(17,25), X(33,41), X(49,57), + X(65,73), X(81,89), X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), + X(177,185), X(193,201), X(209,217), X(225,233), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), + X(41,45), X(49,53), X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), + X(97,101), X(105,109), X(113,117), X(121,125), X(129,133), X(137,141), + X(145,149), X(153,157), X(161,165), X(169,173), X(177,181), X(185,189), + X(193,197), X(201,205), X(209,213), X(217,221), X(225,229), X(233,237), + X(241,245), X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), + X(35,99), X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), + X(83,211), X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), + X(19,51), X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), + X(99,115), X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), + X(75,203), X(11,75), X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), + X(11,43), X(75,107), X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), + X(155,219), X(59,123), X(123,187), X(59,123), X(59,91), X(123,155), X(187,219), + X(27,59), X(91,123), X(155,187), X(27,43), X(59,75), X(91,107), X(123,139), + X(155,171), X(187,203), X(219,235), X(11,27), X(43,59), X(75,91), X(107,123), + X(139,155), X(171,187), X(203,219), X(11,19), X(27,35), X(43,51), X(59,67), + X(75,83), X(91,99), X(107,115), X(123,131), X(139,147), X(155,163), X(171,179), + X(187,195), X(203,211), X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), + X(51,59), X(67,75), X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), + X(163,171), X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), + X(71,199), X(7,71), X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), + X(7,39), X(71,103), X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), + X(151,215), X(55,183), X(119,247), X(55,119), X(183,247), X(23,55), X(87,119), + X(151,183), X(215,247), X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), + X(167,183), X(199,215), X(231,247), X(15,143), X(79,207), X(15,79), X(143,207), + X(47,175), X(111,239), X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), + X(207,239), X(31,159), X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), + X(63,127), X(63,95), X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), + X(31,47), X(63,79), X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), + X(15,31), X(47,63), X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), + X(15,23), X(31,39), X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), + X(127,135), X(143,151), X(159,167), X(175,183), X(191,199), X(207,215), + X(223,231), X(239,247), X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), + X(87,95), X(103,111), X(119,127), X(135,143), X(151,159), X(167,175), + X(183,191), X(199,207), X(215,223), X(231,239), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), + X(235,239), X(243,247), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(245,247), X(2,130), X(66,194), X(2,66), X(130,194), + X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), X(130,162), + X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), X(114,242), + X(50,114), X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), X(2,18), + X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), X(226,242), + X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), X(42,106), + X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), X(90,218), + X(26,90), X(154,218), X(58,122), X(122,186), X(58,122), X(58,90), X(122,154), + X(186,218), X(26,58), X(90,122), X(154,186), X(26,42), X(58,74), X(90,106), + X(122,138), X(154,170), X(186,202), X(218,234), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(10,18), X(26,34), X(42,50), + X(58,66), X(74,82), X(90,98), X(106,114), X(122,130), X(138,146), X(154,162), + X(170,178), X(186,194), X(202,210), X(218,226), X(234,242), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), X(38,102), + X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), X(86,214), + X(22,86), X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), X(22,54), + X(86,118), X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), X(102,118), + X(134,150), X(166,182), X(198,214), X(230,246), X(14,142), X(78,206), X(14,78), + X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), X(14,46), X(78,110), + X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), X(158,222), X(62,126), + X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), X(30,62), X(94,126), + X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), X(158,174), X(190,206), + X(222,238), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), X(174,190), + X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), X(78,86), X(94,102), + X(110,118), X(126,134), X(142,150), X(158,166), X(174,182), X(190,198), + X(206,214), X(222,230), X(238,246), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(230,238), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), + X(236,240), X(244,248), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(242,244), X(246,248), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), + X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), X(247,248) +}; +M(249) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,185), + X(121,249), X(57,121), X(185,249), X(25,57), X(89,121), X(153,185), X(217,249), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(201,217), + X(233,249), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(241,249), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(237,241), + X(245,249), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(201,205), + X(209,213), X(217,221), X(225,229), X(233,237), X(241,245), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), X(163,227), + X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), X(19,83), + X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), X(83,115), + X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), X(139,203), + X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), X(139,171), + X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), X(123,187), + X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), X(155,187), + X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), X(219,235), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), X(203,211), + X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,183), + X(119,247), X(55,119), X(183,247), X(23,55), X(87,119), X(151,183), X(215,247), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(231,247), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(239,247), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(231,239), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(235,239), + X(243,247), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), + X(239,241), X(243,245), X(247,249), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(217,219), X(221,223), X(225,227), + X(229,231), X(233,235), X(237,239), X(241,243), X(245,247), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), + X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), + X(146,210), X(50,178), X(114,242), X(50,114), X(178,242), X(18,50), X(82,114), + X(146,178), X(210,242), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(226,242), X(10,138), X(74,202), X(10,74), X(138,202), + X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), + X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), X(58,122), X(122,186), + X(58,122), X(58,90), X(122,154), X(186,218), X(26,58), X(90,122), X(154,186), + X(26,42), X(58,74), X(90,106), X(122,138), X(154,170), X(186,202), X(218,234), + X(10,26), X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), + X(10,18), X(26,34), X(42,50), X(58,66), X(74,82), X(90,98), X(106,114), + X(122,130), X(138,146), X(154,162), X(170,178), X(186,194), X(202,210), + X(218,226), X(234,242), X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), + X(82,90), X(98,106), X(114,122), X(130,138), X(146,154), X(162,170), + X(178,186), X(194,202), X(210,218), X(226,234), X(6,134), X(70,198), X(6,70), + X(134,198), X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), + X(134,166), X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,182), + X(118,246), X(54,118), X(182,246), X(22,54), X(86,118), X(150,182), X(214,246), + X(6,22), X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), + X(230,246), X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), + X(46,110), X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), + X(94,222), X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), + X(126,158), X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), + X(94,110), X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), + X(78,94), X(110,126), X(142,158), X(174,190), X(206,222), X(14,22), X(30,38), + X(46,54), X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), + X(158,166), X(174,182), X(190,198), X(206,214), X(222,230), X(238,246), + X(6,14), X(22,30), X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), + X(118,126), X(134,142), X(150,158), X(166,174), X(182,190), X(198,206), + X(214,222), X(230,238), X(2,6), X(10,14), X(18,22), X(26,30), X(34,38), + X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), X(90,94), + X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), X(138,142), + X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), X(186,190), + X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), X(234,238), + X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), X(100,228), + X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), X(20,148), + X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), X(180,244), + X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), X(68,84), + X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), X(12,140), + X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), X(172,236), + X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), X(28,92), + X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), X(188,220), + X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), X(124,140), + X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), X(60,68), + X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), + X(236,240), X(244,248), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), + X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), + X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), + X(90,92), X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(242,244), X(246,248), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), + X(226,227), X(228,229), X(230,231), X(232,233), X(234,235), X(236,237), + X(238,239), X(240,241), X(242,243), X(244,245), X(246,247), X(248,249), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(243,244), X(245,246), X(247,248) +}; +M(250) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,185), + X(121,249), X(57,121), X(185,249), X(25,57), X(89,121), X(153,185), X(217,249), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(201,217), + X(233,249), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(241,249), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(237,241), + X(245,249), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(201,205), + X(209,213), X(217,221), X(225,229), X(233,237), X(241,245), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), X(163,227), + X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), X(19,83), + X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), X(83,115), + X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), X(139,203), + X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), X(139,171), + X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,123), X(123,187), + X(59,123), X(59,91), X(123,155), X(187,219), X(27,59), X(91,123), X(155,187), + X(27,43), X(59,75), X(91,107), X(123,139), X(155,171), X(187,203), X(219,235), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), + X(11,19), X(27,35), X(43,51), X(59,67), X(75,83), X(91,99), X(107,115), + X(123,131), X(139,147), X(155,163), X(171,179), X(187,195), X(203,211), + X(219,227), X(235,243), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), + X(83,91), X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), + X(179,187), X(195,203), X(211,219), X(227,235), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,183), + X(119,247), X(55,119), X(183,247), X(23,55), X(87,119), X(151,183), X(215,247), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(231,247), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(239,247), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(231,239), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), + X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), + X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), X(139,143), + X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), X(187,191), + X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), X(235,239), + X(243,247), X(3,5), X(7,9), X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), + X(31,33), X(35,37), X(39,41), X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), + X(63,65), X(67,69), X(71,73), X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), + X(95,97), X(99,101), X(103,105), X(107,109), X(111,113), X(115,117), + X(119,121), X(123,125), X(127,129), X(131,133), X(135,137), X(139,141), + X(143,145), X(147,149), X(151,153), X(155,157), X(159,161), X(163,165), + X(167,169), X(171,173), X(175,177), X(179,181), X(183,185), X(187,189), + X(191,193), X(195,197), X(199,201), X(203,205), X(207,209), X(211,213), + X(215,217), X(219,221), X(223,225), X(227,229), X(231,233), X(235,237), + X(239,241), X(243,245), X(247,249), X(1,3), X(5,7), X(9,11), X(13,15), + X(17,19), X(21,23), X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), + X(49,51), X(53,55), X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), + X(81,83), X(85,87), X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), + X(109,111), X(113,115), X(117,119), X(121,123), X(125,127), X(129,131), + X(133,135), X(137,139), X(141,143), X(145,147), X(149,151), X(153,155), + X(157,159), X(161,163), X(165,167), X(169,171), X(173,175), X(177,179), + X(181,183), X(185,187), X(189,191), X(193,195), X(197,199), X(201,203), + X(205,207), X(209,211), X(213,215), X(217,219), X(221,223), X(225,227), + X(229,231), X(233,235), X(237,239), X(241,243), X(245,247), X(2,130), + X(66,194), X(2,66), X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), + X(2,34), X(66,98), X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), + X(146,210), X(50,178), X(114,242), X(50,114), X(178,242), X(18,50), X(82,114), + X(146,178), X(210,242), X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), + X(162,178), X(194,210), X(226,242), X(10,138), X(74,202), X(10,74), X(138,202), + X(42,170), X(106,234), X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), + X(202,234), X(26,154), X(90,218), X(26,90), X(154,218), X(58,186), X(122,250), + X(58,122), X(186,250), X(26,58), X(90,122), X(154,186), X(218,250), X(10,26), + X(42,58), X(74,90), X(106,122), X(138,154), X(170,186), X(202,218), X(234,250), + X(2,10), X(18,26), X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), + X(114,122), X(130,138), X(146,154), X(162,170), X(178,186), X(194,202), + X(210,218), X(226,234), X(242,250), X(6,134), X(70,198), X(6,70), X(134,198), + X(38,166), X(102,230), X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), + X(198,230), X(22,150), X(86,214), X(22,86), X(150,214), X(54,182), X(118,246), + X(54,118), X(182,246), X(22,54), X(86,118), X(150,182), X(214,246), X(6,22), + X(38,54), X(70,86), X(102,118), X(134,150), X(166,182), X(198,214), X(230,246), + X(14,142), X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), X(46,110), + X(174,238), X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), X(94,222), + X(30,94), X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), + X(190,222), X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), + X(126,142), X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), X(78,94), + X(110,126), X(142,158), X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), + X(62,70), X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(222,230), X(238,246), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(246,250), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), + X(236,240), X(244,248), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), + X(212,214), X(216,218), X(220,222), X(224,226), X(228,230), X(232,234), + X(236,238), X(240,242), X(244,246), X(248,250), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(230,232), X(234,236), X(238,240), X(242,244), X(246,248), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(243,244), X(245,246), X(247,248), X(249,250) +}; +M(251) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,185), + X(121,249), X(57,121), X(185,249), X(25,57), X(89,121), X(153,185), X(217,249), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(201,217), + X(233,249), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(241,249), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(237,241), + X(245,249), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(201,205), + X(209,213), X(217,221), X(225,229), X(233,237), X(241,245), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), X(163,227), + X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), X(19,83), + X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), X(83,115), + X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), X(139,203), + X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), X(139,171), + X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,187), X(123,251), + X(59,123), X(187,251), X(27,59), X(91,123), X(155,187), X(219,251), X(11,27), + X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), X(235,251), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(211,219), X(227,235), X(243,251), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,183), X(119,247), + X(55,119), X(183,247), X(23,55), X(87,119), X(151,183), X(215,247), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(231,247), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), X(47,111), + X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), X(95,223), + X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), X(127,159), + X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), X(95,111), + X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), X(79,95), + X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(191,199), X(207,215), X(223,231), X(239,247), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(231,235), X(239,243), X(247,251), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), + X(235,239), X(243,247), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(245,247), X(249,251), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), + X(114,242), X(50,114), X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(226,242), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,186), X(122,250), X(58,122), X(186,250), + X(26,58), X(90,122), X(154,186), X(218,250), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(234,250), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(242,250), X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), + X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), + X(22,54), X(86,118), X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(230,246), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), + X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), + X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), + X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), + X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(222,230), X(238,246), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(246,250), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,124), X(124,188), X(60,124), X(60,92), X(124,156), + X(188,220), X(28,60), X(92,124), X(156,188), X(28,44), X(60,76), X(92,108), + X(124,140), X(156,172), X(188,204), X(220,236), X(12,28), X(44,60), X(76,92), + X(108,124), X(140,156), X(172,188), X(204,220), X(12,20), X(28,36), X(44,52), + X(60,68), X(76,84), X(92,100), X(108,116), X(124,132), X(140,148), X(156,164), + X(172,180), X(188,196), X(204,212), X(220,228), X(236,244), X(4,12), X(20,28), + X(36,44), X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), + X(148,156), X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(4,8), X(12,16), X(20,24), + X(28,32), X(36,40), X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), + X(92,96), X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), + X(140,144), X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), + X(188,192), X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), + X(236,240), X(244,248), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), + X(24,26), X(28,30), X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), + X(56,58), X(60,62), X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), + X(88,90), X(92,94), X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), + X(116,118), X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), + X(140,142), X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), + X(164,166), X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), + X(188,190), X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), + X(212,214), X(216,218), X(220,222), X(224,226), X(228,230), X(232,234), + X(236,238), X(240,242), X(244,246), X(248,250), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(230,232), X(234,236), X(238,240), X(242,244), X(246,248), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243), + X(244,245), X(246,247), X(248,249), X(250,251), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), + X(235,236), X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), + X(247,248), X(249,250) +}; +M(252) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,185), + X(121,249), X(57,121), X(185,249), X(25,57), X(89,121), X(153,185), X(217,249), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(201,217), + X(233,249), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(241,249), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,125), X(125,189), X(61,125), X(61,93), + X(125,157), X(189,221), X(29,61), X(93,125), X(157,189), X(29,45), X(61,77), + X(93,109), X(125,141), X(157,173), X(189,205), X(221,237), X(13,29), X(45,61), + X(77,93), X(109,125), X(141,157), X(173,189), X(205,221), X(13,21), X(29,37), + X(45,53), X(61,69), X(77,85), X(93,101), X(109,117), X(125,133), X(141,149), + X(157,165), X(173,181), X(189,197), X(205,213), X(221,229), X(237,245), + X(5,13), X(21,29), X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), + X(117,125), X(133,141), X(149,157), X(165,173), X(181,189), X(197,205), + X(213,221), X(229,237), X(5,9), X(13,17), X(21,25), X(29,33), X(37,41), + X(45,49), X(53,57), X(61,65), X(69,73), X(77,81), X(85,89), X(93,97), + X(101,105), X(109,113), X(117,121), X(125,129), X(133,137), X(141,145), + X(149,153), X(157,161), X(165,169), X(173,177), X(181,185), X(189,193), + X(197,201), X(205,209), X(213,217), X(221,225), X(229,233), X(237,241), + X(245,249), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(201,205), + X(209,213), X(217,221), X(225,229), X(233,237), X(241,245), X(3,131), + X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), X(163,227), + X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), X(19,83), + X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), X(83,115), + X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), X(131,147), + X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), X(139,203), + X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), X(139,171), + X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,187), X(123,251), + X(59,123), X(187,251), X(27,59), X(91,123), X(155,187), X(219,251), X(11,27), + X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), X(235,251), + X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), X(99,107), + X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), X(195,203), + X(211,219), X(227,235), X(243,251), X(7,135), X(71,199), X(7,71), X(135,199), + X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), X(135,167), + X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,183), X(119,247), + X(55,119), X(183,247), X(23,55), X(87,119), X(151,183), X(215,247), X(7,23), + X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), X(231,247), + X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), X(47,111), + X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), X(95,223), + X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), X(127,159), + X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), X(95,111), + X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), X(79,95), + X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), X(47,55), + X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), X(159,167), + X(175,183), X(191,199), X(207,215), X(223,231), X(239,247), X(7,15), X(23,31), + X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), X(119,127), X(135,143), + X(151,159), X(167,175), X(183,191), X(199,207), X(215,223), X(231,239), + X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), X(47,51), X(55,59), X(63,67), + X(71,75), X(79,83), X(87,91), X(95,99), X(103,107), X(111,115), X(119,123), + X(127,131), X(135,139), X(143,147), X(151,155), X(159,163), X(167,171), + X(175,179), X(183,187), X(191,195), X(199,203), X(207,211), X(215,219), + X(223,227), X(231,235), X(239,243), X(247,251), X(3,7), X(11,15), X(19,23), + X(27,31), X(35,39), X(43,47), X(51,55), X(59,63), X(67,71), X(75,79), X(83,87), + X(91,95), X(99,103), X(107,111), X(115,119), X(123,127), X(131,135), + X(139,143), X(147,151), X(155,159), X(163,167), X(171,175), X(179,183), + X(187,191), X(195,199), X(203,207), X(211,215), X(219,223), X(227,231), + X(235,239), X(243,247), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(245,247), X(249,251), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), + X(114,242), X(50,114), X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(226,242), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,186), X(122,250), X(58,122), X(186,250), + X(26,58), X(90,122), X(154,186), X(218,250), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(234,250), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(242,250), X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), + X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), + X(22,54), X(86,118), X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(230,246), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), + X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), + X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), + X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), + X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(222,230), X(238,246), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(246,250), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,188), X(124,252), X(60,124), X(188,252), X(28,60), + X(92,124), X(156,188), X(220,252), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(236,252), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), X(244,252), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), X(232,236), + X(240,244), X(248,252), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(236,240), + X(244,248), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(242,244), X(246,248), X(250,252), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), + X(235,236), X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), + X(247,248), X(249,250), X(251,252) +}; +M(253) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,185), + X(121,249), X(57,121), X(185,249), X(25,57), X(89,121), X(153,185), X(217,249), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(201,217), + X(233,249), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(241,249), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,189), X(125,253), X(61,125), X(189,253), + X(29,61), X(93,125), X(157,189), X(221,253), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(173,189), X(205,221), X(237,253), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), + X(245,253), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(201,205), + X(209,213), X(217,221), X(225,229), X(233,237), X(241,245), X(249,253), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), + X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), + X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,187), + X(123,251), X(59,123), X(187,251), X(27,59), X(91,123), X(155,187), X(219,251), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), + X(235,251), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(211,219), X(227,235), X(243,251), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,183), + X(119,247), X(55,119), X(183,247), X(23,55), X(87,119), X(151,183), X(215,247), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(231,247), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(239,247), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(231,239), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), + X(199,203), X(207,211), X(215,219), X(223,227), X(231,235), X(239,243), + X(247,251), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(203,207), + X(211,215), X(219,223), X(227,231), X(235,239), X(243,247), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), X(195,197), + X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), X(219,221), + X(223,225), X(227,229), X(231,233), X(235,237), X(239,241), X(243,245), + X(247,249), X(251,253), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(245,247), X(249,251), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), + X(114,242), X(50,114), X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(226,242), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,186), X(122,250), X(58,122), X(186,250), + X(26,58), X(90,122), X(154,186), X(218,250), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(234,250), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(242,250), X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), + X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), + X(22,54), X(86,118), X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(230,246), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), + X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), + X(158,222), X(62,126), X(126,190), X(62,126), X(62,94), X(126,158), X(190,222), + X(30,62), X(94,126), X(158,190), X(30,46), X(62,78), X(94,110), X(126,142), + X(158,174), X(190,206), X(222,238), X(14,30), X(46,62), X(78,94), X(110,126), + X(142,158), X(174,190), X(206,222), X(14,22), X(30,38), X(46,54), X(62,70), + X(78,86), X(94,102), X(110,118), X(126,134), X(142,150), X(158,166), + X(174,182), X(190,198), X(206,214), X(222,230), X(238,246), X(6,14), X(22,30), + X(38,46), X(54,62), X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), + X(150,158), X(166,174), X(182,190), X(198,206), X(214,222), X(230,238), + X(6,10), X(14,18), X(22,26), X(30,34), X(38,42), X(46,50), X(54,58), X(62,66), + X(70,74), X(78,82), X(86,90), X(94,98), X(102,106), X(110,114), X(118,122), + X(126,130), X(134,138), X(142,146), X(150,154), X(158,162), X(166,170), + X(174,178), X(182,186), X(190,194), X(198,202), X(206,210), X(214,218), + X(222,226), X(230,234), X(238,242), X(246,250), X(2,6), X(10,14), X(18,22), + X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), X(82,86), + X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(4,132), X(68,196), X(4,68), X(132,196), X(36,164), + X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), X(196,228), + X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), X(52,116), + X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), X(36,52), + X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,188), X(124,252), X(60,124), X(188,252), X(28,60), + X(92,124), X(156,188), X(220,252), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(236,252), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), X(244,252), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), X(232,236), + X(240,244), X(248,252), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(236,240), + X(244,248), X(2,4), X(6,8), X(10,12), X(14,16), X(18,20), X(22,24), X(26,28), + X(30,32), X(34,36), X(38,40), X(42,44), X(46,48), X(50,52), X(54,56), X(58,60), + X(62,64), X(66,68), X(70,72), X(74,76), X(78,80), X(82,84), X(86,88), X(90,92), + X(94,96), X(98,100), X(102,104), X(106,108), X(110,112), X(114,116), + X(118,120), X(122,124), X(126,128), X(130,132), X(134,136), X(138,140), + X(142,144), X(146,148), X(150,152), X(154,156), X(158,160), X(162,164), + X(166,168), X(170,172), X(174,176), X(178,180), X(182,184), X(186,188), + X(190,192), X(194,196), X(198,200), X(202,204), X(206,208), X(210,212), + X(214,216), X(218,220), X(222,224), X(226,228), X(230,232), X(234,236), + X(238,240), X(242,244), X(246,248), X(250,252), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), + X(188,189), X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), + X(200,201), X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), + X(212,213), X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), + X(224,225), X(226,227), X(228,229), X(230,231), X(232,233), X(234,235), + X(236,237), X(238,239), X(240,241), X(242,243), X(244,245), X(246,247), + X(248,249), X(250,251), X(252,253), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), + X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), X(247,248), + X(249,250), X(251,252) +}; +M(254) = { + X(1,129), X(65,193), X(1,65), X(129,193), X(33,161), X(97,225), X(33,97), + X(161,225), X(1,33), X(65,97), X(129,161), X(193,225), X(17,145), X(81,209), + X(17,81), X(145,209), X(49,177), X(113,241), X(49,113), X(177,241), X(17,49), + X(81,113), X(145,177), X(209,241), X(1,17), X(33,49), X(65,81), X(97,113), + X(129,145), X(161,177), X(193,209), X(225,241), X(9,137), X(73,201), X(9,73), + X(137,201), X(41,169), X(105,233), X(41,105), X(169,233), X(9,41), X(73,105), + X(137,169), X(201,233), X(25,153), X(89,217), X(25,89), X(153,217), X(57,185), + X(121,249), X(57,121), X(185,249), X(25,57), X(89,121), X(153,185), X(217,249), + X(9,25), X(41,57), X(73,89), X(105,121), X(137,153), X(169,185), X(201,217), + X(233,249), X(1,9), X(17,25), X(33,41), X(49,57), X(65,73), X(81,89), + X(97,105), X(113,121), X(129,137), X(145,153), X(161,169), X(177,185), + X(193,201), X(209,217), X(225,233), X(241,249), X(5,133), X(69,197), X(5,69), + X(133,197), X(37,165), X(101,229), X(37,101), X(165,229), X(5,37), X(69,101), + X(133,165), X(197,229), X(21,149), X(85,213), X(21,85), X(149,213), X(53,181), + X(117,245), X(53,117), X(181,245), X(21,53), X(85,117), X(149,181), X(213,245), + X(5,21), X(37,53), X(69,85), X(101,117), X(133,149), X(165,181), X(197,213), + X(229,245), X(13,141), X(77,205), X(13,77), X(141,205), X(45,173), X(109,237), + X(45,109), X(173,237), X(13,45), X(77,109), X(141,173), X(205,237), X(29,157), + X(93,221), X(29,93), X(157,221), X(61,189), X(125,253), X(61,125), X(189,253), + X(29,61), X(93,125), X(157,189), X(221,253), X(13,29), X(45,61), X(77,93), + X(109,125), X(141,157), X(173,189), X(205,221), X(237,253), X(5,13), X(21,29), + X(37,45), X(53,61), X(69,77), X(85,93), X(101,109), X(117,125), X(133,141), + X(149,157), X(165,173), X(181,189), X(197,205), X(213,221), X(229,237), + X(245,253), X(1,5), X(9,13), X(17,21), X(25,29), X(33,37), X(41,45), X(49,53), + X(57,61), X(65,69), X(73,77), X(81,85), X(89,93), X(97,101), X(105,109), + X(113,117), X(121,125), X(129,133), X(137,141), X(145,149), X(153,157), + X(161,165), X(169,173), X(177,181), X(185,189), X(193,197), X(201,205), + X(209,213), X(217,221), X(225,229), X(233,237), X(241,245), X(249,253), + X(3,131), X(67,195), X(3,67), X(131,195), X(35,163), X(99,227), X(35,99), + X(163,227), X(3,35), X(67,99), X(131,163), X(195,227), X(19,147), X(83,211), + X(19,83), X(147,211), X(51,179), X(115,243), X(51,115), X(179,243), X(19,51), + X(83,115), X(147,179), X(211,243), X(3,19), X(35,51), X(67,83), X(99,115), + X(131,147), X(163,179), X(195,211), X(227,243), X(11,139), X(75,203), X(11,75), + X(139,203), X(43,171), X(107,235), X(43,107), X(171,235), X(11,43), X(75,107), + X(139,171), X(203,235), X(27,155), X(91,219), X(27,91), X(155,219), X(59,187), + X(123,251), X(59,123), X(187,251), X(27,59), X(91,123), X(155,187), X(219,251), + X(11,27), X(43,59), X(75,91), X(107,123), X(139,155), X(171,187), X(203,219), + X(235,251), X(3,11), X(19,27), X(35,43), X(51,59), X(67,75), X(83,91), + X(99,107), X(115,123), X(131,139), X(147,155), X(163,171), X(179,187), + X(195,203), X(211,219), X(227,235), X(243,251), X(7,135), X(71,199), X(7,71), + X(135,199), X(39,167), X(103,231), X(39,103), X(167,231), X(7,39), X(71,103), + X(135,167), X(199,231), X(23,151), X(87,215), X(23,87), X(151,215), X(55,183), + X(119,247), X(55,119), X(183,247), X(23,55), X(87,119), X(151,183), X(215,247), + X(7,23), X(39,55), X(71,87), X(103,119), X(135,151), X(167,183), X(199,215), + X(231,247), X(15,143), X(79,207), X(15,79), X(143,207), X(47,175), X(111,239), + X(47,111), X(175,239), X(15,47), X(79,111), X(143,175), X(207,239), X(31,159), + X(95,223), X(31,95), X(159,223), X(63,127), X(127,191), X(63,127), X(63,95), + X(127,159), X(191,223), X(31,63), X(95,127), X(159,191), X(31,47), X(63,79), + X(95,111), X(127,143), X(159,175), X(191,207), X(223,239), X(15,31), X(47,63), + X(79,95), X(111,127), X(143,159), X(175,191), X(207,223), X(15,23), X(31,39), + X(47,55), X(63,71), X(79,87), X(95,103), X(111,119), X(127,135), X(143,151), + X(159,167), X(175,183), X(191,199), X(207,215), X(223,231), X(239,247), + X(7,15), X(23,31), X(39,47), X(55,63), X(71,79), X(87,95), X(103,111), + X(119,127), X(135,143), X(151,159), X(167,175), X(183,191), X(199,207), + X(215,223), X(231,239), X(7,11), X(15,19), X(23,27), X(31,35), X(39,43), + X(47,51), X(55,59), X(63,67), X(71,75), X(79,83), X(87,91), X(95,99), + X(103,107), X(111,115), X(119,123), X(127,131), X(135,139), X(143,147), + X(151,155), X(159,163), X(167,171), X(175,179), X(183,187), X(191,195), + X(199,203), X(207,211), X(215,219), X(223,227), X(231,235), X(239,243), + X(247,251), X(3,7), X(11,15), X(19,23), X(27,31), X(35,39), X(43,47), X(51,55), + X(59,63), X(67,71), X(75,79), X(83,87), X(91,95), X(99,103), X(107,111), + X(115,119), X(123,127), X(131,135), X(139,143), X(147,151), X(155,159), + X(163,167), X(171,175), X(179,183), X(187,191), X(195,199), X(203,207), + X(211,215), X(219,223), X(227,231), X(235,239), X(243,247), X(3,5), X(7,9), + X(11,13), X(15,17), X(19,21), X(23,25), X(27,29), X(31,33), X(35,37), X(39,41), + X(43,45), X(47,49), X(51,53), X(55,57), X(59,61), X(63,65), X(67,69), X(71,73), + X(75,77), X(79,81), X(83,85), X(87,89), X(91,93), X(95,97), X(99,101), + X(103,105), X(107,109), X(111,113), X(115,117), X(119,121), X(123,125), + X(127,129), X(131,133), X(135,137), X(139,141), X(143,145), X(147,149), + X(151,153), X(155,157), X(159,161), X(163,165), X(167,169), X(171,173), + X(175,177), X(179,181), X(183,185), X(187,189), X(191,193), X(195,197), + X(199,201), X(203,205), X(207,209), X(211,213), X(215,217), X(219,221), + X(223,225), X(227,229), X(231,233), X(235,237), X(239,241), X(243,245), + X(247,249), X(251,253), X(1,3), X(5,7), X(9,11), X(13,15), X(17,19), X(21,23), + X(25,27), X(29,31), X(33,35), X(37,39), X(41,43), X(45,47), X(49,51), X(53,55), + X(57,59), X(61,63), X(65,67), X(69,71), X(73,75), X(77,79), X(81,83), X(85,87), + X(89,91), X(93,95), X(97,99), X(101,103), X(105,107), X(109,111), X(113,115), + X(117,119), X(121,123), X(125,127), X(129,131), X(133,135), X(137,139), + X(141,143), X(145,147), X(149,151), X(153,155), X(157,159), X(161,163), + X(165,167), X(169,171), X(173,175), X(177,179), X(181,183), X(185,187), + X(189,191), X(193,195), X(197,199), X(201,203), X(205,207), X(209,211), + X(213,215), X(217,219), X(221,223), X(225,227), X(229,231), X(233,235), + X(237,239), X(241,243), X(245,247), X(249,251), X(2,130), X(66,194), X(2,66), + X(130,194), X(34,162), X(98,226), X(34,98), X(162,226), X(2,34), X(66,98), + X(130,162), X(194,226), X(18,146), X(82,210), X(18,82), X(146,210), X(50,178), + X(114,242), X(50,114), X(178,242), X(18,50), X(82,114), X(146,178), X(210,242), + X(2,18), X(34,50), X(66,82), X(98,114), X(130,146), X(162,178), X(194,210), + X(226,242), X(10,138), X(74,202), X(10,74), X(138,202), X(42,170), X(106,234), + X(42,106), X(170,234), X(10,42), X(74,106), X(138,170), X(202,234), X(26,154), + X(90,218), X(26,90), X(154,218), X(58,186), X(122,250), X(58,122), X(186,250), + X(26,58), X(90,122), X(154,186), X(218,250), X(10,26), X(42,58), X(74,90), + X(106,122), X(138,154), X(170,186), X(202,218), X(234,250), X(2,10), X(18,26), + X(34,42), X(50,58), X(66,74), X(82,90), X(98,106), X(114,122), X(130,138), + X(146,154), X(162,170), X(178,186), X(194,202), X(210,218), X(226,234), + X(242,250), X(6,134), X(70,198), X(6,70), X(134,198), X(38,166), X(102,230), + X(38,102), X(166,230), X(6,38), X(70,102), X(134,166), X(198,230), X(22,150), + X(86,214), X(22,86), X(150,214), X(54,182), X(118,246), X(54,118), X(182,246), + X(22,54), X(86,118), X(150,182), X(214,246), X(6,22), X(38,54), X(70,86), + X(102,118), X(134,150), X(166,182), X(198,214), X(230,246), X(14,142), + X(78,206), X(14,78), X(142,206), X(46,174), X(110,238), X(46,110), X(174,238), + X(14,46), X(78,110), X(142,174), X(206,238), X(30,158), X(94,222), X(30,94), + X(158,222), X(62,190), X(126,254), X(62,126), X(190,254), X(30,62), X(94,126), + X(158,190), X(222,254), X(14,30), X(46,62), X(78,94), X(110,126), X(142,158), + X(174,190), X(206,222), X(238,254), X(6,14), X(22,30), X(38,46), X(54,62), + X(70,78), X(86,94), X(102,110), X(118,126), X(134,142), X(150,158), X(166,174), + X(182,190), X(198,206), X(214,222), X(230,238), X(246,254), X(2,6), X(10,14), + X(18,22), X(26,30), X(34,38), X(42,46), X(50,54), X(58,62), X(66,70), X(74,78), + X(82,86), X(90,94), X(98,102), X(106,110), X(114,118), X(122,126), X(130,134), + X(138,142), X(146,150), X(154,158), X(162,166), X(170,174), X(178,182), + X(186,190), X(194,198), X(202,206), X(210,214), X(218,222), X(226,230), + X(234,238), X(242,246), X(250,254), X(4,132), X(68,196), X(4,68), X(132,196), + X(36,164), X(100,228), X(36,100), X(164,228), X(4,36), X(68,100), X(132,164), + X(196,228), X(20,148), X(84,212), X(20,84), X(148,212), X(52,180), X(116,244), + X(52,116), X(180,244), X(20,52), X(84,116), X(148,180), X(212,244), X(4,20), + X(36,52), X(68,84), X(100,116), X(132,148), X(164,180), X(196,212), X(228,244), + X(12,140), X(76,204), X(12,76), X(140,204), X(44,172), X(108,236), X(44,108), + X(172,236), X(12,44), X(76,108), X(140,172), X(204,236), X(28,156), X(92,220), + X(28,92), X(156,220), X(60,188), X(124,252), X(60,124), X(188,252), X(28,60), + X(92,124), X(156,188), X(220,252), X(12,28), X(44,60), X(76,92), X(108,124), + X(140,156), X(172,188), X(204,220), X(236,252), X(4,12), X(20,28), X(36,44), + X(52,60), X(68,76), X(84,92), X(100,108), X(116,124), X(132,140), X(148,156), + X(164,172), X(180,188), X(196,204), X(212,220), X(228,236), X(244,252), + X(8,136), X(72,200), X(8,72), X(136,200), X(40,168), X(104,232), X(40,104), + X(168,232), X(8,40), X(72,104), X(136,168), X(200,232), X(24,152), X(88,216), + X(24,88), X(152,216), X(56,184), X(120,248), X(56,120), X(184,248), X(24,56), + X(88,120), X(152,184), X(216,248), X(8,24), X(40,56), X(72,88), X(104,120), + X(136,152), X(168,184), X(200,216), X(232,248), X(16,144), X(80,208), X(16,80), + X(144,208), X(48,176), X(112,240), X(48,112), X(176,240), X(16,48), X(80,112), + X(144,176), X(208,240), X(32,160), X(96,224), X(32,96), X(160,224), X(64,128), + X(128,192), X(64,128), X(64,96), X(128,160), X(192,224), X(32,64), X(96,128), + X(160,192), X(32,48), X(64,80), X(96,112), X(128,144), X(160,176), X(192,208), + X(224,240), X(16,32), X(48,64), X(80,96), X(112,128), X(144,160), X(176,192), + X(208,224), X(16,24), X(32,40), X(48,56), X(64,72), X(80,88), X(96,104), + X(112,120), X(128,136), X(144,152), X(160,168), X(176,184), X(192,200), + X(208,216), X(224,232), X(240,248), X(8,16), X(24,32), X(40,48), X(56,64), + X(72,80), X(88,96), X(104,112), X(120,128), X(136,144), X(152,160), X(168,176), + X(184,192), X(200,208), X(216,224), X(232,240), X(8,12), X(16,20), X(24,28), + X(32,36), X(40,44), X(48,52), X(56,60), X(64,68), X(72,76), X(80,84), X(88,92), + X(96,100), X(104,108), X(112,116), X(120,124), X(128,132), X(136,140), + X(144,148), X(152,156), X(160,164), X(168,172), X(176,180), X(184,188), + X(192,196), X(200,204), X(208,212), X(216,220), X(224,228), X(232,236), + X(240,244), X(248,252), X(4,8), X(12,16), X(20,24), X(28,32), X(36,40), + X(44,48), X(52,56), X(60,64), X(68,72), X(76,80), X(84,88), X(92,96), + X(100,104), X(108,112), X(116,120), X(124,128), X(132,136), X(140,144), + X(148,152), X(156,160), X(164,168), X(172,176), X(180,184), X(188,192), + X(196,200), X(204,208), X(212,216), X(220,224), X(228,232), X(236,240), + X(244,248), X(4,6), X(8,10), X(12,14), X(16,18), X(20,22), X(24,26), X(28,30), + X(32,34), X(36,38), X(40,42), X(44,46), X(48,50), X(52,54), X(56,58), X(60,62), + X(64,66), X(68,70), X(72,74), X(76,78), X(80,82), X(84,86), X(88,90), X(92,94), + X(96,98), X(100,102), X(104,106), X(108,110), X(112,114), X(116,118), + X(120,122), X(124,126), X(128,130), X(132,134), X(136,138), X(140,142), + X(144,146), X(148,150), X(152,154), X(156,158), X(160,162), X(164,166), + X(168,170), X(172,174), X(176,178), X(180,182), X(184,186), X(188,190), + X(192,194), X(196,198), X(200,202), X(204,206), X(208,210), X(212,214), + X(216,218), X(220,222), X(224,226), X(228,230), X(232,234), X(236,238), + X(240,242), X(244,246), X(248,250), X(252,254), X(2,4), X(6,8), X(10,12), + X(14,16), X(18,20), X(22,24), X(26,28), X(30,32), X(34,36), X(38,40), X(42,44), + X(46,48), X(50,52), X(54,56), X(58,60), X(62,64), X(66,68), X(70,72), X(74,76), + X(78,80), X(82,84), X(86,88), X(90,92), X(94,96), X(98,100), X(102,104), + X(106,108), X(110,112), X(114,116), X(118,120), X(122,124), X(126,128), + X(130,132), X(134,136), X(138,140), X(142,144), X(146,148), X(150,152), + X(154,156), X(158,160), X(162,164), X(166,168), X(170,172), X(174,176), + X(178,180), X(182,184), X(186,188), X(190,192), X(194,196), X(198,200), + X(202,204), X(206,208), X(210,212), X(214,216), X(218,220), X(222,224), + X(226,228), X(230,232), X(234,236), X(238,240), X(242,244), X(246,248), + X(250,252), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), + X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), + X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), + X(229,230), X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), + X(241,242), X(243,244), X(245,246), X(247,248), X(249,250), X(251,252), + X(253,254) +}; + +// +// +// + +struct hsg_network const hsg_networks_merging[] = +{ + LM(2), + LM(3), + LM(4), + LM(5), + LM(6), + LM(7), + LM(8), + LM(9), + LM(10), + LM(11), + LM(12), + LM(13), + LM(14), + LM(15), + LM(16), + LM(17), + LM(18), + LM(19), + LM(20), + LM(21), + LM(22), + LM(23), + LM(24), + LM(25), + LM(26), + LM(27), + LM(28), + LM(29), + LM(30), + LM(31), + LM(32), + LM(33), + LM(34), + LM(35), + LM(36), + LM(37), + LM(38), + LM(39), + LM(40), + LM(41), + LM(42), + LM(43), + LM(44), + LM(45), + LM(46), + LM(47), + LM(48), + LM(49), + LM(50), + LM(51), + LM(52), + LM(53), + LM(54), + LM(55), + LM(56), + LM(57), + LM(58), + LM(59), + LM(60), + LM(61), + LM(62), + LM(63), + LM(64), + LM(65), + LM(66), + LM(67), + LM(68), + LM(69), + LM(70), + LM(71), + LM(72), + LM(73), + LM(74), + LM(75), + LM(76), + LM(77), + LM(78), + LM(79), + LM(80), + LM(81), + LM(82), + LM(83), + LM(84), + LM(85), + LM(86), + LM(87), + LM(88), + LM(89), + LM(90), + LM(91), + LM(92), + LM(93), + LM(94), + LM(95), + LM(96), + LM(97), + LM(98), + LM(99), + LM(100), + LM(101), + LM(102), + LM(103), + LM(104), + LM(105), + LM(106), + LM(107), + LM(108), + LM(109), + LM(110), + LM(111), + LM(112), + LM(113), + LM(114), + LM(115), + LM(116), + LM(117), + LM(118), + LM(119), + LM(120), + LM(121), + LM(122), + LM(123), + LM(124), + LM(125), + LM(126), + LM(127), + LM(128), + LM(129), + LM(130), + LM(131), + LM(132), + LM(133), + LM(134), + LM(135), + LM(136), + LM(137), + LM(138), + LM(139), + LM(140), + LM(141), + LM(142), + LM(143), + LM(144), + LM(145), + LM(146), + LM(147), + LM(148), + LM(149), + LM(150), + LM(151), + LM(152), + LM(153), + LM(154), + LM(155), + LM(156), + LM(157), + LM(158), + LM(159), + LM(160), + LM(161), + LM(162), + LM(163), + LM(164), + LM(165), + LM(166), + LM(167), + LM(168), + LM(169), + LM(170), + LM(171), + LM(172), + LM(173), + LM(174), + LM(175), + LM(176), + LM(177), + LM(178), + LM(179), + LM(180), + LM(181), + LM(182), + LM(183), + LM(184), + LM(185), + LM(186), + LM(187), + LM(188), + LM(189), + LM(190), + LM(191), + LM(192), + LM(193), + LM(194), + LM(195), + LM(196), + LM(197), + LM(198), + LM(199), + LM(200), + LM(201), + LM(202), + LM(203), + LM(204), + LM(205), + LM(206), + LM(207), + LM(208), + LM(209), + LM(210), + LM(211), + LM(212), + LM(213), + LM(214), + LM(215), + LM(216), + LM(217), + LM(218), + LM(219), + LM(220), + LM(221), + LM(222), + LM(223), + LM(224), + LM(225), + LM(226), + LM(227), + LM(228), + LM(229), + LM(230), + LM(231), + LM(232), + LM(233), + LM(234), + LM(235), + LM(236), + LM(237), + LM(238), + LM(239), + LM(240), + LM(241), + LM(242), + LM(243), + LM(244), + LM(245), + LM(246), + LM(247), + LM(248), + LM(249), + LM(250), + LM(251), + LM(252), + LM(253), + LM(254) +}; diff --git a/src/compute/hs/gen/networks_sorting.c b/src/compute/hs/gen/networks_sorting.c new file mode 100644 index 0000000000..c7beb6b45e --- /dev/null +++ b/src/compute/hs/gen/networks_sorting.c @@ -0,0 +1,30157 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// This file was generated using a modified version of +// the Perl script "algorithm-networksort-chooser" found here: +// +// http://search.cpan.org/dist/Algorithm-Networksort-Chooser/bin/algorithm-networksort-chooser +// + +#include "networks.h" +#include "macros.h" + +// +// +// + +#define S(n) static struct hsg_op const sn##n[] +#define X(a,b) { HSG_OP_TYPE_CMP_XCHG, { a, b }} + +// +// +// + +#define LS(n) { ARRAY_LENGTH(sn##n), sn##n } + +// +// +// + +S(2) = { + X(1,2) +}; +S(4) = { + X(1,3), X(2,4), X(1,2), X(3,4), X(2,3) +}; +S(6) = { + X(1,5), X(2,6), X(1,3), X(2,4), X(3,5), X(4,6), X(1,2), X(3,4), X(5,6), + X(2,5), X(2,3), X(4,5) +}; +S(8) = { + X(1,5), X(2,6), X(3,7), X(4,8), X(1,3), X(2,4), X(5,7), X(6,8), X(3,5), + X(4,6), X(1,2), X(3,4), X(5,6), X(7,8), X(2,5), X(4,7), X(2,3), X(4,5), X(6,7) +}; +S(10) = { + X(5,10), X(4,9), X(3,8), X(2,7), X(1,6), X(2,5), X(7,10), X(1,4), X(6,9), + X(1,3), X(4,7), X(8,10), X(1,2), X(3,5), X(6,8), X(9,10), X(2,3), X(5,7), + X(8,9), X(4,6), X(3,6), X(7,9), X(2,4), X(5,8), X(3,4), X(7,8), X(4,5), X(6,7), + X(5,6) +}; +S(12) = { + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(2,4), X(6,8), X(10,12), + X(1,3), X(5,7), X(9,11), X(2,3), X(6,7), X(10,11), X(2,6), X(7,11), X(6,10), + X(3,7), X(2,6), X(7,11), X(1,5), X(8,12), X(4,8), X(5,9), X(1,5), X(8,12), + X(2,5), X(8,11), X(4,9), X(3,4), X(9,10), X(3,5), X(8,10), X(4,6), X(7,9), + X(4,5), X(6,7), X(8,9) +}; +S(14) = { + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(1,3), X(5,7), + X(9,11), X(2,4), X(6,8), X(10,12), X(1,5), X(9,13), X(2,6), X(10,14), X(3,7), + X(4,8), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(6,11), X(7,10), + X(4,13), X(8,12), X(2,3), X(5,9), X(2,5), X(8,14), X(3,9), X(3,5), X(6,7), + X(10,11), X(12,14), X(4,9), X(8,13), X(7,9), X(11,13), X(4,6), X(8,10), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(7,8), X(9,10) +}; +S(16) = { + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(1,3), + X(5,7), X(9,11), X(13,15), X(2,4), X(6,8), X(10,12), X(14,16), X(1,5), X(9,13), + X(2,6), X(10,14), X(3,7), X(11,15), X(4,8), X(12,16), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(6,11), X(7,10), X(4,13), + X(14,15), X(8,12), X(2,3), X(5,9), X(2,5), X(8,14), X(3,9), X(12,15), X(3,5), + X(6,7), X(10,11), X(12,14), X(4,9), X(8,13), X(7,9), X(11,13), X(4,6), X(8,10), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(7,8), X(9,10) +}; +S(18) = { + X(1,17), X(2,18), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(9,17), X(10,18), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(5,17), X(6,18), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(3,17), X(4,18), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(2,17), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17) +}; +S(20) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(9,17), X(10,18), X(11,19), X(12,20), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(5,17), + X(6,18), X(7,19), X(8,20), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), + X(14,18), X(15,19), X(16,20), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(3,17), X(4,18), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(2,17), X(4,19), + X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(2,3), X(4,5), X(6,7), + X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19) +}; +S(22) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(5,17), X(6,18), + X(7,19), X(8,20), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(3,17), X(4,18), X(7,21), X(8,22), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(2,17), X(4,19), X(6,21), + X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21) +}; +S(24) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(9,17), + X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(5,17), X(6,18), X(7,19), X(8,20), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(3,17), X(4,18), X(7,21), X(8,22), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(2,17), X(4,19), X(6,21), + X(8,23), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23) +}; +S(26) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25) +}; +S(28) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27) +}; +S(30) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29) +}; +S(32) = { + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31) +}; +S(34) = { + X(1,33), X(2,34), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(17,33), X(18,34), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(9,33), X(10,34), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(5,33), X(6,34), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(3,33), X(4,34), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(2,33), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33) +}; +S(36) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(17,33), X(18,34), X(19,35), X(20,36), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(9,33), X(10,34), X(11,35), X(12,36), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(5,33), X(6,34), X(7,35), X(8,36), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(3,33), X(4,34), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(2,33), X(4,35), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35) +}; +S(38) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(5,33), X(6,34), X(7,35), X(8,36), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(3,33), X(4,34), X(7,37), X(8,38), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(2,33), X(4,35), X(6,37), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37) +}; +S(40) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(5,33), X(6,34), X(7,35), X(8,36), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(3,33), X(4,34), X(7,37), X(8,38), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(2,33), X(4,35), + X(6,37), X(8,39), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39) +}; +S(42) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41) +}; +S(44) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), + X(34,37), X(36,39), X(38,41), X(40,43), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43) +}; +S(46) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), + X(42,45), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45) +}; +S(48) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47) +}; +S(50) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(39,47), X(40,48), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), + X(42,45), X(44,47), X(46,49), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49) +}; +S(52) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), + X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51) +}; +S(54) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(39,47), X(40,48), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53) +}; +S(56) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55) +}; +S(58) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57) +}; +S(60) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), + X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), + X(50,53), X(52,55), X(54,57), X(56,59), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59) +}; +S(62) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), + X(53,61), X(54,62), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), + X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), + X(58,61), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61) +}; +S(64) = { + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63) +}; +S(66) = { + X(1,65), X(2,66), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(33,65), X(34,66), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(17,65), X(18,66), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(9,65), X(10,66), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(5,65), X(6,66), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(3,65), X(4,66), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(2,65), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65) +}; +S(68) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(17,65), X(18,66), X(19,67), X(20,68), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(9,65), X(10,66), X(11,67), X(12,68), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(5,65), X(6,66), X(7,67), X(8,68), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(3,65), X(4,66), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(2,65), X(4,67), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), + X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), + X(58,61), X(60,63), X(62,65), X(64,67), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67) +}; +S(70) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(5,65), X(6,66), X(7,67), X(8,68), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(3,65), X(4,66), X(7,69), X(8,70), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(2,65), X(4,67), X(6,69), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69) +}; +S(72) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(5,65), X(6,66), X(7,67), X(8,68), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(69,71), X(70,72), X(3,65), X(4,66), X(7,69), X(8,70), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(2,65), X(4,67), + X(6,69), X(8,71), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71) +}; +S(74) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(69,73), X(70,74), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73) +}; +S(76) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(69,73), X(70,74), X(71,75), X(72,76), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), + X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), + X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(66,67), X(68,69), X(70,71), X(72,73), X(74,75) +}; +S(78) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), + X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), + X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), + X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), + X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77) +}; +S(80) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(69,73), X(70,74), X(71,75), X(72,76), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79) +}; +S(82) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(75,81), X(76,82), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), + X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), + X(75,77), X(76,78), X(79,81), X(80,82), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(2,17), + X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), + X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), + X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), + X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), + X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), + X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), + X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), + X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), + X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81) +}; +S(84) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), + X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), + X(69,77), X(70,78), X(71,79), X(72,80), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), + X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), + X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), + X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), + X(82,83) +}; +S(86) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(79,83), X(80,84), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), + X(83,85), X(84,86), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), + X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), + X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), + X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), + X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85) +}; +S(88) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(81,85), X(82,86), X(83,87), X(84,88), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), + X(81,83), X(82,84), X(85,87), X(86,88), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), + X(83,85), X(84,86), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87) +}; +S(90) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(81,85), X(82,86), X(83,87), X(84,88), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), + X(81,83), X(82,84), X(85,87), X(86,88), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), + X(83,85), X(84,86), X(87,89), X(88,90), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), + X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), + X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), + X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), + X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), + X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), + X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), + X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), + X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), + X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), + X(82,89), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89) +}; +S(92) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(1,9), X(2,10), X(3,11), X(4,12), + X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), + X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), + X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), + X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), + X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(81,85), X(82,86), X(83,87), X(84,88), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), + X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), + X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), + X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), + X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), + X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(83,89), X(84,90), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), + X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), + X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), + X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), + X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), + X(82,85), X(84,87), X(86,89), X(88,91), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91) +}; +S(94) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(83,89), X(84,90), X(87,93), X(88,94), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), + X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), + X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), + X(91,93), X(92,94), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(2,17), + X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), + X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), + X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), + X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), + X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93) +}; +S(96) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), + X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), + X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), + X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), + X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), + X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), + X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), + X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), + X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), + X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), + X(85,89), X(86,90), X(87,91), X(88,92), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), + X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), + X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95) +}; +S(98) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(79,95), X(80,96), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), + X(63,87), X(64,88), X(73,97), X(74,98), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97) +}; +S(100) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(17,33), + X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), + X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), + X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), + X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), + X(82,98), X(83,99), X(84,100), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(5,65), + X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), + X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), + X(38,98), X(39,99), X(40,100), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(5,17), + X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), + X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), + X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), + X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), + X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), + X(86,98), X(87,99), X(88,100), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), + X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), + X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), + X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), + X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), + X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), + X(94,98), X(95,99), X(96,100), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), + X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), + X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), + X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), + X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), + X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), + X(92,98), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), + X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), + X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), + X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), + X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), + X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), + X(96,98), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(2,17), + X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), + X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), + X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), + X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), + X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), + X(84,99), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99) +}; +S(102) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(1,33), + X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), + X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), + X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), + X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), + X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(5,17), X(6,18), X(7,19), + X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), + X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), + X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), + X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), + X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), + X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), + X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101) +}; +S(104) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), + X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), + X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), + X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), + X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), + X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), + X(78,94), X(79,95), X(80,96), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), + X(95,99), X(96,100), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), + X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), + X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), + X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), + X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), + X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), + X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), + X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103) +}; +S(106) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), + X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), + X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), + X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), + X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), + X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), + X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), + X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), + X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), + X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), + X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), + X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(97,101), X(98,102), X(99,103), X(100,104), X(5,65), X(6,66), X(7,67), + X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), + X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), + X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), + X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), + X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), + X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), + X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), + X(92,99), X(94,101), X(96,103), X(98,105), X(2,5), X(4,7), X(6,9), X(8,11), + X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), + X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), + X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), + X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), + X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), + X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), + X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), + X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), + X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), + X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), + X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), + X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), + X(98,99), X(100,101), X(102,103), X(104,105) +}; +S(108) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(79,95), X(80,96), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(5,33), + X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), + X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), + X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), + X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), + X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), + X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), + X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), + X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), + X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), + X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), + X(91,105), X(92,106), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(3,5), X(4,6), X(7,9), X(8,10), + X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), + X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), + X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), + X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), + X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), + X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), + X(104,106), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(2,33), + X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), + X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), + X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), + X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), + X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107) +}; +S(110) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), + X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), + X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), + X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), + X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), + X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), + X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), + X(95,103), X(96,104), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), + X(106,110), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), + X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), + X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), + X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), + X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), + X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), + X(93,105), X(94,106), X(95,107), X(96,108), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), + X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), + X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), + X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), + X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), + X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), + X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), + X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), + X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), + X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), + X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), + X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(2,33), + X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), + X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), + X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), + X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), + X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(2,17), + X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), + X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), + X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), + X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), + X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), + X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109) +}; +S(112) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(17,33), + X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), + X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), + X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), + X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), + X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), + X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), + X(96,112), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(79,107), X(80,108), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), + X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), + X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), + X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), + X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), + X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), + X(90,105), X(92,107), X(94,109), X(96,111), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111) +}; +S(114) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(17,33), + X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), + X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), + X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), + X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), + X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), + X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), + X(96,112), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), + X(89,113), X(90,114), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), + X(102,104), X(105,107), X(106,108), X(109,111), X(110,112), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), + X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), + X(108,114), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), + X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), + X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), + X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), + X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), + X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), + X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113) +}; +S(116) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(1,33), + X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), + X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), + X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), + X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), + X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), + X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), + X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(17,33), + X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), + X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), + X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), + X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), + X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), + X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), + X(96,112), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), + X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), + X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), + X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), + X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), + X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(9,17), + X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), + X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), + X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), + X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), + X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), + X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), + X(105,113), X(106,114), X(107,115), X(108,116), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), + X(88,116), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), + X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), + X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), + X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), + X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), + X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), + X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), + X(108,114), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), + X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), + X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), + X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), + X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), + X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), + X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), + X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), + X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), + X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(2,17), + X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), + X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), + X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), + X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), + X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), + X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), + X(98,113), X(100,115), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115) +}; +S(118) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), + X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), + X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), + X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), + X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), + X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), + X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), + X(101,117), X(102,118), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(5,33), + X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), + X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), + X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), + X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), + X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), + X(85,113), X(86,114), X(87,115), X(88,116), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), + X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), + X(109,113), X(110,114), X(111,115), X(112,116), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), + X(102,104), X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), + X(114,116), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), + X(83,113), X(84,114), X(87,117), X(88,118), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(103,117), X(104,118), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117) +}; +S(120) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), + X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), + X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), + X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), + X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), + X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), + X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), + X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), + X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), + X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), + X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), + X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), + X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), + X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), + X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), + X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), + X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), + X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), + X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), + X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), + X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), + X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), + X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), + X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), + X(88,118), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), + X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), + X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), + X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), + X(88,119), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119) +}; +S(122) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), + X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), X(105,121), + X(106,122), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), + X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), + X(96,120), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), + X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), + X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), + X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), + X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), + X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), + X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), + X(109,117), X(110,118), X(111,119), X(112,120), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(2,33), + X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), + X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), + X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), + X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), + X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), + X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121) +}; +S(124) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), + X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), + X(63,111), X(64,112), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123) +}; +S(126) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), + X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), + X(63,111), X(64,112), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), + X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), + X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), + X(61,117), X(62,118), X(63,119), X(64,120), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(9,17), + X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), + X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), + X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), + X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), + X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), + X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), + X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), + X(111,119), X(112,120), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), + X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), + X(116,120), X(121,125), X(122,126), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(5,33), + X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), + X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), + X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), + X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), + X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), + X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), + X(96,124), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), + X(102,104), X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), + X(114,116), X(117,119), X(118,120), X(121,123), X(122,124), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), + X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), + X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), + X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), + X(88,119), X(90,121), X(92,123), X(94,125), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125) +}; +S(128) = { + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(121,125), + X(122,126), X(123,127), X(124,128), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(5,33), + X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), + X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), + X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), + X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), + X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), + X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), + X(96,124), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), + X(102,104), X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), + X(114,116), X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), + X(126,128), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(63,125), X(64,126), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), + X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), + X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), + X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), + X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), + X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), + X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), + X(62,125), X(64,127), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127) +}; +S(130) = { + X(1,129), X(2,130), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), + X(66,130), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(17,129), + X(18,130), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(17,33), + X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), + X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), + X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), + X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), + X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), + X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), + X(96,112), X(113,129), X(114,130), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), + X(101,109), X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), + X(115,123), X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), + X(9,129), X(10,130), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), + X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), + X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), + X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), + X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), + X(96,120), X(105,129), X(106,130), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), + X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), + X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), X(5,129), X(6,130), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(3,129), X(4,130), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(2,129), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129) +}; +S(132) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(17,129), X(18,130), X(19,131), X(20,132), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(9,129), X(10,130), X(11,131), X(12,132), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(5,129), X(6,130), X(7,131), X(8,132), X(5,65), X(6,66), X(7,67), + X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), + X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), + X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), + X(103,131), X(104,132), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(3,129), X(4,130), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), + X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), + X(96,126), X(99,129), X(100,130), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), + X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), + X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), + X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), + X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), + X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), + X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), + X(104,118), X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), + X(116,130), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(2,129), X(4,131), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), + X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), + X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131) +}; +S(134) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(9,129), X(10,130), X(11,131), X(12,132), + X(13,133), X(14,134), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(5,129), X(6,130), X(7,131), X(8,132), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), + X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), + X(103,131), X(104,132), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(3,129), X(4,130), X(7,133), X(8,134), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), + X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), + X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), + X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), + X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), + X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), + X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), + X(103,133), X(104,134), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(2,129), X(4,131), X(6,133), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), + X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), + X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), + X(70,133), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(2,17), + X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), + X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), + X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), + X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), + X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), + X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), + X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), + X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), + X(124,131), X(126,133), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133) +}; +S(136) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(1,33), + X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), + X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), + X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), + X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), + X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), + X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), + X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), + X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), + X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(1,17), + X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), + X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), + X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), + X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), + X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), + X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), + X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), + X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), + X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), + X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), + X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), + X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(5,129), X(6,130), X(7,131), + X(8,132), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), X(5,17), + X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), + X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), + X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), + X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), + X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), + X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), + X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), + X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), + X(102,104), X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), + X(114,116), X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), + X(126,128), X(129,131), X(130,132), X(133,135), X(134,136), X(3,129), X(4,130), + X(7,133), X(8,134), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(2,129), X(4,131), X(6,133), X(8,135), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135) +}; +S(138) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), + X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), + X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), + X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), + X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), + X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), + X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), + X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), + X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), + X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), + X(40,136), X(41,137), X(42,138), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), + X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137) +}; +S(140) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(1,65), X(2,66), X(3,67), + X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), + X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), + X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), + X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(1,33), + X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), + X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), + X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), + X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), + X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), + X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), + X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), + X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), + X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), + X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), + X(108,140), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(9,33), + X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), + X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), + X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), + X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), + X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), + X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), + X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), + X(110,134), X(111,135), X(112,136), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), + X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), + X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), + X(130,134), X(131,135), X(132,136), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(5,17), X(6,18), X(7,19), + X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), + X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), + X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), + X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), + X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), + X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), + X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), + X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), + X(133,137), X(134,138), X(135,139), X(136,140), X(1,3), X(2,4), X(5,7), X(6,8), + X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), + X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), + X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), + X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), + X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), + X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), + X(102,104), X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), + X(114,116), X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), + X(126,128), X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), + X(138,140), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(2,129), X(4,131), X(6,133), X(8,135), + X(10,137), X(12,139), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), + X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), + X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), + X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), + X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), + X(102,133), X(104,135), X(106,137), X(108,139), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139) +}; +S(142) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), + X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), + X(75,139), X(76,140), X(77,141), X(78,142), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), + X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), + X(108,140), X(109,141), X(110,142), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), + X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), X(105,121), + X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), X(111,127), + X(112,128), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), + X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), + X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), + X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), + X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), + X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), + X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), + X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), + X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), + X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), + X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), + X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), + X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), + X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), + X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141) +}; +S(144) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), + X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(2,129), X(4,131), + X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143) +}; +S(146) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), + X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), + X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), + X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), + X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), + X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), + X(80,140), X(85,145), X(86,146), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), + X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), + X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), + X(117,145), X(118,146), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(2,33), + X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), + X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), + X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), + X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), + X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), + X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), + X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), + X(108,139), X(110,141), X(112,143), X(114,145), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145) +}; +S(148) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), + X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), + X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), + X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), + X(116,148), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), + X(83,145), X(84,146), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147) +}; +S(150) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), + X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), + X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(1,33), + X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), + X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), + X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), + X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), + X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), + X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), + X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), + X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), + X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(17,129), + X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), + X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), + X(32,144), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(17,33), + X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), + X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), + X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), + X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), + X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), + X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), + X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), + X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), + X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), + X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), + X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), + X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), + X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), + X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), + X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), + X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), + X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), + X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), + X(120,150), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), + X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), X(148,150), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149) +}; +S(152) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), + X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), + X(86,150), X(87,151), X(88,152), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), + X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), + X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), + X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), + X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), + X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), + X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), + X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), + X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), + X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), + X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), + X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), + X(54,150), X(55,151), X(56,152), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), + X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), X(105,121), + X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), X(111,127), + X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), X(133,149), + X(134,150), X(135,151), X(136,152), X(17,129), X(18,130), X(19,131), X(20,132), + X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), + X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), + X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), + X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), + X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), + X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), + X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), + X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), + X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), + X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), + X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), + X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(133,145), + X(134,146), X(135,147), X(136,148), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(2,33), + X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), + X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), + X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), + X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), + X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), + X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), + X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), + X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), + X(120,151), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(124,127), + X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), X(136,139), + X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(148,151), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151) +}; +S(154) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), + X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), + X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), + X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), + X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), + X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), + X(57,153), X(58,154), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), + X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), + X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), + X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), + X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), + X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), + X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), + X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), + X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(2,129), X(4,131), X(6,133), + X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), + X(22,149), X(24,151), X(26,153), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), + X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), + X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), + X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), + X(84,147), X(86,149), X(88,151), X(90,153), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), + X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), + X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), + X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), + X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), X(130,145), + X(132,147), X(134,149), X(136,151), X(138,153), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153) +}; +S(156) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), + X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), + X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), + X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), + X(89,153), X(90,154), X(91,155), X(92,156), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), + X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), + X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), + X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), + X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(17,129), X(18,130), X(19,131), X(20,132), + X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), + X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), + X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), + X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), + X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(133,145), + X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), X(143,155), + X(144,156), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155) +}; +S(158) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), + X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), + X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), + X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), + X(31,151), X(32,152), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(5,33), + X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), + X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), + X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), + X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), + X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), + X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), + X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), + X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), + X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), + X(150,154), X(151,155), X(152,156), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(153,155), X(154,156), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), + X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), + X(27,153), X(28,154), X(31,157), X(32,158), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), + X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), + X(96,158), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(126,157), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157) +}; +S(160) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), + X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), + X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), + X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), + X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), + X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), + X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(9,129), X(10,130), X(11,131), X(12,132), + X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), + X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(5,65), + X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), + X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), + X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), + X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), + X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), + X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), + X(94,154), X(95,155), X(96,156), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), + X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), + X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), + X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), + X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), + X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), + X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), + X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), + X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), + X(127,155), X(128,156), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), + X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), + X(157,159), X(158,160), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), + X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), + X(27,153), X(28,154), X(31,157), X(32,158), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), + X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), + X(96,158), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), + X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), + X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), + X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), + X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), + X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), + X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), + X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), + X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), X(130,145), + X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), X(142,157), + X(144,159), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159) +}; +S(162) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), + X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), + X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), + X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), + X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), + X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), + X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), + X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), + X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), + X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), + X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), + X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), + X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), + X(98,161), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161) +}; +S(164) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), + X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), + X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), + X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), + X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(1,33), + X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), + X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), + X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), + X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), + X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), + X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), + X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), + X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), + X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), + X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), + X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), + X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), + X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), + X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), + X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), + X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), + X(107,163), X(108,164), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(121,125), + X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), X(131,135), + X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), X(145,149), + X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), X(155,159), + X(156,160), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), + X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), + X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), + X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), + X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), + X(132,162), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), + X(151,157), X(152,158), X(155,161), X(156,162), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), + X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), X(148,150), + X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), X(160,162), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(2,129), X(4,131), X(6,133), X(8,135), + X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), + X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), + X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), + X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), + X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(2,33), + X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), + X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), + X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), + X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), + X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), + X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), + X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), + X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), + X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), + X(132,163), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(124,127), + X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), X(136,139), + X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(148,151), + X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), X(160,163), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163) +}; +S(166) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), + X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), + X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), + X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), + X(100,164), X(101,165), X(102,166), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), + X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), + X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), + X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), + X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), + X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), + X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), + X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), + X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), + X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), + X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), + X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), + X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), + X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), + X(142,166), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(5,65), + X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), + X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), + X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), + X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), + X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), + X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), + X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), + X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), + X(100,162), X(103,165), X(104,166), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), X(111,141), + X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), X(123,153), + X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), X(135,165), + X(136,166), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(2,129), X(4,131), X(6,133), + X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), + X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), + X(36,163), X(38,165), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165) +}; +S(168) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), + X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), + X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), + X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), + X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), + X(104,168), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), + X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), + X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), + X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), + X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), + X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), + X(61,157), X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), + X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(5,65), + X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), + X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), + X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), + X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), + X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), + X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), + X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), + X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), + X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(2,129), X(4,131), + X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), + X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), + X(34,161), X(36,163), X(38,165), X(40,167), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), + X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167) +}; +S(170) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), + X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), + X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), + X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), + X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), + X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), + X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), + X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(9,129), X(10,130), X(11,131), X(12,132), + X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), + X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), + X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), X(142,170), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), + X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), + X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(133,145), + X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), X(143,155), + X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), X(157,169), + X(158,170), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), X(44,170), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), + X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), + X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), + X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), + X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), + X(104,167), X(106,169), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), + X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), + X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), + X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), + X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), X(130,145), + X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), X(142,157), + X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), X(154,169), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), + X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), + X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), + X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), + X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), + X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), + X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), + X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), + X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), + X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), + X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), + X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), X(168,169) +}; +S(172) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), + X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), + X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), + X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), + X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), + X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), + X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), + X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), + X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), + X(109,169), X(110,170), X(111,171), X(112,172), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), + X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), + X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), + X(169,171), X(170,172), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), + X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), + X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), + X(40,166), X(43,169), X(44,170), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), + X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), X(3,33), + X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), + X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), + X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), + X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), + X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), + X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), + X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), + X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), + X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), + X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), + X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), + X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), + X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), + X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), + X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), + X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), + X(160,166), X(163,169), X(164,170), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(2,129), X(4,131), X(6,133), X(8,135), + X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), + X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), + X(38,165), X(40,167), X(42,169), X(44,171), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), + X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), X(106,169), + X(108,171), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), + X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), + X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), + X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), + X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), X(130,145), + X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), X(142,157), + X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), X(154,169), + X(156,171), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171) +}; +S(174) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), + X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), + X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), + X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), + X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), + X(109,169), X(110,170), X(111,171), X(112,172), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), + X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), + X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), + X(169,171), X(170,172), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), + X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), + X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), + X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173) +}; +S(176) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), + X(144,160), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), + X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), X(150,166), + X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), X(156,172), + X(157,173), X(158,174), X(159,175), X(160,176), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), + X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), + X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(133,145), + X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), X(143,155), + X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), X(157,169), + X(158,170), X(159,171), X(160,172), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(153,155), X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), + X(165,167), X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), + X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), + X(44,170), X(47,173), X(48,174), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), + X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), + X(111,173), X(112,174), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), X(112,126), + X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), X(124,138), + X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), X(136,150), + X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), X(148,162), + X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), X(160,174), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(2,129), X(4,131), + X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), + X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), + X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), + X(48,175), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(124,127), + X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), X(136,139), + X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(148,151), + X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), X(160,163), + X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), X(172,175), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175) +}; +S(178) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), + X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), + X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), + X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), + X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), + X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), + X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), + X(114,178), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), + X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), + X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), + X(143,175), X(144,176), X(145,177), X(146,178), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), + X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), + X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), + X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(9,129), X(10,130), X(11,131), X(12,132), + X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), + X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), + X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), + X(58,178), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), + X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), + X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), + X(121,177), X(122,178), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(121,125), + X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), X(131,135), + X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), X(145,149), + X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), X(155,159), + X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), X(169,173), + X(170,174), X(171,175), X(172,176), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), + X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), + X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), + X(54,178), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), + X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), + X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), + X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), + X(115,177), X(116,178), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), + X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), + X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), + X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), + X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177) +}; +S(180) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), + X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), + X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), + X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), + X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), + X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), + X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), + X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), + X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), + X(145,177), X(146,178), X(147,179), X(148,180), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), + X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), + X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), + X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), + X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), + X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), + X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), + X(125,173), X(126,174), X(127,175), X(128,176), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), + X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), + X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), + X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), + X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), + X(156,180), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), + X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), + X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), + X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), + X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), + X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), + X(116,179), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179) +}; +S(182) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), + X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), + X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), + X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), + X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), + X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), + X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), + X(116,180), X(117,181), X(118,182), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), + X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), + X(166,182), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), + X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), X(150,166), + X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), X(156,172), + X(157,173), X(158,174), X(159,175), X(160,176), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(125,181), X(126,182), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), + X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), + X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), + X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), + X(115,177), X(116,178), X(119,181), X(120,182), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), + X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), + X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), + X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), + X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), + X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), + X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), + X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), + X(172,178), X(175,181), X(176,182), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), X(134,165), + X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), X(146,177), + X(148,179), X(150,181), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181) +}; +S(184) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), + X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), + X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), + X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), + X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), + X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(17,129), + X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), + X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), + X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), + X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), + X(62,174), X(63,175), X(64,176), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), + X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), + X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(5,17), X(6,18), X(7,19), + X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), + X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), + X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), + X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), + X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), + X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), + X(111,173), X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), + X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), + X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), + X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), + X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), + X(172,179), X(174,181), X(176,183), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183) +}; +S(186) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), + X(170,186), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), + X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), X(150,166), + X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), X(156,172), + X(157,173), X(158,174), X(159,175), X(160,176), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(177,185), X(178,186), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), + X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), + X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), + X(121,177), X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), + X(127,183), X(128,184), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(121,125), + X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), X(131,135), + X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), X(145,149), + X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), X(155,159), + X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), X(169,173), + X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), X(179,183), + X(180,184), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), + X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), + X(56,180), X(61,185), X(62,186), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), + X(125,185), X(126,186), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), + X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), + X(111,173), X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), + X(123,185), X(124,186), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), X(112,126), + X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), X(124,138), + X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), X(136,150), + X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), X(148,162), + X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), X(160,174), + X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), X(172,186), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), + X(171,177), X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(2,129), X(4,131), X(6,133), + X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), + X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), + X(36,163), X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), + X(50,177), X(52,179), X(54,181), X(56,183), X(58,185), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), X(134,165), + X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), X(146,177), + X(148,179), X(150,181), X(152,183), X(154,185), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185) +}; +S(188) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), + X(170,186), X(171,187), X(172,188), X(17,129), X(18,130), X(19,131), X(20,132), + X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), + X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), + X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), + X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), + X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), + X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), + X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), + X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), + X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), X(142,166), + X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), X(156,180), + X(157,181), X(158,182), X(159,183), X(160,184), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), + X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), + X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), + X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), + X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), + X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), + X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), + X(178,182), X(179,183), X(180,184), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), + X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), + X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), + X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), + X(128,188), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), + X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), + X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), + X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), + X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), + X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), + X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), + X(98,161), X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), + X(110,173), X(112,175), X(114,177), X(116,179), X(118,181), X(120,183), + X(122,185), X(124,187), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), X(124,139), + X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(136,151), + X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), X(148,163), + X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), X(160,175), + X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(172,187), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187) +}; +S(190) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), + X(170,186), X(171,187), X(172,188), X(173,189), X(174,190), X(17,129), + X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), + X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), + X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), + X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), + X(62,174), X(63,175), X(64,176), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), + X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), X(106,169), + X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), X(118,181), + X(120,183), X(122,185), X(124,187), X(126,189), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), + X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), + X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), + X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), + X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), + X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189) +}; +S(192) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), + X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), + X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), + X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), + X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), + X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), + X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), + X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), + X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), + X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), + X(170,186), X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), + X(176,192), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), + X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), + X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), + X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), + X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), + X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), + X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), X(116,132), + X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), X(122,138), + X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), X(128,144), + X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), X(150,166), + X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), X(156,172), + X(157,173), X(158,174), X(159,175), X(160,176), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), X(180,188), + X(181,189), X(182,190), X(183,191), X(184,192), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), + X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), + X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), + X(121,177), X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), + X(127,183), X(128,184), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(121,125), + X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), X(131,135), + X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), X(145,149), + X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), X(155,159), + X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), X(169,173), + X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), X(179,183), + X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), X(5,129), X(6,130), + X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), + X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), + X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), + X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), + X(63,187), X(64,188), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), + X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), + X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), + X(126,186), X(127,187), X(128,188), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), + X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), + X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), + X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), + X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), X(166,178), + X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), X(176,188), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), + X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191) +}; +S(194) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(129,193), X(130,194), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), + X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), + X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), + X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), + X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), + X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), + X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), + X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), + X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), + X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), + X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), + X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), + X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), + X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), + X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), + X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), + X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), + X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), + X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), + X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), + X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), + X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), + X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), + X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), + X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), + X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), + X(69,193), X(70,194), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), + X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), + X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), + X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), + X(159,187), X(160,188), X(165,193), X(166,194), X(5,17), X(6,18), X(7,19), + X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), + X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), + X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), + X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), + X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), X(111,141), + X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), X(123,153), + X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), X(135,165), + X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), X(147,177), + X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), X(159,189), + X(160,190), X(163,193), X(164,194), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), X(112,126), + X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), X(124,138), + X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), X(136,150), + X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), X(148,162), + X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), X(160,174), + X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), X(172,186), + X(175,189), X(176,190), X(179,193), X(180,194), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), + X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), + X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), + X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), + X(187,193), X(188,194), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), + X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193) +}; +S(196) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), + X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), + X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), + X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), + X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), + X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), + X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), + X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), + X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), + X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), + X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), + X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), + X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), + X(157,189), X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), + X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), + X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), X(100,196), X(33,65), + X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), + X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), + X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), + X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(125,173), + X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), X(147,195), + X(148,196), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(179,195), X(180,196), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), + X(101,109), X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), + X(115,123), X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), + X(129,137), X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), + X(135,143), X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), + X(149,157), X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), + X(163,171), X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), + X(177,185), X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), + X(183,191), X(184,192), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), + X(74,194), X(75,195), X(76,196), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), + X(138,194), X(139,195), X(140,196), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), + X(188,196), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), X(142,170), + X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), X(152,180), + X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), X(166,194), + X(167,195), X(168,196), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), + X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), + X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), + X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), + X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), X(111,141), + X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), X(123,153), + X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), X(135,165), + X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), X(147,177), + X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), X(159,189), + X(160,190), X(163,193), X(164,194), X(3,17), X(4,18), X(7,21), X(8,22), + X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), + X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), + X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), + X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), + X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), + X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), + X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), X(112,126), + X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), X(124,138), + X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), X(136,150), + X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), X(148,162), + X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), X(160,174), + X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), X(172,186), + X(175,189), X(176,190), X(179,193), X(180,194), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), + X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), + X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), + X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), + X(187,193), X(188,194), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), + X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), + X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), + X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), + X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), + X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), + X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), + X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), + X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), + X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), + X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), + X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), + X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), + X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), + X(193,194), X(195,196), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), + X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), + X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), + X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), + X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), + X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), + X(184,191), X(186,193), X(188,195), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195) +}; +S(198) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), + X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), + X(161,193), X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(9,65), X(10,66), X(11,67), + X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), + X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), + X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), + X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), + X(135,195), X(136,196), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), + X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), + X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), + X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), + X(124,186), X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), + X(136,198), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), + X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), + X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), + X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), + X(187,193), X(188,194), X(191,197), X(192,198), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), + X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), X(148,150), + X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), X(160,162), + X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), X(172,174), + X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), X(184,186), + X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), X(196,198), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(70,197), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), + X(112,175), X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), + X(124,187), X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), + X(192,195), X(194,197), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), + X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), + X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), + X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), + X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), + X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), + X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), X(106,107), + X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), X(118,119), + X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), X(130,131), + X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), X(142,143), + X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), X(154,155), + X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), X(166,167), + X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), X(178,179), + X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), X(190,191), + X(192,193), X(194,195), X(196,197) +}; +S(200) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), X(100,196), + X(101,197), X(102,198), X(103,199), X(104,200), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), + X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), + X(161,193), X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), + X(167,199), X(168,200), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), + X(170,186), X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), + X(176,192), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), + X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), + X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), + X(150,198), X(151,199), X(152,200), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), + X(101,109), X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), + X(115,123), X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), + X(129,137), X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), + X(135,143), X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), + X(149,157), X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), + X(163,171), X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), + X(177,185), X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), + X(183,191), X(184,192), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), + X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), + X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), + X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), + X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), + X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), + X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), + X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), + X(71,195), X(72,196), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), + X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), + X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), + X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), + X(136,196), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(67,193), X(68,194), X(71,197), X(72,198), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), + X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), + X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), + X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), X(119,181), + X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), X(131,193), + X(132,194), X(135,197), X(136,198), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), X(111,141), + X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), X(123,153), + X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), X(135,165), + X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), X(147,177), + X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), X(159,189), + X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), X(3,17), X(4,18), + X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), + X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), + X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), + X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), + X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), + X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), + X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), + X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), + X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), + X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(195,197), X(196,198), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(188,195), X(190,197), X(192,199), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(124,127), + X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), X(136,139), + X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(148,151), + X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), X(160,163), + X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), X(172,175), + X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), X(184,187), + X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), X(196,199), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199) +}; +S(202) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), X(102,198), + X(103,199), X(104,200), X(105,201), X(106,202), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), + X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), + X(161,193), X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), + X(167,199), X(168,200), X(169,201), X(170,202), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), + X(194,202), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), + X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), + X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), + X(71,195), X(72,196), X(77,201), X(78,202), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), + X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), + X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), + X(110,170), X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), + X(120,180), X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), + X(134,194), X(135,195), X(136,196), X(141,201), X(142,202), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), + X(159,187), X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), + X(173,201), X(174,202), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), + X(190,202), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), + X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), + X(192,196), X(197,201), X(198,202), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(153,155), X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), + X(165,167), X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), + X(177,179), X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), + X(189,191), X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), + X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), + X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), + X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), + X(72,198), X(75,201), X(76,202), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), + X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), + X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), + X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), + X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), + X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), + X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), + X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), + X(111,173), X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), + X(123,185), X(124,186), X(127,189), X(128,190), X(131,193), X(132,194), + X(135,197), X(136,198), X(139,201), X(140,202), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), + X(171,177), X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), + X(183,189), X(184,190), X(187,193), X(188,194), X(191,197), X(192,198), + X(195,201), X(196,202), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(2,129), X(4,131), X(6,133), + X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), + X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), + X(36,163), X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), + X(50,177), X(52,179), X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), + X(64,191), X(66,193), X(68,195), X(70,197), X(72,199), X(74,201), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), + X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(2,9), X(4,11), + X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), + X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), + X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), + X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), + X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), + X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), + X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), + X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), + X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), + X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), + X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), + X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), + X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), + X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), X(194,201), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201) +}; +S(204) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), + X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), + X(161,193), X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), + X(167,199), X(168,200), X(169,201), X(170,202), X(171,203), X(172,204), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), + X(91,203), X(92,204), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), + X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), + X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), + X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), + X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), + X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), + X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), + X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), + X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), + X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), + X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), X(152,200), + X(153,201), X(154,202), X(155,203), X(156,204), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), + X(188,204), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), + X(79,199), X(80,200), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), X(142,166), + X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), X(156,180), + X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), X(170,194), + X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), X(176,200), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(185,193), + X(186,194), X(187,195), X(188,196), X(189,197), X(190,198), X(191,199), + X(192,200), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), + X(79,203), X(80,204), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), + X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), + X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), + X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), + X(136,196), X(141,201), X(142,202), X(143,203), X(144,204), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), + X(159,187), X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), + X(173,201), X(174,202), X(175,203), X(176,204), X(5,17), X(6,18), X(7,19), + X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), + X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), + X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), + X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), + X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(3,65), X(4,66), X(7,69), X(8,70), + X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), + X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), + X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), + X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), + X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), + X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), + X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), X(107,169), + X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), X(119,181), + X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), X(131,193), + X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), + X(171,177), X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), + X(183,189), X(184,190), X(187,193), X(188,194), X(191,197), X(192,198), + X(195,201), X(196,202), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(2,129), X(4,131), + X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), + X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), + X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), + X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), X(58,185), X(60,187), + X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), X(72,199), X(74,201), + X(76,203), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(138,201), X(140,203), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), + X(164,195), X(166,197), X(168,199), X(170,201), X(172,203), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203) +}; +S(206) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), + X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), + X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), + X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), + X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), + X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), + X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), + X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), + X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), + X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), + X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), + X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), + X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), + X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), + X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), + X(157,189), X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), + X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), + X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), + X(102,198), X(103,199), X(104,200), X(105,201), X(106,202), X(107,203), + X(108,204), X(109,205), X(110,206), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), + X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), + X(168,200), X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), + X(174,206), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), + X(91,203), X(92,204), X(93,205), X(94,206), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), X(183,199), + X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), X(189,205), + X(190,206), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), + X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), + X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), + X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), + X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), + X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), + X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), + X(143,199), X(144,200), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), + X(175,199), X(176,200), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), + X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), X(141,201), + X(142,202), X(143,203), X(144,204), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), + X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(74,201), X(76,203), X(78,205), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), + X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), X(106,169), + X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), X(118,181), + X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), X(130,193), + X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), X(142,205), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), + X(198,205), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), + X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205) +}; +S(208) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), + X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), + X(141,205), X(142,206), X(143,207), X(144,208), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), + X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), + X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), + X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), + X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), + X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), + X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), + X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), + X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), + X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), X(102,198), + X(103,199), X(104,200), X(105,201), X(106,202), X(107,203), X(108,204), + X(109,205), X(110,206), X(111,207), X(112,208), X(33,65), X(34,66), X(35,67), + X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), + X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), + X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), + X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), + X(99,131), X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), + X(105,137), X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), + X(111,143), X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), + X(117,149), X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), + X(123,155), X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), + X(161,193), X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), + X(167,199), X(168,200), X(169,201), X(170,202), X(171,203), X(172,204), + X(173,205), X(174,206), X(175,207), X(176,208), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), + X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), + X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), + X(200,208), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(201,205), X(202,206), X(203,207), X(204,208), X(5,129), X(6,130), + X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), + X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), + X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), + X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), + X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), + X(78,202), X(79,203), X(80,204), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), + X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), + X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), X(144,204), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), X(142,170), + X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), X(152,180), + X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), X(166,194), + X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), X(176,204), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), + X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), + X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(133,145), + X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), X(143,155), + X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), X(157,169), + X(158,170), X(159,171), X(160,172), X(165,177), X(166,178), X(167,179), + X(168,180), X(173,185), X(174,186), X(175,187), X(176,188), X(181,193), + X(182,194), X(183,195), X(184,196), X(189,201), X(190,202), X(191,203), + X(192,204), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), + X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), + X(192,196), X(197,201), X(198,202), X(199,203), X(200,204), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), + X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), + X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), + X(164,195), X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), + X(176,207), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207) +}; +S(210) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), + X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), + X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), + X(145,209), X(146,210), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), + X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), + X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), + X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), + X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), + X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), + X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), + X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), + X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), + X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), + X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), + X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), + X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), + X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), + X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), + X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), + X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), + X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), + X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), + X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), + X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), X(105,201), + X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), X(111,207), + X(112,208), X(113,209), X(114,210), X(33,65), X(34,66), X(35,67), X(36,68), + X(37,69), X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), + X(45,77), X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), + X(53,85), X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), + X(61,93), X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), + X(100,132), X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), + X(106,138), X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), + X(112,144), X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), + X(118,150), X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), + X(124,156), X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), + X(162,194), X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), + X(168,200), X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), + X(174,206), X(175,207), X(176,208), X(177,209), X(178,210), X(1,17), X(2,18), + X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), + X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), + X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), + X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), + X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), + X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), + X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), + X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), + X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), + X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), + X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), + X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), + X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), + X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), + X(194,210), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), + X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), + X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), + X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), + X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), + X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), + X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), + X(150,198), X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), + X(156,204), X(157,205), X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(199,207), X(200,208), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), + X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), + X(89,209), X(90,210), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), + X(175,199), X(176,200), X(185,209), X(186,210), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), + X(85,209), X(86,210), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), + X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), + X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), + X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), + X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), + X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), + X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), + X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), + X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), + X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), + X(136,196), X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), + X(150,210), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), + X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), + X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), + X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), + X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), + X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), + X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), + X(139,201), X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), + X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), + X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), + X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), + X(187,193), X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), + X(199,205), X(200,206), X(203,209), X(204,210), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), + X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), X(148,150), + X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), X(160,162), + X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), X(172,174), + X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), X(184,186), + X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), X(196,198), + X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), X(208,210), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), + X(82,209), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), + X(182,189), X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), + X(194,201), X(196,203), X(198,205), X(200,207), X(202,209), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209) +}; +S(212) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), X(102,198), + X(103,199), X(104,200), X(105,201), X(106,202), X(107,203), X(108,204), + X(109,205), X(110,206), X(111,207), X(112,208), X(113,209), X(114,210), + X(115,211), X(116,212), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), + X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), + X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), + X(175,207), X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(193,209), X(194,210), X(195,211), X(196,212), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), + X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), + X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), + X(200,208), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), + X(90,210), X(91,211), X(92,212), X(9,65), X(10,66), X(11,67), X(12,68), + X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), + X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), + X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), + X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), + X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), + X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), + X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), + X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), + X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), + X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), + X(144,200), X(153,209), X(154,210), X(155,211), X(156,212), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), + X(187,211), X(188,212), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(203,211), + X(204,212), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), + X(85,209), X(86,210), X(87,211), X(88,212), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), + X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), + X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), + X(110,170), X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), + X(120,180), X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), + X(134,194), X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), + X(144,204), X(149,209), X(150,210), X(151,211), X(152,212), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), + X(159,187), X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), + X(173,201), X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), + X(183,211), X(184,212), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), + X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), + X(200,212), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), + X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), + X(192,196), X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), + X(206,210), X(207,211), X(208,212), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(153,155), X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), + X(165,167), X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), + X(177,179), X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), + X(189,191), X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), + X(201,203), X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), + X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), + X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), + X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), + X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), + X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), X(179,193), + X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(191,205), + X(192,206), X(195,209), X(196,210), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), X(148,211), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), + X(198,205), X(200,207), X(202,209), X(204,211), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(124,127), + X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), X(136,139), + X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(148,151), + X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), X(160,163), + X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), X(172,175), + X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), X(184,187), + X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), X(196,199), + X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), X(208,211), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211) +}; +S(214) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), + X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), + X(148,212), X(149,213), X(150,214), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), + X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), + X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), + X(175,207), X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), + X(181,213), X(182,214), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), + X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), + X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), + X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), + X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), + X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), + X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), + X(102,118), X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), + X(108,124), X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), + X(130,146), X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), + X(136,152), X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), + X(142,158), X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), + X(164,180), X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), + X(170,186), X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), + X(176,192), X(193,209), X(194,210), X(195,211), X(196,212), X(197,213), + X(198,214), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), + X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), + X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), + X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), + X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), + X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), + X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), + X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), + X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), + X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), + X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), + X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), + X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), + X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), + X(150,198), X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), + X(156,204), X(157,205), X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(199,207), X(200,208), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), + X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), + X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), + X(156,212), X(157,213), X(158,214), X(9,33), X(10,34), X(11,35), X(12,36), + X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), + X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), + X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), + X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), + X(188,212), X(189,213), X(190,214), X(9,17), X(10,18), X(11,19), X(12,20), + X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), + X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), + X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), + X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), + X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), + X(210,214), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), + X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), + X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), + X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), + X(86,210), X(87,211), X(88,212), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), + X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), + X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), X(144,204), + X(149,209), X(150,210), X(151,211), X(152,212), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), + X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), + X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), + X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), + X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), X(166,178), + X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), X(176,188), + X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), X(190,202), + X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), X(200,212), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), + X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), + X(207,211), X(208,212), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), + X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), + X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), + X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), + X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), + X(152,214), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), + X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), + X(208,210), X(211,213), X(212,214), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), + X(112,175), X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), + X(124,187), X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), + X(136,199), X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), + X(148,211), X(150,213), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), + X(164,195), X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), + X(176,207), X(178,209), X(180,211), X(182,213), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), + X(202,205), X(204,207), X(206,209), X(208,211), X(210,213), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213) +}; +S(216) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(1,65), X(2,66), X(3,67), X(4,68), + X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), + X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), + X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), + X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), + X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), + X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), + X(152,216), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(33,129), + X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), + X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), + X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), + X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), + X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), X(100,196), + X(101,197), X(102,198), X(103,199), X(104,200), X(105,201), X(106,202), + X(107,203), X(108,204), X(109,205), X(110,206), X(111,207), X(112,208), + X(113,209), X(114,210), X(115,211), X(116,212), X(117,213), X(118,214), + X(119,215), X(120,216), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), + X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), + X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), + X(175,207), X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), + X(181,213), X(182,214), X(183,215), X(184,216), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), + X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), + X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), + X(150,198), X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), + X(156,204), X(157,205), X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(199,207), X(200,208), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), + X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), + X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), + X(96,216), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), + X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), + X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), + X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), + X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), + X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), + X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), + X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), + X(121,177), X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), + X(127,183), X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), + X(141,197), X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), + X(155,211), X(156,212), X(157,213), X(158,214), X(159,215), X(160,216), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), X(142,166), + X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), X(156,180), + X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), X(170,194), + X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), X(176,200), + X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), X(190,214), + X(191,215), X(192,216), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(203,211), + X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(1,5), X(2,6), + X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), + X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), + X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), + X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), + X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), + X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), + X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), X(107,111), + X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), X(121,125), + X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), X(131,135), + X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), X(145,149), + X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), X(155,159), + X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), X(169,173), + X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), X(179,183), + X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), X(193,197), + X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), X(203,207), + X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), X(5,129), X(6,130), + X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), + X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), + X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), + X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), + X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), + X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), + X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), X(141,201), + X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), X(151,211), + X(152,212), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), + X(184,196), X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), + X(198,210), X(199,211), X(200,212), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), + X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), + X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), + X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), + X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), + X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), + X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), + X(152,214), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), + X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), + X(208,210), X(211,213), X(212,214), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), + X(82,209), X(84,211), X(86,213), X(88,215), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), + X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), X(106,169), + X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), X(118,181), + X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), X(130,193), + X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), X(142,205), + X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), + X(182,213), X(184,215), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), + X(182,189), X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), + X(194,201), X(196,203), X(198,205), X(200,207), X(202,209), X(204,211), + X(206,213), X(208,215), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), + X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), + X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215) +}; +S(218) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), + X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), X(102,198), + X(103,199), X(104,200), X(105,201), X(106,202), X(107,203), X(108,204), + X(109,205), X(110,206), X(111,207), X(112,208), X(113,209), X(114,210), + X(115,211), X(116,212), X(117,213), X(118,214), X(119,215), X(120,216), + X(121,217), X(122,218), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), + X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), + X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), + X(175,207), X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), + X(181,213), X(182,214), X(183,215), X(184,216), X(185,217), X(186,218), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(193,209), X(194,210), X(195,211), X(196,212), X(197,213), X(198,214), + X(199,215), X(200,216), X(201,217), X(202,218), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), + X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), + X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), + X(200,208), X(209,217), X(210,218), X(9,129), X(10,130), X(11,131), X(12,132), + X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), + X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), + X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), + X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), + X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), + X(80,200), X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), + X(95,215), X(96,216), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), + X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), X(188,212), + X(189,213), X(190,214), X(191,215), X(192,216), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), + X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), + X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), + X(110,170), X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), + X(120,180), X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), + X(134,194), X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), + X(144,204), X(149,209), X(150,210), X(151,211), X(152,212), X(157,217), + X(158,218), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), + X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), + X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), + X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), + X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), X(166,178), + X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), X(176,188), + X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), X(190,202), + X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), X(200,212), + X(205,217), X(206,218), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), + X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), + X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), + X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), + X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), + X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), + X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), + X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), + X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), + X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), X(200,204), + X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), X(214,218), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), + X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), + X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), + X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), + X(91,217), X(92,218), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), + X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), + X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), + X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), + X(124,186), X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), + X(136,198), X(139,201), X(140,202), X(143,205), X(144,206), X(147,209), + X(148,210), X(151,213), X(152,214), X(155,217), X(156,218), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(203,217), X(204,218), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), + X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), + X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), + X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), + X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), + X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), + X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), + X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), + X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), + X(184,190), X(187,193), X(188,194), X(191,197), X(192,198), X(195,201), + X(196,202), X(199,205), X(200,206), X(203,209), X(204,210), X(207,213), + X(208,214), X(211,217), X(212,218), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), + X(82,209), X(84,211), X(86,213), X(88,215), X(90,217), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), + X(198,205), X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), + X(210,217), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), + X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), + X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217) +}; +S(220) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), + X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), + X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), + X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), + X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), + X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), + X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), + X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), + X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), + X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), + X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), + X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), + X(149,213), X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), + X(155,219), X(156,220), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), + X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), + X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), + X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), + X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), + X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), + X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), + X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), + X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), + X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), + X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), + X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), + X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), + X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), + X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), + X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), + X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), + X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), + X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), + X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), + X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), + X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), + X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), + X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), + X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), + X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), + X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), + X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), + X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), + X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), X(105,201), + X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), X(111,207), + X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), X(117,213), + X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), X(123,219), + X(124,220), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), + X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), + X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), + X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), + X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), + X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), + X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), + X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), + X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), + X(182,214), X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), + X(188,220), X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), + X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), + X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), + X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), + X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), + X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), + X(80,96), X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(193,209), X(194,210), X(195,211), X(196,212), X(197,213), X(198,214), + X(199,215), X(200,216), X(201,217), X(202,218), X(203,219), X(204,220), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), + X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), + X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), + X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), + X(50,98), X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), + X(57,105), X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), + X(64,112), X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), + X(87,135), X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), + X(94,142), X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), + X(116,164), X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), + X(122,170), X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), + X(128,176), X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), + X(150,198), X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), + X(156,204), X(157,205), X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), + X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), + X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), + X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), + X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), + X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), + X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), + X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), X(212,220), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), + X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), + X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), + X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), + X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), + X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(9,65), + X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), + X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), + X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), + X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), + X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), + X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), + X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), + X(156,212), X(157,213), X(158,214), X(159,215), X(160,216), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), + X(187,211), X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(185,193), + X(186,194), X(187,195), X(188,196), X(189,197), X(190,198), X(191,199), + X(192,200), X(201,209), X(202,210), X(203,211), X(204,212), X(205,213), + X(206,214), X(207,215), X(208,216), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), + X(211,215), X(212,216), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), + X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), + X(96,220), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), X(142,170), + X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), X(152,180), + X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), X(166,194), + X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), X(176,204), + X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), X(190,218), + X(191,219), X(192,220), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), + X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), + X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), + X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), + X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), + X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), + X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), + X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), + X(208,212), X(213,217), X(214,218), X(215,219), X(216,220), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), + X(188,218), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), + X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), X(212,218), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), + X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), + X(164,195), X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), + X(176,207), X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), + X(188,219), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), + X(202,217), X(204,219), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), X(212,219), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), + X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219) +}; +S(222) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), + X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), + X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), + X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), + X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), + X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), + X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), + X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), + X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), + X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), + X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), + X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), + X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), X(152,216), + X(153,217), X(154,218), X(155,219), X(156,220), X(157,221), X(158,222), + X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), + X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), + X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), + X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), + X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), + X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), + X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), + X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), + X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), + X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), + X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), + X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), + X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), + X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), + X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), + X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), + X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), + X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), + X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), + X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), + X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), + X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), + X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), + X(157,189), X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), + X(35,131), X(36,132), X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), + X(42,138), X(43,139), X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), + X(49,145), X(50,146), X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), + X(56,152), X(57,153), X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), + X(63,159), X(64,160), X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), + X(102,198), X(103,199), X(104,200), X(105,201), X(106,202), X(107,203), + X(108,204), X(109,205), X(110,206), X(111,207), X(112,208), X(113,209), + X(114,210), X(115,211), X(116,212), X(117,213), X(118,214), X(119,215), + X(120,216), X(121,217), X(122,218), X(123,219), X(124,220), X(125,221), + X(126,222), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), + X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), + X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), + X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), + X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), + X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), + X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), + X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), + X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), + X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), + X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), + X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), + X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), + X(182,214), X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), + X(188,220), X(189,221), X(190,222), X(1,17), X(2,18), X(3,19), X(4,20), + X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), X(12,28), + X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), X(36,52), + X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), X(44,60), + X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), X(68,84), + X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), X(76,92), + X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), X(99,115), + X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), X(105,121), + X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), X(111,127), + X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), X(133,149), + X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), X(139,155), + X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), X(161,177), + X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), X(167,183), + X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), X(173,189), + X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), X(195,211), + X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), X(201,217), + X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), X(17,129), + X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), + X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), + X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), + X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), + X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), + X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), + X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), + X(157,205), X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), X(19,35), + X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), + X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), + X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), + X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), + X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), + X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), + X(200,208), X(209,217), X(210,218), X(211,219), X(212,220), X(213,221), + X(214,222), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), + X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), + X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), + X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), + X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), + X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), + X(156,212), X(157,213), X(158,214), X(159,215), X(160,216), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), + X(187,211), X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(185,193), + X(186,194), X(187,195), X(188,196), X(189,197), X(190,198), X(191,199), + X(192,200), X(201,209), X(202,210), X(203,211), X(204,212), X(205,213), + X(206,214), X(207,215), X(208,216), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), + X(211,215), X(212,216), X(217,221), X(218,222), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), + X(79,203), X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), + X(94,218), X(95,219), X(96,220), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), + X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), + X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), X(144,204), + X(149,209), X(150,210), X(151,211), X(152,212), X(157,217), X(158,218), + X(159,219), X(160,220), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), + X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), + X(207,211), X(208,212), X(213,217), X(214,218), X(215,219), X(216,220), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), + X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), + X(152,214), X(155,217), X(156,218), X(159,221), X(160,222), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), X(179,193), + X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(191,205), + X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), X(203,217), + X(204,218), X(207,221), X(208,222), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(219,221), X(220,222), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), + X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), X(134,165), + X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), X(146,177), + X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), X(158,189), + X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), X(170,201), + X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), X(182,213), + X(184,215), X(186,217), X(188,219), X(190,221), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), + X(182,189), X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), + X(194,201), X(196,203), X(198,205), X(200,207), X(202,209), X(204,211), + X(206,213), X(208,215), X(210,217), X(212,219), X(214,221), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), + X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), X(218,221), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221) +}; +S(224) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(1,65), X(2,66), + X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), + X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), + X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), + X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), + X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), + X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), + X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), + X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), + X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), + X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), + X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), + X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), + X(151,215), X(152,216), X(153,217), X(154,218), X(155,219), X(156,220), + X(157,221), X(158,222), X(159,223), X(160,224), X(65,129), X(66,130), + X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), + X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), + X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), + X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), + X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), + X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), + X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), + X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), + X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), + X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), + X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), + X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), + X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), + X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(33,129), X(34,130), X(35,131), X(36,132), + X(37,133), X(38,134), X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), + X(44,140), X(45,141), X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), + X(51,147), X(52,148), X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), + X(58,154), X(59,155), X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), + X(97,193), X(98,194), X(99,195), X(100,196), X(101,197), X(102,198), + X(103,199), X(104,200), X(105,201), X(106,202), X(107,203), X(108,204), + X(109,205), X(110,206), X(111,207), X(112,208), X(113,209), X(114,210), + X(115,211), X(116,212), X(117,213), X(118,214), X(119,215), X(120,216), + X(121,217), X(122,218), X(123,219), X(124,220), X(125,221), X(126,222), + X(127,223), X(128,224), X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), + X(38,70), X(39,71), X(40,72), X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), + X(46,78), X(47,79), X(48,80), X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), + X(54,86), X(55,87), X(56,88), X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), + X(62,94), X(63,95), X(64,96), X(97,129), X(98,130), X(99,131), X(100,132), + X(101,133), X(102,134), X(103,135), X(104,136), X(105,137), X(106,138), + X(107,139), X(108,140), X(109,141), X(110,142), X(111,143), X(112,144), + X(113,145), X(114,146), X(115,147), X(116,148), X(117,149), X(118,150), + X(119,151), X(120,152), X(121,153), X(122,154), X(123,155), X(124,156), + X(125,157), X(126,158), X(127,159), X(128,160), X(161,193), X(162,194), + X(163,195), X(164,196), X(165,197), X(166,198), X(167,199), X(168,200), + X(169,201), X(170,202), X(171,203), X(172,204), X(173,205), X(174,206), + X(175,207), X(176,208), X(177,209), X(178,210), X(179,211), X(180,212), + X(181,213), X(182,214), X(183,215), X(184,216), X(185,217), X(186,218), + X(187,219), X(188,220), X(189,221), X(190,222), X(191,223), X(192,224), + X(1,17), X(2,18), X(3,19), X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), + X(9,25), X(10,26), X(11,27), X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), + X(33,49), X(34,50), X(35,51), X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), + X(41,57), X(42,58), X(43,59), X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), + X(65,81), X(66,82), X(67,83), X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), + X(73,89), X(74,90), X(75,91), X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), + X(97,113), X(98,114), X(99,115), X(100,116), X(101,117), X(102,118), + X(103,119), X(104,120), X(105,121), X(106,122), X(107,123), X(108,124), + X(109,125), X(110,126), X(111,127), X(112,128), X(129,145), X(130,146), + X(131,147), X(132,148), X(133,149), X(134,150), X(135,151), X(136,152), + X(137,153), X(138,154), X(139,155), X(140,156), X(141,157), X(142,158), + X(143,159), X(144,160), X(161,177), X(162,178), X(163,179), X(164,180), + X(165,181), X(166,182), X(167,183), X(168,184), X(169,185), X(170,186), + X(171,187), X(172,188), X(173,189), X(174,190), X(175,191), X(176,192), + X(193,209), X(194,210), X(195,211), X(196,212), X(197,213), X(198,214), + X(199,215), X(200,216), X(201,217), X(202,218), X(203,219), X(204,220), + X(205,221), X(206,222), X(207,223), X(208,224), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(17,65), X(18,66), X(19,67), + X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), + X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(17,33), X(18,34), X(19,35), X(20,36), + X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), + X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), + X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), + X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), + X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), + X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), + X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), + X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), + X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), + X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), + X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), + X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), + X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), + X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), X(1,9), X(2,10), + X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), + X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), + X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), + X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), + X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), + X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), + X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), + X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), + X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), + X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), + X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), + X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), + X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), + X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), + X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), + X(200,208), X(209,217), X(210,218), X(211,219), X(212,220), X(213,221), + X(214,222), X(215,223), X(216,224), X(9,129), X(10,130), X(11,131), X(12,132), + X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), + X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), + X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), + X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), + X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), + X(80,200), X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), + X(95,215), X(96,216), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), + X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), X(188,212), + X(189,213), X(190,214), X(191,215), X(192,216), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(1,5), + X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), + X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), + X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), + X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), + X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), + X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), X(92,96), + X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), + X(79,203), X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), + X(94,218), X(95,219), X(96,220), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), + X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), + X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), + X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), + X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), + X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), + X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), + X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), X(110,170), + X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), X(120,180), + X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), X(134,194), + X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), X(144,204), + X(149,209), X(150,210), X(151,211), X(152,212), X(157,217), X(158,218), + X(159,219), X(160,220), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), X(5,9), + X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), + X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), + X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), + X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), + X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), + X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), + X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), + X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), + X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), + X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), + X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), + X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), + X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), + X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), + X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), + X(207,211), X(208,212), X(213,217), X(214,218), X(215,219), X(216,220), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), + X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), + X(95,221), X(96,222), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), + X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), + X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), + X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), + X(124,186), X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), + X(136,198), X(139,201), X(140,202), X(143,205), X(144,206), X(147,209), + X(148,210), X(151,213), X(152,214), X(155,217), X(156,218), X(159,221), + X(160,222), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), + X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), + X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), + X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), + X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), + X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), + X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), X(188,218), + X(191,221), X(192,222), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), + X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), + X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), + X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), + X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), + X(79,93), X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), + X(92,106), X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(3,9), X(4,10), X(7,13), + X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), + X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), + X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), + X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), + X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), + X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), + X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), + X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), + X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), + X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), + X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), + X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), + X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), + X(187,193), X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), + X(199,205), X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), + X(211,217), X(212,218), X(215,221), X(216,222), X(3,5), X(4,6), X(7,9), + X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), + X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), + X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), + X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), + X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), + X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), + X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), X(112,114), + X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), X(124,126), + X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), X(136,138), + X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), X(148,150), + X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), X(160,162), + X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), X(172,174), + X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), X(184,186), + X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), X(196,198), + X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), X(208,210), + X(211,213), X(212,214), X(215,217), X(216,218), X(219,221), X(220,222), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(2,129), X(4,131), X(6,133), X(8,135), + X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), + X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), + X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), + X(52,179), X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), + X(66,193), X(68,195), X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), + X(80,207), X(82,209), X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), + X(94,221), X(96,223), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), + X(112,175), X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), + X(124,187), X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), + X(136,199), X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), + X(148,211), X(150,213), X(152,215), X(154,217), X(156,219), X(158,221), + X(160,223), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), + X(202,217), X(204,219), X(206,221), X(208,223), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), + X(198,205), X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), + X(210,217), X(212,219), X(214,221), X(216,223), X(2,5), X(4,7), X(6,9), + X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), + X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), + X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), + X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), + X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), + X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), + X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), X(112,115), + X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), X(124,127), + X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), X(136,139), + X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), X(148,151), + X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), X(160,163), + X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), X(172,175), + X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), X(184,187), + X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), X(196,199), + X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), X(208,211), + X(210,213), X(212,215), X(214,217), X(216,219), X(218,221), X(220,223), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223) +}; +S(226) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), + X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), X(155,219), + X(156,220), X(157,221), X(158,222), X(159,223), X(160,224), X(161,225), + X(162,226), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(193,225), + X(194,226), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), + X(209,225), X(210,226), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), + X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), + X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), + X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), + X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), + X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), + X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), + X(156,212), X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), + X(170,226), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), + X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), + X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), + X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), + X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), + X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), + X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), + X(176,200), X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), + X(190,214), X(191,215), X(192,216), X(201,225), X(202,226), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), + X(188,196), X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), + X(202,210), X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), + X(208,216), X(217,225), X(218,226), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), + X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), X(220,224), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), X(101,225), + X(102,226), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(197,225), X(198,226), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), + X(184,196), X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), + X(198,210), X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), + X(208,220), X(213,225), X(214,226), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), + X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), + X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), + X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), + X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), + X(95,221), X(96,222), X(99,225), X(100,226), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), X(188,218), + X(191,221), X(192,222), X(195,225), X(196,226), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(203,217), X(204,218), X(207,221), + X(208,222), X(211,225), X(212,226), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), + X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), + X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), X(219,221), + X(220,222), X(223,225), X(224,226), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), X(148,211), + X(150,213), X(152,215), X(154,217), X(156,219), X(158,221), X(160,223), + X(162,225), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(194,225), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), X(124,139), + X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(136,151), + X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), X(148,163), + X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), X(160,175), + X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(172,187), + X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), X(184,199), + X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), X(196,211), + X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), X(208,223), + X(210,225), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), X(212,219), + X(214,221), X(216,223), X(218,225), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), + X(202,205), X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), + X(214,217), X(216,219), X(218,221), X(220,223), X(222,225), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225) +}; +S(228) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), + X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), + X(148,212), X(149,213), X(150,214), X(151,215), X(152,216), X(153,217), + X(154,218), X(155,219), X(156,220), X(157,221), X(158,222), X(159,223), + X(160,224), X(161,225), X(162,226), X(163,227), X(164,228), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(193,225), X(194,226), X(195,227), + X(196,228), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), + X(157,205), X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), + X(179,227), X(180,228), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), + X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), + X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), + X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), + X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), + X(189,205), X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), + X(211,227), X(212,228), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), + X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), + X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), + X(107,227), X(108,228), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), X(142,166), + X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), X(156,180), + X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), X(170,194), + X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), X(176,200), + X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), X(190,214), + X(191,215), X(192,216), X(201,225), X(202,226), X(203,227), X(204,228), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(185,193), + X(186,194), X(187,195), X(188,196), X(189,197), X(190,198), X(191,199), + X(192,200), X(201,209), X(202,210), X(203,211), X(204,212), X(205,213), + X(206,214), X(207,215), X(208,216), X(217,225), X(218,226), X(219,227), + X(220,228), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), + X(79,203), X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), + X(94,218), X(95,219), X(96,220), X(101,225), X(102,226), X(103,227), + X(104,228), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), X(197,225), + X(198,226), X(199,227), X(200,228), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), + X(213,225), X(214,226), X(215,227), X(216,228), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), + X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), + X(223,227), X(224,228), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), X(213,215), + X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), X(225,227), + X(226,228), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(99,225), X(100,226), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), + X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), + X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), + X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), + X(124,186), X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), + X(136,198), X(139,201), X(140,202), X(143,205), X(144,206), X(147,209), + X(148,210), X(151,213), X(152,214), X(155,217), X(156,218), X(159,221), + X(160,222), X(163,225), X(164,226), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), X(111,141), + X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), X(123,153), + X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), X(135,165), + X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), X(147,177), + X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), X(159,189), + X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), X(171,201), + X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), X(183,213), + X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), X(195,225), + X(196,226), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), + X(171,177), X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), + X(183,189), X(184,190), X(187,193), X(188,194), X(191,197), X(192,198), + X(195,201), X(196,202), X(199,205), X(200,206), X(203,209), X(204,210), + X(207,213), X(208,214), X(211,217), X(212,218), X(215,221), X(216,222), + X(219,225), X(220,226), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), + X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), + X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(2,129), X(4,131), + X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), + X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), + X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), + X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), X(58,185), X(60,187), + X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), X(72,199), X(74,201), + X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), X(86,213), X(88,215), + X(90,217), X(92,219), X(94,221), X(96,223), X(98,225), X(100,227), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), + X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(194,225), X(196,227), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), + X(208,223), X(210,225), X(212,227), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), + X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), + X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), + X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), X(218,221), + X(220,223), X(222,225), X(224,227), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), + X(226,227) +}; +S(230) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(1,65), X(2,66), X(3,67), + X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), + X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), + X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), + X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), + X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), + X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), + X(152,216), X(153,217), X(154,218), X(155,219), X(156,220), X(157,221), + X(158,222), X(159,223), X(160,224), X(161,225), X(162,226), X(163,227), + X(164,228), X(165,229), X(166,230), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(193,225), X(194,226), X(195,227), X(196,228), X(197,229), + X(198,230), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(125,173), + X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), X(147,195), + X(148,196), X(149,197), X(150,198), X(151,199), X(152,200), X(153,201), + X(154,202), X(155,203), X(156,204), X(157,205), X(158,206), X(159,207), + X(160,208), X(177,225), X(178,226), X(179,227), X(180,228), X(181,229), + X(182,230), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), X(183,199), + X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), X(189,205), + X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), X(211,227), + X(212,228), X(213,229), X(214,230), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), + X(101,109), X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), + X(115,123), X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), + X(129,137), X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), + X(135,143), X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), + X(149,157), X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), + X(163,171), X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), + X(177,185), X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), + X(183,191), X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), + X(197,205), X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), + X(211,219), X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), + X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), + X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), + X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), + X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), + X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), + X(106,226), X(107,227), X(108,228), X(109,229), X(110,230), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), + X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), + X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), + X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), X(156,212), + X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), X(170,226), + X(171,227), X(172,228), X(173,229), X(174,230), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), + X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), X(201,225), + X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), + X(188,196), X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), + X(202,210), X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), + X(208,216), X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), + X(222,230), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), X(226,230), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), X(101,225), + X(102,226), X(103,227), X(104,228), X(5,65), X(6,66), X(7,67), X(8,68), + X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), + X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), + X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), + X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), + X(110,170), X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), + X(120,180), X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), + X(134,194), X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), + X(144,204), X(149,209), X(150,210), X(151,211), X(152,212), X(157,217), + X(158,218), X(159,219), X(160,220), X(165,225), X(166,226), X(167,227), + X(168,228), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), + X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), + X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), + X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), + X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), + X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), + X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(197,225), X(198,226), X(199,227), + X(200,228), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), + X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), + X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), + X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), + X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), + X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), + X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), + X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), + X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), + X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), + X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), + X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), X(166,178), + X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), X(176,188), + X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), X(190,202), + X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), X(200,212), + X(205,217), X(206,218), X(207,219), X(208,220), X(213,225), X(214,226), + X(215,227), X(216,228), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), + X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), + X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), + X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), + X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), + X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), + X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), + X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), + X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), + X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), + X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), + X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), + X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), + X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), + X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), X(200,204), + X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), X(214,218), + X(215,219), X(216,220), X(221,225), X(222,226), X(223,227), X(224,228), X(1,3), + X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), + X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), + X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), + X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), + X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), + X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), + X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), + X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), + X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), + X(91,217), X(92,218), X(95,221), X(96,222), X(99,225), X(100,226), X(103,229), + X(104,230), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), + X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), + X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), + X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), + X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), + X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), + X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), + X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), + X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), + X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), + X(139,201), X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), + X(151,213), X(152,214), X(155,217), X(156,218), X(159,221), X(160,222), + X(163,225), X(164,226), X(167,229), X(168,230), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), + X(195,225), X(196,226), X(199,229), X(200,230), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(203,217), X(204,218), X(207,221), + X(208,222), X(211,225), X(212,226), X(215,229), X(216,230), X(3,9), X(4,10), + X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), + X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), + X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), + X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), + X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), + X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), + X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), X(111,117), + X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), X(123,129), + X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), X(135,141), + X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), X(147,153), + X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), X(159,165), + X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), X(171,177), + X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), X(183,189), + X(184,190), X(187,193), X(188,194), X(191,197), X(192,198), X(195,201), + X(196,202), X(199,205), X(200,206), X(203,209), X(204,210), X(207,213), + X(208,214), X(211,217), X(212,218), X(215,221), X(216,222), X(219,225), + X(220,226), X(223,229), X(224,230), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), + X(227,229), X(228,230), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), + X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), + X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), + X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), + X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), + X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), + X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), X(105,106), + X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), X(117,118), + X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), X(129,130), + X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), X(141,142), + X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), X(153,154), + X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), X(165,166), + X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), X(177,178), + X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), X(189,190), + X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), X(201,202), + X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), X(213,214), + X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), X(225,226), + X(227,228), X(229,230), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), + X(82,209), X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), + X(96,223), X(98,225), X(100,227), X(102,229), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(194,225), X(196,227), X(198,229), X(2,17), X(4,19), + X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), + X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), + X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), + X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), + X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), + X(208,223), X(210,225), X(212,227), X(214,229), X(2,9), X(4,11), X(6,13), + X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), + X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), + X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), + X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), + X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), + X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), + X(102,109), X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), + X(114,121), X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), + X(126,133), X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), + X(138,145), X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), + X(150,157), X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), + X(162,169), X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), + X(174,181), X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), + X(186,193), X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), + X(198,205), X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), + X(210,217), X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), + X(222,229), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), + X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), + X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), + X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), + X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), + X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), + X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), + X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), + X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), + X(216,219), X(218,221), X(220,223), X(222,225), X(224,227), X(226,229), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229) +}; +S(232) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), X(1,65), + X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), + X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), + X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), + X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), + X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), + X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), + X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), + X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), + X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), + X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), X(155,219), + X(156,220), X(157,221), X(158,222), X(159,223), X(160,224), X(161,225), + X(162,226), X(163,227), X(164,228), X(165,229), X(166,230), X(167,231), + X(168,232), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(193,225), + X(194,226), X(195,227), X(196,228), X(197,229), X(198,230), X(199,231), + X(200,232), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), X(179,227), + X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), + X(209,225), X(210,226), X(211,227), X(212,228), X(213,229), X(214,230), + X(215,231), X(216,232), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), + X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), + X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), + X(107,227), X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), + X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), + X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), + X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), + X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), + X(156,212), X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), + X(170,226), X(171,227), X(172,228), X(173,229), X(174,230), X(175,231), + X(176,232), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), + X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), + X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), + X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), + X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), + X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), + X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), + X(176,200), X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), + X(190,214), X(191,215), X(192,216), X(201,225), X(202,226), X(203,227), + X(204,228), X(205,229), X(206,230), X(207,231), X(208,232), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), + X(188,196), X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), + X(202,210), X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), + X(208,216), X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), + X(222,230), X(223,231), X(224,232), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), + X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), X(220,224), + X(225,229), X(226,230), X(227,231), X(228,232), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), + X(79,203), X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), + X(94,218), X(95,219), X(96,220), X(101,225), X(102,226), X(103,227), + X(104,228), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), X(197,225), + X(198,226), X(199,227), X(200,228), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), + X(213,225), X(214,226), X(215,227), X(216,228), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), + X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), + X(223,227), X(224,228), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), X(213,215), + X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), X(225,227), + X(226,228), X(229,231), X(230,232), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), + X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), + X(95,221), X(96,222), X(99,225), X(100,226), X(103,229), X(104,230), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), + X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), + X(188,218), X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), + X(200,230), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), + X(215,229), X(216,230), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), + X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), X(212,218), + X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), X(224,230), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), + X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), + X(219,221), X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(100,227), X(102,229), X(104,231), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(168,231), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), + X(164,195), X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), + X(176,207), X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), + X(188,219), X(190,221), X(192,223), X(194,225), X(196,227), X(198,229), + X(200,231), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), + X(202,217), X(204,219), X(206,221), X(208,223), X(210,225), X(212,227), + X(214,229), X(216,231), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), X(212,219), + X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), X(224,231), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), + X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), + X(218,221), X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231) +}; +S(234) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), + X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), + X(148,212), X(149,213), X(150,214), X(151,215), X(152,216), X(153,217), + X(154,218), X(155,219), X(156,220), X(157,221), X(158,222), X(159,223), + X(160,224), X(161,225), X(162,226), X(163,227), X(164,228), X(165,229), + X(166,230), X(167,231), X(168,232), X(169,233), X(170,234), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(193,225), X(194,226), X(195,227), + X(196,228), X(197,229), X(198,230), X(199,231), X(200,232), X(201,233), + X(202,234), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(121,233), X(122,234), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), + X(157,205), X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), + X(179,227), X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), + X(185,233), X(186,234), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), + X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), + X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), + X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), + X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), + X(189,205), X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), + X(211,227), X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), + X(217,233), X(218,234), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), + X(226,234), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), + X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), + X(105,225), X(106,226), X(107,227), X(108,228), X(109,229), X(110,230), + X(111,231), X(112,232), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), + X(173,229), X(174,230), X(175,231), X(176,232), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), + X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), X(201,225), + X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), X(207,231), + X(208,232), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(203,211), + X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(217,225), + X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), X(223,231), + X(224,232), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), X(226,230), + X(227,231), X(228,232), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), + X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), + X(96,220), X(101,225), X(102,226), X(103,227), X(104,228), X(109,233), + X(110,234), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), X(142,170), + X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), X(152,180), + X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), X(166,194), + X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), X(176,204), + X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), X(190,218), + X(191,219), X(192,220), X(197,225), X(198,226), X(199,227), X(200,228), + X(205,233), X(206,234), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), + X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), + X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), X(213,225), + X(214,226), X(215,227), X(216,228), X(221,233), X(222,234), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), + X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), + X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), + X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), + X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), + X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), + X(208,212), X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), + X(222,226), X(223,227), X(224,228), X(229,233), X(230,234), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), X(229,231), + X(230,232), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(99,225), X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), X(3,65), + X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), + X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), + X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), + X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), + X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), + X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), + X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), + X(195,225), X(196,226), X(199,229), X(200,230), X(203,233), X(204,234), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), X(179,193), + X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(191,205), + X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), X(203,217), + X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), X(215,229), + X(216,230), X(219,233), X(220,234), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), + X(227,229), X(228,230), X(231,233), X(232,234), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), + X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), X(98,225), + X(100,227), X(102,229), X(104,231), X(106,233), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(168,231), X(170,233), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), X(134,165), + X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), X(146,177), + X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), X(158,189), + X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), X(170,201), + X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), X(182,213), + X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), X(194,225), + X(196,227), X(198,229), X(200,231), X(202,233), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), + X(208,223), X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), + X(182,189), X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), + X(194,201), X(196,203), X(198,205), X(200,207), X(202,209), X(204,211), + X(206,213), X(208,215), X(210,217), X(212,219), X(214,221), X(216,223), + X(218,225), X(220,227), X(222,229), X(224,231), X(226,233), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), + X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), X(218,221), + X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), X(230,233), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233) +}; +S(236) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(1,65), X(2,66), X(3,67), + X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), + X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), + X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), + X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), + X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), + X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), + X(152,216), X(153,217), X(154,218), X(155,219), X(156,220), X(157,221), + X(158,222), X(159,223), X(160,224), X(161,225), X(162,226), X(163,227), + X(164,228), X(165,229), X(166,230), X(167,231), X(168,232), X(169,233), + X(170,234), X(171,235), X(172,236), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(193,225), X(194,226), X(195,227), X(196,228), X(197,229), + X(198,230), X(199,231), X(200,232), X(201,233), X(202,234), X(203,235), + X(204,236), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(121,233), X(122,234), X(123,235), + X(124,236), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(125,173), + X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), X(147,195), + X(148,196), X(149,197), X(150,198), X(151,199), X(152,200), X(153,201), + X(154,202), X(155,203), X(156,204), X(157,205), X(158,206), X(159,207), + X(160,208), X(177,225), X(178,226), X(179,227), X(180,228), X(181,229), + X(182,230), X(183,231), X(184,232), X(185,233), X(186,234), X(187,235), + X(188,236), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), X(183,199), + X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), X(189,205), + X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), X(211,227), + X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), X(217,233), + X(218,234), X(219,235), X(220,236), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), + X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), + X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), + X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), + X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), + X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), + X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), + X(101,109), X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), + X(115,123), X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), + X(129,137), X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), + X(135,143), X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), + X(149,157), X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), + X(163,171), X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), + X(177,185), X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), + X(183,191), X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), + X(197,205), X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), + X(211,219), X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), + X(225,233), X(226,234), X(227,235), X(228,236), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), + X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), + X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), X(107,227), + X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), + X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), + X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), + X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), X(156,212), + X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), X(170,226), + X(171,227), X(172,228), X(173,229), X(174,230), X(175,231), X(176,232), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), X(142,166), + X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), X(156,180), + X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), X(170,194), + X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), X(176,200), + X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), X(190,214), + X(191,215), X(192,216), X(201,225), X(202,226), X(203,227), X(204,228), + X(205,229), X(206,230), X(207,231), X(208,232), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), + X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), + X(223,231), X(224,232), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), + X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), + X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), + X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), + X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), + X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), + X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), + X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), + X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), + X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), + X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), + X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), + X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), + X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), + X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), + X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), + X(212,216), X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), + X(226,230), X(227,231), X(228,232), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), + X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), + X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), + X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), + X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), + X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), + X(95,219), X(96,220), X(101,225), X(102,226), X(103,227), X(104,228), + X(109,233), X(110,234), X(111,235), X(112,236), X(5,65), X(6,66), X(7,67), + X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), X(23,83), + X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), X(39,99), + X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), X(54,114), + X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), X(69,129), + X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), X(80,140), + X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), X(95,155), + X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), X(109,169), + X(110,170), X(111,171), X(112,172), X(117,177), X(118,178), X(119,179), + X(120,180), X(125,185), X(126,186), X(127,187), X(128,188), X(133,193), + X(134,194), X(135,195), X(136,196), X(141,201), X(142,202), X(143,203), + X(144,204), X(149,209), X(150,210), X(151,211), X(152,212), X(157,217), + X(158,218), X(159,219), X(160,220), X(165,225), X(166,226), X(167,227), + X(168,228), X(173,233), X(174,234), X(175,235), X(176,236), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), + X(159,187), X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), + X(173,201), X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), + X(183,211), X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), + X(197,225), X(198,226), X(199,227), X(200,228), X(205,233), X(206,234), + X(207,235), X(208,236), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), + X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), + X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), X(213,225), + X(214,226), X(215,227), X(216,228), X(221,233), X(222,234), X(223,235), + X(224,236), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), + X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), + X(192,196), X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), + X(206,210), X(207,211), X(208,212), X(213,217), X(214,218), X(215,219), + X(216,220), X(221,225), X(222,226), X(223,227), X(224,228), X(229,233), + X(230,234), X(231,235), X(232,236), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(153,155), X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), + X(165,167), X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), + X(177,179), X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), + X(189,191), X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), + X(201,203), X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), + X(213,215), X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), + X(225,227), X(226,228), X(229,231), X(230,232), X(233,235), X(234,236), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), + X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), + X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), + X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), + X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), + X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), X(99,225), + X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), + X(195,225), X(196,226), X(199,229), X(200,230), X(203,233), X(204,234), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), X(179,193), + X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(191,205), + X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), X(203,217), + X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), X(215,229), + X(216,230), X(219,233), X(220,234), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), + X(227,229), X(228,230), X(231,233), X(232,234), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), + X(235,236), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), X(2,65), + X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), + X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), + X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), + X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), + X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), + X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), + X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(168,231), X(170,233), X(172,235), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), + X(182,213), X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), + X(194,225), X(196,227), X(198,229), X(200,231), X(202,233), X(204,235), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), + X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), + X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), + X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), + X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), X(130,145), + X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), X(142,157), + X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), X(154,169), + X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), X(166,181), + X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), X(178,193), + X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), X(190,205), + X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), X(202,217), + X(204,219), X(206,221), X(208,223), X(210,225), X(212,227), X(214,229), + X(216,231), X(218,233), X(220,235), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), + X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), + X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), + X(224,231), X(226,233), X(228,235), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), + X(202,205), X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), + X(214,217), X(216,219), X(218,221), X(220,223), X(222,225), X(224,227), + X(226,229), X(228,231), X(230,233), X(232,235), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), + X(188,189), X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), + X(200,201), X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), + X(212,213), X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), + X(224,225), X(226,227), X(228,229), X(230,231), X(232,233), X(234,235) +}; +S(238) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), + X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), X(155,219), + X(156,220), X(157,221), X(158,222), X(159,223), X(160,224), X(161,225), + X(162,226), X(163,227), X(164,228), X(165,229), X(166,230), X(167,231), + X(168,232), X(169,233), X(170,234), X(171,235), X(172,236), X(173,237), + X(174,238), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(193,225), + X(194,226), X(195,227), X(196,228), X(197,229), X(198,230), X(199,231), + X(200,232), X(201,233), X(202,234), X(203,235), X(204,236), X(205,237), + X(206,238), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(121,233), X(122,234), X(123,235), + X(124,236), X(125,237), X(126,238), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), X(179,227), + X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), X(185,233), + X(186,234), X(187,235), X(188,236), X(189,237), X(190,238), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), + X(209,225), X(210,226), X(211,227), X(212,228), X(213,229), X(214,230), + X(215,231), X(216,232), X(217,233), X(218,234), X(219,235), X(220,236), + X(221,237), X(222,238), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), + X(226,234), X(227,235), X(228,236), X(229,237), X(230,238), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), + X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), + X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), + X(107,227), X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), + X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), + X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), + X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), + X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), + X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), + X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), + X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), + X(108,164), X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), + X(122,178), X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), + X(128,184), X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), + X(142,198), X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), + X(156,212), X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), + X(170,226), X(171,227), X(172,228), X(173,229), X(174,230), X(175,231), + X(176,232), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), + X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), + X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), + X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), + X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), + X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), + X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), + X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), + X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), + X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), + X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), + X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), + X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), + X(176,200), X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), + X(190,214), X(191,215), X(192,216), X(201,225), X(202,226), X(203,227), + X(204,228), X(205,229), X(206,230), X(207,231), X(208,232), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), + X(188,196), X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), + X(202,210), X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), + X(208,216), X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), + X(222,230), X(223,231), X(224,232), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), + X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), X(220,224), + X(225,229), X(226,230), X(227,231), X(228,232), X(233,237), X(234,238), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), X(101,225), + X(102,226), X(103,227), X(104,228), X(109,233), X(110,234), X(111,235), + X(112,236), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), + X(175,235), X(176,236), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(197,225), X(198,226), X(199,227), + X(200,228), X(205,233), X(206,234), X(207,235), X(208,236), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), + X(184,196), X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), + X(198,210), X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), + X(208,220), X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), + X(222,234), X(223,235), X(224,236), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), + X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), + X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), + X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), X(223,227), + X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), X(229,231), + X(230,232), X(233,235), X(234,236), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), + X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), + X(95,221), X(96,222), X(99,225), X(100,226), X(103,229), X(104,230), + X(107,233), X(108,234), X(111,237), X(112,238), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), X(188,218), + X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), X(200,230), + X(203,233), X(204,234), X(207,237), X(208,238), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(203,217), X(204,218), X(207,221), + X(208,222), X(211,225), X(212,226), X(215,229), X(216,230), X(219,233), + X(220,234), X(223,237), X(224,238), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(231,237), X(232,238), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), + X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), + X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), X(219,221), + X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), X(231,233), + X(232,234), X(235,237), X(236,238), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), + X(237,238), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), + X(110,237), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), X(148,211), + X(150,213), X(152,215), X(154,217), X(156,219), X(158,221), X(160,223), + X(162,225), X(164,227), X(166,229), X(168,231), X(170,233), X(172,235), + X(174,237), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(194,225), X(196,227), X(198,229), X(200,231), + X(202,233), X(204,235), X(206,237), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), X(124,139), + X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(136,151), + X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), X(148,163), + X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), X(160,175), + X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(172,187), + X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), X(184,199), + X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), X(196,211), + X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), X(208,223), + X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), X(220,235), + X(222,237), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), X(212,219), + X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), X(224,231), + X(226,233), X(228,235), X(230,237), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), + X(202,205), X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), + X(214,217), X(216,219), X(218,221), X(220,223), X(222,225), X(224,227), + X(226,229), X(228,231), X(230,233), X(232,235), X(234,237), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237) +}; +S(240) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), + X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), + X(148,212), X(149,213), X(150,214), X(151,215), X(152,216), X(153,217), + X(154,218), X(155,219), X(156,220), X(157,221), X(158,222), X(159,223), + X(160,224), X(161,225), X(162,226), X(163,227), X(164,228), X(165,229), + X(166,230), X(167,231), X(168,232), X(169,233), X(170,234), X(171,235), + X(172,236), X(173,237), X(174,238), X(175,239), X(176,240), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(193,225), X(194,226), X(195,227), + X(196,228), X(197,229), X(198,230), X(199,231), X(200,232), X(201,233), + X(202,234), X(203,235), X(204,236), X(205,237), X(206,238), X(207,239), + X(208,240), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(121,233), X(122,234), X(123,235), + X(124,236), X(125,237), X(126,238), X(127,239), X(128,240), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), + X(157,205), X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), + X(179,227), X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), + X(185,233), X(186,234), X(187,235), X(188,236), X(189,237), X(190,238), + X(191,239), X(192,240), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), + X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), + X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), + X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), + X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), + X(189,205), X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), + X(211,227), X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), + X(217,233), X(218,234), X(219,235), X(220,236), X(221,237), X(222,238), + X(223,239), X(224,240), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), + X(226,234), X(227,235), X(228,236), X(229,237), X(230,238), X(231,239), + X(232,240), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), + X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), + X(105,225), X(106,226), X(107,227), X(108,228), X(109,229), X(110,230), + X(111,231), X(112,232), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), + X(173,229), X(174,230), X(175,231), X(176,232), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), + X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), X(201,225), + X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), X(207,231), + X(208,232), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(203,211), + X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(217,225), + X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), X(223,231), + X(224,232), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), X(226,230), + X(227,231), X(228,232), X(233,237), X(234,238), X(235,239), X(236,240), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), X(101,225), + X(102,226), X(103,227), X(104,228), X(109,233), X(110,234), X(111,235), + X(112,236), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), + X(175,235), X(176,236), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(197,225), X(198,226), X(199,227), + X(200,228), X(205,233), X(206,234), X(207,235), X(208,236), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), + X(184,196), X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), + X(198,210), X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), + X(208,220), X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), + X(222,234), X(223,235), X(224,236), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), + X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), + X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), + X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), X(223,227), + X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), X(229,231), + X(230,232), X(233,235), X(234,236), X(237,239), X(238,240), X(3,129), X(4,130), + X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), + X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), + X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), + X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), + X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), + X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), + X(91,217), X(92,218), X(95,221), X(96,222), X(99,225), X(100,226), X(103,229), + X(104,230), X(107,233), X(108,234), X(111,237), X(112,238), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), X(188,218), + X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), X(200,230), + X(203,233), X(204,234), X(207,237), X(208,238), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(203,217), X(204,218), X(207,221), + X(208,222), X(211,225), X(212,226), X(215,229), X(216,230), X(219,233), + X(220,234), X(223,237), X(224,238), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(231,237), X(232,238), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), + X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), + X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), X(219,221), + X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), X(231,233), + X(232,234), X(235,237), X(236,238), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), + X(237,238), X(239,240), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), + X(12,139), X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), + X(26,153), X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), + X(40,167), X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), + X(54,181), X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), + X(68,195), X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), + X(82,209), X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), + X(96,223), X(98,225), X(100,227), X(102,229), X(104,231), X(106,233), + X(108,235), X(110,237), X(112,239), X(2,65), X(4,67), X(6,69), X(8,71), + X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), + X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), + X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), + X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), + X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), + X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), + X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), X(106,169), + X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), X(118,181), + X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), X(130,193), + X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), X(142,205), + X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), X(154,217), + X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), X(166,229), + X(168,231), X(170,233), X(172,235), X(174,237), X(176,239), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), + X(182,213), X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), + X(194,225), X(196,227), X(198,229), X(200,231), X(202,233), X(204,235), + X(206,237), X(208,239), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), + X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), + X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), + X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), + X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), + X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), + X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), + X(202,217), X(204,219), X(206,221), X(208,223), X(210,225), X(212,227), + X(214,229), X(216,231), X(218,233), X(220,235), X(222,237), X(224,239), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), + X(182,189), X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), + X(194,201), X(196,203), X(198,205), X(200,207), X(202,209), X(204,211), + X(206,213), X(208,215), X(210,217), X(212,219), X(214,221), X(216,223), + X(218,225), X(220,227), X(222,229), X(224,231), X(226,233), X(228,235), + X(230,237), X(232,239), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), + X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), + X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), + X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), + X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), + X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), + X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), + X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), + X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), + X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), + X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), + X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), + X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), + X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), + X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), + X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), + X(216,219), X(218,221), X(220,223), X(222,225), X(224,227), X(226,229), + X(228,231), X(230,233), X(232,235), X(234,237), X(236,239), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239) +}; +S(242) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(1,65), X(2,66), X(3,67), + X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), + X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), + X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), + X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), + X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), + X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), + X(152,216), X(153,217), X(154,218), X(155,219), X(156,220), X(157,221), + X(158,222), X(159,223), X(160,224), X(161,225), X(162,226), X(163,227), + X(164,228), X(165,229), X(166,230), X(167,231), X(168,232), X(169,233), + X(170,234), X(171,235), X(172,236), X(173,237), X(174,238), X(175,239), + X(176,240), X(177,241), X(178,242), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(193,225), X(194,226), X(195,227), X(196,228), X(197,229), + X(198,230), X(199,231), X(200,232), X(201,233), X(202,234), X(203,235), + X(204,236), X(205,237), X(206,238), X(207,239), X(208,240), X(209,241), + X(210,242), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(113,225), X(114,226), X(115,227), + X(116,228), X(117,229), X(118,230), X(119,231), X(120,232), X(121,233), + X(122,234), X(123,235), X(124,236), X(125,237), X(126,238), X(127,239), + X(128,240), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(125,173), + X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), X(147,195), + X(148,196), X(149,197), X(150,198), X(151,199), X(152,200), X(153,201), + X(154,202), X(155,203), X(156,204), X(157,205), X(158,206), X(159,207), + X(160,208), X(177,225), X(178,226), X(179,227), X(180,228), X(181,229), + X(182,230), X(183,231), X(184,232), X(185,233), X(186,234), X(187,235), + X(188,236), X(189,237), X(190,238), X(191,239), X(192,240), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), + X(209,225), X(210,226), X(211,227), X(212,228), X(213,229), X(214,230), + X(215,231), X(216,232), X(217,233), X(218,234), X(219,235), X(220,236), + X(221,237), X(222,238), X(223,239), X(224,240), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), X(180,188), + X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), X(194,202), + X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), X(200,208), + X(209,217), X(210,218), X(211,219), X(212,220), X(213,221), X(214,222), + X(215,223), X(216,224), X(225,233), X(226,234), X(227,235), X(228,236), + X(229,237), X(230,238), X(231,239), X(232,240), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), + X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), + X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), X(107,227), + X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), X(121,241), + X(122,242), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), + X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), + X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), + X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), + X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), + X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), + X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), + X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), X(125,181), + X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), X(139,195), + X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), X(153,209), + X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), X(159,215), + X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), X(173,229), + X(174,230), X(175,231), X(176,232), X(185,241), X(186,242), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), + X(187,211), X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), + X(201,225), X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), + X(207,231), X(208,232), X(217,241), X(218,242), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), + X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), + X(223,231), X(224,232), X(233,241), X(234,242), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), + X(210,214), X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), + X(220,224), X(225,229), X(226,230), X(227,231), X(228,232), X(233,237), + X(234,238), X(235,239), X(236,240), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), + X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), + X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), + X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), + X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), + X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), + X(95,219), X(96,220), X(101,225), X(102,226), X(103,227), X(104,228), + X(109,233), X(110,234), X(111,235), X(112,236), X(117,241), X(118,242), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), + X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), X(141,201), + X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), X(151,211), + X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), X(165,225), + X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), X(175,235), + X(176,236), X(181,241), X(182,242), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), X(197,225), + X(198,226), X(199,227), X(200,228), X(205,233), X(206,234), X(207,235), + X(208,236), X(213,241), X(214,242), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), + X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), X(222,234), + X(223,235), X(224,236), X(229,241), X(230,242), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), + X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), + X(223,227), X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), + X(237,241), X(238,242), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), X(213,215), + X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), X(225,227), + X(226,228), X(229,231), X(230,232), X(233,235), X(234,236), X(237,239), + X(238,240), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(99,225), X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), + X(111,237), X(112,238), X(115,241), X(116,242), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(179,241), X(180,242), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), + X(188,218), X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), + X(200,230), X(203,233), X(204,234), X(207,237), X(208,238), X(211,241), + X(212,242), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), + X(215,229), X(216,230), X(219,233), X(220,234), X(223,237), X(224,238), + X(227,241), X(228,242), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), + X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), X(212,218), + X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), X(224,230), + X(227,233), X(228,234), X(231,237), X(232,238), X(235,241), X(236,242), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), + X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), + X(219,221), X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), + X(231,233), X(232,234), X(235,237), X(236,238), X(239,241), X(240,242), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), + X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), X(98,225), + X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), X(110,237), + X(112,239), X(114,241), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), + X(112,175), X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), + X(124,187), X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), + X(136,199), X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), + X(148,211), X(150,213), X(152,215), X(154,217), X(156,219), X(158,221), + X(160,223), X(162,225), X(164,227), X(166,229), X(168,231), X(170,233), + X(172,235), X(174,237), X(176,239), X(178,241), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), + X(182,213), X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), + X(194,225), X(196,227), X(198,229), X(200,231), X(202,233), X(204,235), + X(206,237), X(208,239), X(210,241), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), X(124,139), + X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(136,151), + X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), X(148,163), + X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), X(160,175), + X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(172,187), + X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), X(184,199), + X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), X(196,211), + X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), X(208,223), + X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), X(220,235), + X(222,237), X(224,239), X(226,241), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), + X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), + X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), + X(224,231), X(226,233), X(228,235), X(230,237), X(232,239), X(234,241), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), + X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), + X(218,221), X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), + X(230,233), X(232,235), X(234,237), X(236,239), X(238,241), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241) +}; +S(244) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(115,243), X(116,244), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), + X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), X(155,219), + X(156,220), X(157,221), X(158,222), X(159,223), X(160,224), X(161,225), + X(162,226), X(163,227), X(164,228), X(165,229), X(166,230), X(167,231), + X(168,232), X(169,233), X(170,234), X(171,235), X(172,236), X(173,237), + X(174,238), X(175,239), X(176,240), X(177,241), X(178,242), X(179,243), + X(180,244), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(193,225), + X(194,226), X(195,227), X(196,228), X(197,229), X(198,230), X(199,231), + X(200,232), X(201,233), X(202,234), X(203,235), X(204,236), X(205,237), + X(206,238), X(207,239), X(208,240), X(209,241), X(210,242), X(211,243), + X(212,244), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(227,243), X(228,244), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), + X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), X(113,225), + X(114,226), X(115,227), X(116,228), X(117,229), X(118,230), X(119,231), + X(120,232), X(121,233), X(122,234), X(123,235), X(124,236), X(125,237), + X(126,238), X(127,239), X(128,240), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), X(179,227), + X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), X(185,233), + X(186,234), X(187,235), X(188,236), X(189,237), X(190,238), X(191,239), + X(192,240), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), X(183,199), + X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), X(189,205), + X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), X(211,227), + X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), X(217,233), + X(218,234), X(219,235), X(220,236), X(221,237), X(222,238), X(223,239), + X(224,240), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), X(212,220), + X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), X(226,234), + X(227,235), X(228,236), X(229,237), X(230,238), X(231,239), X(232,240), + X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), + X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), + X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), + X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), + X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), + X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), + X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), + X(106,226), X(107,227), X(108,228), X(109,229), X(110,230), X(111,231), + X(112,232), X(121,241), X(122,242), X(123,243), X(124,244), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), + X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), + X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), + X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), X(156,212), + X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), X(170,226), + X(171,227), X(172,228), X(173,229), X(174,230), X(175,231), X(176,232), + X(185,241), X(186,242), X(187,243), X(188,244), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), + X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), X(201,225), + X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), X(207,231), + X(208,232), X(217,241), X(218,242), X(219,243), X(220,244), X(9,17), X(10,18), + X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), + X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), + X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), + X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), + X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), + X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), + X(106,114), X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), + X(112,120), X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), + X(126,134), X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), + X(140,148), X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), + X(154,162), X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), + X(160,168), X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), + X(174,182), X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), + X(188,196), X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), + X(202,210), X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), + X(208,216), X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), + X(222,230), X(223,231), X(224,232), X(233,241), X(234,242), X(235,243), + X(236,244), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), X(226,230), + X(227,231), X(228,232), X(233,237), X(234,238), X(235,239), X(236,240), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), X(101,225), + X(102,226), X(103,227), X(104,228), X(109,233), X(110,234), X(111,235), + X(112,236), X(117,241), X(118,242), X(119,243), X(120,244), X(5,65), X(6,66), + X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), X(21,81), X(22,82), + X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), X(37,97), X(38,98), + X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), X(48,108), X(53,113), + X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), X(63,123), X(64,124), + X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), X(78,138), X(79,139), + X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), X(93,153), X(94,154), + X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), X(104,164), + X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), X(118,178), + X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), X(128,188), + X(133,193), X(134,194), X(135,195), X(136,196), X(141,201), X(142,202), + X(143,203), X(144,204), X(149,209), X(150,210), X(151,211), X(152,212), + X(157,217), X(158,218), X(159,219), X(160,220), X(165,225), X(166,226), + X(167,227), X(168,228), X(173,233), X(174,234), X(175,235), X(176,236), + X(181,241), X(182,242), X(183,243), X(184,244), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), X(197,225), + X(198,226), X(199,227), X(200,228), X(205,233), X(206,234), X(207,235), + X(208,236), X(213,241), X(214,242), X(215,243), X(216,244), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), + X(184,196), X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), + X(198,210), X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), + X(208,220), X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), + X(222,234), X(223,235), X(224,236), X(229,241), X(230,242), X(231,243), + X(232,244), X(5,9), X(6,10), X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), + X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), + X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), + X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), + X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), + X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), + X(96,100), X(101,105), X(102,106), X(103,107), X(104,108), X(109,113), + X(110,114), X(111,115), X(112,116), X(117,121), X(118,122), X(119,123), + X(120,124), X(125,129), X(126,130), X(127,131), X(128,132), X(133,137), + X(134,138), X(135,139), X(136,140), X(141,145), X(142,146), X(143,147), + X(144,148), X(149,153), X(150,154), X(151,155), X(152,156), X(157,161), + X(158,162), X(159,163), X(160,164), X(165,169), X(166,170), X(167,171), + X(168,172), X(173,177), X(174,178), X(175,179), X(176,180), X(181,185), + X(182,186), X(183,187), X(184,188), X(189,193), X(190,194), X(191,195), + X(192,196), X(197,201), X(198,202), X(199,203), X(200,204), X(205,209), + X(206,210), X(207,211), X(208,212), X(213,217), X(214,218), X(215,219), + X(216,220), X(221,225), X(222,226), X(223,227), X(224,228), X(229,233), + X(230,234), X(231,235), X(232,236), X(237,241), X(238,242), X(239,243), + X(240,244), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), + X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), + X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), + X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), + X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), + X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), + X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), + X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), + X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), + X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), + X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), + X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), + X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), + X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), + X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), + X(205,207), X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), + X(217,219), X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), + X(229,231), X(230,232), X(233,235), X(234,236), X(237,239), X(238,240), + X(241,243), X(242,244), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), + X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), + X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), + X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), + X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), + X(68,194), X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), + X(83,209), X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), + X(96,222), X(99,225), X(100,226), X(103,229), X(104,230), X(107,233), + X(108,234), X(111,237), X(112,238), X(115,241), X(116,242), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(179,241), X(180,242), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), + X(188,218), X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), + X(200,230), X(203,233), X(204,234), X(207,237), X(208,238), X(211,241), + X(212,242), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), + X(215,229), X(216,230), X(219,233), X(220,234), X(223,237), X(224,238), + X(227,241), X(228,242), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), + X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), X(212,218), + X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), X(224,230), + X(227,233), X(228,234), X(231,237), X(232,238), X(235,241), X(236,242), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), + X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), + X(219,221), X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), + X(231,233), X(232,234), X(235,237), X(236,238), X(239,241), X(240,242), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(243,244), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), + X(110,237), X(112,239), X(114,241), X(116,243), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(168,231), X(170,233), X(172,235), X(174,237), X(176,239), + X(178,241), X(180,243), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), + X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), + X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), + X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), + X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), + X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), + X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), + X(104,135), X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), + X(116,147), X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), + X(128,159), X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), + X(140,171), X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), + X(152,183), X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), + X(164,195), X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), + X(176,207), X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), + X(188,219), X(190,221), X(192,223), X(194,225), X(196,227), X(198,229), + X(200,231), X(202,233), X(204,235), X(206,237), X(208,239), X(210,241), + X(212,243), X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), + X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), + X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), + X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), + X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), + X(80,95), X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), + X(94,109), X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), + X(106,121), X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), + X(118,133), X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), + X(130,145), X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), + X(142,157), X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), + X(154,169), X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), + X(166,181), X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), + X(178,193), X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), + X(190,205), X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), + X(202,217), X(204,219), X(206,221), X(208,223), X(210,225), X(212,227), + X(214,229), X(216,231), X(218,233), X(220,235), X(222,237), X(224,239), + X(226,241), X(228,243), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), + X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), + X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), + X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), + X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), + X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), X(212,219), + X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), X(224,231), + X(226,233), X(228,235), X(230,237), X(232,239), X(234,241), X(236,243), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), + X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), + X(218,221), X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), + X(230,233), X(232,235), X(234,237), X(236,239), X(238,241), X(240,243), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243) +}; +S(246) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(115,243), X(116,244), + X(117,245), X(118,246), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), + X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), + X(148,212), X(149,213), X(150,214), X(151,215), X(152,216), X(153,217), + X(154,218), X(155,219), X(156,220), X(157,221), X(158,222), X(159,223), + X(160,224), X(161,225), X(162,226), X(163,227), X(164,228), X(165,229), + X(166,230), X(167,231), X(168,232), X(169,233), X(170,234), X(171,235), + X(172,236), X(173,237), X(174,238), X(175,239), X(176,240), X(177,241), + X(178,242), X(179,243), X(180,244), X(181,245), X(182,246), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(193,225), X(194,226), X(195,227), + X(196,228), X(197,229), X(198,230), X(199,231), X(200,232), X(201,233), + X(202,234), X(203,235), X(204,236), X(205,237), X(206,238), X(207,239), + X(208,240), X(209,241), X(210,242), X(211,243), X(212,244), X(213,245), + X(214,246), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(227,243), X(228,244), + X(229,245), X(230,246), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(121,233), X(122,234), X(123,235), + X(124,236), X(125,237), X(126,238), X(127,239), X(128,240), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), + X(157,205), X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), + X(179,227), X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), + X(185,233), X(186,234), X(187,235), X(188,236), X(189,237), X(190,238), + X(191,239), X(192,240), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), + X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), + X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), + X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), + X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), + X(189,205), X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), + X(211,227), X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), + X(217,233), X(218,234), X(219,235), X(220,236), X(221,237), X(222,238), + X(223,239), X(224,240), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), + X(226,234), X(227,235), X(228,236), X(229,237), X(230,238), X(231,239), + X(232,240), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), + X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), + X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), + X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), + X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), + X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), + X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), + X(105,225), X(106,226), X(107,227), X(108,228), X(109,229), X(110,230), + X(111,231), X(112,232), X(121,241), X(122,242), X(123,243), X(124,244), + X(125,245), X(126,246), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), + X(173,229), X(174,230), X(175,231), X(176,232), X(185,241), X(186,242), + X(187,243), X(188,244), X(189,245), X(190,246), X(9,33), X(10,34), X(11,35), + X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), + X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), + X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), + X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), + X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), + X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), + X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), + X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), + X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), + X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), + X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), + X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), + X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), + X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), X(201,225), + X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), X(207,231), + X(208,232), X(217,241), X(218,242), X(219,243), X(220,244), X(221,245), + X(222,246), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), + X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), + X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), + X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), + X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), + X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), + X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(203,211), + X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(217,225), + X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), X(223,231), + X(224,232), X(233,241), X(234,242), X(235,243), X(236,244), X(237,245), + X(238,246), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), X(226,230), + X(227,231), X(228,232), X(233,237), X(234,238), X(235,239), X(236,240), + X(241,245), X(242,246), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), + X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), + X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), + X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), + X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), + X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), + X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), + X(96,220), X(101,225), X(102,226), X(103,227), X(104,228), X(109,233), + X(110,234), X(111,235), X(112,236), X(117,241), X(118,242), X(119,243), + X(120,244), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), + X(175,235), X(176,236), X(181,241), X(182,242), X(183,243), X(184,244), + X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), + X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), + X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), + X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), + X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), + X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), + X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), X(104,132), + X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), X(118,146), + X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), X(128,156), + X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), X(142,170), + X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), X(152,180), + X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), X(166,194), + X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), X(176,204), + X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), X(190,218), + X(191,219), X(192,220), X(197,225), X(198,226), X(199,227), X(200,228), + X(205,233), X(206,234), X(207,235), X(208,236), X(213,241), X(214,242), + X(215,243), X(216,244), X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), + X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), + X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), + X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), + X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), + X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), + X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), X(103,115), + X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), X(117,129), + X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), X(127,139), + X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), X(141,153), + X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), X(151,163), + X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), X(165,177), + X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), X(175,187), + X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), X(189,201), + X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), X(199,211), + X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), X(213,225), + X(214,226), X(215,227), X(216,228), X(221,233), X(222,234), X(223,235), + X(224,236), X(229,241), X(230,242), X(231,243), X(232,244), X(5,9), X(6,10), + X(7,11), X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), + X(23,27), X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), + X(39,43), X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), + X(55,59), X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), + X(71,75), X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), + X(87,91), X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), + X(102,106), X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), + X(112,116), X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), + X(126,130), X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), + X(136,140), X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), + X(150,154), X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), + X(160,164), X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), + X(174,178), X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), + X(184,188), X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), + X(198,202), X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), + X(208,212), X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), + X(222,226), X(223,227), X(224,228), X(229,233), X(230,234), X(231,235), + X(232,236), X(237,241), X(238,242), X(239,243), X(240,244), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), X(229,231), + X(230,232), X(233,235), X(234,236), X(237,239), X(238,240), X(241,243), + X(242,244), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(99,225), X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), + X(111,237), X(112,238), X(115,241), X(116,242), X(119,245), X(120,246), + X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), + X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), + X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), + X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), + X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), + X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), + X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), + X(104,166), X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), + X(116,178), X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), + X(128,190), X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), + X(140,202), X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), + X(152,214), X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), + X(164,226), X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), + X(176,238), X(179,241), X(180,242), X(183,245), X(184,246), X(3,33), X(4,34), + X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), + X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), + X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), + X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), + X(195,225), X(196,226), X(199,229), X(200,230), X(203,233), X(204,234), + X(207,237), X(208,238), X(211,241), X(212,242), X(215,245), X(216,246), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), X(179,193), + X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(191,205), + X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), X(203,217), + X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), X(215,229), + X(216,230), X(219,233), X(220,234), X(223,237), X(224,238), X(227,241), + X(228,242), X(231,245), X(232,246), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(231,237), X(232,238), X(235,241), + X(236,242), X(239,245), X(240,246), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), + X(227,229), X(228,230), X(231,233), X(232,234), X(235,237), X(236,238), + X(239,241), X(240,242), X(243,245), X(244,246), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), + X(235,236), X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), + X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), X(98,225), + X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), X(110,237), + X(112,239), X(114,241), X(116,243), X(118,245), X(2,65), X(4,67), X(6,69), + X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), + X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(168,231), X(170,233), X(172,235), X(174,237), X(176,239), + X(178,241), X(180,243), X(182,245), X(2,33), X(4,35), X(6,37), X(8,39), + X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), + X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), + X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), + X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), X(70,101), + X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), X(84,115), + X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), X(98,129), + X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), X(110,141), + X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), X(122,153), + X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), X(134,165), + X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), X(146,177), + X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), X(158,189), + X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), X(170,201), + X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), X(182,213), + X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), X(194,225), + X(196,227), X(198,229), X(200,231), X(202,233), X(204,235), X(206,237), + X(208,239), X(210,241), X(212,243), X(214,245), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), + X(208,223), X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), + X(220,235), X(222,237), X(224,239), X(226,241), X(228,243), X(230,245), X(2,9), + X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), + X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), + X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), + X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), + X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), + X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), X(94,101), X(96,103), + X(98,105), X(100,107), X(102,109), X(104,111), X(106,113), X(108,115), + X(110,117), X(112,119), X(114,121), X(116,123), X(118,125), X(120,127), + X(122,129), X(124,131), X(126,133), X(128,135), X(130,137), X(132,139), + X(134,141), X(136,143), X(138,145), X(140,147), X(142,149), X(144,151), + X(146,153), X(148,155), X(150,157), X(152,159), X(154,161), X(156,163), + X(158,165), X(160,167), X(162,169), X(164,171), X(166,173), X(168,175), + X(170,177), X(172,179), X(174,181), X(176,183), X(178,185), X(180,187), + X(182,189), X(184,191), X(186,193), X(188,195), X(190,197), X(192,199), + X(194,201), X(196,203), X(198,205), X(200,207), X(202,209), X(204,211), + X(206,213), X(208,215), X(210,217), X(212,219), X(214,221), X(216,223), + X(218,225), X(220,227), X(222,229), X(224,231), X(226,233), X(228,235), + X(230,237), X(232,239), X(234,241), X(236,243), X(238,245), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), + X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), X(218,221), + X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), X(230,233), + X(232,235), X(234,237), X(236,239), X(238,241), X(240,243), X(242,245), X(2,3), + X(4,5), X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), + X(20,21), X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), + X(36,37), X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), + X(52,53), X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), + X(68,69), X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), + X(84,85), X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243), + X(244,245) +}; +S(248) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(115,243), X(116,244), + X(117,245), X(118,246), X(119,247), X(120,248), X(1,65), X(2,66), X(3,67), + X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), + X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), + X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), + X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), + X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), + X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), + X(152,216), X(153,217), X(154,218), X(155,219), X(156,220), X(157,221), + X(158,222), X(159,223), X(160,224), X(161,225), X(162,226), X(163,227), + X(164,228), X(165,229), X(166,230), X(167,231), X(168,232), X(169,233), + X(170,234), X(171,235), X(172,236), X(173,237), X(174,238), X(175,239), + X(176,240), X(177,241), X(178,242), X(179,243), X(180,244), X(181,245), + X(182,246), X(183,247), X(184,248), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(193,225), X(194,226), X(195,227), X(196,228), X(197,229), + X(198,230), X(199,231), X(200,232), X(201,233), X(202,234), X(203,235), + X(204,236), X(205,237), X(206,238), X(207,239), X(208,240), X(209,241), + X(210,242), X(211,243), X(212,244), X(213,245), X(214,246), X(215,247), + X(216,248), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(227,243), X(228,244), + X(229,245), X(230,246), X(231,247), X(232,248), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(113,225), X(114,226), X(115,227), + X(116,228), X(117,229), X(118,230), X(119,231), X(120,232), X(121,233), + X(122,234), X(123,235), X(124,236), X(125,237), X(126,238), X(127,239), + X(128,240), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(125,173), + X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), X(147,195), + X(148,196), X(149,197), X(150,198), X(151,199), X(152,200), X(153,201), + X(154,202), X(155,203), X(156,204), X(157,205), X(158,206), X(159,207), + X(160,208), X(177,225), X(178,226), X(179,227), X(180,228), X(181,229), + X(182,230), X(183,231), X(184,232), X(185,233), X(186,234), X(187,235), + X(188,236), X(189,237), X(190,238), X(191,239), X(192,240), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), + X(209,225), X(210,226), X(211,227), X(212,228), X(213,229), X(214,230), + X(215,231), X(216,232), X(217,233), X(218,234), X(219,235), X(220,236), + X(221,237), X(222,238), X(223,239), X(224,240), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), X(180,188), + X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), X(194,202), + X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), X(200,208), + X(209,217), X(210,218), X(211,219), X(212,220), X(213,221), X(214,222), + X(215,223), X(216,224), X(225,233), X(226,234), X(227,235), X(228,236), + X(229,237), X(230,238), X(231,239), X(232,240), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), + X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), + X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), X(107,227), + X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), X(121,241), + X(122,242), X(123,243), X(124,244), X(125,245), X(126,246), X(127,247), + X(128,248), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), + X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), + X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), + X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), + X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), + X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), + X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), + X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), X(125,181), + X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), X(139,195), + X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), X(153,209), + X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), X(159,215), + X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), X(173,229), + X(174,230), X(175,231), X(176,232), X(185,241), X(186,242), X(187,243), + X(188,244), X(189,245), X(190,246), X(191,247), X(192,248), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), + X(187,211), X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), + X(201,225), X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), + X(207,231), X(208,232), X(217,241), X(218,242), X(219,243), X(220,244), + X(221,245), X(222,246), X(223,247), X(224,248), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), + X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), + X(223,231), X(224,232), X(233,241), X(234,242), X(235,243), X(236,244), + X(237,245), X(238,246), X(239,247), X(240,248), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), + X(210,214), X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), + X(220,224), X(225,229), X(226,230), X(227,231), X(228,232), X(233,237), + X(234,238), X(235,239), X(236,240), X(241,245), X(242,246), X(243,247), + X(244,248), X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), + X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), + X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), + X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), + X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), + X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), + X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), + X(101,225), X(102,226), X(103,227), X(104,228), X(109,233), X(110,234), + X(111,235), X(112,236), X(117,241), X(118,242), X(119,243), X(120,244), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), + X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), X(141,201), + X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), X(151,211), + X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), X(165,225), + X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), X(175,235), + X(176,236), X(181,241), X(182,242), X(183,243), X(184,244), X(5,33), X(6,34), + X(7,35), X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), + X(23,51), X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), + X(39,67), X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), + X(55,83), X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), + X(71,99), X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), + X(86,114), X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), + X(101,129), X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), + X(111,139), X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), + X(125,153), X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), + X(135,163), X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), + X(149,177), X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), + X(159,187), X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), + X(173,201), X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), + X(183,211), X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), + X(197,225), X(198,226), X(199,227), X(200,228), X(205,233), X(206,234), + X(207,235), X(208,236), X(213,241), X(214,242), X(215,243), X(216,244), + X(5,17), X(6,18), X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), + X(21,33), X(22,34), X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), + X(37,49), X(38,50), X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), + X(53,65), X(54,66), X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), + X(69,81), X(70,82), X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), + X(85,97), X(86,98), X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), + X(96,108), X(101,113), X(102,114), X(103,115), X(104,116), X(109,121), + X(110,122), X(111,123), X(112,124), X(117,129), X(118,130), X(119,131), + X(120,132), X(125,137), X(126,138), X(127,139), X(128,140), X(133,145), + X(134,146), X(135,147), X(136,148), X(141,153), X(142,154), X(143,155), + X(144,156), X(149,161), X(150,162), X(151,163), X(152,164), X(157,169), + X(158,170), X(159,171), X(160,172), X(165,177), X(166,178), X(167,179), + X(168,180), X(173,185), X(174,186), X(175,187), X(176,188), X(181,193), + X(182,194), X(183,195), X(184,196), X(189,201), X(190,202), X(191,203), + X(192,204), X(197,209), X(198,210), X(199,211), X(200,212), X(205,217), + X(206,218), X(207,219), X(208,220), X(213,225), X(214,226), X(215,227), + X(216,228), X(221,233), X(222,234), X(223,235), X(224,236), X(229,241), + X(230,242), X(231,243), X(232,244), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), + X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), + X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), + X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), X(223,227), + X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), X(237,241), + X(238,242), X(239,243), X(240,244), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), + X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), + X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), + X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), + X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), + X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), + X(90,92), X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), + X(105,107), X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), + X(117,119), X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), + X(129,131), X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), + X(141,143), X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), + X(153,155), X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), + X(165,167), X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), + X(177,179), X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), + X(189,191), X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), + X(201,203), X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), + X(213,215), X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), + X(225,227), X(226,228), X(229,231), X(230,232), X(233,235), X(234,236), + X(237,239), X(238,240), X(241,243), X(242,244), X(245,247), X(246,248), + X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), X(15,141), + X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), X(28,154), + X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), X(43,169), + X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), X(56,182), + X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), X(71,197), + X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), X(84,210), + X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), X(99,225), + X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), X(111,237), + X(112,238), X(115,241), X(116,242), X(119,245), X(120,246), X(3,65), X(4,66), + X(7,69), X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), + X(23,85), X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(179,241), X(180,242), X(183,245), X(184,246), X(3,33), X(4,34), X(7,37), + X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), + X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), + X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), + X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), + X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), + X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), + X(99,129), X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), + X(111,141), X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), + X(123,153), X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), + X(135,165), X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), + X(147,177), X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), + X(159,189), X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), + X(171,201), X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), + X(183,213), X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), + X(195,225), X(196,226), X(199,229), X(200,230), X(203,233), X(204,234), + X(207,237), X(208,238), X(211,241), X(212,242), X(215,245), X(216,246), + X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), + X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), + X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), + X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), + X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), + X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), + X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), X(107,121), + X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), X(119,133), + X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), X(131,145), + X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), X(143,157), + X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), X(155,169), + X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), X(167,181), + X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), X(179,193), + X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), X(191,205), + X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), X(203,217), + X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), X(215,229), + X(216,230), X(219,233), X(220,234), X(223,237), X(224,238), X(227,241), + X(228,242), X(231,245), X(232,246), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(231,237), X(232,238), X(235,241), + X(236,242), X(239,245), X(240,246), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), + X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), + X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), + X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), + X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), + X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), + X(92,94), X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), + X(107,109), X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), + X(119,121), X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), + X(131,133), X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), + X(143,145), X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), + X(155,157), X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), + X(167,169), X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), + X(179,181), X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), + X(191,193), X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), + X(203,205), X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), + X(215,217), X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), + X(227,229), X(228,230), X(231,233), X(232,234), X(235,237), X(236,238), + X(239,241), X(240,242), X(243,245), X(244,246), X(1,2), X(3,4), X(5,6), X(7,8), + X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), + X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), + X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), + X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), + X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), + X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), + X(103,104), X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), + X(115,116), X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), + X(127,128), X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), + X(139,140), X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), + X(151,152), X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), + X(163,164), X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), + X(175,176), X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), + X(187,188), X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), + X(199,200), X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), + X(211,212), X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), + X(223,224), X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), + X(235,236), X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), + X(247,248), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), + X(110,237), X(112,239), X(114,241), X(116,243), X(118,245), X(120,247), + X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), + X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), + X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), + X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), + X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), + X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), + X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), + X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), + X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), + X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), + X(140,203), X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), + X(152,215), X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), + X(164,227), X(166,229), X(168,231), X(170,233), X(172,235), X(174,237), + X(176,239), X(178,241), X(180,243), X(182,245), X(184,247), X(2,33), X(4,35), + X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), + X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), + X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), + X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), + X(182,213), X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), + X(194,225), X(196,227), X(198,229), X(200,231), X(202,233), X(204,235), + X(206,237), X(208,239), X(210,241), X(212,243), X(214,245), X(216,247), + X(2,17), X(4,19), X(6,21), X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), + X(18,33), X(20,35), X(22,37), X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), + X(34,49), X(36,51), X(38,53), X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), + X(50,65), X(52,67), X(54,69), X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), + X(66,81), X(68,83), X(70,85), X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), + X(82,97), X(84,99), X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), + X(96,111), X(98,113), X(100,115), X(102,117), X(104,119), X(106,121), + X(108,123), X(110,125), X(112,127), X(114,129), X(116,131), X(118,133), + X(120,135), X(122,137), X(124,139), X(126,141), X(128,143), X(130,145), + X(132,147), X(134,149), X(136,151), X(138,153), X(140,155), X(142,157), + X(144,159), X(146,161), X(148,163), X(150,165), X(152,167), X(154,169), + X(156,171), X(158,173), X(160,175), X(162,177), X(164,179), X(166,181), + X(168,183), X(170,185), X(172,187), X(174,189), X(176,191), X(178,193), + X(180,195), X(182,197), X(184,199), X(186,201), X(188,203), X(190,205), + X(192,207), X(194,209), X(196,211), X(198,213), X(200,215), X(202,217), + X(204,219), X(206,221), X(208,223), X(210,225), X(212,227), X(214,229), + X(216,231), X(218,233), X(220,235), X(222,237), X(224,239), X(226,241), + X(228,243), X(230,245), X(232,247), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), + X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), + X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), + X(224,231), X(226,233), X(228,235), X(230,237), X(232,239), X(234,241), + X(236,243), X(238,245), X(240,247), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), + X(202,205), X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), + X(214,217), X(216,219), X(218,221), X(220,223), X(222,225), X(224,227), + X(226,229), X(228,231), X(230,233), X(232,235), X(234,237), X(236,239), + X(238,241), X(240,243), X(242,245), X(244,247), X(2,3), X(4,5), X(6,7), X(8,9), + X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), + X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), + X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), + X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), + X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), + X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), + X(104,105), X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), + X(116,117), X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), + X(128,129), X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), + X(140,141), X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), + X(152,153), X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), + X(164,165), X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), + X(176,177), X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), + X(188,189), X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), + X(200,201), X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), + X(212,213), X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), + X(224,225), X(226,227), X(228,229), X(230,231), X(232,233), X(234,235), + X(236,237), X(238,239), X(240,241), X(242,243), X(244,245), X(246,247) +}; +S(250) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(115,243), X(116,244), + X(117,245), X(118,246), X(119,247), X(120,248), X(121,249), X(122,250), + X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), + X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), + X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), + X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), + X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), X(38,102), X(39,103), + X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), X(45,109), X(46,110), + X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), X(52,116), X(53,117), + X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), X(59,123), X(60,124), + X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), X(130,194), X(131,195), + X(132,196), X(133,197), X(134,198), X(135,199), X(136,200), X(137,201), + X(138,202), X(139,203), X(140,204), X(141,205), X(142,206), X(143,207), + X(144,208), X(145,209), X(146,210), X(147,211), X(148,212), X(149,213), + X(150,214), X(151,215), X(152,216), X(153,217), X(154,218), X(155,219), + X(156,220), X(157,221), X(158,222), X(159,223), X(160,224), X(161,225), + X(162,226), X(163,227), X(164,228), X(165,229), X(166,230), X(167,231), + X(168,232), X(169,233), X(170,234), X(171,235), X(172,236), X(173,237), + X(174,238), X(175,239), X(176,240), X(177,241), X(178,242), X(179,243), + X(180,244), X(181,245), X(182,246), X(183,247), X(184,248), X(185,249), + X(186,250), X(65,129), X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), + X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), + X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), + X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), + X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), + X(99,163), X(100,164), X(101,165), X(102,166), X(103,167), X(104,168), + X(105,169), X(106,170), X(107,171), X(108,172), X(109,173), X(110,174), + X(111,175), X(112,176), X(113,177), X(114,178), X(115,179), X(116,180), + X(117,181), X(118,182), X(119,183), X(120,184), X(121,185), X(122,186), + X(123,187), X(124,188), X(125,189), X(126,190), X(127,191), X(128,192), + X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), + X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), + X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), + X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), + X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), X(70,102), X(71,103), + X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), X(77,109), X(78,110), + X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), X(84,116), X(85,117), + X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), X(91,123), X(92,124), + X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), X(130,162), X(131,163), + X(132,164), X(133,165), X(134,166), X(135,167), X(136,168), X(137,169), + X(138,170), X(139,171), X(140,172), X(141,173), X(142,174), X(143,175), + X(144,176), X(145,177), X(146,178), X(147,179), X(148,180), X(149,181), + X(150,182), X(151,183), X(152,184), X(153,185), X(154,186), X(155,187), + X(156,188), X(157,189), X(158,190), X(159,191), X(160,192), X(193,225), + X(194,226), X(195,227), X(196,228), X(197,229), X(198,230), X(199,231), + X(200,232), X(201,233), X(202,234), X(203,235), X(204,236), X(205,237), + X(206,238), X(207,239), X(208,240), X(209,241), X(210,242), X(211,243), + X(212,244), X(213,245), X(214,246), X(215,247), X(216,248), X(217,249), + X(218,250), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(227,243), X(228,244), + X(229,245), X(230,246), X(231,247), X(232,248), X(233,249), X(234,250), + X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), + X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), + X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), + X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), + X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), + X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), + X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), X(96,208), X(113,225), + X(114,226), X(115,227), X(116,228), X(117,229), X(118,230), X(119,231), + X(120,232), X(121,233), X(122,234), X(123,235), X(124,236), X(125,237), + X(126,238), X(127,239), X(128,240), X(17,65), X(18,66), X(19,67), X(20,68), + X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), + X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), + X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), + X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), + X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), + X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), + X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), X(117,165), + X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), X(123,171), + X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), X(145,193), + X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), X(151,199), + X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), X(157,205), + X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), X(179,227), + X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), X(185,233), + X(186,234), X(187,235), X(188,236), X(189,237), X(190,238), X(191,239), + X(192,240), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), X(22,38), + X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), X(30,46), + X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), X(54,70), + X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), X(62,78), + X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), X(85,101), + X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), X(92,108), + X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), X(115,131), + X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), X(121,137), + X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), X(127,143), + X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), X(149,165), + X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), X(155,171), + X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), X(177,193), + X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), X(183,199), + X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), X(189,205), + X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), X(211,227), + X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), X(217,233), + X(218,234), X(219,235), X(220,236), X(221,237), X(222,238), X(223,239), + X(224,240), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), X(7,15), + X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), X(23,31), + X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), X(39,47), + X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), X(55,63), + X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), X(71,79), + X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), X(87,95), + X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), X(102,110), + X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), X(116,124), + X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), X(130,138), + X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), X(136,144), + X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), X(150,158), + X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), X(164,172), + X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), X(178,186), + X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), X(184,192), + X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), X(198,206), + X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), X(212,220), + X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), X(226,234), + X(227,235), X(228,236), X(229,237), X(230,238), X(231,239), X(232,240), + X(241,249), X(242,250), X(9,129), X(10,130), X(11,131), X(12,132), X(13,133), + X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), X(27,147), X(28,148), + X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), X(42,162), X(43,163), + X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), X(57,177), X(58,178), + X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), X(64,184), X(73,193), + X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), X(79,199), X(80,200), + X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), X(94,214), X(95,215), + X(96,216), X(105,225), X(106,226), X(107,227), X(108,228), X(109,229), + X(110,230), X(111,231), X(112,232), X(121,241), X(122,242), X(123,243), + X(124,244), X(125,245), X(126,246), X(127,247), X(128,248), X(9,65), X(10,66), + X(11,67), X(12,68), X(13,69), X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), + X(27,83), X(28,84), X(29,85), X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), + X(43,99), X(44,100), X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), + X(58,114), X(59,115), X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), + X(73,129), X(74,130), X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), + X(80,136), X(89,145), X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), + X(95,151), X(96,152), X(105,161), X(106,162), X(107,163), X(108,164), + X(109,165), X(110,166), X(111,167), X(112,168), X(121,177), X(122,178), + X(123,179), X(124,180), X(125,181), X(126,182), X(127,183), X(128,184), + X(137,193), X(138,194), X(139,195), X(140,196), X(141,197), X(142,198), + X(143,199), X(144,200), X(153,209), X(154,210), X(155,211), X(156,212), + X(157,213), X(158,214), X(159,215), X(160,216), X(169,225), X(170,226), + X(171,227), X(172,228), X(173,229), X(174,230), X(175,231), X(176,232), + X(185,241), X(186,242), X(187,243), X(188,244), X(189,245), X(190,246), + X(191,247), X(192,248), X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), + X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), + X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), + X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), + X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), X(75,99), X(76,100), + X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), X(90,114), X(91,115), + X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), X(105,129), X(106,130), + X(107,131), X(108,132), X(109,133), X(110,134), X(111,135), X(112,136), + X(121,145), X(122,146), X(123,147), X(124,148), X(125,149), X(126,150), + X(127,151), X(128,152), X(137,161), X(138,162), X(139,163), X(140,164), + X(141,165), X(142,166), X(143,167), X(144,168), X(153,177), X(154,178), + X(155,179), X(156,180), X(157,181), X(158,182), X(159,183), X(160,184), + X(169,193), X(170,194), X(171,195), X(172,196), X(173,197), X(174,198), + X(175,199), X(176,200), X(185,209), X(186,210), X(187,211), X(188,212), + X(189,213), X(190,214), X(191,215), X(192,216), X(201,225), X(202,226), + X(203,227), X(204,228), X(205,229), X(206,230), X(207,231), X(208,232), + X(217,241), X(218,242), X(219,243), X(220,244), X(221,245), X(222,246), + X(223,247), X(224,248), X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), + X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), + X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), + X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), + X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), + X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), X(92,100), + X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), X(107,115), + X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), X(121,129), + X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), X(127,135), + X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), X(141,149), + X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), X(155,163), + X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), X(169,177), + X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), X(175,183), + X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), X(189,197), + X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), X(203,211), + X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), X(217,225), + X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), X(223,231), + X(224,232), X(233,241), X(234,242), X(235,243), X(236,244), X(237,245), + X(238,246), X(239,247), X(240,248), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), + X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), + X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), + X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), + X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), + X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), + X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), + X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), X(114,118), + X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), X(124,128), + X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), X(138,142), + X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), X(148,152), + X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), X(162,166), + X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), X(172,176), + X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), X(186,190), + X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), X(196,200), + X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), X(210,214), + X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), X(220,224), + X(225,229), X(226,230), X(227,231), X(228,232), X(233,237), X(234,238), + X(235,239), X(236,240), X(241,245), X(242,246), X(243,247), X(244,248), + X(5,129), X(6,130), X(7,131), X(8,132), X(13,137), X(14,138), X(15,139), + X(16,140), X(21,145), X(22,146), X(23,147), X(24,148), X(29,153), X(30,154), + X(31,155), X(32,156), X(37,161), X(38,162), X(39,163), X(40,164), X(45,169), + X(46,170), X(47,171), X(48,172), X(53,177), X(54,178), X(55,179), X(56,180), + X(61,185), X(62,186), X(63,187), X(64,188), X(69,193), X(70,194), X(71,195), + X(72,196), X(77,201), X(78,202), X(79,203), X(80,204), X(85,209), X(86,210), + X(87,211), X(88,212), X(93,217), X(94,218), X(95,219), X(96,220), X(101,225), + X(102,226), X(103,227), X(104,228), X(109,233), X(110,234), X(111,235), + X(112,236), X(117,241), X(118,242), X(119,243), X(120,244), X(125,249), + X(126,250), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), + X(175,235), X(176,236), X(181,241), X(182,242), X(183,243), X(184,244), + X(189,249), X(190,250), X(5,33), X(6,34), X(7,35), X(8,36), X(13,41), X(14,42), + X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), X(29,57), X(30,58), + X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), X(45,73), X(46,74), + X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), X(61,89), X(62,90), + X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), X(72,100), X(77,105), + X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), X(87,115), X(88,116), + X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), X(102,130), X(103,131), + X(104,132), X(109,137), X(110,138), X(111,139), X(112,140), X(117,145), + X(118,146), X(119,147), X(120,148), X(125,153), X(126,154), X(127,155), + X(128,156), X(133,161), X(134,162), X(135,163), X(136,164), X(141,169), + X(142,170), X(143,171), X(144,172), X(149,177), X(150,178), X(151,179), + X(152,180), X(157,185), X(158,186), X(159,187), X(160,188), X(165,193), + X(166,194), X(167,195), X(168,196), X(173,201), X(174,202), X(175,203), + X(176,204), X(181,209), X(182,210), X(183,211), X(184,212), X(189,217), + X(190,218), X(191,219), X(192,220), X(197,225), X(198,226), X(199,227), + X(200,228), X(205,233), X(206,234), X(207,235), X(208,236), X(213,241), + X(214,242), X(215,243), X(216,244), X(221,249), X(222,250), X(5,17), X(6,18), + X(7,19), X(8,20), X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), + X(23,35), X(24,36), X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), + X(39,51), X(40,52), X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), + X(55,67), X(56,68), X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), + X(71,83), X(72,84), X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), + X(87,99), X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), + X(102,114), X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), + X(112,124), X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), + X(126,138), X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), + X(136,148), X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), + X(150,162), X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), + X(160,172), X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), + X(174,186), X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), + X(184,196), X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), + X(198,210), X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), + X(208,220), X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), + X(222,234), X(223,235), X(224,236), X(229,241), X(230,242), X(231,243), + X(232,244), X(237,249), X(238,250), X(5,9), X(6,10), X(7,11), X(8,12), + X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), X(24,28), + X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), X(40,44), + X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), X(56,60), + X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), X(72,76), + X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), X(88,92), + X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), X(103,107), + X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), X(117,121), + X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), X(127,131), + X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), X(141,145), + X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), X(151,155), + X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), X(165,169), + X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), X(175,179), + X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), X(189,193), + X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), X(199,203), + X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), X(213,217), + X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), X(223,227), + X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), X(237,241), + X(238,242), X(239,243), X(240,244), X(245,249), X(246,250), X(1,3), X(2,4), + X(5,7), X(6,8), X(9,11), X(10,12), X(13,15), X(14,16), X(17,19), X(18,20), + X(21,23), X(22,24), X(25,27), X(26,28), X(29,31), X(30,32), X(33,35), X(34,36), + X(37,39), X(38,40), X(41,43), X(42,44), X(45,47), X(46,48), X(49,51), X(50,52), + X(53,55), X(54,56), X(57,59), X(58,60), X(61,63), X(62,64), X(65,67), X(66,68), + X(69,71), X(70,72), X(73,75), X(74,76), X(77,79), X(78,80), X(81,83), X(82,84), + X(85,87), X(86,88), X(89,91), X(90,92), X(93,95), X(94,96), X(97,99), + X(98,100), X(101,103), X(102,104), X(105,107), X(106,108), X(109,111), + X(110,112), X(113,115), X(114,116), X(117,119), X(118,120), X(121,123), + X(122,124), X(125,127), X(126,128), X(129,131), X(130,132), X(133,135), + X(134,136), X(137,139), X(138,140), X(141,143), X(142,144), X(145,147), + X(146,148), X(149,151), X(150,152), X(153,155), X(154,156), X(157,159), + X(158,160), X(161,163), X(162,164), X(165,167), X(166,168), X(169,171), + X(170,172), X(173,175), X(174,176), X(177,179), X(178,180), X(181,183), + X(182,184), X(185,187), X(186,188), X(189,191), X(190,192), X(193,195), + X(194,196), X(197,199), X(198,200), X(201,203), X(202,204), X(205,207), + X(206,208), X(209,211), X(210,212), X(213,215), X(214,216), X(217,219), + X(218,220), X(221,223), X(222,224), X(225,227), X(226,228), X(229,231), + X(230,232), X(233,235), X(234,236), X(237,239), X(238,240), X(241,243), + X(242,244), X(245,247), X(246,248), X(3,129), X(4,130), X(7,133), X(8,134), + X(11,137), X(12,138), X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), + X(24,150), X(27,153), X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), + X(39,165), X(40,166), X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), + X(52,178), X(55,181), X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), + X(67,193), X(68,194), X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), + X(80,206), X(83,209), X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), + X(95,221), X(96,222), X(99,225), X(100,226), X(103,229), X(104,230), + X(107,233), X(108,234), X(111,237), X(112,238), X(115,241), X(116,242), + X(119,245), X(120,246), X(123,249), X(124,250), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(179,241), X(180,242), X(183,245), X(184,246), X(187,249), X(188,250), + X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), X(15,45), X(16,46), + X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), X(31,61), X(32,62), + X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), X(47,77), X(48,78), + X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), X(63,93), X(64,94), + X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), X(76,106), X(79,109), + X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), X(91,121), X(92,122), + X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), X(104,134), + X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), X(116,146), + X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), X(128,158), + X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), X(140,170), + X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), X(152,182), + X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), X(164,194), + X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), X(176,206), + X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), X(188,218), + X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), X(200,230), + X(203,233), X(204,234), X(207,237), X(208,238), X(211,241), X(212,242), + X(215,245), X(216,246), X(219,249), X(220,250), X(3,17), X(4,18), X(7,21), + X(8,22), X(11,25), X(12,26), X(15,29), X(16,30), X(19,33), X(20,34), X(23,37), + X(24,38), X(27,41), X(28,42), X(31,45), X(32,46), X(35,49), X(36,50), X(39,53), + X(40,54), X(43,57), X(44,58), X(47,61), X(48,62), X(51,65), X(52,66), X(55,69), + X(56,70), X(59,73), X(60,74), X(63,77), X(64,78), X(67,81), X(68,82), X(71,85), + X(72,86), X(75,89), X(76,90), X(79,93), X(80,94), X(83,97), X(84,98), + X(87,101), X(88,102), X(91,105), X(92,106), X(95,109), X(96,110), X(99,113), + X(100,114), X(103,117), X(104,118), X(107,121), X(108,122), X(111,125), + X(112,126), X(115,129), X(116,130), X(119,133), X(120,134), X(123,137), + X(124,138), X(127,141), X(128,142), X(131,145), X(132,146), X(135,149), + X(136,150), X(139,153), X(140,154), X(143,157), X(144,158), X(147,161), + X(148,162), X(151,165), X(152,166), X(155,169), X(156,170), X(159,173), + X(160,174), X(163,177), X(164,178), X(167,181), X(168,182), X(171,185), + X(172,186), X(175,189), X(176,190), X(179,193), X(180,194), X(183,197), + X(184,198), X(187,201), X(188,202), X(191,205), X(192,206), X(195,209), + X(196,210), X(199,213), X(200,214), X(203,217), X(204,218), X(207,221), + X(208,222), X(211,225), X(212,226), X(215,229), X(216,230), X(219,233), + X(220,234), X(223,237), X(224,238), X(227,241), X(228,242), X(231,245), + X(232,246), X(235,249), X(236,250), X(3,9), X(4,10), X(7,13), X(8,14), + X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), + X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), + X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), + X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), + X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), + X(91,97), X(92,98), X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), + X(104,110), X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), + X(116,122), X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), + X(128,134), X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), + X(140,146), X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), + X(152,158), X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), + X(164,170), X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), + X(176,182), X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), + X(188,194), X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), + X(200,206), X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), + X(212,218), X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), + X(224,230), X(227,233), X(228,234), X(231,237), X(232,238), X(235,241), + X(236,242), X(239,245), X(240,246), X(243,249), X(244,250), X(3,5), X(4,6), + X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), X(20,22), + X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), X(36,38), + X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), X(52,54), + X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), X(68,70), + X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), X(84,86), + X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), X(99,101), + X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), X(111,113), + X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), X(123,125), + X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), X(135,137), + X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), X(147,149), + X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), X(159,161), + X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), X(171,173), + X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), X(183,185), + X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), X(195,197), + X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), X(207,209), + X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), X(219,221), + X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), X(231,233), + X(232,234), X(235,237), X(236,238), X(239,241), X(240,242), X(243,245), + X(244,246), X(247,249), X(248,250), X(1,2), X(3,4), X(5,6), X(7,8), X(9,10), + X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), X(21,22), X(23,24), X(25,26), + X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), X(37,38), X(39,40), X(41,42), + X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), X(53,54), X(55,56), X(57,58), + X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), X(69,70), X(71,72), X(73,74), + X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), X(85,86), X(87,88), X(89,90), + X(91,92), X(93,94), X(95,96), X(97,98), X(99,100), X(101,102), X(103,104), + X(105,106), X(107,108), X(109,110), X(111,112), X(113,114), X(115,116), + X(117,118), X(119,120), X(121,122), X(123,124), X(125,126), X(127,128), + X(129,130), X(131,132), X(133,134), X(135,136), X(137,138), X(139,140), + X(141,142), X(143,144), X(145,146), X(147,148), X(149,150), X(151,152), + X(153,154), X(155,156), X(157,158), X(159,160), X(161,162), X(163,164), + X(165,166), X(167,168), X(169,170), X(171,172), X(173,174), X(175,176), + X(177,178), X(179,180), X(181,182), X(183,184), X(185,186), X(187,188), + X(189,190), X(191,192), X(193,194), X(195,196), X(197,198), X(199,200), + X(201,202), X(203,204), X(205,206), X(207,208), X(209,210), X(211,212), + X(213,214), X(215,216), X(217,218), X(219,220), X(221,222), X(223,224), + X(225,226), X(227,228), X(229,230), X(231,232), X(233,234), X(235,236), + X(237,238), X(239,240), X(241,242), X(243,244), X(245,246), X(247,248), + X(249,250), X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), + X(14,141), X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), + X(28,155), X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), + X(42,169), X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), + X(56,183), X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), + X(70,197), X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), + X(84,211), X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), + X(98,225), X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), + X(110,237), X(112,239), X(114,241), X(116,243), X(118,245), X(120,247), + X(122,249), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), + X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), + X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), X(44,107), + X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), X(58,121), + X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), X(72,135), + X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), X(86,149), + X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), X(100,163), + X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), X(112,175), + X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), X(124,187), + X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), X(136,199), + X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), X(148,211), + X(150,213), X(152,215), X(154,217), X(156,219), X(158,221), X(160,223), + X(162,225), X(164,227), X(166,229), X(168,231), X(170,233), X(172,235), + X(174,237), X(176,239), X(178,241), X(180,243), X(182,245), X(184,247), + X(186,249), X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), + X(16,47), X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), + X(32,63), X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), + X(48,79), X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), + X(64,95), X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), + X(78,109), X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), + X(92,123), X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(194,225), X(196,227), X(198,229), X(200,231), + X(202,233), X(204,235), X(206,237), X(208,239), X(210,241), X(212,243), + X(214,245), X(216,247), X(218,249), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), X(124,139), + X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(136,151), + X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), X(148,163), + X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), X(160,175), + X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(172,187), + X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), X(184,199), + X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), X(196,211), + X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), X(208,223), + X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), X(220,235), + X(222,237), X(224,239), X(226,241), X(228,243), X(230,245), X(232,247), + X(234,249), X(2,9), X(4,11), X(6,13), X(8,15), X(10,17), X(12,19), X(14,21), + X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), X(26,33), X(28,35), X(30,37), + X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), X(42,49), X(44,51), X(46,53), + X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), X(58,65), X(60,67), X(62,69), + X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), X(74,81), X(76,83), X(78,85), + X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), X(90,97), X(92,99), + X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), X(104,111), + X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), X(116,123), + X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), X(128,135), + X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), X(140,147), + X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), X(152,159), + X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), X(164,171), + X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), X(176,183), + X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), X(188,195), + X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), X(200,207), + X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), X(212,219), + X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), X(224,231), + X(226,233), X(228,235), X(230,237), X(232,239), X(234,241), X(236,243), + X(238,245), X(240,247), X(242,249), X(2,5), X(4,7), X(6,9), X(8,11), X(10,13), + X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), X(22,25), X(24,27), X(26,29), + X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), X(38,41), X(40,43), X(42,45), + X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), X(54,57), X(56,59), X(58,61), + X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), X(70,73), X(72,75), X(74,77), + X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), X(86,89), X(88,91), X(90,93), + X(92,95), X(94,97), X(96,99), X(98,101), X(100,103), X(102,105), X(104,107), + X(106,109), X(108,111), X(110,113), X(112,115), X(114,117), X(116,119), + X(118,121), X(120,123), X(122,125), X(124,127), X(126,129), X(128,131), + X(130,133), X(132,135), X(134,137), X(136,139), X(138,141), X(140,143), + X(142,145), X(144,147), X(146,149), X(148,151), X(150,153), X(152,155), + X(154,157), X(156,159), X(158,161), X(160,163), X(162,165), X(164,167), + X(166,169), X(168,171), X(170,173), X(172,175), X(174,177), X(176,179), + X(178,181), X(180,183), X(182,185), X(184,187), X(186,189), X(188,191), + X(190,193), X(192,195), X(194,197), X(196,199), X(198,201), X(200,203), + X(202,205), X(204,207), X(206,209), X(208,211), X(210,213), X(212,215), + X(214,217), X(216,219), X(218,221), X(220,223), X(222,225), X(224,227), + X(226,229), X(228,231), X(230,233), X(232,235), X(234,237), X(236,239), + X(238,241), X(240,243), X(242,245), X(244,247), X(246,249), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243), + X(244,245), X(246,247), X(248,249) +}; +S(252) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(115,243), X(116,244), + X(117,245), X(118,246), X(119,247), X(120,248), X(121,249), X(122,250), + X(123,251), X(124,252), X(1,65), X(2,66), X(3,67), X(4,68), X(5,69), X(6,70), + X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), X(12,76), X(13,77), X(14,78), + X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), X(20,84), X(21,85), X(22,86), + X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), X(28,92), X(29,93), X(30,94), + X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), X(36,100), X(37,101), + X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), X(43,107), X(44,108), + X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), X(50,114), X(51,115), + X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), X(57,121), X(58,122), + X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), X(64,128), X(129,193), + X(130,194), X(131,195), X(132,196), X(133,197), X(134,198), X(135,199), + X(136,200), X(137,201), X(138,202), X(139,203), X(140,204), X(141,205), + X(142,206), X(143,207), X(144,208), X(145,209), X(146,210), X(147,211), + X(148,212), X(149,213), X(150,214), X(151,215), X(152,216), X(153,217), + X(154,218), X(155,219), X(156,220), X(157,221), X(158,222), X(159,223), + X(160,224), X(161,225), X(162,226), X(163,227), X(164,228), X(165,229), + X(166,230), X(167,231), X(168,232), X(169,233), X(170,234), X(171,235), + X(172,236), X(173,237), X(174,238), X(175,239), X(176,240), X(177,241), + X(178,242), X(179,243), X(180,244), X(181,245), X(182,246), X(183,247), + X(184,248), X(185,249), X(186,250), X(187,251), X(188,252), X(65,129), + X(66,130), X(67,131), X(68,132), X(69,133), X(70,134), X(71,135), X(72,136), + X(73,137), X(74,138), X(75,139), X(76,140), X(77,141), X(78,142), X(79,143), + X(80,144), X(81,145), X(82,146), X(83,147), X(84,148), X(85,149), X(86,150), + X(87,151), X(88,152), X(89,153), X(90,154), X(91,155), X(92,156), X(93,157), + X(94,158), X(95,159), X(96,160), X(97,161), X(98,162), X(99,163), X(100,164), + X(101,165), X(102,166), X(103,167), X(104,168), X(105,169), X(106,170), + X(107,171), X(108,172), X(109,173), X(110,174), X(111,175), X(112,176), + X(113,177), X(114,178), X(115,179), X(116,180), X(117,181), X(118,182), + X(119,183), X(120,184), X(121,185), X(122,186), X(123,187), X(124,188), + X(125,189), X(126,190), X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), + X(4,36), X(5,37), X(6,38), X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), + X(12,44), X(13,45), X(14,46), X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), + X(20,52), X(21,53), X(22,54), X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), + X(28,60), X(29,61), X(30,62), X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), + X(68,100), X(69,101), X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), + X(75,107), X(76,108), X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), + X(82,114), X(83,115), X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), + X(89,121), X(90,122), X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), + X(96,128), X(129,161), X(130,162), X(131,163), X(132,164), X(133,165), + X(134,166), X(135,167), X(136,168), X(137,169), X(138,170), X(139,171), + X(140,172), X(141,173), X(142,174), X(143,175), X(144,176), X(145,177), + X(146,178), X(147,179), X(148,180), X(149,181), X(150,182), X(151,183), + X(152,184), X(153,185), X(154,186), X(155,187), X(156,188), X(157,189), + X(158,190), X(159,191), X(160,192), X(193,225), X(194,226), X(195,227), + X(196,228), X(197,229), X(198,230), X(199,231), X(200,232), X(201,233), + X(202,234), X(203,235), X(204,236), X(205,237), X(206,238), X(207,239), + X(208,240), X(209,241), X(210,242), X(211,243), X(212,244), X(213,245), + X(214,246), X(215,247), X(216,248), X(217,249), X(218,250), X(219,251), + X(220,252), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(227,243), X(228,244), + X(229,245), X(230,246), X(231,247), X(232,248), X(233,249), X(234,250), + X(235,251), X(236,252), X(17,129), X(18,130), X(19,131), X(20,132), X(21,133), + X(22,134), X(23,135), X(24,136), X(25,137), X(26,138), X(27,139), X(28,140), + X(29,141), X(30,142), X(31,143), X(32,144), X(49,161), X(50,162), X(51,163), + X(52,164), X(53,165), X(54,166), X(55,167), X(56,168), X(57,169), X(58,170), + X(59,171), X(60,172), X(61,173), X(62,174), X(63,175), X(64,176), X(81,193), + X(82,194), X(83,195), X(84,196), X(85,197), X(86,198), X(87,199), X(88,200), + X(89,201), X(90,202), X(91,203), X(92,204), X(93,205), X(94,206), X(95,207), + X(96,208), X(113,225), X(114,226), X(115,227), X(116,228), X(117,229), + X(118,230), X(119,231), X(120,232), X(121,233), X(122,234), X(123,235), + X(124,236), X(125,237), X(126,238), X(127,239), X(128,240), X(17,65), X(18,66), + X(19,67), X(20,68), X(21,69), X(22,70), X(23,71), X(24,72), X(25,73), X(26,74), + X(27,75), X(28,76), X(29,77), X(30,78), X(31,79), X(32,80), X(49,97), X(50,98), + X(51,99), X(52,100), X(53,101), X(54,102), X(55,103), X(56,104), X(57,105), + X(58,106), X(59,107), X(60,108), X(61,109), X(62,110), X(63,111), X(64,112), + X(81,129), X(82,130), X(83,131), X(84,132), X(85,133), X(86,134), X(87,135), + X(88,136), X(89,137), X(90,138), X(91,139), X(92,140), X(93,141), X(94,142), + X(95,143), X(96,144), X(113,161), X(114,162), X(115,163), X(116,164), + X(117,165), X(118,166), X(119,167), X(120,168), X(121,169), X(122,170), + X(123,171), X(124,172), X(125,173), X(126,174), X(127,175), X(128,176), + X(145,193), X(146,194), X(147,195), X(148,196), X(149,197), X(150,198), + X(151,199), X(152,200), X(153,201), X(154,202), X(155,203), X(156,204), + X(157,205), X(158,206), X(159,207), X(160,208), X(177,225), X(178,226), + X(179,227), X(180,228), X(181,229), X(182,230), X(183,231), X(184,232), + X(185,233), X(186,234), X(187,235), X(188,236), X(189,237), X(190,238), + X(191,239), X(192,240), X(17,33), X(18,34), X(19,35), X(20,36), X(21,37), + X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), X(27,43), X(28,44), X(29,45), + X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), X(51,67), X(52,68), X(53,69), + X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), X(59,75), X(60,76), X(61,77), + X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), X(83,99), X(84,100), + X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), X(90,106), X(91,107), + X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), X(113,129), X(114,130), + X(115,131), X(116,132), X(117,133), X(118,134), X(119,135), X(120,136), + X(121,137), X(122,138), X(123,139), X(124,140), X(125,141), X(126,142), + X(127,143), X(128,144), X(145,161), X(146,162), X(147,163), X(148,164), + X(149,165), X(150,166), X(151,167), X(152,168), X(153,169), X(154,170), + X(155,171), X(156,172), X(157,173), X(158,174), X(159,175), X(160,176), + X(177,193), X(178,194), X(179,195), X(180,196), X(181,197), X(182,198), + X(183,199), X(184,200), X(185,201), X(186,202), X(187,203), X(188,204), + X(189,205), X(190,206), X(191,207), X(192,208), X(209,225), X(210,226), + X(211,227), X(212,228), X(213,229), X(214,230), X(215,231), X(216,232), + X(217,233), X(218,234), X(219,235), X(220,236), X(221,237), X(222,238), + X(223,239), X(224,240), X(1,9), X(2,10), X(3,11), X(4,12), X(5,13), X(6,14), + X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), X(20,28), X(21,29), X(22,30), + X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), X(36,44), X(37,45), X(38,46), + X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), X(52,60), X(53,61), X(54,62), + X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), X(68,76), X(69,77), X(70,78), + X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), X(84,92), X(85,93), X(86,94), + X(87,95), X(88,96), X(97,105), X(98,106), X(99,107), X(100,108), X(101,109), + X(102,110), X(103,111), X(104,112), X(113,121), X(114,122), X(115,123), + X(116,124), X(117,125), X(118,126), X(119,127), X(120,128), X(129,137), + X(130,138), X(131,139), X(132,140), X(133,141), X(134,142), X(135,143), + X(136,144), X(145,153), X(146,154), X(147,155), X(148,156), X(149,157), + X(150,158), X(151,159), X(152,160), X(161,169), X(162,170), X(163,171), + X(164,172), X(165,173), X(166,174), X(167,175), X(168,176), X(177,185), + X(178,186), X(179,187), X(180,188), X(181,189), X(182,190), X(183,191), + X(184,192), X(193,201), X(194,202), X(195,203), X(196,204), X(197,205), + X(198,206), X(199,207), X(200,208), X(209,217), X(210,218), X(211,219), + X(212,220), X(213,221), X(214,222), X(215,223), X(216,224), X(225,233), + X(226,234), X(227,235), X(228,236), X(229,237), X(230,238), X(231,239), + X(232,240), X(241,249), X(242,250), X(243,251), X(244,252), X(9,129), + X(10,130), X(11,131), X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), + X(25,145), X(26,146), X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), + X(32,152), X(41,161), X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), + X(47,167), X(48,168), X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), + X(62,182), X(63,183), X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), + X(77,197), X(78,198), X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), + X(92,212), X(93,213), X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), + X(107,227), X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), + X(121,241), X(122,242), X(123,243), X(124,244), X(125,245), X(126,246), + X(127,247), X(128,248), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), + X(14,70), X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), + X(30,86), X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), + X(45,101), X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), + X(60,116), X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), + X(75,131), X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), + X(90,146), X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), + X(105,161), X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), + X(111,167), X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), + X(125,181), X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), + X(139,195), X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), + X(153,209), X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), + X(159,215), X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), + X(173,229), X(174,230), X(175,231), X(176,232), X(185,241), X(186,242), + X(187,243), X(188,244), X(189,245), X(190,246), X(191,247), X(192,248), + X(9,33), X(10,34), X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), + X(25,49), X(26,50), X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), + X(41,65), X(42,66), X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), + X(57,81), X(58,82), X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), + X(73,97), X(74,98), X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), + X(80,104), X(89,113), X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), + X(95,119), X(96,120), X(105,129), X(106,130), X(107,131), X(108,132), + X(109,133), X(110,134), X(111,135), X(112,136), X(121,145), X(122,146), + X(123,147), X(124,148), X(125,149), X(126,150), X(127,151), X(128,152), + X(137,161), X(138,162), X(139,163), X(140,164), X(141,165), X(142,166), + X(143,167), X(144,168), X(153,177), X(154,178), X(155,179), X(156,180), + X(157,181), X(158,182), X(159,183), X(160,184), X(169,193), X(170,194), + X(171,195), X(172,196), X(173,197), X(174,198), X(175,199), X(176,200), + X(185,209), X(186,210), X(187,211), X(188,212), X(189,213), X(190,214), + X(191,215), X(192,216), X(201,225), X(202,226), X(203,227), X(204,228), + X(205,229), X(206,230), X(207,231), X(208,232), X(217,241), X(218,242), + X(219,243), X(220,244), X(221,245), X(222,246), X(223,247), X(224,248), + X(9,17), X(10,18), X(11,19), X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), + X(25,33), X(26,34), X(27,35), X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), + X(41,49), X(42,50), X(43,51), X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), + X(57,65), X(58,66), X(59,67), X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), + X(73,81), X(74,82), X(75,83), X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), + X(89,97), X(90,98), X(91,99), X(92,100), X(93,101), X(94,102), X(95,103), + X(96,104), X(105,113), X(106,114), X(107,115), X(108,116), X(109,117), + X(110,118), X(111,119), X(112,120), X(121,129), X(122,130), X(123,131), + X(124,132), X(125,133), X(126,134), X(127,135), X(128,136), X(137,145), + X(138,146), X(139,147), X(140,148), X(141,149), X(142,150), X(143,151), + X(144,152), X(153,161), X(154,162), X(155,163), X(156,164), X(157,165), + X(158,166), X(159,167), X(160,168), X(169,177), X(170,178), X(171,179), + X(172,180), X(173,181), X(174,182), X(175,183), X(176,184), X(185,193), + X(186,194), X(187,195), X(188,196), X(189,197), X(190,198), X(191,199), + X(192,200), X(201,209), X(202,210), X(203,211), X(204,212), X(205,213), + X(206,214), X(207,215), X(208,216), X(217,225), X(218,226), X(219,227), + X(220,228), X(221,229), X(222,230), X(223,231), X(224,232), X(233,241), + X(234,242), X(235,243), X(236,244), X(237,245), X(238,246), X(239,247), + X(240,248), X(1,5), X(2,6), X(3,7), X(4,8), X(9,13), X(10,14), X(11,15), + X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), X(25,29), X(26,30), X(27,31), + X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), X(41,45), X(42,46), X(43,47), + X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), X(57,61), X(58,62), X(59,63), + X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), X(73,77), X(74,78), X(75,79), + X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), X(89,93), X(90,94), X(91,95), + X(92,96), X(97,101), X(98,102), X(99,103), X(100,104), X(105,109), X(106,110), + X(107,111), X(108,112), X(113,117), X(114,118), X(115,119), X(116,120), + X(121,125), X(122,126), X(123,127), X(124,128), X(129,133), X(130,134), + X(131,135), X(132,136), X(137,141), X(138,142), X(139,143), X(140,144), + X(145,149), X(146,150), X(147,151), X(148,152), X(153,157), X(154,158), + X(155,159), X(156,160), X(161,165), X(162,166), X(163,167), X(164,168), + X(169,173), X(170,174), X(171,175), X(172,176), X(177,181), X(178,182), + X(179,183), X(180,184), X(185,189), X(186,190), X(187,191), X(188,192), + X(193,197), X(194,198), X(195,199), X(196,200), X(201,205), X(202,206), + X(203,207), X(204,208), X(209,213), X(210,214), X(211,215), X(212,216), + X(217,221), X(218,222), X(219,223), X(220,224), X(225,229), X(226,230), + X(227,231), X(228,232), X(233,237), X(234,238), X(235,239), X(236,240), + X(241,245), X(242,246), X(243,247), X(244,248), X(5,129), X(6,130), X(7,131), + X(8,132), X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), + X(23,147), X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), + X(38,162), X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), + X(53,177), X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), + X(64,188), X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), + X(79,203), X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), + X(94,218), X(95,219), X(96,220), X(101,225), X(102,226), X(103,227), + X(104,228), X(109,233), X(110,234), X(111,235), X(112,236), X(117,241), + X(118,242), X(119,243), X(120,244), X(125,249), X(126,250), X(127,251), + X(128,252), X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), + X(16,76), X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), + X(32,92), X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), + X(47,107), X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), + X(62,122), X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), + X(77,137), X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), + X(88,148), X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), + X(103,163), X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), + X(117,177), X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), + X(127,187), X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), + X(141,201), X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), + X(151,211), X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), + X(165,225), X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), + X(175,235), X(176,236), X(181,241), X(182,242), X(183,243), X(184,244), + X(189,249), X(190,250), X(191,251), X(192,252), X(5,33), X(6,34), X(7,35), + X(8,36), X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), + X(24,52), X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), + X(40,68), X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), + X(56,84), X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), X(197,225), + X(198,226), X(199,227), X(200,228), X(205,233), X(206,234), X(207,235), + X(208,236), X(213,241), X(214,242), X(215,243), X(216,244), X(221,249), + X(222,250), X(223,251), X(224,252), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), + X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), X(222,234), + X(223,235), X(224,236), X(229,241), X(230,242), X(231,243), X(232,244), + X(237,249), X(238,250), X(239,251), X(240,252), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), + X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), + X(223,227), X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), + X(237,241), X(238,242), X(239,243), X(240,244), X(245,249), X(246,250), + X(247,251), X(248,252), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), X(213,215), + X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), X(225,227), + X(226,228), X(229,231), X(230,232), X(233,235), X(234,236), X(237,239), + X(238,240), X(241,243), X(242,244), X(245,247), X(246,248), X(249,251), + X(250,252), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(99,225), X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), + X(111,237), X(112,238), X(115,241), X(116,242), X(119,245), X(120,246), + X(123,249), X(124,250), X(3,65), X(4,66), X(7,69), X(8,70), X(11,73), X(12,74), + X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), X(24,86), X(27,89), X(28,90), + X(31,93), X(32,94), X(35,97), X(36,98), X(39,101), X(40,102), X(43,105), + X(44,106), X(47,109), X(48,110), X(51,113), X(52,114), X(55,117), X(56,118), + X(59,121), X(60,122), X(63,125), X(64,126), X(67,129), X(68,130), X(71,133), + X(72,134), X(75,137), X(76,138), X(79,141), X(80,142), X(83,145), X(84,146), + X(87,149), X(88,150), X(91,153), X(92,154), X(95,157), X(96,158), X(99,161), + X(100,162), X(103,165), X(104,166), X(107,169), X(108,170), X(111,173), + X(112,174), X(115,177), X(116,178), X(119,181), X(120,182), X(123,185), + X(124,186), X(127,189), X(128,190), X(131,193), X(132,194), X(135,197), + X(136,198), X(139,201), X(140,202), X(143,205), X(144,206), X(147,209), + X(148,210), X(151,213), X(152,214), X(155,217), X(156,218), X(159,221), + X(160,222), X(163,225), X(164,226), X(167,229), X(168,230), X(171,233), + X(172,234), X(175,237), X(176,238), X(179,241), X(180,242), X(183,245), + X(184,246), X(187,249), X(188,250), X(3,33), X(4,34), X(7,37), X(8,38), + X(11,41), X(12,42), X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), + X(27,57), X(28,58), X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), + X(43,73), X(44,74), X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), + X(59,89), X(60,90), X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), + X(72,102), X(75,105), X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), + X(87,117), X(88,118), X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), + X(100,130), X(103,133), X(104,134), X(107,137), X(108,138), X(111,141), + X(112,142), X(115,145), X(116,146), X(119,149), X(120,150), X(123,153), + X(124,154), X(127,157), X(128,158), X(131,161), X(132,162), X(135,165), + X(136,166), X(139,169), X(140,170), X(143,173), X(144,174), X(147,177), + X(148,178), X(151,181), X(152,182), X(155,185), X(156,186), X(159,189), + X(160,190), X(163,193), X(164,194), X(167,197), X(168,198), X(171,201), + X(172,202), X(175,205), X(176,206), X(179,209), X(180,210), X(183,213), + X(184,214), X(187,217), X(188,218), X(191,221), X(192,222), X(195,225), + X(196,226), X(199,229), X(200,230), X(203,233), X(204,234), X(207,237), + X(208,238), X(211,241), X(212,242), X(215,245), X(216,246), X(219,249), + X(220,250), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), + X(215,229), X(216,230), X(219,233), X(220,234), X(223,237), X(224,238), + X(227,241), X(228,242), X(231,245), X(232,246), X(235,249), X(236,250), X(3,9), + X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), X(15,21), X(16,22), X(19,25), + X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), X(31,37), X(32,38), X(35,41), + X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), X(47,53), X(48,54), X(51,57), + X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), X(63,69), X(64,70), X(67,73), + X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), X(79,85), X(80,86), X(83,89), + X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), X(95,101), X(96,102), + X(99,105), X(100,106), X(103,109), X(104,110), X(107,113), X(108,114), + X(111,117), X(112,118), X(115,121), X(116,122), X(119,125), X(120,126), + X(123,129), X(124,130), X(127,133), X(128,134), X(131,137), X(132,138), + X(135,141), X(136,142), X(139,145), X(140,146), X(143,149), X(144,150), + X(147,153), X(148,154), X(151,157), X(152,158), X(155,161), X(156,162), + X(159,165), X(160,166), X(163,169), X(164,170), X(167,173), X(168,174), + X(171,177), X(172,178), X(175,181), X(176,182), X(179,185), X(180,186), + X(183,189), X(184,190), X(187,193), X(188,194), X(191,197), X(192,198), + X(195,201), X(196,202), X(199,205), X(200,206), X(203,209), X(204,210), + X(207,213), X(208,214), X(211,217), X(212,218), X(215,221), X(216,222), + X(219,225), X(220,226), X(223,229), X(224,230), X(227,233), X(228,234), + X(231,237), X(232,238), X(235,241), X(236,242), X(239,245), X(240,246), + X(243,249), X(244,250), X(3,5), X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), + X(15,17), X(16,18), X(19,21), X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), + X(31,33), X(32,34), X(35,37), X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), + X(47,49), X(48,50), X(51,53), X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), + X(63,65), X(64,66), X(67,69), X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), + X(79,81), X(80,82), X(83,85), X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), + X(95,97), X(96,98), X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), + X(108,110), X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), + X(120,122), X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), + X(132,134), X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), + X(144,146), X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), + X(156,158), X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), + X(168,170), X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), + X(180,182), X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), + X(192,194), X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), + X(204,206), X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), + X(216,218), X(219,221), X(220,222), X(223,225), X(224,226), X(227,229), + X(228,230), X(231,233), X(232,234), X(235,237), X(236,238), X(239,241), + X(240,242), X(243,245), X(244,246), X(247,249), X(248,250), X(1,2), X(3,4), + X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), X(19,20), + X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), X(35,36), + X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), X(51,52), + X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), X(67,68), + X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), X(83,84), + X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(243,244), X(245,246), X(247,248), X(249,250), X(251,252), X(2,129), X(4,131), + X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), X(16,143), X(18,145), + X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), X(30,157), X(32,159), + X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), X(44,171), X(46,173), + X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), X(58,185), X(60,187), + X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), X(72,199), X(74,201), + X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), X(86,213), X(88,215), + X(90,217), X(92,219), X(94,221), X(96,223), X(98,225), X(100,227), X(102,229), + X(104,231), X(106,233), X(108,235), X(110,237), X(112,239), X(114,241), + X(116,243), X(118,245), X(120,247), X(122,249), X(124,251), X(2,65), X(4,67), + X(6,69), X(8,71), X(10,73), X(12,75), X(14,77), X(16,79), X(18,81), X(20,83), + X(22,85), X(24,87), X(26,89), X(28,91), X(30,93), X(32,95), X(34,97), X(36,99), + X(38,101), X(40,103), X(42,105), X(44,107), X(46,109), X(48,111), X(50,113), + X(52,115), X(54,117), X(56,119), X(58,121), X(60,123), X(62,125), X(64,127), + X(66,129), X(68,131), X(70,133), X(72,135), X(74,137), X(76,139), X(78,141), + X(80,143), X(82,145), X(84,147), X(86,149), X(88,151), X(90,153), X(92,155), + X(94,157), X(96,159), X(98,161), X(100,163), X(102,165), X(104,167), + X(106,169), X(108,171), X(110,173), X(112,175), X(114,177), X(116,179), + X(118,181), X(120,183), X(122,185), X(124,187), X(126,189), X(128,191), + X(130,193), X(132,195), X(134,197), X(136,199), X(138,201), X(140,203), + X(142,205), X(144,207), X(146,209), X(148,211), X(150,213), X(152,215), + X(154,217), X(156,219), X(158,221), X(160,223), X(162,225), X(164,227), + X(166,229), X(168,231), X(170,233), X(172,235), X(174,237), X(176,239), + X(178,241), X(180,243), X(182,245), X(184,247), X(186,249), X(188,251), + X(2,33), X(4,35), X(6,37), X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), + X(18,49), X(20,51), X(22,53), X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), + X(34,65), X(36,67), X(38,69), X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), + X(50,81), X(52,83), X(54,85), X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), + X(66,97), X(68,99), X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), + X(80,111), X(82,113), X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), + X(94,125), X(96,127), X(98,129), X(100,131), X(102,133), X(104,135), + X(106,137), X(108,139), X(110,141), X(112,143), X(114,145), X(116,147), + X(118,149), X(120,151), X(122,153), X(124,155), X(126,157), X(128,159), + X(130,161), X(132,163), X(134,165), X(136,167), X(138,169), X(140,171), + X(142,173), X(144,175), X(146,177), X(148,179), X(150,181), X(152,183), + X(154,185), X(156,187), X(158,189), X(160,191), X(162,193), X(164,195), + X(166,197), X(168,199), X(170,201), X(172,203), X(174,205), X(176,207), + X(178,209), X(180,211), X(182,213), X(184,215), X(186,217), X(188,219), + X(190,221), X(192,223), X(194,225), X(196,227), X(198,229), X(200,231), + X(202,233), X(204,235), X(206,237), X(208,239), X(210,241), X(212,243), + X(214,245), X(216,247), X(218,249), X(220,251), X(2,17), X(4,19), X(6,21), + X(8,23), X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), + X(24,39), X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), + X(40,55), X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), + X(56,71), X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), + X(72,87), X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), + X(86,101), X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), + X(100,115), X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), + X(112,127), X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), + X(124,139), X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), + X(136,151), X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), + X(148,163), X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), + X(160,175), X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), + X(172,187), X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), + X(184,199), X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), + X(196,211), X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), + X(208,223), X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), + X(220,235), X(222,237), X(224,239), X(226,241), X(228,243), X(230,245), + X(232,247), X(234,249), X(236,251), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), + X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), + X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), + X(224,231), X(226,233), X(228,235), X(230,237), X(232,239), X(234,241), + X(236,243), X(238,245), X(240,247), X(242,249), X(244,251), X(2,5), X(4,7), + X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), X(20,23), + X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), X(36,39), + X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), X(52,55), + X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), X(68,71), + X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), X(84,87), + X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), X(98,101), + X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), X(110,113), + X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), X(122,125), + X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), X(134,137), + X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), X(146,149), + X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), X(158,161), + X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), X(170,173), + X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), X(182,185), + X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), X(194,197), + X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), X(206,209), + X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), X(218,221), + X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), X(230,233), + X(232,235), X(234,237), X(236,239), X(238,241), X(240,243), X(242,245), + X(244,247), X(246,249), X(248,251), X(2,3), X(4,5), X(6,7), X(8,9), X(10,11), + X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), X(22,23), X(24,25), X(26,27), + X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), X(38,39), X(40,41), X(42,43), + X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), X(54,55), X(56,57), X(58,59), + X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), X(70,71), X(72,73), X(74,75), + X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), X(86,87), X(88,89), X(90,91), + X(92,93), X(94,95), X(96,97), X(98,99), X(100,101), X(102,103), X(104,105), + X(106,107), X(108,109), X(110,111), X(112,113), X(114,115), X(116,117), + X(118,119), X(120,121), X(122,123), X(124,125), X(126,127), X(128,129), + X(130,131), X(132,133), X(134,135), X(136,137), X(138,139), X(140,141), + X(142,143), X(144,145), X(146,147), X(148,149), X(150,151), X(152,153), + X(154,155), X(156,157), X(158,159), X(160,161), X(162,163), X(164,165), + X(166,167), X(168,169), X(170,171), X(172,173), X(174,175), X(176,177), + X(178,179), X(180,181), X(182,183), X(184,185), X(186,187), X(188,189), + X(190,191), X(192,193), X(194,195), X(196,197), X(198,199), X(200,201), + X(202,203), X(204,205), X(206,207), X(208,209), X(210,211), X(212,213), + X(214,215), X(216,217), X(218,219), X(220,221), X(222,223), X(224,225), + X(226,227), X(228,229), X(230,231), X(232,233), X(234,235), X(236,237), + X(238,239), X(240,241), X(242,243), X(244,245), X(246,247), X(248,249), + X(250,251) +}; +S(254) = { + X(1,129), X(2,130), X(3,131), X(4,132), X(5,133), X(6,134), X(7,135), + X(8,136), X(9,137), X(10,138), X(11,139), X(12,140), X(13,141), X(14,142), + X(15,143), X(16,144), X(17,145), X(18,146), X(19,147), X(20,148), X(21,149), + X(22,150), X(23,151), X(24,152), X(25,153), X(26,154), X(27,155), X(28,156), + X(29,157), X(30,158), X(31,159), X(32,160), X(33,161), X(34,162), X(35,163), + X(36,164), X(37,165), X(38,166), X(39,167), X(40,168), X(41,169), X(42,170), + X(43,171), X(44,172), X(45,173), X(46,174), X(47,175), X(48,176), X(49,177), + X(50,178), X(51,179), X(52,180), X(53,181), X(54,182), X(55,183), X(56,184), + X(57,185), X(58,186), X(59,187), X(60,188), X(61,189), X(62,190), X(63,191), + X(64,192), X(65,193), X(66,194), X(67,195), X(68,196), X(69,197), X(70,198), + X(71,199), X(72,200), X(73,201), X(74,202), X(75,203), X(76,204), X(77,205), + X(78,206), X(79,207), X(80,208), X(81,209), X(82,210), X(83,211), X(84,212), + X(85,213), X(86,214), X(87,215), X(88,216), X(89,217), X(90,218), X(91,219), + X(92,220), X(93,221), X(94,222), X(95,223), X(96,224), X(97,225), X(98,226), + X(99,227), X(100,228), X(101,229), X(102,230), X(103,231), X(104,232), + X(105,233), X(106,234), X(107,235), X(108,236), X(109,237), X(110,238), + X(111,239), X(112,240), X(113,241), X(114,242), X(115,243), X(116,244), + X(117,245), X(118,246), X(119,247), X(120,248), X(121,249), X(122,250), + X(123,251), X(124,252), X(125,253), X(126,254), X(1,65), X(2,66), X(3,67), + X(4,68), X(5,69), X(6,70), X(7,71), X(8,72), X(9,73), X(10,74), X(11,75), + X(12,76), X(13,77), X(14,78), X(15,79), X(16,80), X(17,81), X(18,82), X(19,83), + X(20,84), X(21,85), X(22,86), X(23,87), X(24,88), X(25,89), X(26,90), X(27,91), + X(28,92), X(29,93), X(30,94), X(31,95), X(32,96), X(33,97), X(34,98), X(35,99), + X(36,100), X(37,101), X(38,102), X(39,103), X(40,104), X(41,105), X(42,106), + X(43,107), X(44,108), X(45,109), X(46,110), X(47,111), X(48,112), X(49,113), + X(50,114), X(51,115), X(52,116), X(53,117), X(54,118), X(55,119), X(56,120), + X(57,121), X(58,122), X(59,123), X(60,124), X(61,125), X(62,126), X(63,127), + X(64,128), X(129,193), X(130,194), X(131,195), X(132,196), X(133,197), + X(134,198), X(135,199), X(136,200), X(137,201), X(138,202), X(139,203), + X(140,204), X(141,205), X(142,206), X(143,207), X(144,208), X(145,209), + X(146,210), X(147,211), X(148,212), X(149,213), X(150,214), X(151,215), + X(152,216), X(153,217), X(154,218), X(155,219), X(156,220), X(157,221), + X(158,222), X(159,223), X(160,224), X(161,225), X(162,226), X(163,227), + X(164,228), X(165,229), X(166,230), X(167,231), X(168,232), X(169,233), + X(170,234), X(171,235), X(172,236), X(173,237), X(174,238), X(175,239), + X(176,240), X(177,241), X(178,242), X(179,243), X(180,244), X(181,245), + X(182,246), X(183,247), X(184,248), X(185,249), X(186,250), X(187,251), + X(188,252), X(189,253), X(190,254), X(65,129), X(66,130), X(67,131), X(68,132), + X(69,133), X(70,134), X(71,135), X(72,136), X(73,137), X(74,138), X(75,139), + X(76,140), X(77,141), X(78,142), X(79,143), X(80,144), X(81,145), X(82,146), + X(83,147), X(84,148), X(85,149), X(86,150), X(87,151), X(88,152), X(89,153), + X(90,154), X(91,155), X(92,156), X(93,157), X(94,158), X(95,159), X(96,160), + X(97,161), X(98,162), X(99,163), X(100,164), X(101,165), X(102,166), + X(103,167), X(104,168), X(105,169), X(106,170), X(107,171), X(108,172), + X(109,173), X(110,174), X(111,175), X(112,176), X(113,177), X(114,178), + X(115,179), X(116,180), X(117,181), X(118,182), X(119,183), X(120,184), + X(121,185), X(122,186), X(123,187), X(124,188), X(125,189), X(126,190), + X(127,191), X(128,192), X(1,33), X(2,34), X(3,35), X(4,36), X(5,37), X(6,38), + X(7,39), X(8,40), X(9,41), X(10,42), X(11,43), X(12,44), X(13,45), X(14,46), + X(15,47), X(16,48), X(17,49), X(18,50), X(19,51), X(20,52), X(21,53), X(22,54), + X(23,55), X(24,56), X(25,57), X(26,58), X(27,59), X(28,60), X(29,61), X(30,62), + X(31,63), X(32,64), X(65,97), X(66,98), X(67,99), X(68,100), X(69,101), + X(70,102), X(71,103), X(72,104), X(73,105), X(74,106), X(75,107), X(76,108), + X(77,109), X(78,110), X(79,111), X(80,112), X(81,113), X(82,114), X(83,115), + X(84,116), X(85,117), X(86,118), X(87,119), X(88,120), X(89,121), X(90,122), + X(91,123), X(92,124), X(93,125), X(94,126), X(95,127), X(96,128), X(129,161), + X(130,162), X(131,163), X(132,164), X(133,165), X(134,166), X(135,167), + X(136,168), X(137,169), X(138,170), X(139,171), X(140,172), X(141,173), + X(142,174), X(143,175), X(144,176), X(145,177), X(146,178), X(147,179), + X(148,180), X(149,181), X(150,182), X(151,183), X(152,184), X(153,185), + X(154,186), X(155,187), X(156,188), X(157,189), X(158,190), X(159,191), + X(160,192), X(193,225), X(194,226), X(195,227), X(196,228), X(197,229), + X(198,230), X(199,231), X(200,232), X(201,233), X(202,234), X(203,235), + X(204,236), X(205,237), X(206,238), X(207,239), X(208,240), X(209,241), + X(210,242), X(211,243), X(212,244), X(213,245), X(214,246), X(215,247), + X(216,248), X(217,249), X(218,250), X(219,251), X(220,252), X(221,253), + X(222,254), X(33,129), X(34,130), X(35,131), X(36,132), X(37,133), X(38,134), + X(39,135), X(40,136), X(41,137), X(42,138), X(43,139), X(44,140), X(45,141), + X(46,142), X(47,143), X(48,144), X(49,145), X(50,146), X(51,147), X(52,148), + X(53,149), X(54,150), X(55,151), X(56,152), X(57,153), X(58,154), X(59,155), + X(60,156), X(61,157), X(62,158), X(63,159), X(64,160), X(97,193), X(98,194), + X(99,195), X(100,196), X(101,197), X(102,198), X(103,199), X(104,200), + X(105,201), X(106,202), X(107,203), X(108,204), X(109,205), X(110,206), + X(111,207), X(112,208), X(113,209), X(114,210), X(115,211), X(116,212), + X(117,213), X(118,214), X(119,215), X(120,216), X(121,217), X(122,218), + X(123,219), X(124,220), X(125,221), X(126,222), X(127,223), X(128,224), + X(33,65), X(34,66), X(35,67), X(36,68), X(37,69), X(38,70), X(39,71), X(40,72), + X(41,73), X(42,74), X(43,75), X(44,76), X(45,77), X(46,78), X(47,79), X(48,80), + X(49,81), X(50,82), X(51,83), X(52,84), X(53,85), X(54,86), X(55,87), X(56,88), + X(57,89), X(58,90), X(59,91), X(60,92), X(61,93), X(62,94), X(63,95), X(64,96), + X(97,129), X(98,130), X(99,131), X(100,132), X(101,133), X(102,134), + X(103,135), X(104,136), X(105,137), X(106,138), X(107,139), X(108,140), + X(109,141), X(110,142), X(111,143), X(112,144), X(113,145), X(114,146), + X(115,147), X(116,148), X(117,149), X(118,150), X(119,151), X(120,152), + X(121,153), X(122,154), X(123,155), X(124,156), X(125,157), X(126,158), + X(127,159), X(128,160), X(161,193), X(162,194), X(163,195), X(164,196), + X(165,197), X(166,198), X(167,199), X(168,200), X(169,201), X(170,202), + X(171,203), X(172,204), X(173,205), X(174,206), X(175,207), X(176,208), + X(177,209), X(178,210), X(179,211), X(180,212), X(181,213), X(182,214), + X(183,215), X(184,216), X(185,217), X(186,218), X(187,219), X(188,220), + X(189,221), X(190,222), X(191,223), X(192,224), X(1,17), X(2,18), X(3,19), + X(4,20), X(5,21), X(6,22), X(7,23), X(8,24), X(9,25), X(10,26), X(11,27), + X(12,28), X(13,29), X(14,30), X(15,31), X(16,32), X(33,49), X(34,50), X(35,51), + X(36,52), X(37,53), X(38,54), X(39,55), X(40,56), X(41,57), X(42,58), X(43,59), + X(44,60), X(45,61), X(46,62), X(47,63), X(48,64), X(65,81), X(66,82), X(67,83), + X(68,84), X(69,85), X(70,86), X(71,87), X(72,88), X(73,89), X(74,90), X(75,91), + X(76,92), X(77,93), X(78,94), X(79,95), X(80,96), X(97,113), X(98,114), + X(99,115), X(100,116), X(101,117), X(102,118), X(103,119), X(104,120), + X(105,121), X(106,122), X(107,123), X(108,124), X(109,125), X(110,126), + X(111,127), X(112,128), X(129,145), X(130,146), X(131,147), X(132,148), + X(133,149), X(134,150), X(135,151), X(136,152), X(137,153), X(138,154), + X(139,155), X(140,156), X(141,157), X(142,158), X(143,159), X(144,160), + X(161,177), X(162,178), X(163,179), X(164,180), X(165,181), X(166,182), + X(167,183), X(168,184), X(169,185), X(170,186), X(171,187), X(172,188), + X(173,189), X(174,190), X(175,191), X(176,192), X(193,209), X(194,210), + X(195,211), X(196,212), X(197,213), X(198,214), X(199,215), X(200,216), + X(201,217), X(202,218), X(203,219), X(204,220), X(205,221), X(206,222), + X(207,223), X(208,224), X(225,241), X(226,242), X(227,243), X(228,244), + X(229,245), X(230,246), X(231,247), X(232,248), X(233,249), X(234,250), + X(235,251), X(236,252), X(237,253), X(238,254), X(17,129), X(18,130), + X(19,131), X(20,132), X(21,133), X(22,134), X(23,135), X(24,136), X(25,137), + X(26,138), X(27,139), X(28,140), X(29,141), X(30,142), X(31,143), X(32,144), + X(49,161), X(50,162), X(51,163), X(52,164), X(53,165), X(54,166), X(55,167), + X(56,168), X(57,169), X(58,170), X(59,171), X(60,172), X(61,173), X(62,174), + X(63,175), X(64,176), X(81,193), X(82,194), X(83,195), X(84,196), X(85,197), + X(86,198), X(87,199), X(88,200), X(89,201), X(90,202), X(91,203), X(92,204), + X(93,205), X(94,206), X(95,207), X(96,208), X(113,225), X(114,226), X(115,227), + X(116,228), X(117,229), X(118,230), X(119,231), X(120,232), X(121,233), + X(122,234), X(123,235), X(124,236), X(125,237), X(126,238), X(127,239), + X(128,240), X(17,65), X(18,66), X(19,67), X(20,68), X(21,69), X(22,70), + X(23,71), X(24,72), X(25,73), X(26,74), X(27,75), X(28,76), X(29,77), X(30,78), + X(31,79), X(32,80), X(49,97), X(50,98), X(51,99), X(52,100), X(53,101), + X(54,102), X(55,103), X(56,104), X(57,105), X(58,106), X(59,107), X(60,108), + X(61,109), X(62,110), X(63,111), X(64,112), X(81,129), X(82,130), X(83,131), + X(84,132), X(85,133), X(86,134), X(87,135), X(88,136), X(89,137), X(90,138), + X(91,139), X(92,140), X(93,141), X(94,142), X(95,143), X(96,144), X(113,161), + X(114,162), X(115,163), X(116,164), X(117,165), X(118,166), X(119,167), + X(120,168), X(121,169), X(122,170), X(123,171), X(124,172), X(125,173), + X(126,174), X(127,175), X(128,176), X(145,193), X(146,194), X(147,195), + X(148,196), X(149,197), X(150,198), X(151,199), X(152,200), X(153,201), + X(154,202), X(155,203), X(156,204), X(157,205), X(158,206), X(159,207), + X(160,208), X(177,225), X(178,226), X(179,227), X(180,228), X(181,229), + X(182,230), X(183,231), X(184,232), X(185,233), X(186,234), X(187,235), + X(188,236), X(189,237), X(190,238), X(191,239), X(192,240), X(17,33), X(18,34), + X(19,35), X(20,36), X(21,37), X(22,38), X(23,39), X(24,40), X(25,41), X(26,42), + X(27,43), X(28,44), X(29,45), X(30,46), X(31,47), X(32,48), X(49,65), X(50,66), + X(51,67), X(52,68), X(53,69), X(54,70), X(55,71), X(56,72), X(57,73), X(58,74), + X(59,75), X(60,76), X(61,77), X(62,78), X(63,79), X(64,80), X(81,97), X(82,98), + X(83,99), X(84,100), X(85,101), X(86,102), X(87,103), X(88,104), X(89,105), + X(90,106), X(91,107), X(92,108), X(93,109), X(94,110), X(95,111), X(96,112), + X(113,129), X(114,130), X(115,131), X(116,132), X(117,133), X(118,134), + X(119,135), X(120,136), X(121,137), X(122,138), X(123,139), X(124,140), + X(125,141), X(126,142), X(127,143), X(128,144), X(145,161), X(146,162), + X(147,163), X(148,164), X(149,165), X(150,166), X(151,167), X(152,168), + X(153,169), X(154,170), X(155,171), X(156,172), X(157,173), X(158,174), + X(159,175), X(160,176), X(177,193), X(178,194), X(179,195), X(180,196), + X(181,197), X(182,198), X(183,199), X(184,200), X(185,201), X(186,202), + X(187,203), X(188,204), X(189,205), X(190,206), X(191,207), X(192,208), + X(209,225), X(210,226), X(211,227), X(212,228), X(213,229), X(214,230), + X(215,231), X(216,232), X(217,233), X(218,234), X(219,235), X(220,236), + X(221,237), X(222,238), X(223,239), X(224,240), X(1,9), X(2,10), X(3,11), + X(4,12), X(5,13), X(6,14), X(7,15), X(8,16), X(17,25), X(18,26), X(19,27), + X(20,28), X(21,29), X(22,30), X(23,31), X(24,32), X(33,41), X(34,42), X(35,43), + X(36,44), X(37,45), X(38,46), X(39,47), X(40,48), X(49,57), X(50,58), X(51,59), + X(52,60), X(53,61), X(54,62), X(55,63), X(56,64), X(65,73), X(66,74), X(67,75), + X(68,76), X(69,77), X(70,78), X(71,79), X(72,80), X(81,89), X(82,90), X(83,91), + X(84,92), X(85,93), X(86,94), X(87,95), X(88,96), X(97,105), X(98,106), + X(99,107), X(100,108), X(101,109), X(102,110), X(103,111), X(104,112), + X(113,121), X(114,122), X(115,123), X(116,124), X(117,125), X(118,126), + X(119,127), X(120,128), X(129,137), X(130,138), X(131,139), X(132,140), + X(133,141), X(134,142), X(135,143), X(136,144), X(145,153), X(146,154), + X(147,155), X(148,156), X(149,157), X(150,158), X(151,159), X(152,160), + X(161,169), X(162,170), X(163,171), X(164,172), X(165,173), X(166,174), + X(167,175), X(168,176), X(177,185), X(178,186), X(179,187), X(180,188), + X(181,189), X(182,190), X(183,191), X(184,192), X(193,201), X(194,202), + X(195,203), X(196,204), X(197,205), X(198,206), X(199,207), X(200,208), + X(209,217), X(210,218), X(211,219), X(212,220), X(213,221), X(214,222), + X(215,223), X(216,224), X(225,233), X(226,234), X(227,235), X(228,236), + X(229,237), X(230,238), X(231,239), X(232,240), X(241,249), X(242,250), + X(243,251), X(244,252), X(245,253), X(246,254), X(9,129), X(10,130), X(11,131), + X(12,132), X(13,133), X(14,134), X(15,135), X(16,136), X(25,145), X(26,146), + X(27,147), X(28,148), X(29,149), X(30,150), X(31,151), X(32,152), X(41,161), + X(42,162), X(43,163), X(44,164), X(45,165), X(46,166), X(47,167), X(48,168), + X(57,177), X(58,178), X(59,179), X(60,180), X(61,181), X(62,182), X(63,183), + X(64,184), X(73,193), X(74,194), X(75,195), X(76,196), X(77,197), X(78,198), + X(79,199), X(80,200), X(89,209), X(90,210), X(91,211), X(92,212), X(93,213), + X(94,214), X(95,215), X(96,216), X(105,225), X(106,226), X(107,227), + X(108,228), X(109,229), X(110,230), X(111,231), X(112,232), X(121,241), + X(122,242), X(123,243), X(124,244), X(125,245), X(126,246), X(127,247), + X(128,248), X(9,65), X(10,66), X(11,67), X(12,68), X(13,69), X(14,70), + X(15,71), X(16,72), X(25,81), X(26,82), X(27,83), X(28,84), X(29,85), X(30,86), + X(31,87), X(32,88), X(41,97), X(42,98), X(43,99), X(44,100), X(45,101), + X(46,102), X(47,103), X(48,104), X(57,113), X(58,114), X(59,115), X(60,116), + X(61,117), X(62,118), X(63,119), X(64,120), X(73,129), X(74,130), X(75,131), + X(76,132), X(77,133), X(78,134), X(79,135), X(80,136), X(89,145), X(90,146), + X(91,147), X(92,148), X(93,149), X(94,150), X(95,151), X(96,152), X(105,161), + X(106,162), X(107,163), X(108,164), X(109,165), X(110,166), X(111,167), + X(112,168), X(121,177), X(122,178), X(123,179), X(124,180), X(125,181), + X(126,182), X(127,183), X(128,184), X(137,193), X(138,194), X(139,195), + X(140,196), X(141,197), X(142,198), X(143,199), X(144,200), X(153,209), + X(154,210), X(155,211), X(156,212), X(157,213), X(158,214), X(159,215), + X(160,216), X(169,225), X(170,226), X(171,227), X(172,228), X(173,229), + X(174,230), X(175,231), X(176,232), X(185,241), X(186,242), X(187,243), + X(188,244), X(189,245), X(190,246), X(191,247), X(192,248), X(9,33), X(10,34), + X(11,35), X(12,36), X(13,37), X(14,38), X(15,39), X(16,40), X(25,49), X(26,50), + X(27,51), X(28,52), X(29,53), X(30,54), X(31,55), X(32,56), X(41,65), X(42,66), + X(43,67), X(44,68), X(45,69), X(46,70), X(47,71), X(48,72), X(57,81), X(58,82), + X(59,83), X(60,84), X(61,85), X(62,86), X(63,87), X(64,88), X(73,97), X(74,98), + X(75,99), X(76,100), X(77,101), X(78,102), X(79,103), X(80,104), X(89,113), + X(90,114), X(91,115), X(92,116), X(93,117), X(94,118), X(95,119), X(96,120), + X(105,129), X(106,130), X(107,131), X(108,132), X(109,133), X(110,134), + X(111,135), X(112,136), X(121,145), X(122,146), X(123,147), X(124,148), + X(125,149), X(126,150), X(127,151), X(128,152), X(137,161), X(138,162), + X(139,163), X(140,164), X(141,165), X(142,166), X(143,167), X(144,168), + X(153,177), X(154,178), X(155,179), X(156,180), X(157,181), X(158,182), + X(159,183), X(160,184), X(169,193), X(170,194), X(171,195), X(172,196), + X(173,197), X(174,198), X(175,199), X(176,200), X(185,209), X(186,210), + X(187,211), X(188,212), X(189,213), X(190,214), X(191,215), X(192,216), + X(201,225), X(202,226), X(203,227), X(204,228), X(205,229), X(206,230), + X(207,231), X(208,232), X(217,241), X(218,242), X(219,243), X(220,244), + X(221,245), X(222,246), X(223,247), X(224,248), X(9,17), X(10,18), X(11,19), + X(12,20), X(13,21), X(14,22), X(15,23), X(16,24), X(25,33), X(26,34), X(27,35), + X(28,36), X(29,37), X(30,38), X(31,39), X(32,40), X(41,49), X(42,50), X(43,51), + X(44,52), X(45,53), X(46,54), X(47,55), X(48,56), X(57,65), X(58,66), X(59,67), + X(60,68), X(61,69), X(62,70), X(63,71), X(64,72), X(73,81), X(74,82), X(75,83), + X(76,84), X(77,85), X(78,86), X(79,87), X(80,88), X(89,97), X(90,98), X(91,99), + X(92,100), X(93,101), X(94,102), X(95,103), X(96,104), X(105,113), X(106,114), + X(107,115), X(108,116), X(109,117), X(110,118), X(111,119), X(112,120), + X(121,129), X(122,130), X(123,131), X(124,132), X(125,133), X(126,134), + X(127,135), X(128,136), X(137,145), X(138,146), X(139,147), X(140,148), + X(141,149), X(142,150), X(143,151), X(144,152), X(153,161), X(154,162), + X(155,163), X(156,164), X(157,165), X(158,166), X(159,167), X(160,168), + X(169,177), X(170,178), X(171,179), X(172,180), X(173,181), X(174,182), + X(175,183), X(176,184), X(185,193), X(186,194), X(187,195), X(188,196), + X(189,197), X(190,198), X(191,199), X(192,200), X(201,209), X(202,210), + X(203,211), X(204,212), X(205,213), X(206,214), X(207,215), X(208,216), + X(217,225), X(218,226), X(219,227), X(220,228), X(221,229), X(222,230), + X(223,231), X(224,232), X(233,241), X(234,242), X(235,243), X(236,244), + X(237,245), X(238,246), X(239,247), X(240,248), X(1,5), X(2,6), X(3,7), X(4,8), + X(9,13), X(10,14), X(11,15), X(12,16), X(17,21), X(18,22), X(19,23), X(20,24), + X(25,29), X(26,30), X(27,31), X(28,32), X(33,37), X(34,38), X(35,39), X(36,40), + X(41,45), X(42,46), X(43,47), X(44,48), X(49,53), X(50,54), X(51,55), X(52,56), + X(57,61), X(58,62), X(59,63), X(60,64), X(65,69), X(66,70), X(67,71), X(68,72), + X(73,77), X(74,78), X(75,79), X(76,80), X(81,85), X(82,86), X(83,87), X(84,88), + X(89,93), X(90,94), X(91,95), X(92,96), X(97,101), X(98,102), X(99,103), + X(100,104), X(105,109), X(106,110), X(107,111), X(108,112), X(113,117), + X(114,118), X(115,119), X(116,120), X(121,125), X(122,126), X(123,127), + X(124,128), X(129,133), X(130,134), X(131,135), X(132,136), X(137,141), + X(138,142), X(139,143), X(140,144), X(145,149), X(146,150), X(147,151), + X(148,152), X(153,157), X(154,158), X(155,159), X(156,160), X(161,165), + X(162,166), X(163,167), X(164,168), X(169,173), X(170,174), X(171,175), + X(172,176), X(177,181), X(178,182), X(179,183), X(180,184), X(185,189), + X(186,190), X(187,191), X(188,192), X(193,197), X(194,198), X(195,199), + X(196,200), X(201,205), X(202,206), X(203,207), X(204,208), X(209,213), + X(210,214), X(211,215), X(212,216), X(217,221), X(218,222), X(219,223), + X(220,224), X(225,229), X(226,230), X(227,231), X(228,232), X(233,237), + X(234,238), X(235,239), X(236,240), X(241,245), X(242,246), X(243,247), + X(244,248), X(249,253), X(250,254), X(5,129), X(6,130), X(7,131), X(8,132), + X(13,137), X(14,138), X(15,139), X(16,140), X(21,145), X(22,146), X(23,147), + X(24,148), X(29,153), X(30,154), X(31,155), X(32,156), X(37,161), X(38,162), + X(39,163), X(40,164), X(45,169), X(46,170), X(47,171), X(48,172), X(53,177), + X(54,178), X(55,179), X(56,180), X(61,185), X(62,186), X(63,187), X(64,188), + X(69,193), X(70,194), X(71,195), X(72,196), X(77,201), X(78,202), X(79,203), + X(80,204), X(85,209), X(86,210), X(87,211), X(88,212), X(93,217), X(94,218), + X(95,219), X(96,220), X(101,225), X(102,226), X(103,227), X(104,228), + X(109,233), X(110,234), X(111,235), X(112,236), X(117,241), X(118,242), + X(119,243), X(120,244), X(125,249), X(126,250), X(127,251), X(128,252), + X(5,65), X(6,66), X(7,67), X(8,68), X(13,73), X(14,74), X(15,75), X(16,76), + X(21,81), X(22,82), X(23,83), X(24,84), X(29,89), X(30,90), X(31,91), X(32,92), + X(37,97), X(38,98), X(39,99), X(40,100), X(45,105), X(46,106), X(47,107), + X(48,108), X(53,113), X(54,114), X(55,115), X(56,116), X(61,121), X(62,122), + X(63,123), X(64,124), X(69,129), X(70,130), X(71,131), X(72,132), X(77,137), + X(78,138), X(79,139), X(80,140), X(85,145), X(86,146), X(87,147), X(88,148), + X(93,153), X(94,154), X(95,155), X(96,156), X(101,161), X(102,162), X(103,163), + X(104,164), X(109,169), X(110,170), X(111,171), X(112,172), X(117,177), + X(118,178), X(119,179), X(120,180), X(125,185), X(126,186), X(127,187), + X(128,188), X(133,193), X(134,194), X(135,195), X(136,196), X(141,201), + X(142,202), X(143,203), X(144,204), X(149,209), X(150,210), X(151,211), + X(152,212), X(157,217), X(158,218), X(159,219), X(160,220), X(165,225), + X(166,226), X(167,227), X(168,228), X(173,233), X(174,234), X(175,235), + X(176,236), X(181,241), X(182,242), X(183,243), X(184,244), X(189,249), + X(190,250), X(191,251), X(192,252), X(5,33), X(6,34), X(7,35), X(8,36), + X(13,41), X(14,42), X(15,43), X(16,44), X(21,49), X(22,50), X(23,51), X(24,52), + X(29,57), X(30,58), X(31,59), X(32,60), X(37,65), X(38,66), X(39,67), X(40,68), + X(45,73), X(46,74), X(47,75), X(48,76), X(53,81), X(54,82), X(55,83), X(56,84), + X(61,89), X(62,90), X(63,91), X(64,92), X(69,97), X(70,98), X(71,99), + X(72,100), X(77,105), X(78,106), X(79,107), X(80,108), X(85,113), X(86,114), + X(87,115), X(88,116), X(93,121), X(94,122), X(95,123), X(96,124), X(101,129), + X(102,130), X(103,131), X(104,132), X(109,137), X(110,138), X(111,139), + X(112,140), X(117,145), X(118,146), X(119,147), X(120,148), X(125,153), + X(126,154), X(127,155), X(128,156), X(133,161), X(134,162), X(135,163), + X(136,164), X(141,169), X(142,170), X(143,171), X(144,172), X(149,177), + X(150,178), X(151,179), X(152,180), X(157,185), X(158,186), X(159,187), + X(160,188), X(165,193), X(166,194), X(167,195), X(168,196), X(173,201), + X(174,202), X(175,203), X(176,204), X(181,209), X(182,210), X(183,211), + X(184,212), X(189,217), X(190,218), X(191,219), X(192,220), X(197,225), + X(198,226), X(199,227), X(200,228), X(205,233), X(206,234), X(207,235), + X(208,236), X(213,241), X(214,242), X(215,243), X(216,244), X(221,249), + X(222,250), X(223,251), X(224,252), X(5,17), X(6,18), X(7,19), X(8,20), + X(13,25), X(14,26), X(15,27), X(16,28), X(21,33), X(22,34), X(23,35), X(24,36), + X(29,41), X(30,42), X(31,43), X(32,44), X(37,49), X(38,50), X(39,51), X(40,52), + X(45,57), X(46,58), X(47,59), X(48,60), X(53,65), X(54,66), X(55,67), X(56,68), + X(61,73), X(62,74), X(63,75), X(64,76), X(69,81), X(70,82), X(71,83), X(72,84), + X(77,89), X(78,90), X(79,91), X(80,92), X(85,97), X(86,98), X(87,99), + X(88,100), X(93,105), X(94,106), X(95,107), X(96,108), X(101,113), X(102,114), + X(103,115), X(104,116), X(109,121), X(110,122), X(111,123), X(112,124), + X(117,129), X(118,130), X(119,131), X(120,132), X(125,137), X(126,138), + X(127,139), X(128,140), X(133,145), X(134,146), X(135,147), X(136,148), + X(141,153), X(142,154), X(143,155), X(144,156), X(149,161), X(150,162), + X(151,163), X(152,164), X(157,169), X(158,170), X(159,171), X(160,172), + X(165,177), X(166,178), X(167,179), X(168,180), X(173,185), X(174,186), + X(175,187), X(176,188), X(181,193), X(182,194), X(183,195), X(184,196), + X(189,201), X(190,202), X(191,203), X(192,204), X(197,209), X(198,210), + X(199,211), X(200,212), X(205,217), X(206,218), X(207,219), X(208,220), + X(213,225), X(214,226), X(215,227), X(216,228), X(221,233), X(222,234), + X(223,235), X(224,236), X(229,241), X(230,242), X(231,243), X(232,244), + X(237,249), X(238,250), X(239,251), X(240,252), X(5,9), X(6,10), X(7,11), + X(8,12), X(13,17), X(14,18), X(15,19), X(16,20), X(21,25), X(22,26), X(23,27), + X(24,28), X(29,33), X(30,34), X(31,35), X(32,36), X(37,41), X(38,42), X(39,43), + X(40,44), X(45,49), X(46,50), X(47,51), X(48,52), X(53,57), X(54,58), X(55,59), + X(56,60), X(61,65), X(62,66), X(63,67), X(64,68), X(69,73), X(70,74), X(71,75), + X(72,76), X(77,81), X(78,82), X(79,83), X(80,84), X(85,89), X(86,90), X(87,91), + X(88,92), X(93,97), X(94,98), X(95,99), X(96,100), X(101,105), X(102,106), + X(103,107), X(104,108), X(109,113), X(110,114), X(111,115), X(112,116), + X(117,121), X(118,122), X(119,123), X(120,124), X(125,129), X(126,130), + X(127,131), X(128,132), X(133,137), X(134,138), X(135,139), X(136,140), + X(141,145), X(142,146), X(143,147), X(144,148), X(149,153), X(150,154), + X(151,155), X(152,156), X(157,161), X(158,162), X(159,163), X(160,164), + X(165,169), X(166,170), X(167,171), X(168,172), X(173,177), X(174,178), + X(175,179), X(176,180), X(181,185), X(182,186), X(183,187), X(184,188), + X(189,193), X(190,194), X(191,195), X(192,196), X(197,201), X(198,202), + X(199,203), X(200,204), X(205,209), X(206,210), X(207,211), X(208,212), + X(213,217), X(214,218), X(215,219), X(216,220), X(221,225), X(222,226), + X(223,227), X(224,228), X(229,233), X(230,234), X(231,235), X(232,236), + X(237,241), X(238,242), X(239,243), X(240,244), X(245,249), X(246,250), + X(247,251), X(248,252), X(1,3), X(2,4), X(5,7), X(6,8), X(9,11), X(10,12), + X(13,15), X(14,16), X(17,19), X(18,20), X(21,23), X(22,24), X(25,27), X(26,28), + X(29,31), X(30,32), X(33,35), X(34,36), X(37,39), X(38,40), X(41,43), X(42,44), + X(45,47), X(46,48), X(49,51), X(50,52), X(53,55), X(54,56), X(57,59), X(58,60), + X(61,63), X(62,64), X(65,67), X(66,68), X(69,71), X(70,72), X(73,75), X(74,76), + X(77,79), X(78,80), X(81,83), X(82,84), X(85,87), X(86,88), X(89,91), X(90,92), + X(93,95), X(94,96), X(97,99), X(98,100), X(101,103), X(102,104), X(105,107), + X(106,108), X(109,111), X(110,112), X(113,115), X(114,116), X(117,119), + X(118,120), X(121,123), X(122,124), X(125,127), X(126,128), X(129,131), + X(130,132), X(133,135), X(134,136), X(137,139), X(138,140), X(141,143), + X(142,144), X(145,147), X(146,148), X(149,151), X(150,152), X(153,155), + X(154,156), X(157,159), X(158,160), X(161,163), X(162,164), X(165,167), + X(166,168), X(169,171), X(170,172), X(173,175), X(174,176), X(177,179), + X(178,180), X(181,183), X(182,184), X(185,187), X(186,188), X(189,191), + X(190,192), X(193,195), X(194,196), X(197,199), X(198,200), X(201,203), + X(202,204), X(205,207), X(206,208), X(209,211), X(210,212), X(213,215), + X(214,216), X(217,219), X(218,220), X(221,223), X(222,224), X(225,227), + X(226,228), X(229,231), X(230,232), X(233,235), X(234,236), X(237,239), + X(238,240), X(241,243), X(242,244), X(245,247), X(246,248), X(249,251), + X(250,252), X(3,129), X(4,130), X(7,133), X(8,134), X(11,137), X(12,138), + X(15,141), X(16,142), X(19,145), X(20,146), X(23,149), X(24,150), X(27,153), + X(28,154), X(31,157), X(32,158), X(35,161), X(36,162), X(39,165), X(40,166), + X(43,169), X(44,170), X(47,173), X(48,174), X(51,177), X(52,178), X(55,181), + X(56,182), X(59,185), X(60,186), X(63,189), X(64,190), X(67,193), X(68,194), + X(71,197), X(72,198), X(75,201), X(76,202), X(79,205), X(80,206), X(83,209), + X(84,210), X(87,213), X(88,214), X(91,217), X(92,218), X(95,221), X(96,222), + X(99,225), X(100,226), X(103,229), X(104,230), X(107,233), X(108,234), + X(111,237), X(112,238), X(115,241), X(116,242), X(119,245), X(120,246), + X(123,249), X(124,250), X(127,253), X(128,254), X(3,65), X(4,66), X(7,69), + X(8,70), X(11,73), X(12,74), X(15,77), X(16,78), X(19,81), X(20,82), X(23,85), + X(24,86), X(27,89), X(28,90), X(31,93), X(32,94), X(35,97), X(36,98), + X(39,101), X(40,102), X(43,105), X(44,106), X(47,109), X(48,110), X(51,113), + X(52,114), X(55,117), X(56,118), X(59,121), X(60,122), X(63,125), X(64,126), + X(67,129), X(68,130), X(71,133), X(72,134), X(75,137), X(76,138), X(79,141), + X(80,142), X(83,145), X(84,146), X(87,149), X(88,150), X(91,153), X(92,154), + X(95,157), X(96,158), X(99,161), X(100,162), X(103,165), X(104,166), + X(107,169), X(108,170), X(111,173), X(112,174), X(115,177), X(116,178), + X(119,181), X(120,182), X(123,185), X(124,186), X(127,189), X(128,190), + X(131,193), X(132,194), X(135,197), X(136,198), X(139,201), X(140,202), + X(143,205), X(144,206), X(147,209), X(148,210), X(151,213), X(152,214), + X(155,217), X(156,218), X(159,221), X(160,222), X(163,225), X(164,226), + X(167,229), X(168,230), X(171,233), X(172,234), X(175,237), X(176,238), + X(179,241), X(180,242), X(183,245), X(184,246), X(187,249), X(188,250), + X(191,253), X(192,254), X(3,33), X(4,34), X(7,37), X(8,38), X(11,41), X(12,42), + X(15,45), X(16,46), X(19,49), X(20,50), X(23,53), X(24,54), X(27,57), X(28,58), + X(31,61), X(32,62), X(35,65), X(36,66), X(39,69), X(40,70), X(43,73), X(44,74), + X(47,77), X(48,78), X(51,81), X(52,82), X(55,85), X(56,86), X(59,89), X(60,90), + X(63,93), X(64,94), X(67,97), X(68,98), X(71,101), X(72,102), X(75,105), + X(76,106), X(79,109), X(80,110), X(83,113), X(84,114), X(87,117), X(88,118), + X(91,121), X(92,122), X(95,125), X(96,126), X(99,129), X(100,130), X(103,133), + X(104,134), X(107,137), X(108,138), X(111,141), X(112,142), X(115,145), + X(116,146), X(119,149), X(120,150), X(123,153), X(124,154), X(127,157), + X(128,158), X(131,161), X(132,162), X(135,165), X(136,166), X(139,169), + X(140,170), X(143,173), X(144,174), X(147,177), X(148,178), X(151,181), + X(152,182), X(155,185), X(156,186), X(159,189), X(160,190), X(163,193), + X(164,194), X(167,197), X(168,198), X(171,201), X(172,202), X(175,205), + X(176,206), X(179,209), X(180,210), X(183,213), X(184,214), X(187,217), + X(188,218), X(191,221), X(192,222), X(195,225), X(196,226), X(199,229), + X(200,230), X(203,233), X(204,234), X(207,237), X(208,238), X(211,241), + X(212,242), X(215,245), X(216,246), X(219,249), X(220,250), X(223,253), + X(224,254), X(3,17), X(4,18), X(7,21), X(8,22), X(11,25), X(12,26), X(15,29), + X(16,30), X(19,33), X(20,34), X(23,37), X(24,38), X(27,41), X(28,42), X(31,45), + X(32,46), X(35,49), X(36,50), X(39,53), X(40,54), X(43,57), X(44,58), X(47,61), + X(48,62), X(51,65), X(52,66), X(55,69), X(56,70), X(59,73), X(60,74), X(63,77), + X(64,78), X(67,81), X(68,82), X(71,85), X(72,86), X(75,89), X(76,90), X(79,93), + X(80,94), X(83,97), X(84,98), X(87,101), X(88,102), X(91,105), X(92,106), + X(95,109), X(96,110), X(99,113), X(100,114), X(103,117), X(104,118), + X(107,121), X(108,122), X(111,125), X(112,126), X(115,129), X(116,130), + X(119,133), X(120,134), X(123,137), X(124,138), X(127,141), X(128,142), + X(131,145), X(132,146), X(135,149), X(136,150), X(139,153), X(140,154), + X(143,157), X(144,158), X(147,161), X(148,162), X(151,165), X(152,166), + X(155,169), X(156,170), X(159,173), X(160,174), X(163,177), X(164,178), + X(167,181), X(168,182), X(171,185), X(172,186), X(175,189), X(176,190), + X(179,193), X(180,194), X(183,197), X(184,198), X(187,201), X(188,202), + X(191,205), X(192,206), X(195,209), X(196,210), X(199,213), X(200,214), + X(203,217), X(204,218), X(207,221), X(208,222), X(211,225), X(212,226), + X(215,229), X(216,230), X(219,233), X(220,234), X(223,237), X(224,238), + X(227,241), X(228,242), X(231,245), X(232,246), X(235,249), X(236,250), + X(239,253), X(240,254), X(3,9), X(4,10), X(7,13), X(8,14), X(11,17), X(12,18), + X(15,21), X(16,22), X(19,25), X(20,26), X(23,29), X(24,30), X(27,33), X(28,34), + X(31,37), X(32,38), X(35,41), X(36,42), X(39,45), X(40,46), X(43,49), X(44,50), + X(47,53), X(48,54), X(51,57), X(52,58), X(55,61), X(56,62), X(59,65), X(60,66), + X(63,69), X(64,70), X(67,73), X(68,74), X(71,77), X(72,78), X(75,81), X(76,82), + X(79,85), X(80,86), X(83,89), X(84,90), X(87,93), X(88,94), X(91,97), X(92,98), + X(95,101), X(96,102), X(99,105), X(100,106), X(103,109), X(104,110), + X(107,113), X(108,114), X(111,117), X(112,118), X(115,121), X(116,122), + X(119,125), X(120,126), X(123,129), X(124,130), X(127,133), X(128,134), + X(131,137), X(132,138), X(135,141), X(136,142), X(139,145), X(140,146), + X(143,149), X(144,150), X(147,153), X(148,154), X(151,157), X(152,158), + X(155,161), X(156,162), X(159,165), X(160,166), X(163,169), X(164,170), + X(167,173), X(168,174), X(171,177), X(172,178), X(175,181), X(176,182), + X(179,185), X(180,186), X(183,189), X(184,190), X(187,193), X(188,194), + X(191,197), X(192,198), X(195,201), X(196,202), X(199,205), X(200,206), + X(203,209), X(204,210), X(207,213), X(208,214), X(211,217), X(212,218), + X(215,221), X(216,222), X(219,225), X(220,226), X(223,229), X(224,230), + X(227,233), X(228,234), X(231,237), X(232,238), X(235,241), X(236,242), + X(239,245), X(240,246), X(243,249), X(244,250), X(247,253), X(248,254), X(3,5), + X(4,6), X(7,9), X(8,10), X(11,13), X(12,14), X(15,17), X(16,18), X(19,21), + X(20,22), X(23,25), X(24,26), X(27,29), X(28,30), X(31,33), X(32,34), X(35,37), + X(36,38), X(39,41), X(40,42), X(43,45), X(44,46), X(47,49), X(48,50), X(51,53), + X(52,54), X(55,57), X(56,58), X(59,61), X(60,62), X(63,65), X(64,66), X(67,69), + X(68,70), X(71,73), X(72,74), X(75,77), X(76,78), X(79,81), X(80,82), X(83,85), + X(84,86), X(87,89), X(88,90), X(91,93), X(92,94), X(95,97), X(96,98), + X(99,101), X(100,102), X(103,105), X(104,106), X(107,109), X(108,110), + X(111,113), X(112,114), X(115,117), X(116,118), X(119,121), X(120,122), + X(123,125), X(124,126), X(127,129), X(128,130), X(131,133), X(132,134), + X(135,137), X(136,138), X(139,141), X(140,142), X(143,145), X(144,146), + X(147,149), X(148,150), X(151,153), X(152,154), X(155,157), X(156,158), + X(159,161), X(160,162), X(163,165), X(164,166), X(167,169), X(168,170), + X(171,173), X(172,174), X(175,177), X(176,178), X(179,181), X(180,182), + X(183,185), X(184,186), X(187,189), X(188,190), X(191,193), X(192,194), + X(195,197), X(196,198), X(199,201), X(200,202), X(203,205), X(204,206), + X(207,209), X(208,210), X(211,213), X(212,214), X(215,217), X(216,218), + X(219,221), X(220,222), X(223,225), X(224,226), X(227,229), X(228,230), + X(231,233), X(232,234), X(235,237), X(236,238), X(239,241), X(240,242), + X(243,245), X(244,246), X(247,249), X(248,250), X(251,253), X(252,254), X(1,2), + X(3,4), X(5,6), X(7,8), X(9,10), X(11,12), X(13,14), X(15,16), X(17,18), + X(19,20), X(21,22), X(23,24), X(25,26), X(27,28), X(29,30), X(31,32), X(33,34), + X(35,36), X(37,38), X(39,40), X(41,42), X(43,44), X(45,46), X(47,48), X(49,50), + X(51,52), X(53,54), X(55,56), X(57,58), X(59,60), X(61,62), X(63,64), X(65,66), + X(67,68), X(69,70), X(71,72), X(73,74), X(75,76), X(77,78), X(79,80), X(81,82), + X(83,84), X(85,86), X(87,88), X(89,90), X(91,92), X(93,94), X(95,96), X(97,98), + X(99,100), X(101,102), X(103,104), X(105,106), X(107,108), X(109,110), + X(111,112), X(113,114), X(115,116), X(117,118), X(119,120), X(121,122), + X(123,124), X(125,126), X(127,128), X(129,130), X(131,132), X(133,134), + X(135,136), X(137,138), X(139,140), X(141,142), X(143,144), X(145,146), + X(147,148), X(149,150), X(151,152), X(153,154), X(155,156), X(157,158), + X(159,160), X(161,162), X(163,164), X(165,166), X(167,168), X(169,170), + X(171,172), X(173,174), X(175,176), X(177,178), X(179,180), X(181,182), + X(183,184), X(185,186), X(187,188), X(189,190), X(191,192), X(193,194), + X(195,196), X(197,198), X(199,200), X(201,202), X(203,204), X(205,206), + X(207,208), X(209,210), X(211,212), X(213,214), X(215,216), X(217,218), + X(219,220), X(221,222), X(223,224), X(225,226), X(227,228), X(229,230), + X(231,232), X(233,234), X(235,236), X(237,238), X(239,240), X(241,242), + X(243,244), X(245,246), X(247,248), X(249,250), X(251,252), X(253,254), + X(2,129), X(4,131), X(6,133), X(8,135), X(10,137), X(12,139), X(14,141), + X(16,143), X(18,145), X(20,147), X(22,149), X(24,151), X(26,153), X(28,155), + X(30,157), X(32,159), X(34,161), X(36,163), X(38,165), X(40,167), X(42,169), + X(44,171), X(46,173), X(48,175), X(50,177), X(52,179), X(54,181), X(56,183), + X(58,185), X(60,187), X(62,189), X(64,191), X(66,193), X(68,195), X(70,197), + X(72,199), X(74,201), X(76,203), X(78,205), X(80,207), X(82,209), X(84,211), + X(86,213), X(88,215), X(90,217), X(92,219), X(94,221), X(96,223), X(98,225), + X(100,227), X(102,229), X(104,231), X(106,233), X(108,235), X(110,237), + X(112,239), X(114,241), X(116,243), X(118,245), X(120,247), X(122,249), + X(124,251), X(126,253), X(2,65), X(4,67), X(6,69), X(8,71), X(10,73), X(12,75), + X(14,77), X(16,79), X(18,81), X(20,83), X(22,85), X(24,87), X(26,89), X(28,91), + X(30,93), X(32,95), X(34,97), X(36,99), X(38,101), X(40,103), X(42,105), + X(44,107), X(46,109), X(48,111), X(50,113), X(52,115), X(54,117), X(56,119), + X(58,121), X(60,123), X(62,125), X(64,127), X(66,129), X(68,131), X(70,133), + X(72,135), X(74,137), X(76,139), X(78,141), X(80,143), X(82,145), X(84,147), + X(86,149), X(88,151), X(90,153), X(92,155), X(94,157), X(96,159), X(98,161), + X(100,163), X(102,165), X(104,167), X(106,169), X(108,171), X(110,173), + X(112,175), X(114,177), X(116,179), X(118,181), X(120,183), X(122,185), + X(124,187), X(126,189), X(128,191), X(130,193), X(132,195), X(134,197), + X(136,199), X(138,201), X(140,203), X(142,205), X(144,207), X(146,209), + X(148,211), X(150,213), X(152,215), X(154,217), X(156,219), X(158,221), + X(160,223), X(162,225), X(164,227), X(166,229), X(168,231), X(170,233), + X(172,235), X(174,237), X(176,239), X(178,241), X(180,243), X(182,245), + X(184,247), X(186,249), X(188,251), X(190,253), X(2,33), X(4,35), X(6,37), + X(8,39), X(10,41), X(12,43), X(14,45), X(16,47), X(18,49), X(20,51), X(22,53), + X(24,55), X(26,57), X(28,59), X(30,61), X(32,63), X(34,65), X(36,67), X(38,69), + X(40,71), X(42,73), X(44,75), X(46,77), X(48,79), X(50,81), X(52,83), X(54,85), + X(56,87), X(58,89), X(60,91), X(62,93), X(64,95), X(66,97), X(68,99), + X(70,101), X(72,103), X(74,105), X(76,107), X(78,109), X(80,111), X(82,113), + X(84,115), X(86,117), X(88,119), X(90,121), X(92,123), X(94,125), X(96,127), + X(98,129), X(100,131), X(102,133), X(104,135), X(106,137), X(108,139), + X(110,141), X(112,143), X(114,145), X(116,147), X(118,149), X(120,151), + X(122,153), X(124,155), X(126,157), X(128,159), X(130,161), X(132,163), + X(134,165), X(136,167), X(138,169), X(140,171), X(142,173), X(144,175), + X(146,177), X(148,179), X(150,181), X(152,183), X(154,185), X(156,187), + X(158,189), X(160,191), X(162,193), X(164,195), X(166,197), X(168,199), + X(170,201), X(172,203), X(174,205), X(176,207), X(178,209), X(180,211), + X(182,213), X(184,215), X(186,217), X(188,219), X(190,221), X(192,223), + X(194,225), X(196,227), X(198,229), X(200,231), X(202,233), X(204,235), + X(206,237), X(208,239), X(210,241), X(212,243), X(214,245), X(216,247), + X(218,249), X(220,251), X(222,253), X(2,17), X(4,19), X(6,21), X(8,23), + X(10,25), X(12,27), X(14,29), X(16,31), X(18,33), X(20,35), X(22,37), X(24,39), + X(26,41), X(28,43), X(30,45), X(32,47), X(34,49), X(36,51), X(38,53), X(40,55), + X(42,57), X(44,59), X(46,61), X(48,63), X(50,65), X(52,67), X(54,69), X(56,71), + X(58,73), X(60,75), X(62,77), X(64,79), X(66,81), X(68,83), X(70,85), X(72,87), + X(74,89), X(76,91), X(78,93), X(80,95), X(82,97), X(84,99), X(86,101), + X(88,103), X(90,105), X(92,107), X(94,109), X(96,111), X(98,113), X(100,115), + X(102,117), X(104,119), X(106,121), X(108,123), X(110,125), X(112,127), + X(114,129), X(116,131), X(118,133), X(120,135), X(122,137), X(124,139), + X(126,141), X(128,143), X(130,145), X(132,147), X(134,149), X(136,151), + X(138,153), X(140,155), X(142,157), X(144,159), X(146,161), X(148,163), + X(150,165), X(152,167), X(154,169), X(156,171), X(158,173), X(160,175), + X(162,177), X(164,179), X(166,181), X(168,183), X(170,185), X(172,187), + X(174,189), X(176,191), X(178,193), X(180,195), X(182,197), X(184,199), + X(186,201), X(188,203), X(190,205), X(192,207), X(194,209), X(196,211), + X(198,213), X(200,215), X(202,217), X(204,219), X(206,221), X(208,223), + X(210,225), X(212,227), X(214,229), X(216,231), X(218,233), X(220,235), + X(222,237), X(224,239), X(226,241), X(228,243), X(230,245), X(232,247), + X(234,249), X(236,251), X(238,253), X(2,9), X(4,11), X(6,13), X(8,15), + X(10,17), X(12,19), X(14,21), X(16,23), X(18,25), X(20,27), X(22,29), X(24,31), + X(26,33), X(28,35), X(30,37), X(32,39), X(34,41), X(36,43), X(38,45), X(40,47), + X(42,49), X(44,51), X(46,53), X(48,55), X(50,57), X(52,59), X(54,61), X(56,63), + X(58,65), X(60,67), X(62,69), X(64,71), X(66,73), X(68,75), X(70,77), X(72,79), + X(74,81), X(76,83), X(78,85), X(80,87), X(82,89), X(84,91), X(86,93), X(88,95), + X(90,97), X(92,99), X(94,101), X(96,103), X(98,105), X(100,107), X(102,109), + X(104,111), X(106,113), X(108,115), X(110,117), X(112,119), X(114,121), + X(116,123), X(118,125), X(120,127), X(122,129), X(124,131), X(126,133), + X(128,135), X(130,137), X(132,139), X(134,141), X(136,143), X(138,145), + X(140,147), X(142,149), X(144,151), X(146,153), X(148,155), X(150,157), + X(152,159), X(154,161), X(156,163), X(158,165), X(160,167), X(162,169), + X(164,171), X(166,173), X(168,175), X(170,177), X(172,179), X(174,181), + X(176,183), X(178,185), X(180,187), X(182,189), X(184,191), X(186,193), + X(188,195), X(190,197), X(192,199), X(194,201), X(196,203), X(198,205), + X(200,207), X(202,209), X(204,211), X(206,213), X(208,215), X(210,217), + X(212,219), X(214,221), X(216,223), X(218,225), X(220,227), X(222,229), + X(224,231), X(226,233), X(228,235), X(230,237), X(232,239), X(234,241), + X(236,243), X(238,245), X(240,247), X(242,249), X(244,251), X(246,253), X(2,5), + X(4,7), X(6,9), X(8,11), X(10,13), X(12,15), X(14,17), X(16,19), X(18,21), + X(20,23), X(22,25), X(24,27), X(26,29), X(28,31), X(30,33), X(32,35), X(34,37), + X(36,39), X(38,41), X(40,43), X(42,45), X(44,47), X(46,49), X(48,51), X(50,53), + X(52,55), X(54,57), X(56,59), X(58,61), X(60,63), X(62,65), X(64,67), X(66,69), + X(68,71), X(70,73), X(72,75), X(74,77), X(76,79), X(78,81), X(80,83), X(82,85), + X(84,87), X(86,89), X(88,91), X(90,93), X(92,95), X(94,97), X(96,99), + X(98,101), X(100,103), X(102,105), X(104,107), X(106,109), X(108,111), + X(110,113), X(112,115), X(114,117), X(116,119), X(118,121), X(120,123), + X(122,125), X(124,127), X(126,129), X(128,131), X(130,133), X(132,135), + X(134,137), X(136,139), X(138,141), X(140,143), X(142,145), X(144,147), + X(146,149), X(148,151), X(150,153), X(152,155), X(154,157), X(156,159), + X(158,161), X(160,163), X(162,165), X(164,167), X(166,169), X(168,171), + X(170,173), X(172,175), X(174,177), X(176,179), X(178,181), X(180,183), + X(182,185), X(184,187), X(186,189), X(188,191), X(190,193), X(192,195), + X(194,197), X(196,199), X(198,201), X(200,203), X(202,205), X(204,207), + X(206,209), X(208,211), X(210,213), X(212,215), X(214,217), X(216,219), + X(218,221), X(220,223), X(222,225), X(224,227), X(226,229), X(228,231), + X(230,233), X(232,235), X(234,237), X(236,239), X(238,241), X(240,243), + X(242,245), X(244,247), X(246,249), X(248,251), X(250,253), X(2,3), X(4,5), + X(6,7), X(8,9), X(10,11), X(12,13), X(14,15), X(16,17), X(18,19), X(20,21), + X(22,23), X(24,25), X(26,27), X(28,29), X(30,31), X(32,33), X(34,35), X(36,37), + X(38,39), X(40,41), X(42,43), X(44,45), X(46,47), X(48,49), X(50,51), X(52,53), + X(54,55), X(56,57), X(58,59), X(60,61), X(62,63), X(64,65), X(66,67), X(68,69), + X(70,71), X(72,73), X(74,75), X(76,77), X(78,79), X(80,81), X(82,83), X(84,85), + X(86,87), X(88,89), X(90,91), X(92,93), X(94,95), X(96,97), X(98,99), + X(100,101), X(102,103), X(104,105), X(106,107), X(108,109), X(110,111), + X(112,113), X(114,115), X(116,117), X(118,119), X(120,121), X(122,123), + X(124,125), X(126,127), X(128,129), X(130,131), X(132,133), X(134,135), + X(136,137), X(138,139), X(140,141), X(142,143), X(144,145), X(146,147), + X(148,149), X(150,151), X(152,153), X(154,155), X(156,157), X(158,159), + X(160,161), X(162,163), X(164,165), X(166,167), X(168,169), X(170,171), + X(172,173), X(174,175), X(176,177), X(178,179), X(180,181), X(182,183), + X(184,185), X(186,187), X(188,189), X(190,191), X(192,193), X(194,195), + X(196,197), X(198,199), X(200,201), X(202,203), X(204,205), X(206,207), + X(208,209), X(210,211), X(212,213), X(214,215), X(216,217), X(218,219), + X(220,221), X(222,223), X(224,225), X(226,227), X(228,229), X(230,231), + X(232,233), X(234,235), X(236,237), X(238,239), X(240,241), X(242,243), + X(244,245), X(246,247), X(248,249), X(250,251), X(252,253) +}; + +// +// +// + +struct hsg_network const hsg_networks_sorting[] = + { + LS(2), + LS(4), + LS(6), + LS(8), + LS(10), + LS(12), + LS(14), + LS(16), + LS(18), + LS(20), + LS(22), + LS(24), + LS(26), + LS(28), + LS(30), + LS(32), + LS(34), + LS(36), + LS(38), + LS(40), + LS(42), + LS(44), + LS(46), + LS(48), + LS(50), + LS(52), + LS(54), + LS(56), + LS(58), + LS(60), + LS(62), + LS(64), + LS(66), + LS(68), + LS(70), + LS(72), + LS(74), + LS(76), + LS(78), + LS(80), + LS(82), + LS(84), + LS(86), + LS(88), + LS(90), + LS(92), + LS(94), + LS(96), + LS(98), + LS(100), + LS(102), + LS(104), + LS(106), + LS(108), + LS(110), + LS(112), + LS(114), + LS(116), + LS(118), + LS(120), + LS(122), + LS(124), + LS(126), + LS(128), + LS(130), + LS(132), + LS(134), + LS(136), + LS(138), + LS(140), + LS(142), + LS(144), + LS(146), + LS(148), + LS(150), + LS(152), + LS(154), + LS(156), + LS(158), + LS(160), + LS(162), + LS(164), + LS(166), + LS(168), + LS(170), + LS(172), + LS(174), + LS(176), + LS(178), + LS(180), + LS(182), + LS(184), + LS(186), + LS(188), + LS(190), + LS(192), + LS(194), + LS(196), + LS(198), + LS(200), + LS(202), + LS(204), + LS(206), + LS(208), + LS(210), + LS(212), + LS(214), + LS(216), + LS(218), + LS(220), + LS(222), + LS(224), + LS(226), + LS(228), + LS(230), + LS(232), + LS(234), + LS(236), + LS(238), + LS(240), + LS(242), + LS(244), + LS(246), + LS(248), + LS(250), + LS(252), + LS(254) + }; + +// +// +// diff --git a/src/compute/hs/gen/target_cuda_sm3x.c b/src/compute/hs/gen/target_cuda_sm3x.c new file mode 100644 index 0000000000..436fc5f50d --- /dev/null +++ b/src/compute/hs/gen/target_cuda_sm3x.c @@ -0,0 +1,776 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#include <stdio.h> + +// +// +// + +#include "gen.h" +#include "util.h" + +// +// +// + +void +hsg_target_cuda_sm3x(struct hsg_file * const files, + struct hsg_merge const * const merge, + struct hsg_op const * const ops, + uint32_t const depth) +{ + const char* const type = (hsg_config.type.words == 2) ? "uint64_t" : "uint32_t"; + const char* const type_max = (hsg_config.type.words == 2) ? "UINT64_MAX" : "UINT32_MAX"; + + switch (ops->type) + { + case HSG_OP_TYPE_END: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "}\n"); + break; + + case HSG_OP_TYPE_BEGIN: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "{\n"); + break; + + case HSG_OP_TYPE_ELSE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else\n"); + break; + + case HSG_OP_TYPE_FILE_HEADER: + { + uint32_t const bc_min = msb_idx_u32(hsg_config.block.warps_min); + uint32_t const bc_max = msb_idx_u32(pow2_rd_u32(merge[0].warps)); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + "// \n" + "// Copyright 2016 Google Inc. \n" + "// \n" + "// Use of this source code is governed by a BSD-style \n" + "// license that can be found in the LICENSE file. \n" + "// \n" + " \n" + "#pragma once \n" + " \n" + "#include <stdint.h> \n" + " \n" + "#define HS_LANES_PER_WARP %u \n" + "#define HS_BS_WARPS_PER_BLOCK %u \n" + "#define HS_BC_WARPS_LOG2_MIN %u \n" + "#define HS_BC_WARPS_LOG2_MAX %u \n" + "#define HS_KEYS_PER_THREAD %u \n" + "#define HS_KEY_WORDS %u \n" + "#define HS_KEY_TYPE %s \n" + " \n" + "#include <%s_args.h> \n" + " \n", + hsg_config.warp.lanes, + merge->warps, + bc_min, + bc_max, + hsg_config.thread.regs, + hsg_config.type.words, + type, + files[HSG_FILE_TYPE_SOURCE].prefix); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "// -*- compile-command: \"nvcc -arch sm_52 -Xptxas=-v,-abi=no -cubin -I. %s\"; -*-\n", + files[HSG_FILE_TYPE_SOURCE].name); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "// \n" + "// Copyright 2016 Google Inc. \n" + "// \n" + "// Use of this source code is governed by a BSD-style \n" + "// license that can be found in the LICENSE file. \n" + "// \n" + " \n" + "#ifdef __cplusplus \n" + "extern \"C\" { \n" + "#endif \n" + " \n" + "#include \"%s_launcher.h\" \n" + " \n" + "#ifdef __cplusplus \n" + "} \n" + "#endif \n" + " \n" + "#include \"%s_launch_bounds.h\" \n" + "#include <%s_finalize.inl> \n" + " \n" + "// \n" + "// \n" + "// \n", + files[HSG_FILE_TYPE_HEADER].prefix, + files[HSG_FILE_TYPE_SOURCE].prefix, + files[HSG_FILE_TYPE_SOURCE].prefix); + } + break; + + case HSG_OP_TYPE_FILE_FOOTER: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "// \n" + "// \n" + "// \n" + " \n" + "#include \"%s_launcher.inl\" \n" + " \n" + "// \n" + "// \n" + "// \n", + files[HSG_FILE_TYPE_SOURCE].prefix); + break; + + case HSG_OP_TYPE_BS_KERNEL_PROTO: + { + const uint32_t tpb = merge->warps * hsg_config.warp.lanes; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "extern \"C\" \n" + "__global__ \n" + "__launch_bounds__(%u,%u) \n" + "void \n" + "hs_bs_kernel(const struct hs_args args) \n", + tpb,1); + } + break; + + case HSG_OP_TYPE_BS_KERNEL_PREAMBLE: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "__shared__ union { \n"); + + for (uint32_t ii=0; ii<MERGE_LEVELS_MAX_LOG2; ii++) + { + const struct hsg_merge* const m = merge + ii; + + if (m->warps < 2) + break; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " %s m%u[%u][%u];\n", + type, + ii, + m->rows_bs, + m->warps * hsg_config.warp.lanes); + } + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " struct { \n" + " %s f[%u][%u]; \n" + " %s l[%u]; \n" + " }; \n", + type, + merge[0].warps, + hsg_config.warp.skpw_bs - 1, + type, + merge[0].warps); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "} shared; \n" + " \n"); + + const uint32_t kpw = hsg_config.warp.lanes * hsg_config.thread.regs; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const int32_t block_warp_idx = threadIdx.x / %u; \n" + "const int32_t warp_lane_idx = threadIdx.x & %u; \n" + "const int32_t warp_idx = blockIdx.x * %u + block_warp_idx; \n" + "const int32_t warp_gmem_idx = warp_idx * %u + warp_lane_idx; \n" + " \n" + "%s const * const vin_ptr = args.vin + warp_gmem_idx; \n" + "%s * const vout_ptr = args.vout + warp_gmem_idx; \n" + " \n", + + hsg_config.warp.lanes, + hsg_config.warp.lanes - 1, + merge[0].warps, + kpw, + type, + type); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (warp_idx >= args.bs.full + args.bs.frac) \n" + " return; \n" + " \n"); + } + break; + + case HSG_OP_TYPE_BC_KERNEL_PROTO: + { + uint32_t const bc_warps = merge[ops->a].warps; + uint32_t const tpb = bc_warps * hsg_config.warp.lanes; + uint32_t const bpm = hsg_config.block.warps_max / bc_warps; + uint32_t const msb = msb_idx_u32(bc_warps); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "extern \"C\" \n" + "__global__ \n" + "__launch_bounds__(%u,%u) \n" + "void \n" + "hs_bc_%u_kernel(const struct hs_args args) \n", + tpb,bpm, + msb); + } + break; + + case HSG_OP_TYPE_BC_KERNEL_PREAMBLE: + { + const struct hsg_merge* const m = merge + ops->a; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "__shared__ union { \n"); + + if (m->warps >= 2) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " %s m%u[%u][%u]; \n", + type, + ops->a, + m->rows_bc, + m->warps * hsg_config.warp.lanes); + } + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " struct { \n" + " %s f[%u][%u]; \n" + " %s l[%u]; \n" + " }; \n" + "} shared; \n" + " \n", + type,m->warps,m->skpw_bc - 1, + type,m->warps); + + const uint32_t kpw = hsg_config.warp.lanes * hsg_config.thread.regs; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const int32_t block_warp_idx = threadIdx.x / %u; \n" + "const int32_t warp_lane_idx = threadIdx.x & %u; \n" + "const int32_t warp_gmem_base = blockIdx.x * %u * %u + warp_lane_idx; \n" + "const int32_t warp_gmem_idx = warp_gmem_base + block_warp_idx * %u; \n" + " \n" + "%s * const vout_ptr = args.vout + warp_gmem_idx; \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes - 1, + m->warps,kpw, + kpw, + type); + +#if 0 + // + // NO LONGER NEED THIS TEST + // + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (warp_idx >= args.bc.full) \n" + " return; \n" + " \n"); +#endif + } + break; + + case HSG_OP_TYPE_FM_KERNEL_PROTO: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "#define HS_FM_WARPS_LOG2_%u %u \n" + "extern \"C\" \n" + "__global__ \n" + "HS_FM_LAUNCH_BOUNDS_%u \n" + "void \n" + "hs_fm_%u_kernel(const struct hs_args args) \n", + ops->a, + ops->b, + ops->a - ops->b, + ops->a); + break; + + case HSG_OP_TYPE_FM_KERNEL_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const int32_t warp_idx = (blockDim.x * blockIdx.x + threadIdx.x) / %u; \n" + "const int32_t warp_lane_idx = threadIdx.x & %u; \n" + " \n" + "const int32_t merge_idx = warp_idx / %u >> %u; \n" + " \n" + "const int32_t merge_stride = %u * %u << %u; \n" + "const int32_t merge_keys = merge_stride * %u; \n" + " \n" + "const int32_t merge_base = merge_idx * merge_keys; \n" + " \n" + "const int32_t merge_l_off = (warp_idx - merge_idx * (%u << %u)) * %u + warp_lane_idx; \n" + "const int32_t merge_l_end = merge_l_off + merge_stride * (%u / 2 - 1); \n" + "%s * const merge_l = args.vout + merge_base + merge_l_off; \n" + " \n" + "const int32_t merge_r_off = merge_keys - merge_l_end - 1; \n" + "%s * const merge_r = args.vout + merge_base + merge_r_off; \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes-1, + hsg_config.thread.regs,ops->b, + hsg_config.thread.regs,hsg_config.warp.lanes,ops->b, + ops->a, + hsg_config.thread.regs,ops->b,hsg_config.warp.lanes, + ops->a, + type, + type); + break; + + case HSG_OP_TYPE_HM_KERNEL_PROTO: + { + const uint32_t bc_max = msb_idx_u32(pow2_rd_u32(merge[0].warps)); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "#define HS_HM_WARPS_LOG2_%u %u \n" + "extern \"C\" \n" + "__global__ \n" + "HS_HM_LAUNCH_BOUNDS_%u \n" + "void \n" + "hs_hm_%u_kernel(const struct hs_args args) \n", + ops->a, + ops->b, + ops->a - ops->b - bc_max, + ops->a); + } + break; + + case HSG_OP_TYPE_HM_KERNEL_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const int32_t warp_idx = (blockDim.x * blockIdx.x + threadIdx.x) / %u; \n" + "const int32_t warp_lane_idx = threadIdx.x & %u; \n" + " \n" + "const int32_t merge_idx = (warp_idx / %u) >> %u; \n" + " \n" + "const int32_t merge_stride = %u * %u << %u; \n" + "const int32_t merge_keys = merge_stride * %u; \n" + " \n" + "const int32_t merge_base = merge_idx * merge_keys; \n" + " \n" + "const int32_t merge_off = (warp_idx - merge_idx * (%u << %u)) * %u; \n" + "%s * const merge_ptr = args.vout + merge_base + merge_off + warp_lane_idx; \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes-1, + hsg_config.thread.regs,ops->b, + hsg_config.thread.regs,hsg_config.warp.lanes,ops->b, + ops->a, + hsg_config.thread.regs,ops->b,hsg_config.warp.lanes, + type); + break; + + case HSG_OP_TYPE_BX_REG_GLOBAL_LOAD: + { + static const char* const vstr[] = { "vin_ptr", "vout_ptr" }; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%-3u = %s[%-3u * %u]; \n", + type,ops->n,vstr[ops->v],ops->n-1,hsg_config.warp.lanes); + } + break; + + case HSG_OP_TYPE_BX_REG_GLOBAL_STORE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "vout_ptr[%-3u * %u] = r%u; \n", + ops->n-1,hsg_config.warp.lanes,ops->n); + break; + +#if 0 + case HSG_OP_TYPE_BX_WARP_STORE_PRED: + if (ops->a == 1) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (!args.is_final) \n"); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (blockIdx.x * %u + block_warp_idx >= args.bx.ru) \n" + "{ \n" + " return; \n" + "} \n" + "else if (!args.is_final) \n", + ops->a); + } + break; +#endif + + case HSG_OP_TYPE_HM_REG_GLOBAL_LOAD: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%-3u = merge_ptr[%-3u * merge_stride];\n", + type,ops->a,ops->b); + break; + + case HSG_OP_TYPE_HM_REG_GLOBAL_STORE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "merge_ptr[%-3u * merge_stride] = r%u;\n", + ops->b,ops->a); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%-3u = merge_l[%-3u * merge_stride];\n", + type,ops->a,ops->b); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_STORE_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "merge_l[%-3u * merge_stride] = r%u;\n", + ops->b,ops->a); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%-3u = merge_r[%-3u * merge_stride];\n", + type,ops->a,ops->b); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_STORE_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "merge_r[%-3u * merge_stride] = r%u;\n", + ops->b,ops->a); + break; + + case HSG_OP_TYPE_WARP_FLIP: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const int32_t flip_lane_mask = %u; \n" + "const int32_t flip_lane_idx = warp_lane_idx ^ flip_lane_mask; \n" + "const bool t_lt = warp_lane_idx < flip_lane_idx; \n", + ops->n-1); + } + break; + + case HSG_OP_TYPE_WARP_HALF: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const int32_t half_lane_mask = %u; \n" + "const int32_t half_lane_idx = warp_lane_idx ^ half_lane_mask; \n" + "const bool t_lt = warp_lane_idx < half_lane_idx; \n", + ops->n / 2); + } + break; + + case HSG_OP_TYPE_CMP_FLIP: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_FLIP(r%-3u,r%-3u,r%-3u)\n",ops->a,ops->b,ops->c); + break; + + case HSG_OP_TYPE_CMP_HALF: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_HALF(r%-3u,r%-3u)\n",ops->a,ops->b); + break; + + case HSG_OP_TYPE_CMP_XCHG: + if (ops->c == UINT32_MAX) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_XCHG(r%-3u,r%-3u)\n", + ops->a,ops->b); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_XCHG(r%u_%u,r%u_%u)\n", + ops->c,ops->a,ops->c,ops->b); + } + break; + + case HSG_OP_TYPE_BS_REG_SHARED_STORE_V: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "smem_v[%-3u * %-2u * %-3u] = r%u;\n", + ops->a,hsg_config.warp.lanes,ops->c,ops->b); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_LOAD_V: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "r%-3u = smem_v[%-3u * %-2u * %-3u];\n", + ops->b,ops->a,hsg_config.warp.lanes,ops->c); + break; + + case HSG_OP_TYPE_BC_REG_SHARED_LOAD_V: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%-3u = smem_v[%-3u * %-2u * %-3u];\n", + type,ops->b,ops->a,hsg_config.warp.lanes,ops->c); + break; + + case HSG_OP_TYPE_BX_REG_SHARED_STORE_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "smem_l[%5u] = r%u_%u;\n", + ops->b * hsg_config.warp.lanes, + ops->c, + ops->a); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_STORE_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "smem_r[%5u] = r%u_%u;\n", + ops->b * hsg_config.warp.lanes, + ops->c, + ops->a); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_LOAD_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%u_%-3u = smem_l[%u];\n", + type, + ops->c, + ops->a, + ops->b * hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_LOAD_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%u_%-3u = smem_r[%u];\n", + type, + ops->c, + ops->a, + ops->b * hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BC_REG_GLOBAL_LOAD_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s r%u_%-3u = gmem_l[%u];\n", + type, + ops->c, + ops->a, + ops->b * hsg_config.warp.lanes); + break; + +#if 0 + case HSG_OP_TYPE_REG_F_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s* const f_%u_smem_st_ptr = &shared.f[block_warp_idx]", + type, + ops->a); + + if (ops->a >= (int32_t)hsg_config.warp.lanes) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "[warp_lane_idx * %u];\n", + (ops->a / hsg_config.warp.lanes) * hsg_config.warp.lanes + 1); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "[(warp_lane_idx & 0x%X) * %u + (warp_lane_idx & ~0x%X)];\n", + ops->a-1, + hsg_config.warp.lanes + 1, + ops->a-1); + } + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "const %s* const f_%u_smem_ld_ptr = &shared.f[block_warp_idx][warp_lane_idx];\n", + type, + ops->a); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s* const f_%u_gmem_st_ptr = args.vout + warp_gmem_idx", + type, + ops->a); + + if (ops->a >= (int32_t)hsg_config.warp.lanes) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file,";\n"); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " - warp_lane_idx + (warp_lane_idx & ~0x%X) * %u + (warp_lane_idx & 0x%X);\n", + ops->a-1, + hsg_config.thread.regs, + ops->a-1); + } + break; + + case HSG_OP_TYPE_REG_SHARED_STORE_F: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "f_%u_smem_st_ptr[%-3u] = r%u;\n", + ops->c, + ops->b, + ops->a); + break; + + case HSG_OP_TYPE_REG_SHARED_LOAD_F: + if (ops->c >= (int32_t)hsg_config.warp.lanes) + { + uint32_t const adjacent = ops->c / hsg_config.warp.lanes; + uint32_t const stride = adjacent * hsg_config.warp.lanes + 1; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "r%-3u = f_%u_smem_ld_ptr[%-3u];\n", + ops->a, + ops->c, + (ops->b / adjacent) * stride + (ops->b % adjacent) * hsg_config.warp.lanes); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "r%-3u = f_%u_smem_ld_ptr[%-3u];\n", + ops->a, + ops->c, + ops->b * (hsg_config.warp.lanes + 1)); + } + break; + + case HSG_OP_TYPE_REG_GLOBAL_STORE_F: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "f_%u_gmem_st_ptr[%-3u * %u + %-3u] = r%u;\n", + ops->c, + ops->b, + hsg_config.thread.regs, // hsg_config.warp.lanes, + (ops->a - 1) & ~(ops->c - 1), + ops->a); + break; +#endif + +#if 0 + case HSG_OP_TYPE_FINALIZE: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_FINALIZE(%s,args,shared.f[block_warp_idx],shared.l,\n" + " block_warp_idx,warp_lane_idx,warp_gmem_idx,\n" + " r%-3u", + ops->a == 1 ? "true" : "false", + 1); + +#define HS_WARP_FINALIZE_PRETTY_PRINT 8 + + for (uint32_t r=2; r<=hsg_config.thread.regs; r++) + { + if (r % HS_WARP_FINALIZE_PRETTY_PRINT == 1) + fprintf(files[HSG_FILE_TYPE_SOURCE].file,",\n"); + else + fprintf(files[HSG_FILE_TYPE_SOURCE].file,","); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file,"r%-3u",r); + } + + fprintf(files[HSG_FILE_TYPE_SOURCE].file,");\n"); + } + break; +#endif + + case HSG_OP_TYPE_BLOCK_SYNC: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "__syncthreads();\n"); + break; + + case HSG_OP_TYPE_BS_FRAC_PRED: + { + if (ops->m == 0) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (warp_idx < args.bs.full)\n"); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else if (args.bs.frac == %u)\n", + ops->w); + } + } + break; + +#if 0 // DELETED + case HSG_OP_TYPE_BX_MERGE_V_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s * const smem_v = shared.m%u[0] + threadIdx.x; \n", + type,ops->a); + break; +#endif + + case HSG_OP_TYPE_BS_MERGE_H_PREAMBLE: + if (ops->c == 0) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s * smem_l = shared.m%u[block_warp_idx ] + warp_lane_idx; \n" + "%s * smem_r = shared.m%u[block_warp_idx ^ 1] + (warp_lane_idx ^ %u); \n", + type,ops->a, + type,ops->a,hsg_config.warp.lanes-1); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "smem_l = shared.m%u[block_warp_idx ] + warp_lane_idx; \n" + "smem_r = shared.m%u[block_warp_idx ^ 1] + (warp_lane_idx ^ %u); \n", + ops->a, + ops->a,hsg_config.warp.lanes-1); + } + break; + + case HSG_OP_TYPE_BC_MERGE_H_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "%s const * const gmem_l = args.vout + (warp_gmem_base + block_warp_idx * %u); \n" + "%s * const smem_l = shared.m%u[block_warp_idx] + warp_lane_idx; \n" + "%s * const smem_v = shared.m%u[0] + threadIdx.x; \n", + type,hsg_config.warp.lanes, + type,ops->a, + type,ops->a); + break; + + case HSG_OP_TYPE_BX_MERGE_H_PRED: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (threadIdx.x < %u)\n", + ops->a * hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BS_ACTIVE_PRED: + { + const struct hsg_merge* const m = merge + ops->a; + + if (m->warps <= 32) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (((1u << block_warp_idx) & 0x%08X) != 0)\n", + m->levels[ops->b].active.b32a2[0]); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (((1UL << block_warp_idx) & 0x%08X%08XL) != 0L)\n", + m->levels[ops->b].active.b32a2[1], + m->levels[ops->b].active.b32a2[0]); + } + } + break; + + case HSG_OP_TYPE_FM_MERGE_RIGHT_PRED: + { + if (ops->a == ops->b) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (merge_idx < args.fm.full) \n"); + } + else if (ops->b > 1) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else if (args.fm.frac == %u) \n", + ops->b); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else\n"); + } + } + break; + + default: + hsg_target_debug(files,merge,ops,depth); + break; + } +} + +// +// +// diff --git a/src/compute/hs/gen/target_igp_genx.c b/src/compute/hs/gen/target_igp_genx.c new file mode 100644 index 0000000000..f321975ba0 --- /dev/null +++ b/src/compute/hs/gen/target_igp_genx.c @@ -0,0 +1,672 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#include <stdio.h> + +// +// +// + +#include "gen.h" +#include "util.h" +#include "macros.h" +#include "transpose.h" + +// +// +// + +static +char +hsg_transpose_reg_prefix(uint32_t const cols_log2) +{ + return 'a' + (('r' + cols_log2 - 'a') % 26); +} + +static +void +hsg_transpose_blend(uint32_t const cols_log2, + uint32_t const row_ll, // lower-left + uint32_t const row_ur, // upper-right + FILE * file) +{ + // we're starting register names at '1' for now + fprintf(file, + " HS_TRANSPOSE_BLEND( %c, %c, %2u, %3u, %3u ) \\\n", + hsg_transpose_reg_prefix(cols_log2-1), + hsg_transpose_reg_prefix(cols_log2), + cols_log2,row_ll+1,row_ur+1); +} + +static +void +hsg_transpose_remap(uint32_t const row_from, + uint32_t const row_to, + FILE * file) +{ + // we're starting register names at '1' for now + fprintf(file, + " HS_TRANSPOSE_REMAP( %c, %3u, %3u ) \\\n", + hsg_transpose_reg_prefix(msb_idx_u32(hsg_config.warp.lanes)), + row_from+1,row_to+1); +} + +// +// +// + +void +hsg_target_igp_genx(struct hsg_file * const files, + struct hsg_merge const * const merge, + struct hsg_op const * const ops, + uint32_t const depth) +{ + switch (ops->type) + { + case HSG_OP_TYPE_END: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "}\n"); + break; + + case HSG_OP_TYPE_BEGIN: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "{\n"); + break; + + case HSG_OP_TYPE_ELSE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else\n"); + break; + + case HSG_OP_TYPE_FILE_HEADER: + { + uint32_t const bc_max = msb_idx_u32(pow2_rd_u32(merge->warps)); + uint32_t const warp_lanes_log2 = msb_idx_u32(hsg_config.warp.lanes); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + "// \n" + "// Copyright 2016 Google Inc. \n" + "// \n" + "// Use of this source code is governed by a BSD-style \n" + "// license that can be found in the LICENSE file. \n" + "// \n" + " \n" + "#ifndef HS_CL_ONCE \n" + "#define HS_CL_ONCE \n" + " \n" + "#define HS_LANES_PER_WARP_LOG2 %u \n" + "#define HS_LANES_PER_WARP (1 << HS_LANES_PER_WARP_LOG2) \n" + "#define HS_BS_WARPS %u \n" + "#define HS_BS_WARPS_LOG2_RU %u \n" + "#define HS_BC_WARPS_LOG2_MAX %u \n" + "#define HS_FM_BLOCKS_LOG2_MIN %u \n" + "#define HS_HM_BLOCKS_LOG2_MIN %u \n" + "#define HS_KEYS_PER_LANE %u \n" + "#define HS_REG_LAST(c) c##%u \n" + "#define HS_KEY_WORDS %u \n" + "#define HS_KEY_TYPE %s \n" + "#define HS_EMPTY \n" + " \n", + warp_lanes_log2, + merge->warps, + msb_idx_u32(pow2_ru_u32(merge->warps)), + bc_max, + hsg_config.merge.flip.lo, + hsg_config.merge.half.lo, + hsg_config.thread.regs, + hsg_config.thread.regs, + hsg_config.type.words, + (hsg_config.type.words == 2) ? "ulong" : "uint"); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + "#define HS_SLAB_ROWS() \\\n"); + + for (uint32_t ii=1; ii<=hsg_config.thread.regs; ii++) + fprintf(files[HSG_FILE_TYPE_HEADER].file, + " HS_SLAB_ROW( %3u, %3u ) \\\n",ii,ii-1); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + " HS_EMPTY\n" + " \n"); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + "#define HS_TRANSPOSE_SLAB() \\\n"); + + for (uint32_t ii=1; ii<=warp_lanes_log2; ii++) + fprintf(files[HSG_FILE_TYPE_HEADER].file, + " HS_TRANSPOSE_STAGE( %u ) \\\n",ii); + + hsg_transpose(msb_idx_u32(hsg_config.warp.lanes), + hsg_config.thread.regs, + files[HSG_FILE_TYPE_HEADER].file, + files[HSG_FILE_TYPE_HEADER].file, + hsg_transpose_blend, + hsg_transpose_remap); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + " HS_EMPTY\n" + " \n"); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "// \n" + "// Copyright 2016 Google Inc. \n" + "// \n" + "// Use of this source code is governed by a BSD-style \n" + "// license that can be found in the LICENSE file. \n" + "// \n" + " \n" + "#include <%s_macros.h> \n" + " \n" + "// \n" + "// \n" + "// \n", + files[HSG_FILE_TYPE_SOURCE].prefix); + } + break; + + case HSG_OP_TYPE_FILE_FOOTER: + fprintf(files[HSG_FILE_TYPE_HEADER].file, + " \n" + "#endif \n" + " \n" + "// \n" + "// \n" + "// \n" + " \n"); + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "// \n" + "// \n" + "// \n" + " \n"); + break; + + case HSG_OP_TYPE_TRANSPOSE_KERNEL_PROTO: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "__kernel \n" + "__attribute__((intel_reqd_sub_group_size(%u))) \n" + "void hs_kernel_transpose(__global HS_KEY_TYPE * const restrict vout) \n", + hsg_config.warp.lanes); + } + break; + + case HSG_OP_TYPE_TRANSPOSE_KERNEL_PREAMBLE: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const global_id = get_global_id(0); \n" + "uint const gmem_idx = (global_id / %u) * %u + (global_id & %u); \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes * hsg_config.thread.regs, + hsg_config.warp.lanes-1); + } + break; + + case HSG_OP_TYPE_TRANSPOSE_KERNEL_BODY: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_TRANSPOSE_SLAB()\n"); + } + break; + + case HSG_OP_TYPE_BS_KERNEL_PROTO: + { + struct hsg_merge const * const m = merge + ops->a; + + uint32_t const tpb = m->warps * hsg_config.warp.lanes; + uint32_t const bs = pow2_ru_u32(m->warps); + uint32_t const msb = msb_idx_u32(bs); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "__kernel \n" + "__attribute__((reqd_work_group_size(%u,1,1))) \n" + "__attribute__((intel_reqd_sub_group_size(%u))) \n" + "void hs_kernel_bs_%u(__global HS_KEY_TYPE const * const restrict vin, \n" + " __global HS_KEY_TYPE * const restrict vout) \n", + tpb, + hsg_config.warp.lanes, + msb); + } + break; + + case HSG_OP_TYPE_BS_KERNEL_PREAMBLE: + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "__local union { \n"); + + struct hsg_merge const * const m = merge + ops->a; + + if (m->warps > 1) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " HS_KEY_TYPE m[%u * %u];\n", + m->rows_bs, + m->warps * hsg_config.warp.lanes); + } + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "} shared; \n" + " \n"); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const global_id = get_global_id(0); \n" + "uint const gmem_idx = (global_id / %u) * %u + (global_id & %u); \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes * hsg_config.thread.regs, + hsg_config.warp.lanes-1); + } + break; + + case HSG_OP_TYPE_BC_KERNEL_PROTO: + { + uint32_t const bc_max = pow2_rd_u32(merge[0].warps); + uint32_t const tpb = bc_max * hsg_config.warp.lanes; + uint32_t const msb = msb_idx_u32(merge[ops->a].warps); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "__kernel \n" + "__attribute__((intel_reqd_sub_group_size(%u))) \n" + "void hs_kernel_bc_%u(__global HS_KEY_TYPE * const restrict vout) \n", + hsg_config.warp.lanes,msb); + } + break; + + case HSG_OP_TYPE_BC_KERNEL_PREAMBLE: + { + struct hsg_merge const * const m = merge + ops->a; + uint32_t const bc_max = pow2_rd_u32(merge[0].warps); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "__local union { \n"); + + if (m->warps > 1) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " HS_KEY_TYPE m[%-3u * %u];\n", + m->rows_bc, + m->warps * hsg_config.warp.lanes); + } + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "} shared; \n" + " \n"); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const global_id = get_global_id(0); \n" + "uint const gmem_idx = (global_id / %u) * %u + (global_id & %u); \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes * hsg_config.thread.regs, + hsg_config.warp.lanes-1); + } + break; + + case HSG_OP_TYPE_FM_KERNEL_PROTO: + fprintf(files[HSG_FILE_TYPE_HEADER].file, + "#define HS_FM_BLOCKS_LOG2_%-2u %u \n", + ops->a,ops->b); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "__kernel \n" + "__attribute__((intel_reqd_sub_group_size(%u))) \n" + "void hs_kernel_fm_%u(__global HS_KEY_TYPE * const restrict vout, \n" + " uint const fm_full, \n" + " uint const fm_frac) \n", + hsg_config.warp.lanes,ops->a); + break; + + case HSG_OP_TYPE_FM_KERNEL_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const global_id = (uint)get_global_id(0); \n" + "uint const warp_idx = global_id / %u; \n" + "uint const warp_lane_idx = global_id & %u; \n" + " \n" + "uint const merge_idx = warp_idx / %u >> %u; \n" + " \n" + "uint const merge_stride = %u * %u << %u; \n" + "uint const merge_keys = merge_stride * %u; \n" + " \n" + "uint const merge_base = merge_idx * merge_keys; \n" + " \n" + "uint const merge_l_off = (warp_idx - merge_idx * (%u << %u)) * %u + warp_lane_idx; \n" + "uint const merge_l_end = merge_stride * (%u / 2 - 1) + merge_l_off; \n" + " \n" + "int const merge_r_off = merge_keys - merge_l_end - 1; \n" + " \n" + "__global HS_KEY_TYPE * const restrict merge_l = vout + (merge_base + merge_l_off); \n" + "__global HS_KEY_TYPE * const restrict merge_r = vout + (merge_base + merge_r_off); \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes-1, + hsg_config.thread.regs,ops->b, + hsg_config.thread.regs,hsg_config.warp.lanes,ops->b, + ops->a, + hsg_config.thread.regs,ops->b,hsg_config.warp.lanes, + ops->a); + break; + + case HSG_OP_TYPE_HM_KERNEL_PROTO: + { + uint32_t const bc_max = msb_idx_u32(pow2_rd_u32(merge[0].warps)); + + fprintf(files[HSG_FILE_TYPE_HEADER].file, + "#define HS_HM_BLOCKS_LOG2_%-2u %u \n", + ops->a,ops->b); + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + " \n" + "__kernel \n" + "__attribute__((intel_reqd_sub_group_size(%u))) \n" + "void hs_kernel_hm_%u(__global HS_KEY_TYPE * const restrict vout) \n", + hsg_config.warp.lanes,ops->a); + } + break; + + case HSG_OP_TYPE_HM_KERNEL_PREAMBLE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const global_id = (uint)get_global_id(0); \n" + "uint const warp_idx = global_id / %u; \n" + "uint const warp_lane_idx = global_id & %u; \n" + " \n" + "uint const merge_idx = (warp_idx / %u) >> %u; \n" + " \n" + "uint const merge_stride = %u * %u << %u; \n" + "uint const merge_keys = merge_stride * %u; \n" + " \n" + "uint const merge_base = merge_idx * merge_keys; \n" + "uint const merge_off = (warp_idx - merge_idx * (%u << %u)) * %u; \n" + " \n" + "__global HS_KEY_TYPE * const restrict merge_ptr = vout + (merge_base + merge_off + warp_lane_idx); \n" + " \n", + hsg_config.warp.lanes, + hsg_config.warp.lanes-1, + hsg_config.thread.regs,ops->b, + hsg_config.thread.regs,hsg_config.warp.lanes,ops->b, + ops->a, + hsg_config.thread.regs,ops->b,hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BX_REG_GLOBAL_LOAD: + { + static char const * const vstr[] = { "vin", "vout" }; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%-3u = (%s + gmem_idx)[%-3u * %u]; \n", + ops->n,vstr[ops->v],ops->n-1,hsg_config.warp.lanes); + } + break; + + case HSG_OP_TYPE_BX_REG_GLOBAL_STORE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "(vout + gmem_idx)[%-3u * %u] = r%u; \n", + ops->n-1,hsg_config.warp.lanes,ops->n); + break; + + case HSG_OP_TYPE_HM_REG_GLOBAL_LOAD: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%-3u = merge_ptr[%-3u * merge_stride];\n", + ops->a,ops->b); + break; + + case HSG_OP_TYPE_HM_REG_GLOBAL_STORE: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "merge_ptr[%-3u * merge_stride] = r%u;\n", + ops->b,ops->a); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%-3u = merge_l[%-3u * merge_stride];\n", + ops->a,ops->b); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_STORE_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "merge_l[%-3u * merge_stride] = r%u;\n", + ops->b,ops->a); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_LOAD_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%-3u = merge_r[%-3u * merge_stride];\n", + ops->a,ops->b); + break; + + case HSG_OP_TYPE_FM_REG_GLOBAL_STORE_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "merge_r[%-3u * merge_stride] = r%u;\n", + ops->b,ops->a); + break; + + case HSG_OP_TYPE_WARP_FLIP: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const flip_lane_mask = %u; \n" + "uint const flip_lane_idx = get_sub_group_local_id() ^ flip_lane_mask; \n" + "int const t_lt = get_sub_group_local_id() < flip_lane_idx; \n", + ops->n-1); + break; + + case HSG_OP_TYPE_WARP_HALF: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const half_lane_mask = %u; \n" + "uint const half_lane_idx = get_sub_group_local_id() ^ half_lane_mask; \n" + "int const t_lt = get_sub_group_local_id() < half_lane_idx; \n", + ops->n / 2); + break; + + case HSG_OP_TYPE_CMP_FLIP: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_FLIP(%-3u,r%-3u,r%-3u)\n",ops->a,ops->b,ops->c); + break; + + case HSG_OP_TYPE_CMP_HALF: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_HALF(%-3u,r%-3u)\n",ops->a,ops->b); + break; + + case HSG_OP_TYPE_CMP_XCHG: + if (ops->c == UINT32_MAX) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_XCHG(r%-3u,r%-3u)\n", + ops->a,ops->b); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_CMP_XCHG(r%u_%u,r%u_%u)\n", + ops->c,ops->a,ops->c,ops->b); + } + break; + + case HSG_OP_TYPE_BS_REG_SHARED_STORE_V: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "(shared.m + get_local_id(0))[%-3u * %-2u * %-3u] = r%u;\n", + merge[ops->a].warps,hsg_config.warp.lanes,ops->c,ops->b); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_LOAD_V: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "r%-3u = (shared.m + get_local_id(0))[%-3u * %-2u * %-3u];\n", + ops->b,merge[ops->a].warps,hsg_config.warp.lanes,ops->c); + break; + + case HSG_OP_TYPE_BC_REG_SHARED_LOAD_V: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%-3u = (shared.m + get_local_id(0))[%-3u * %-2u * %-3u];\n", + ops->b,ops->a,hsg_config.warp.lanes,ops->c); + break; + + case HSG_OP_TYPE_BX_REG_SHARED_STORE_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "(shared.m + smem_l_idx)[%5u] = r%u_%u;\n", + ops->b * hsg_config.warp.lanes, + ops->c, + ops->a); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_STORE_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "(shared.m + smem_r_idx)[%5u] = r%u_%u;\n", + ops->b * hsg_config.warp.lanes, + ops->c, + ops->a); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_LOAD_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%u_%-3u = (shared.m + smem_l_idx)[%u];\n", + ops->c, + ops->a, + ops->b * hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BS_REG_SHARED_LOAD_RIGHT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%u_%-3u = (shared.m + smem_r_idx)[%u];\n", + ops->c, + ops->a, + ops->b * hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BC_REG_GLOBAL_LOAD_LEFT: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "HS_KEY_TYPE r%u_%-3u = (vout + gmem_l_idx)[%u];\n", + ops->c, + ops->a, + ops->b * hsg_config.warp.lanes); + break; + + case HSG_OP_TYPE_BLOCK_SYNC: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "barrier(CLK_LOCAL_MEM_FENCE);\n"); // OpenCL 2.0+: work_group_barrier + break; + + case HSG_OP_TYPE_BS_FRAC_PRED: + { + if (ops->m == 0) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (warp_idx < bs_full)\n"); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else if (bs_frac == %u)\n", + ops->w); + } + } + break; + + case HSG_OP_TYPE_BS_MERGE_H_PREAMBLE: + { + struct hsg_merge const * const m = merge + ops->a; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const smem_l_idx = get_sub_group_id() * %u + get_sub_group_local_id(); \n" + "uint const smem_r_idx = (get_sub_group_id() ^ 1) * %u + (get_sub_group_local_id() ^ %u); \n", + m->warps * hsg_config.warp.lanes, + m->warps * hsg_config.warp.lanes, hsg_config.warp.lanes-1); +#if 0 + if (ops->b == true) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint smem_l_idx = get_sub_group_id() * %u + get_sub_group_local_id(); \n" + "uint smem_r_idx = (get_sub_group_id() ^ 1) * %u + (get_sub_group_local_id() ^ %u); \n", + m->warps * hsg_config.warp.lanes, + m->warps * hsg_config.warp.lanes, hsg_config.warp.lanes-1); + } + else // update + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "smem_l_idx = get_sub_group_id() * %u + get_sub_group_local_id(); \n" + "smem_r_idx = (get_sub_group_id() ^ 1) * %u + (get_sub_group_local_id() ^ %u); \n", + m->warps * hsg_config.warp.lanes, + m->warps * hsg_config.warp.lanes, hsg_config.warp.lanes-1); + } +#endif + } + break; + + case HSG_OP_TYPE_BC_MERGE_H_PREAMBLE: + { + struct hsg_merge const * const m = merge + ops->a; + uint32_t const b = m->warps * hsg_config.warp.lanes; + uint32_t const k = b * hsg_config.thread.regs; + + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "uint const gmem_l_idx = (global_id / %u) * %u + (global_id & %u); \n" + "uint const smem_l_idx = get_sub_group_id() * %u + get_sub_group_local_id(); \n", + b,k,b-1, + b); + + } + break; + + case HSG_OP_TYPE_BX_MERGE_H_PRED: + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (get_sub_group_id() < %u)\n", + ops->a); + break; + + case HSG_OP_TYPE_BS_ACTIVE_PRED: + { + struct hsg_merge const * const m = merge + ops->a; + + if (m->warps <= 32) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (((1u << get_sub_group_id()) & 0x%08X) != 0)\n", + m->levels[ops->b].active.b32a2[0]); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (((1UL << get_sub_group_id()) & 0x%08X%08XL) != 0L)\n", + m->levels[ops->b].active.b32a2[1], + m->levels[ops->b].active.b32a2[0]); + } + } + break; + + case HSG_OP_TYPE_FM_MERGE_RIGHT_PRED: + { + if (ops->a == ops->b) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "if (merge_idx < fm_full) \n"); + } + else if (ops->b > 1) + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else if (fm_frac == %u) \n", + ops->b); + } + else + { + fprintf(files[HSG_FILE_TYPE_SOURCE].file, + "else\n"); + } + } + break; + + default: + hsg_target_debug(files,merge,ops,depth); + break; + } +} + +// +// +// diff --git a/src/compute/hs/gen/transpose.c b/src/compute/hs/gen/transpose.c new file mode 100644 index 0000000000..f99e966ff7 --- /dev/null +++ b/src/compute/hs/gen/transpose.c @@ -0,0 +1,172 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +// +// +// + +#include "transpose.h" +#include "macros.h" + +// +// Rows must be an even number. This is enforced elsewhere. +// +// The transpose requires (cols_log2 * rows/2) row-pair blends. +// +void +hsg_transpose(uint32_t const cols_log2, + uint32_t const rows, + void * blend, + void * remap, + void (*pfn_blend)(uint32_t const cols_log2, + uint32_t const row_ll, // lower-left + uint32_t const row_ur, // upper-right + void * blend), + void (*pfn_remap)(uint32_t const row_from, + uint32_t const row_to, + void * remap)) +{ + // get mapping array + uint32_t * map_curr = ALLOCA(rows * sizeof(*map_curr)); + uint32_t * map_next = ALLOCA(rows * sizeof(*map_next)); + + // init the mapping array + for (uint32_t ii=0; ii<rows; ii++) + map_curr[ii] = ii; + + // successively transpose rows using blends + for (uint32_t cc=1; cc<=cols_log2; cc++) + { + uint32_t const mask = BITS_TO_MASK(cc); + + for (uint32_t ii=0; ii<rows; ii++) + { + uint32_t const left = map_curr[ii]; + uint32_t const stay = left & ~mask; + + if (left != stay) // will be swapped away + { + for (uint32_t jj=0; jj<rows; jj++) + { + if (map_curr[jj] == stay) + { + map_next[jj] = stay; + map_next[ii] = stay + (rows << (cc-1)); + + pfn_blend(cc,ii,jj,blend); // log2,left,right,payload + + break; + } + } + } + } + + uint32_t * tmp = map_curr; + + map_curr = map_next; + map_next = tmp; + } + + // write out the remapping + for (uint32_t ii=0; ii<rows; ii++) + pfn_remap(ii,map_curr[ii] >> cols_log2,remap); +} + +// +// test it! +// + +#ifdef HS_TRANSPOSE_DEBUG + +#include <stdio.h> + +static uint32_t cols; // implicit on SIMD/GPU + +static +void +hsg_debug_remap(uint32_t const row_from, + uint32_t const row_to, + uint32_t * const r) +{ + fprintf(stdout,"REMAP( %3u, %3u )\n",row_from,row_to); + + r[row_to] = row_from; +} + +static +void +hsg_debug_blend(uint32_t const cols_log2, + uint32_t const row_ll, // lower-left + uint32_t const row_ur, // upper-right + uint32_t * m) +{ + fprintf(stdout,"BLEND( %u, %3u, %3u )\n",cols_log2,row_ll,row_ur); + + uint32_t * const ll = ALLOCA(cols * sizeof(*m)); + uint32_t * const ur = ALLOCA(cols * sizeof(*m)); + + memcpy(ll,m+row_ll*cols,cols * sizeof(*m)); + memcpy(ur,m+row_ur*cols,cols * sizeof(*m)); + + for (uint32_t ii=0; ii<cols; ii++) + m[row_ll*cols+ii] = ((ii >> cols_log2-1) & 1) ? ll[ii] : ur[ii^(1<<cols_log2-1)]; + + for (uint32_t ii=0; ii<cols; ii++) + m[row_ur*cols+ii] = ((ii >> cols_log2-1) & 1) ? ll[ii^(1<<cols_log2-1)] : ur[ii]; +} + +static +void +hsg_debug_print(uint32_t const rows, + uint32_t const * const m, + uint32_t const * const r) +{ + for (uint32_t rr=0; rr<rows; rr++) { + for (uint32_t cc=0; cc<cols; cc++) + fprintf(stdout,"%4u ",m[r[rr]*cols + cc]); + fprintf(stdout,"\n"); + } +} + +int +main(int argc, char * argv[]) +{ + uint32_t const cols_log2 = (argc <= 1) ? 3 : strtoul(argv[1],NULL,0); + uint32_t const rows = (argc <= 2) ? 6 : strtoul(argv[2],NULL,0); + + if (rows & 1) + return; + + cols = 1 << cols_log2; + + uint32_t * const m = ALLOCA(cols * rows * sizeof(*m)); + uint32_t * const r = ALLOCA( rows * sizeof(*r)); + + for (uint32_t rr=0; rr<rows; rr++) { + r[rr] = rr; + for (uint32_t cc=0; cc<cols; cc++) + m[rr*cols+cc] = cc*rows+rr; + } + + hsg_debug_print(rows,m,r); + + hsg_transpose(cols_log2,rows, + m,r, + hsg_debug_blend, + hsg_debug_remap); + + hsg_debug_print(rows,m,r); + + return 0; +} + +#endif + +// +// +// diff --git a/src/compute/hs/gen/transpose.h b/src/compute/hs/gen/transpose.h new file mode 100644 index 0000000000..83f6fc4e42 --- /dev/null +++ b/src/compute/hs/gen/transpose.h @@ -0,0 +1,38 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <stdint.h> + +// +// There must be an even number of rows. This is enforced elsewhere. +// +// The transpose requires (cols_log2 * rows/2) row-pair blends. +// + +void +hsg_transpose(uint32_t const cols_log2, + uint32_t const rows, + void * blend, + void * remap, + void (*pfn_blend)(uint32_t const cols_log2, + uint32_t const row_ll, // lower-left + uint32_t const row_ur, // upper-right + void * blend), + void (*pfn_remap)(uint32_t const row_from, + uint32_t const row_to, + void * remap)); + +// +// +// diff --git a/src/compute/sk/SkContext_Compute.cpp b/src/compute/sk/SkContext_Compute.cpp new file mode 100644 index 0000000000..331fad6df4 --- /dev/null +++ b/src/compute/sk/SkContext_Compute.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2016 Google Inc. + * + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#include "SkContext_Compute.h" + +// +// +// + +// +// +// + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#define TARGET_PLATFORM_SUBSTRING "TO BE SET" +#define TARGET_DEVICE_SUBSTRING "TO BE SET" + +// +// +// + +// +// +// + +SkContext_Compute::SkContext_Compute(GrGLInterface const * fInterface) + : fInterface(fInterface) +{ + // + // Make sure fInterface destruction occurs after compute + // + SkSafeRef(fInterface); + + skc_err err; + + // + // CREATE A NEW SPINEL CONTEXT AND ATTACH TO WINDOW + // + err = skc_context_create(&context, TARGET_PLATFORM_SUBSTRING, TARGET_DEVICE_SUBSTRING); + SKC_ERR_CHECK(err); + + // + // CREATE A NEW REUSABLE INTEROP OBJECT + // + // interop = skc_interop_create(fInterface,1); TODO have this in skc.h + + // + // CREATE A NEW REUSABLE SURFACE OBJECT + // + err = skc_surface_create(context, + interop, + &surface); + SKC_ERR_CHECK(err); +} + +// +// +// + +SkContext_Compute::~SkContext_Compute() +{ + skc_err err; + + // dispose of surface + err = skc_surface_dispose(surface); + SKC_ERR_CHECK(err); + + // dispose of interop + // skc_interop_dispose(interop); TODO have this in skc.h + + // dispose of context + err = skc_context_release(context); + SKC_ERR_CHECK(err); + + // unref GL interface + SkSafeUnref(fInterface); +} + +// +// +// + diff --git a/src/compute/sk/SkContext_Compute.h b/src/compute/sk/SkContext_Compute.h new file mode 100644 index 0000000000..066e11df45 --- /dev/null +++ b/src/compute/sk/SkContext_Compute.h @@ -0,0 +1,71 @@ +/* + * Copyright 2016 Google Inc. + * + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "gl/GrGLInterface.h" + +// +// +// + +#ifdef __cplusplus +extern "C" { +#endif + +#include "skc.h" + +#ifdef __cplusplus +} +#endif + +// +// +// + +class SkContext_Compute : public SkRefCntBase +{ + public: + + // + // + // + + SkContext_Compute(GrGLInterface const * fInterface); + + ~SkContext_Compute(); + + // + // + // + + skc_context_t context; + skc_interop_t interop; + skc_surface_t surface; + + // + // + // + + private: + + GrGLInterface const * fInterface; + + // + // + // +}; + +// +// +// diff --git a/src/compute/sk/SkDevice_Compute.cpp b/src/compute/sk/SkDevice_Compute.cpp new file mode 100644 index 0000000000..f19f7dbc75 --- /dev/null +++ b/src/compute/sk/SkDevice_Compute.cpp @@ -0,0 +1,887 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + */ + +// +// C++ +// + +#include "SkDevice_Compute.h" +#include "SkPM4f.h" + +// +// +// + +#if SK_SUPPORT_GPU_COMPUTE + +// +// C++ +// + +#include "SkImageInfo.h" +#include "SkDraw.h" +#include "SkMatrix.h" +#include "SkPath.h" + +// +// C +// + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../spinel/spinel/color.h" +#include "../compute/skc/skc.h" + +#ifdef __cplusplus +} +#endif + +// +// +// + +SkDevice_Compute::SkDevice_Compute(sk_sp<SkContext_Compute> compute, int w, int h) + : SkClipStackDevice(SkImageInfo::MakeN32Premul(w,h), SkSurfaceProps(0,kUnknown_SkPixelGeometry)) + , fCompute(std::move(compute)) +{ + fTopCTM = this->ctm(); + fTransformWeakref = SKC_WEAKREF_INVALID; + + fClipWeakref = SKC_WEAKREF_INVALID; + + skc_err err; + + // + // create a composition + // +#define LAYER_COUNT (1<<14) + + err = skc_composition_create(fCompute->context, &fComposition); + SKC_ERR_CHECK(err); + + // Is this correct? + int clipRect[] = { 0, 0, w - 1, h - 1 }; + err = skc_composition_clip_set(fComposition, clipRect); + SKC_ERR_CHECK(err); + + // + // create styling + // + err = skc_styling_create(fCompute->context, + LAYER_COUNT, + 10, + 2 * 1024 * 1024, + &fStyling); + + // + // create a path builder + // + err = skc_path_builder_create(fCompute->context, &fPB); + SKC_ERR_CHECK(err); + + // + // create a raster builder + // + err = skc_raster_builder_create(fCompute->context, &fRB); + SKC_ERR_CHECK(err); + + // + // create the simplest styling group that encloses all layers + // + styling_group_init(); +} + + +// +// +// + +SkDevice_Compute::~SkDevice_Compute() { + skc_err err; + + err = skc_raster_builder_release(fRB); + SKC_ERR_CHECK(err); + + err = skc_path_builder_release(fPB); + SKC_ERR_CHECK(err); + + err = skc_styling_dispose(fStyling); + SKC_ERR_CHECK(err); + + err = skc_composition_dispose(fComposition); + SKC_ERR_CHECK(err); +} + +// +// +// + +void SkDevice_Compute::flush() { + // + // seal the styling and composition objects + // + skc_err err; + + err = skc_composition_seal(fComposition); + SKC_ERR_CHECK(err); + + err = skc_styling_seal(fStyling); + SKC_ERR_CHECK(err); + + // + // we're going to block here -- API mismatch + // + + // + // render to surface + // + // note this implicitly seals composition and styling + // + err = skc_surface_render(fCompute->surface, fComposition, fStyling); + SKC_ERR_CHECK(err); + + // + // kick off pipeline and wait here -- not needed since skc_surface_reset() blocks + // + err = skc_surface_wait(fCompute->surface); + SKC_ERR_CHECK(err); + + // + // reset the surface -- implicitly waits for render to finish -- FIXME -- composition might be released too early + // + err = skc_surface_reset(fCompute->surface); + SKC_ERR_CHECK(err); + + // + // reset composition and styling + // + err = skc_composition_reset(fComposition); + SKC_ERR_CHECK(err); + + err = skc_styling_reset(fStyling); + SKC_ERR_CHECK(err); + + // + // + // + styling_group_init(); +} + +// +// +// + +#define SKC_STYLING_CMDS(...) SK_ARRAY_COUNT(__VA_ARGS__),__VA_ARGS__ +#define SKC_GROUP_IDS(...) SK_ARRAY_COUNT(__VA_ARGS__),__VA_ARGS__ + +void SkDevice_Compute::styling_group_init() { + skc_styling_group_alloc(fStyling, &fGroupID); + fParents.push_back(fGroupID); + + // ENTER + skc_styling_cmd_t const styling_cmds_enter[] = { + SKC_STYLING_CMD_OP_COVER_ZERO_ACC, + SKC_STYLING_CMD_OP_COLOR_ZERO_ACC | SKC_STYLING_CMD_OP_IS_FINAL + }; + skc_styling_group_enter(fStyling, fGroupID, SKC_STYLING_CMDS(styling_cmds_enter)); + + skc_group_id const group_id_parents[] = { fGroupID }; + skc_styling_group_parents(fStyling, fGroupID, SKC_GROUP_IDS(group_id_parents)); + + // RANGE + skc_styling_group_range_lo(fStyling, fGroupID, 0); + skc_styling_group_range_hi(fStyling, fGroupID, LAYER_COUNT-1); + + // LEAVE + skc_styling_cmd_t const styling_cmds_leave[] = { + SKC_STYLING_CMD_OP_SURFACE_COMPOSITE | SKC_STYLING_CMD_OP_IS_FINAL + }; + skc_styling_group_leave(fStyling, fGroupID, SKC_STYLING_CMDS(styling_cmds_leave)); + + // START + fGroupLayerID = LAYER_COUNT-1; +} + +// +// +// + +#define SK_SCALE_F32 (1.0f/255.0f) +#define SK_TO_RGBA_F32(c) { SK_SCALE_F32 * SkColorGetR(c), \ + SK_SCALE_F32 * SkColorGetG(c), \ + SK_SCALE_F32 * SkColorGetB(c), \ + SK_SCALE_F32 * SkColorGetA(c) } +// +// +// + +void SkDevice_Compute::path_rasterize_and_place(const SkPaint& paint, + const skc_path_t path, + const SkMatrix* prePathMatrix) { + float transform[9]; + const SkMatrix& ctm = fTopCTM; + SkMatrix tmp; + + if (prePathMatrix) { + tmp.setConcat(ctm, *prePathMatrix); + } + transform[0] = tmp.get(SkMatrix::kMScaleX); + transform[1] = tmp.get(SkMatrix::kMSkewX ); + transform[2] = tmp.get(SkMatrix::kMTransX); + transform[3] = tmp.get(SkMatrix::kMSkewY ); + transform[4] = tmp.get(SkMatrix::kMScaleY); + transform[5] = tmp.get(SkMatrix::kMTransY); + transform[6] = tmp.get(SkMatrix::kMPersp0); + transform[7] = tmp.get(SkMatrix::kMPersp1); + transform[8] = tmp.get(SkMatrix::kMPersp2); + + skc_transform_weakref_t& transform_weakref = fTransformWeakref; + // + + // always invalid for now + // + skc_raster_clip_weakref_t clip_weakref = fClipWeakref; + + // TODO Support arbitrary path clip? + SkRect devClip = SkRect::MakeFromIRect(this->devClipBounds()); + const float clip[] = { devClip.fLeft, devClip.fTop, devClip.fRight, devClip.fBottom }; + + // + // + // + skc_err err; + skc_raster_t raster; + + err = skc_raster_begin(fRB); + err = skc_raster_add_filled(fRB, path, &transform_weakref, transform, &clip_weakref, clip); + err = skc_raster_end(fRB, &raster); + + // + // can release path handle now because it is being referenced by raster + // + err = skc_path_release(fCompute->context, path); + + // + // style the path + // + skc_styling_cmd_t cmds[1 + 3 + 1]; + + cmds[0] = SKC_STYLING_CMD_OP_COVER_NONZERO; + cmds[SK_ARRAY_COUNT(cmds)-1] = SKC_STYLING_CMD_OP_BLEND_OVER | SKC_STYLING_CMD_OP_IS_FINAL; + + { + SkPM4f rgba = SkColor4f::FromColor(paint.getColor()).premul(); + + skc_styling_layer_fill_solid_encoder(cmds+1, rgba.fVec); + + skc_styling_group_layer(fStyling, fGroupID, fGroupLayerID, SKC_STYLING_CMDS(cmds)); + } + + err = skc_composition_place(fComposition, fGroupLayerID, raster, 0, 0); + + // + // can release raster handle now because it is being referenced by composition + // + err = skc_raster_release(fCompute->context, raster); + + SkASSERT(err == SKC_ERR_SUCCESS); + + fGroupLayerID -= 1; +} + +// +// +// + +void SkDevice_Compute::path_add(const SkPaint& paint, + const SkPath& path, + const SkMatrix* prePathMatrix) { + skc_err err; + + err = skc_path_begin(fPB); + +#if 0 + SkPath::Iter pi(path,false); +#else + SkPath::RawIter pi(path); // this seems to work fine for now +#endif + + SkPoint xy0; + + // + // build path + // + while (true) + { + SkPoint pts[4]; + SkPath::Verb const verb = pi.next(pts); + + switch (verb) + { + case SkPath::kMove_Verb: + xy0 = pts[0]; + err = skc_path_move_to(fPB, + pts[0].x(),pts[0].y()); + continue; + + case SkPath::kLine_Verb: + err = skc_path_line_to(fPB, + pts[1].x(),pts[1].y()); + continue; + + case SkPath::kQuad_Verb: + err = skc_path_quad_to(fPB, + pts[1].x(),pts[1].y(), + pts[2].x(),pts[2].y()); + continue; + + case SkPath::kConic_Verb: // <--------------------- FIXME + err = skc_path_line_to(fPB, + pts[2].x(),pts[2].y()); + continue; + + case SkPath::kCubic_Verb: + err = skc_path_cubic_to(fPB, + pts[1].x(),pts[1].y(), + pts[2].x(),pts[2].y(), + pts[3].x(),pts[3].y()); + continue; + + case SkPath::kClose_Verb: + err = skc_path_line_to(fPB,xy0.x(),xy0.y()); + continue; + + case SkPath::kDone_Verb: + break; + } + + // + // otherwise, kDone_Verb breaks out of while loop + // + break; + } + + // + // seal the path + // + skc_path_t skc_path; + + err = skc_path_end(fPB,&skc_path); + + // + // rasterize the path and place it in a composition + // + path_rasterize_and_place(paint,skc_path,prePathMatrix); + + SkASSERT(err == SKC_ERR_SUCCESS); +} + +// +// +// + +void +SkDevice_Compute::circles_add( + const SkPaint & paint, + const SkPoint points[], + int32_t const count, + SkScalar const radius) +{ +#define CIRCLE_KAPPA 0.55228474983079339840f // moar digits! + +#define CIRCLE_RADIUS_X radius +#define CIRCLE_RADIUS_Y radius + +#define CIRCLE_KAPPA_X (CIRCLE_RADIUS_X * CIRCLE_KAPPA) +#define CIRCLE_KAPPA_Y (CIRCLE_RADIUS_Y * CIRCLE_KAPPA) + + // + // use a 4 Bezier approximation + // + float const circle[] = + { + 0.0f, +CIRCLE_RADIUS_Y, // move_to + + +CIRCLE_KAPPA_X, +CIRCLE_RADIUS_Y, // cubic_to + +CIRCLE_RADIUS_X, +CIRCLE_KAPPA_Y, + +CIRCLE_RADIUS_X, 0.0f, + + +CIRCLE_RADIUS_X, -CIRCLE_KAPPA_Y, // cubic_to + +CIRCLE_KAPPA_X, -CIRCLE_RADIUS_Y, + 0.0f, -CIRCLE_RADIUS_Y, + + -CIRCLE_KAPPA_X, -CIRCLE_RADIUS_Y, // cubic_to + -CIRCLE_RADIUS_X, -CIRCLE_KAPPA_Y, + -CIRCLE_RADIUS_X, 0.0f, + + -CIRCLE_RADIUS_X, +CIRCLE_KAPPA_Y, // cubic_to + -CIRCLE_KAPPA_X, +CIRCLE_RADIUS_Y, + 0.0f, +CIRCLE_RADIUS_Y + }; + +#define CXLAT(x,y,t) circle[x]+t.fX,circle[y]+t.fY + + // + // + // + + skc_err err; + + err = skc_path_begin(fPB); + + // + // + // + for (int32_t ii=0; ii<count; ii++) + { + SkPoint const p = points[ii]; + + err = skc_path_move_to(fPB, + CXLAT(0,1,p)); + + err = skc_path_cubic_to(fPB, + CXLAT(2,3,p), + CXLAT(4,5,p), + CXLAT(6,7,p)); + + err = skc_path_cubic_to(fPB, + CXLAT(8, 9,p), + CXLAT(10,11,p), + CXLAT(12,13,p)); + + err = skc_path_cubic_to(fPB, + CXLAT(14,15,p), + CXLAT(16,17,p), + CXLAT(18,19,p)); + + err = skc_path_cubic_to(fPB, + CXLAT(20,21,p), + CXLAT(22,23,p), + CXLAT(24,25,p)); + } + + // + // seal the path + // + skc_path_t skc_path; + + err = skc_path_end(fPB,&skc_path); + + // + // rasterize the path and place it in a composition + // + path_rasterize_and_place(paint,skc_path,NULL); + + SkASSERT(err == SKC_ERR_SUCCESS); +} + +// +// +// + +void +SkDevice_Compute::squares_add( + const SkPaint & paint, + const SkPoint points[], + int32_t const count, + SkScalar const radius) +{ + float const square[] = + { + -radius,+radius, // move_to + +radius,+radius, // line_to + +radius,-radius, // line_to + -radius,-radius, // line_to + -radius,+radius // line_to + }; + +#define SXLAT(x,y,t) square[x]+t.fX,square[y]+t.fY + + // + // + // + + skc_err err; + + err = skc_path_begin(fPB); + + // + // + // + for (int32_t ii=0; ii<count; ii++) + { + SkPoint const p = points[ii]; + + err = skc_path_move_to(fPB,SXLAT(0,1,p)); + err = skc_path_line_to(fPB,SXLAT(2,3,p)); + err = skc_path_line_to(fPB,SXLAT(4,5,p)); + err = skc_path_line_to(fPB,SXLAT(6,7,p)); + err = skc_path_line_to(fPB,SXLAT(8,9,p)); + } + + // + // seal the path + // + skc_path_t skc_path; + + err = skc_path_end(fPB,&skc_path); + + // + // rasterize the path and place it in a composition + // + path_rasterize_and_place(paint,skc_path,NULL); + + SkASSERT(err == SKC_ERR_SUCCESS); +} + +// +// FIXME -- THIS IS NOT CORRECT +// +// Need to implement butt, round, square caps +// + +void +SkDevice_Compute::line_stroked_butt(SkPoint const xy0, + SkPoint const xy1, + SkScalar const radius) +{ + float const dx = xy1.fX - xy0.fX; + float const dy = xy1.fY - xy0.fY; + + float const hypot = hypotf(dx,dy); + + // FIXME -- what's practical here? + if (hypot == 0.0f) + return; + + float const scale = radius / hypot; + + float const rx = dy * scale; + float const ry = dx * scale; + + skc_err err; + + err = skc_path_move_to(fPB,xy0.fX-rx,xy0.fY+ry); + err = skc_path_line_to(fPB,xy1.fX-rx,xy1.fY+ry); + err = skc_path_line_to(fPB,xy1.fX+rx,xy1.fY-ry); + err = skc_path_line_to(fPB,xy0.fX+rx,xy0.fY-ry); + err = skc_path_line_to(fPB,xy0.fX-rx,xy0.fY+ry); + + SkASSERT(err == SKC_ERR_SUCCESS); +} + +void +SkDevice_Compute::lines_stroked_add( + const SkPaint & paint, + const SkPoint points[], + int32_t const count, + SkScalar const radius) +{ + skc_err err; + + err = skc_path_begin(fPB); + + // + // + // + for (int32_t ii=0; ii<count; ii+=2) + line_stroked_butt(points[ii],points[ii+1],radius); + + // + // seal the path + // + skc_path_t skc_path; + + err = skc_path_end(fPB,&skc_path); + + // + // rasterize the path and place it in a composition + // + path_rasterize_and_place(paint,skc_path,NULL); + + SkASSERT(err == SKC_ERR_SUCCESS); +} + + +// +// +// + +// drawPaint is really just a short-cut for drawRect(wide_open, paint) +// so we have to respect everything (but stroking and maskfilter) in the paint +// - color | shader +// - colorFilter +// - blendmode +// - etc. +void SkDevice_Compute::drawPaint(const SkPaint& paint) { + // + // clear the surface -- will be postponed until render is complete + // + SkColor const c = paint.getColor(); + float rgba[4] = SK_TO_RGBA_F32(c); + + skc_surface_clear(fCompute->surface,rgba); +} + +void SkDevice_Compute::drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint points[], + const SkPaint& paint) { + if (count == 0) { + return; + } + + const SkScalar radius = paint.getStrokeWidth() * 0.5f; + + /* + * drawPoints draws each element (point, line) separately. This means our bulk-adding into the + * same raster is not valid for most blendmodes. + */ + switch (mode) { + case SkCanvas::kPoints_PointMode: { + if (paint.getStrokeCap() == SkPaint::kRound_Cap) { + circles_add(paint, points, (int32_t)count, radius); + } else { + squares_add(paint, points,(int32_t)count, radius); + } + } break; + + case SkCanvas::kLines_PointMode: { + if (count <= 1) { + return; + } + lines_stroked_add(paint, points, (int32_t)count & ~1, radius); + } break; + + case SkCanvas::kPolygon_PointMode: { + SkPoint xy0 = points[0]; + skc_err err = skc_path_begin(fPB); + + for (size_t i = 0; i < count; ++i) { + const SkPoint xy1 = points[i]; + line_stroked_butt(xy0, xy1, radius); + xy0 = xy1; + } + + // + // seal the path + // + skc_path_t skc_path; + err = skc_path_end(fPB, &skc_path); + + // + // rasterize the path and place it in a composition + // + path_rasterize_and_place(paint, skc_path, nullptr); + + SkASSERT(err == SKC_ERR_SUCCESS); + } break; + + default: + break; + } +} + +void SkDevice_Compute::drawRect(const SkRect& rect, const SkPaint& paint) { + SkPath path; + + path.addRect(rect); + this->drawPath(path, paint, nullptr, true); +} + +void SkDevice_Compute::drawOval(const SkRect& oval, const SkPaint& paint) { + SkPath path; + + path.addOval(oval); + this->drawPath(path, paint, nullptr, true); +} + +void SkDevice_Compute::drawRRect(const SkRRect& rrect, const SkPaint& paint) { + SkPath path; + + path.addRRect(rrect); + this->drawPath(path, paint, nullptr, true); +} + +void SkDevice_Compute::drawPath(const SkPath& path, const SkPaint& paint, + const SkMatrix* prePathMatrix, bool pathIsMutable) { + if (paint.getStyle() == SkPaint::kFill_Style) { + path_add(paint,path,prePathMatrix); + } else { + SkPath stroked; + +#define SK_MAGIC_RES_SCALE 1024 + + paint.getFillPath(path, &stroked, nullptr, SK_MAGIC_RES_SCALE); + this->path_add(paint, stroked, prePathMatrix); + } +} + +void SkDevice_Compute::drawText(const void* text, + size_t length, + SkScalar x, + SkScalar y, + const SkPaint& paint) { + SkPath outline; + + paint.getTextPath(text,length,x,y,&outline); + this->drawPath(outline, paint, nullptr, true); +} + +void +SkDevice_Compute::drawPosText(const void * text, + size_t length, + const SkScalar pos[], + int scalarsPerPos, + const SkPoint & offset, + const SkPaint & paint) +{ +#if 0 + draw.drawPosText_asPaths((const char *)text,length, + pos,scalarsPerPos,offset,paint); +#endif +} + +SkBaseDevice* SkDevice_Compute::onCreateDevice(const CreateInfo& cinfo, const SkPaint* paint) { +#ifdef SK_USE_COMPUTE_LAYER_GROUP + return this->createLayerGroup(cinfo, paint); +#else + // TODO return a new SkDevice_Compute when SkDevice_ComputeLayerGroup doesn't work + return nullptr; +#endif +} + +void SkDevice_Compute::drawDevice(SkBaseDevice* device, int left, int top, const SkPaint& paint) { + // It seems that we won't support image filter until snapSpecial and drawSpecial are implemented + // (SkCanvas.cpp will call drawSpecial when the paint has an image filter). + SkASSERT(!paint.getImageFilter()); + +#ifdef SK_USE_COMPUTE_LAYER_GROUP + // In case of SkDevice_ComputeLayerGroup, we close the group + SkDevice_ComputeLayerGroup* layerDevice = static_cast<SkDevice_ComputeLayerGroup*>(device); + SkASSERT(layerDevice->fRoot == this); // the layerDevice should belong to this root device + SkASSERT(layerDevice->fGroupID == fGroupID); // the layerDevice should be the top device + + // left, top should be the same as the origin, + // and we can ignore them because we have no offscreen buffer. + SkASSERT(SkIPoint::Make(left, top) == device->getOrigin()); + + // close the group and pop the top device + skc_styling_group_range_lo(fStyling, fGroupID, fGroupLayerID + 1); + fGroupID = fParents.back(); + fParents.pop_back(); +#else + // TODO handle the case where the device is a SkDevice_Compute rather than + // SkDevice_ComputeLayerGroup (in which case an offscreen buffer is created). +#endif +} + +#ifdef SK_USE_COMPUTE_LAYER_GROUP + +SkDevice_ComputeLayerGroup* SkDevice_Compute::createLayerGroup(const CreateInfo& cinfo, + const SkPaint* paint) { + return new SkDevice_ComputeLayerGroup(this, cinfo, paint); +} + +void SkDevice_Compute::onCtmChanged() { + fTopCTM = this->ctm(); + fTransformWeakref = SKC_WEAKREF_INVALID; +} + +SkDevice_ComputeLayerGroup::SkDevice_ComputeLayerGroup(SkDevice_Compute* root, + const CreateInfo& cinfo, const SkPaint* paint) + : SkBaseDevice(SkImageInfo::MakeN32Premul(cinfo.fInfo.width(), cinfo.fInfo.height()), + SkSurfaceProps(0,kUnknown_SkPixelGeometry)) { + // TODO clip the group using cinfo; handle the paint's alpha and maybe color filter? + + // Create a new group. We'll restore the previous group during onRestore. + skc_styling_group_alloc(fRoot->fStyling, &fRoot->fGroupID); + fRoot->fParents.push_back(fRoot->fGroupID); + fGroupID = fRoot->fGroupID; + + // ENTER + skc_styling_cmd_t const styling_cmds_enter[] = { + SKC_STYLING_CMD_OP_COVER_ZERO_ACC, + SKC_STYLING_CMD_OP_COLOR_ZERO_ACC + }; + skc_styling_group_enter(fRoot->fStyling, fRoot->fGroupID, SKC_STYLING_CMDS(styling_cmds_enter)); + + skc_styling_group_parents(fRoot->fStyling, fRoot->fGroupID, fRoot->fParents.count(), + fRoot->fParents.begin()); + + // RANGE + // We'll set range_lo at restore + skc_styling_group_range_hi(fRoot->fStyling, fRoot->fGroupID, fRoot->fGroupLayerID); + + // LEAVE + skc_styling_cmd_t const styling_cmds_leave[] = { + SKC_STYLING_CMD_OP_SURFACE_COMPOSITE + }; + skc_styling_group_leave(fRoot->fStyling, fRoot->fGroupID, SKC_STYLING_CMDS(styling_cmds_leave)); +} + +void SkDevice_ComputeLayerGroup::drawDevice(SkBaseDevice* device, int left, int top, + const SkPaint& paint) { + fRoot->drawDevice(device, left, top, paint); // the root will properly close the group +} + +SkBaseDevice* SkDevice_ComputeLayerGroup::onCreateDevice(const CreateInfo& cinfo, + const SkPaint* paint) { + return fRoot->createLayerGroup(cinfo, paint); +} + +void SkDevice_ComputeLayerGroup::onCtmChanged() { + this->sanityCheck(); + + // Cancels the translation as we're not using an offscreen buffer + const SkIPoint& origin = this->getOrigin(); + fRoot->fTopCTM = this->ctm(); + fRoot->fTopCTM.postTranslate(SkIntToScalar(origin.fX), SkIntToScalar(origin.fY)); + fRoot->fTransformWeakref = SKC_WEAKREF_INVALID; +} + +void SkDevice_ComputeLayerGroup::onSave() { + this->sanityCheck(); + fRoot->onSave(); +} + +void SkDevice_ComputeLayerGroup::onRestore() { + this->sanityCheck(); + fRoot->onRestore(); +} + +void SkDevice_ComputeLayerGroup::onClipRect(const SkRect& rect, SkClipOp op, bool aa) { + this->sanityCheck(); + fRoot->fClipStack.clipRect(rect, fRoot->fTopCTM, op, aa); + fRoot->fClipWeakref = SKC_WEAKREF_INVALID; +} + +void SkDevice_ComputeLayerGroup::onClipRRect(const SkRRect& rrect, SkClipOp op, bool aa) { + this->sanityCheck(); + fRoot->fClipStack.clipRRect(rrect, fRoot->fTopCTM, op, aa); + fRoot->fClipWeakref = SKC_WEAKREF_INVALID; +} + +void SkDevice_ComputeLayerGroup::onClipPath(const SkPath& path, SkClipOp op, bool aa) { + this->sanityCheck(); + fRoot->fClipStack.clipPath(path, fRoot->fTopCTM, op, aa); + fRoot->fClipWeakref = SKC_WEAKREF_INVALID; +} + +void SkDevice_ComputeLayerGroup::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) { + this->sanityCheck(); + fRoot->onClipRegion(deviceRgn, op); +} + +void SkDevice_ComputeLayerGroup::onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) { + this->sanityCheck(); + fRoot->onSetDeviceClipRestriction(mutableClipRestriction); +} + +#endif // SK_USE_COMPUTE_LAYER_GROUP + +#endif diff --git a/src/compute/sk/SkDevice_Compute.h b/src/compute/sk/SkDevice_Compute.h new file mode 100644 index 0000000000..d2d16e50b7 --- /dev/null +++ b/src/compute/sk/SkDevice_Compute.h @@ -0,0 +1,265 @@ +/* + * Copyright 2016 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + */ + +#ifndef SkDevice_Compute_DEFINED +#define SkDevice_Compute_DEFINED + +// +// for now make sure it's defined +// + +#if !defined(SK_SUPPORT_GPU_COMPUTE) +#define SK_SUPPORT_GPU_COMPUTE 1 +#endif + +// +// +// + +#if SK_SUPPORT_GPU_COMPUTE + +// TODO Check whether we can use SkDevice_ComputeLayerGroup at compile time +// by checking whether there is only one top device. +#define SK_USE_COMPUTE_LAYER_GROUP + +// +// C +// + +#ifdef __cplusplus +extern "C" { +#endif + +#include <context.h> + +#ifdef __cplusplus +} +#endif + +#include "../compute/skc/skc.h" + +// +// C++ +// + +#include "SkDevice.h" +#include "SkClipStackDevice.h" +#include "SkContext_Compute.h" +#include "SkTArray.h" + +// +// +// + +#ifdef SK_USE_COMPUTE_LAYER_GROUP +class SkDevice_ComputeLayerGroup; +#endif + +class SkDevice_Compute : public SkClipStackDevice { +public: + SkDevice_Compute(sk_sp<SkContext_Compute>, int w, int h); + ~SkDevice_Compute() override; + + void drawPaint(const SkPaint& paint) override; + void drawPoints(SkCanvas::PointMode, size_t, const SkPoint[], const SkPaint&) override; + void drawRect(const SkRect&, const SkPaint&) override; + void drawOval(const SkRect&, const SkPaint&) override; + void drawRRect(const SkRRect&, const SkPaint&) override; + void drawPath(const SkPath&, const SkPaint&, const SkMatrix*, bool) override; + void drawText(const void*, size_t, SkScalar, SkScalar, const SkPaint&) override; + void drawPosText(const void*, size_t, const SkScalar[], int, const SkPoint&, + const SkPaint&) override; + + void onRestore() override { + this->SkClipStackDevice::onRestore(); + fClipWeakref = SKC_WEAKREF_INVALID; + } + void onClipRect(const SkRect& rect, SkClipOp op, bool aa) override { + this->SkClipStackDevice::onClipRect(rect, op, aa); + fClipWeakref = SKC_WEAKREF_INVALID; + } + void onClipRRect(const SkRRect& rrect, SkClipOp op, bool aa) override { + this->SkClipStackDevice::onClipRRect(rrect, op, aa); + fClipWeakref = SKC_WEAKREF_INVALID; + } + void onClipPath(const SkPath& path, SkClipOp op, bool aa) override { + this->SkClipStackDevice::onClipPath(path, op, aa); + fClipWeakref = SKC_WEAKREF_INVALID; + } + void onClipRegion(const SkRegion& deviceRgn, SkClipOp op) override { + this->SkClipStackDevice::onClipRegion(deviceRgn, op); + fClipWeakref = SKC_WEAKREF_INVALID; + } + void onSetDeviceClipRestriction(SkIRect* clipRestriction) override { + this->SkClipStackDevice::onSetDeviceClipRestriction(clipRestriction); + fClipWeakref = SKC_WEAKREF_INVALID; + } + + ClipType onGetClipType() const override { + // TODO Support non-rect clip + return kRect_ClipType; + } + + void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) override {} + void drawSprite(const SkBitmap&, int, int, const SkPaint&) override {} + void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint&, + SkCanvas::SrcRectConstraint) override {} + void drawDevice(SkBaseDevice*, int, int, const SkPaint&) override; + void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override {} + void flush() override; + + SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override; + + void onCtmChanged() override; + + friend class SkDevice_ComputeLayerGroup; + +private: + void styling_group_init(); + + void path_add(const SkPaint&, const SkPath&, const SkMatrix* prePathMatrix = nullptr); + void circles_add(const SkPaint&, const SkPoint points[], int32_t count, SkScalar radius); + void squares_add(const SkPaint&, const SkPoint points[], int32_t count, SkScalar radius); + void line_stroked_butt(SkPoint xy0, SkPoint xy1, SkScalar radius); + void lines_stroked_add(const SkPaint&, const SkPoint points[], int32_t count, SkScalar radius); + void path_rasterize_and_place(const SkPaint&, const skc_path_t path, + const SkMatrix* prePathMatrix = nullptr); + + sk_sp<SkContext_Compute> fCompute; + + skc_composition_t fComposition; + skc_styling_t fStyling; + + skc_path_builder_t fPB; + skc_raster_builder_t fRB; + + skc_group_id fGroupID; + skc_group_id fGroupLayerID; + + // When SK_USE_COMPUTE_LAYER_GROUP is set, fTopCTM is the global CTM for the top device. + // When SK_USE_COMPUTE_LAYER_GROUP is not set, fTopCTM is equal to this->ctm(). + SkMatrix fTopCTM; + skc_transform_weakref_t fTransformWeakref; + + skc_raster_clip_weakref_t fClipWeakref; + +#ifdef SK_USE_COMPUTE_LAYER_GROUP + SkTArray<skc_group_id> fParents; + + SkDevice_ComputeLayerGroup* createLayerGroup(const CreateInfo&, const SkPaint*); +#endif +}; + +#ifdef SK_USE_COMPUTE_LAYER_GROUP + +// A group of skc layers that correspond to a saveLayer in the top level (root) SkDevice_Compute. +class SkDevice_ComputeLayerGroup : public SkBaseDevice { +public: + SkDevice_ComputeLayerGroup(SkDevice_Compute* root, const CreateInfo&, const SkPaint*); + ~SkDevice_ComputeLayerGroup() override; + + void drawPaint(const SkPaint& paint) override { + this->sanityCheck(); + fRoot->drawPaint(paint); + } + + void + drawPoints(SkCanvas::PointMode pm, size_t s, const SkPoint pts[], const SkPaint& p) override { + this->sanityCheck(); + fRoot->drawPoints(pm, s, pts, p); + } + + void drawRect(const SkRect& r, const SkPaint& p) override { + this->sanityCheck(); + fRoot->drawRect(r, p); + } + + void drawOval(const SkRect& r, const SkPaint& p) override { + this->sanityCheck(); + fRoot->drawOval(r, p); + } + + void drawRRect(const SkRRect& rr, const SkPaint& p) override { + this->sanityCheck(); + fRoot->drawRRect(rr, p); + } + + void drawPath(const SkPath& path, const SkPaint& p, const SkMatrix* m, bool b) override { + this->sanityCheck(); + fRoot->drawPath(path, p, m, b); + } + + void drawText(const void* t, size_t l, SkScalar x, SkScalar y, const SkPaint& p) override { + this->sanityCheck(); + fRoot->drawText(t, l, x, y, p); + } + + void drawPosText(const void* t, size_t l, const SkScalar p[], int s, const SkPoint& o, + const SkPaint& paint) override { + this->sanityCheck(); + fRoot->drawPosText(t, l, p, s, o, paint); + } + + void onSave() override; + void onRestore() override; + void onClipRect(const SkRect& rect, SkClipOp, bool aa) override; + void onClipRRect(const SkRRect& rrect, SkClipOp, bool aa) override; + void onClipPath(const SkPath& path, SkClipOp, bool aa) override; + void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override; + void onSetDeviceClipRestriction(SkIRect* mutableClipRestriction) override; + bool onClipIsAA() const override { + return fRoot->onClipIsAA(); + } + void onAsRgnClip(SkRegion* rgn) const override { + return fRoot->onAsRgnClip(rgn); + } + ClipType onGetClipType() const override { + return fRoot->onGetClipType(); + } + + void onCtmChanged() override; + + void drawBitmap(const SkBitmap&, const SkMatrix&, const SkPaint&) override {} + void drawSprite(const SkBitmap&, int, int, const SkPaint&) override {} + void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint&, + SkCanvas::SrcRectConstraint) override {} + void drawDevice(SkBaseDevice*, int, int, const SkPaint&) override; + void drawVertices(const SkVertices*, SkBlendMode, const SkPaint&) override {} + void flush() override; + + SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override; + + friend class SkDevice_Compute; + +private: + SkDevice_Compute* fRoot; + + // Save a copy of the current group id for sanity check. + // If the sanity check fails, we're probably in the Android world where + // multiple top-level devices can co-exist. In that case, we can no longer use the group syntax + // and we have to create a new root-level SkDevice_Compute with an offscreen surface. + // According to reed@, we should be able to tell whether this sanity check will fail + // at the compile time (e.g., Chrome and Flutter never do this; Android sometimes does this). + skc_group_id fGroupID; + + void sanityCheck() { +#ifdef SK_DEBUG + // We should only change the top level device's CTM. + // Otherwise we can't use SkDevice_ComputeLayerGroup. + SkASSERT(fGroupID == fRoot->fGroupID); + + // The root SkDevice_Compute must have an origin (0, 0) as saveLayer won't + // ever create another SkDevice_Compute + SkASSERT(fRoot->getOrigin() == SkIPoint::Make(0, 0)); +#endif + } +}; + +#endif // SK_USE_COMPUTE_LAYER_GROUP + +#endif // SK_SUPPORT_GPU_COMPUTE +#endif // SkDevice_Compute_DEFINED diff --git a/src/compute/sk/SkImage_Compute.cpp b/src/compute/sk/SkImage_Compute.cpp new file mode 100644 index 0000000000..039766f109 --- /dev/null +++ b/src/compute/sk/SkImage_Compute.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +// +// +// + +#include "SkImage_Compute.h" + +// +// +// + +#if SK_SUPPORT_GPU_COMPUTE + +// +// C++ +// + +// +// +// + +SkImage_Compute::SkImage_Compute(sk_sp<SkContext_Compute> compute, + GrGLuint const snap, + int const width, + int const height) + + : SkImage(width,height,0), // FIXME -- who provides unique id? + compute(compute), + snap(snap) +{ + ; +} + +SkImage_Compute::~SkImage_Compute() +{ + // skc_interop_snap_dispose(compute->interop,snap); TODO skc.h +} + +// +// +// + +#endif diff --git a/src/compute/sk/SkImage_Compute.h b/src/compute/sk/SkImage_Compute.h new file mode 100644 index 0000000000..a3d9f028a3 --- /dev/null +++ b/src/compute/sk/SkImage_Compute.h @@ -0,0 +1,83 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkSurface_Image_DEFINED +#define SkSurface_Image_DEFINED + +// +// for now make sure it's defined +// + +#if !defined(SK_SUPPORT_GPU_COMPUTE) +#define SK_SUPPORT_GPU_COMPUTE 1 +#endif + +// +// +// + +#if SK_SUPPORT_GPU_COMPUTE + +// +// +// + +// #include "GrContext.h" +// #include "SkRefCnt.h" +#include "SkImage.h" +#include "gl/GrGLGpu.h" + +// +// +// + +#include "SkContext_Compute.h" + +// +// +// + +class SkImage_Compute : public SkImage +{ + public: + + SkImage_Compute(sk_sp<SkContext_Compute> compute, + GrGLuint const snap, + int const width, + int const height); + + ~SkImage_Compute(); + + // + // + // + + private: + + // + // + // + + sk_sp<SkContext_Compute> compute; // reference to compute context + GrGLuint snap; // fbo + + // + // + // +}; + +// +// +// + +#endif + +// +// +// + +#endif diff --git a/src/compute/sk/SkSurface_Compute.cpp b/src/compute/sk/SkSurface_Compute.cpp new file mode 100644 index 0000000000..5dac0f0aff --- /dev/null +++ b/src/compute/sk/SkSurface_Compute.cpp @@ -0,0 +1,191 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +// +// +// + +#include "SkSurface_Compute.h" +#include "SkDevice_Compute.h" +#include "SkImage_Compute.h" + +// +// +// + +#if SK_SUPPORT_GPU_COMPUTE + +// +// C++ +// + +#include "gl/GrGLGpu.h" +#include "SkSurface_Gpu.h" + +// +// +// + +SkSurface_Compute::SkSurface_Compute(sk_sp<SkContext_Compute> compute, + int const width, int const height) + : INHERITED(width,height,nullptr), + compute(compute) +{ + // + // resize interop + // + // skc_interop_size_set(compute->interop,width,height,NULL); TODO skc.h +} + +SkSurface_Compute::~SkSurface_Compute() +{ + ; +} + +// +// +// + +SkCanvas* +SkSurface_Compute::onNewCanvas() +{ + uint32_t w = 0,h = 0; + + // skc_interop_size_get(compute->interop,&w,&h); TODO skc.h + + SkDevice_Compute * const device_compute = new SkDevice_Compute(compute,w,h);; + SkCanvas * const canvas = new SkCanvas(device_compute,SkCanvas::kConservativeRasterClip_InitFlag); + + // + // destroy device upon surface destruction + // + device = sk_sp<SkBaseDevice>(device_compute); + + // + // move origin from upper left to lower left + // + SkMatrix matrix; + + matrix.setScaleTranslate(1.0f,-1.0f,0.0f,(SkScalar)h); + + canvas->setMatrix(matrix); + + return canvas; +} + +// +// +// + +sk_sp<SkSurface> +SkSurface_Compute::onNewSurface(const SkImageInfo& info) +{ + return sk_make_sp<SkSurface_Compute>(compute,info.width(),info.height()); +} + +// +// +// + +sk_sp<SkImage> +SkSurface_Compute::onNewImageSnapshot() +{ + uint32_t w,h; + + // skc_interop_size_get(compute->interop,&w,&h); TODO skc.h + + GrGLuint snap; + + // skc_interop_snap_create(compute->interop, TODO skc.h + // skc_surface_interop_surface_get(compute->surface), + // &snap); + + return sk_make_sp<SkImage_Compute>(compute,snap,w,h); +} + +// +// +// + +void +SkSurface_Compute::onCopyOnWrite(ContentChangeMode mode) +{ + ; +} + +// +// +// + +#if 0 + +sk_sp<SkSurface> +SkSurface_Compute::MakeComputeBackedSurface(SkWindow * const window, + const SkWindow::AttachmentInfo & attachmentInfo, + GrGLInterface const * const grInterface, + GrContext * const grContext, + sk_sp<SkContext_Compute> compute) +{ + GrBackendRenderTargetDesc desc; + + desc.fWidth = SkScalarRoundToInt(window->width()); + desc.fHeight = SkScalarRoundToInt(window->height()); + + if (0 == desc.fWidth || 0 == desc.fHeight) { + return nullptr; + } + + // TODO: Query the actual framebuffer for sRGB capable. However, to + // preserve old (fake-linear) behavior, we don't do this. Instead, rely + // on the flag (currently driven via 'C' mode in SampleApp). + // + // Also, we may not have real sRGB support (ANGLE, in particular), so check for + // that, and fall back to L32: + // + // ... and, if we're using a 10-bit/channel FB0, it doesn't do sRGB conversion on write, + // so pretend that it's non-sRGB 8888: + desc.fConfig = + grContext->caps()->srgbSupport() && + SkImageInfoIsGammaCorrect(window->info()) && + (attachmentInfo.fColorBits != 30) + ? kSkiaGamma8888_GrPixelConfig : kSkia8888_GrPixelConfig; + + desc.fOrigin = kBottomLeft_GrSurfaceOrigin; + desc.fSampleCnt = 0; // attachmentInfo.fSampleCount; + desc.fStencilBits = 0; // attachmentInfo.fStencilBits; + + GrGLint buffer; + + GR_GL_GetIntegerv(grInterface,GR_GL_FRAMEBUFFER_BINDING,&buffer); + desc.fRenderTargetHandle = buffer; + + sk_sp<SkColorSpace> colorSpace = + grContext->caps()->srgbSupport() && SkImageInfoIsGammaCorrect(window->info()) + ? SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : nullptr; + + // + // + // + + if (!grContext) { + return nullptr; + } + + if (!SkSurface_Gpu::Valid(grContext,desc.fConfig,colorSpace.get())) { + return nullptr; + } + + return sk_make_sp<SkSurface_Compute>(compute,desc.fWidth,desc.fHeight); +} + +#endif + +// +// +// + +#endif diff --git a/src/compute/sk/SkSurface_Compute.h b/src/compute/sk/SkSurface_Compute.h new file mode 100644 index 0000000000..84836c0f29 --- /dev/null +++ b/src/compute/sk/SkSurface_Compute.h @@ -0,0 +1,113 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkSurface_Compute_DEFINED +#define SkSurface_Compute_DEFINED + +// +// for now make sure it's defined +// + +#if !defined(SK_SUPPORT_GPU_COMPUTE) +#define SK_SUPPORT_GPU_COMPUTE 1 +#endif + +// +// +// + +#if SK_SUPPORT_GPU_COMPUTE + +// +// +// + +#include "SkSurface_Base.h" +#include "GrContext.h" +#include "SkRefCnt.h" + +// Yuqian: It doesn't seem right to me for SkSurface_Compute to depend on SkWindow. +// Maybe we should move MakeComputeBackedSurface(from SkWindow) to SkWindow.cpp. +// #include "SkWindow.h" + +// +// +// + +#include "SkContext_Compute.h" + +// +// +// + +// +// +// + +class SkSurface_Compute : public SkSurface_Base +{ + public: + + SkSurface_Compute(sk_sp<SkContext_Compute> compute, + int const width, int const height); + + ~SkSurface_Compute(); + + // + // + // + + SkCanvas* onNewCanvas() override; + sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override; + sk_sp<SkImage> onNewImageSnapshot() override; + void onCopyOnWrite(ContentChangeMode) override; + + // + // + // + + // static sk_sp<SkSurface> MakeComputeBackedSurface(SkWindow * const window, + // const SkWindow::AttachmentInfo & attachmentInfo, + // GrGLInterface const * const grInterface, + // GrContext * const grContext, + // sk_sp<SkContext_Compute> compute); + // // + // + // + + private: + + typedef SkSurface_Base INHERITED; + + // + // + // + + sk_sp<SkBaseDevice> device; + + // + // + // + + sk_sp<SkContext_Compute> compute; + + // + // + // +}; + +// +// +// + +#endif + +// +// +// + +#endif diff --git a/src/compute/skc/Makefile b/src/compute/skc/Makefile new file mode 100644 index 0000000000..e6516e3fd1 --- /dev/null +++ b/src/compute/skc/Makefile @@ -0,0 +1,79 @@ +#
+# Copyright 2016 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can
+# be found in the LICENSE file.
+#
+
+SRC = block_pool_init.cl paths_copy.cl fills_expand.cl rasterize.cl raster_alloc.cl prefix.cl place.cl render.cl
+
+PRE = $(SRC:%.cl=%.pre.cl)
+
+IR_GEN9 = $(PRE:%.cl=%.ir)
+
+$(info PRE : $(PRE))
+$(info IR_GEN9 : $(IR_GEN9))
+
+#
+#
+#
+
+OPENCL_STD = -cl-std=CL1.2
+OPENCL_PRE = __OPENCL_C_VERSION__=120
+
+# OPENCL_STD = -cl-std=CL2.0
+# OPENCL_PRE = __OPENCL_C_VERSION__=200
+
+#
+#
+#
+
+TARGETS = $(PRE) $(IR_GEN9)
+
+#
+#
+#
+
+IOC = ioc64
+
+IOC_IR_OPTS_OPT = $(OPENCL_STD) -cl-single-precision-constant -cl-denorms-are-zero -cl-mad-enable \
+ -cl-no-signed-zeros -cl-fast-relaxed-math -cl-kernel-arg-info
+
+IOC_IR_OPTS_DBG = $(OPENCL_STD) -cl-kernel-arg-info -g
+
+IOC_IR_OPTS = $(IOC_IR_OPTS_OPT)
+
+#
+#
+#
+
+PRE_DEPS = $(wildcard *.h)
+
+#
+#
+#
+
+all: $(TARGETS)
+
+
+clean:
+ -rm -f $(TARGETS) $(wildcard *.pre.bin.inl) $(wildcard *.pre.src.inl) $(wildcard *.gen) $(wildcard *.TMP)
+
+#
+# PREPROCESS
+#
+
+$(PRE): %.pre.cl: %.cl $(PRE_DEPS)
+ cl -I . -I "%INTELOCLSDKROOT%\include" -D $(OPENCL_PRE) -EP $< -P -Fi"$@"
+ clang-format -i $@
+ dos2unix $@
+ xxd -i $@ $(basename $@).src.inl
+
+#
+# GEN9 -- supports OpenCL 2.0 and can emit SPIR-V / SPIR-V TEXT but cannot load it via clCreateProgramWithIL()
+#
+
+$(IR_GEN9): %.ir: %.cl
+ touch $@
+ $(IOC) -cmd=build -bo="$(IOC_IR_OPTS)" -device=gpu -input=$< -ir=$@ -asm
+ xxd -i $@ $(basename $@).bin.inl
diff --git a/src/compute/skc/allocator_device_cl.c b/src/compute/skc/allocator_device_cl.c new file mode 100644 index 0000000000..aa44f36e87 --- /dev/null +++ b/src/compute/skc/allocator_device_cl.c @@ -0,0 +1,136 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "runtime_cl_12.h" +#include "config_cl.h" +#include "common/cl/assert_cl.h" + +// +// PERM +// + +cl_mem +skc_runtime_device_perm_alloc(struct skc_runtime * const runtime, + cl_mem_flags const flags, + size_t const size) +{ + cl_int cl_err; + + cl_mem mem = clCreateBuffer(runtime->cl.context, + flags, + size, + NULL, + &cl_err); cl_ok(cl_err); + return mem; +} + +void +skc_runtime_device_perm_free(struct skc_runtime * const runtime, + cl_mem const mem) +{ + cl(ReleaseMemObject(mem)); +} + +// +// TEMP +// + +cl_mem +skc_runtime_device_temp_alloc(struct skc_runtime * const runtime, + cl_mem_flags const flags, + size_t const size, + skc_subbuf_id_t * const subbuf_id, + size_t * const subbuf_size) +{ + if (size == 0) + { + *subbuf_id = (skc_subbuf_id_t)-1; + + if (subbuf_size != NULL) + *subbuf_size = 0; + + return NULL; + } + + cl_buffer_region br; + + br.origin = skc_suballocator_subbuf_alloc(&runtime->allocator.device.temp.suballocator, + runtime->scheduler, + size,subbuf_id,&br.size); + + if (subbuf_size != NULL) + *subbuf_size = br.size; + + cl_int cl_err; + + cl_mem mem = clCreateSubBuffer(runtime->allocator.device.temp.extent, + flags, + CL_BUFFER_CREATE_TYPE_REGION, + &br, + &cl_err); cl_ok(cl_err); + + return mem; +} + + +void +skc_runtime_device_temp_free(struct skc_runtime * const runtime, + cl_mem const mem, + skc_subbuf_id_t const subbuf_id) +{ + if (mem == NULL) + return; + + skc_suballocator_subbuf_free(&runtime->allocator.device.temp.suballocator,subbuf_id); + + cl(ReleaseMemObject(mem)); +} + +// +// +// + +void +skc_allocator_device_create(struct skc_runtime * const runtime) +{ + skc_suballocator_create(runtime, + &runtime->allocator.device.temp.suballocator, + "DEVICE", + runtime->config->suballocator.device.subbufs, + runtime->cl.base_align, + runtime->config->suballocator.device.size); + +#ifndef NDEBUG +#pragma message("Get rid of CL_MEM_ALLOC_HOST_PTR as soon as the sorter is installed") + cl_mem_flags const flags = CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR; +#else + cl_mem_flags const flags = CL_MEM_READ_WRITE; +#endif + + runtime->allocator.device.temp.extent = + skc_runtime_device_perm_alloc(runtime, + flags, + runtime->config->suballocator.device.size); +} + +void +skc_allocator_device_dispose(struct skc_runtime * const runtime) +{ + skc_suballocator_dispose(runtime,&runtime->allocator.device.temp.suballocator); + + skc_runtime_device_perm_free(runtime,runtime->allocator.device.temp.extent); +} + +// +// +// + diff --git a/src/compute/skc/allocator_device_cl.h b/src/compute/skc/allocator_device_cl.h new file mode 100644 index 0000000000..67d4e41398 --- /dev/null +++ b/src/compute/skc/allocator_device_cl.h @@ -0,0 +1,54 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> + +// +// +// + +#include "suballocator.h" + +// +// +// + +struct skc_allocator_device +{ +#if 0 + struct { + + } perm; +#endif + + struct { + struct skc_suballocator suballocator; + cl_mem extent; + } temp; +}; + +// +// +// + +void +skc_allocator_device_create(struct skc_runtime * const runtime); + +void +skc_allocator_device_dispose(struct skc_runtime * const runtime); + +// +// +// + diff --git a/src/compute/skc/allocator_host.c b/src/compute/skc/allocator_host.c new file mode 100644 index 0000000000..dbdcba0f51 --- /dev/null +++ b/src/compute/skc/allocator_host.c @@ -0,0 +1,120 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> + +// +// +// + +#include "runtime_cl_12.h" +#include "config_cl.h" + +// +// +// + +#define SKC_RUNTIME_HOST_CACHELINE_SIZE 64 + +#define SKC_ALIGNED_MALLOC(size,alignment) _aligned_malloc(size,alignment) +#define SKC_ALIGNED_FREE(p) _aligned_free(p) + +// +// PERM +// + +void * +skc_runtime_host_perm_alloc(struct skc_runtime * const runtime, + skc_mem_flags_e const flags, + size_t const size) +{ + return SKC_ALIGNED_MALLOC(SKC_ROUND_UP(size,SKC_RUNTIME_HOST_CACHELINE_SIZE), + SKC_RUNTIME_HOST_CACHELINE_SIZE); +} + +void +skc_runtime_host_perm_free(struct skc_runtime * const runtime, + void * const mem) +{ + SKC_ALIGNED_FREE(mem); +} + +// +// TEMP +// + +void * +skc_runtime_host_temp_alloc(struct skc_runtime * const runtime, + skc_mem_flags_e const flags, + size_t const size, + skc_subbuf_id_t * const subbuf_id, + size_t * const subbuf_size) +{ + if (size == 0) + { + *subbuf_id = (skc_subbuf_id_t)-1; + + if (subbuf_size != NULL) + *subbuf_size = 0; + + return NULL; + } + + return runtime->allocator.host.temp.extent + + skc_suballocator_subbuf_alloc(&runtime->allocator.host.temp.suballocator, + runtime->scheduler, + size,subbuf_id,subbuf_size); +} + + +void +skc_runtime_host_temp_free(struct skc_runtime * const runtime, + void * const mem, + skc_subbuf_id_t const subbuf_id) +{ + if (mem == NULL) + return; + + skc_suballocator_subbuf_free(&runtime->allocator.host.temp.suballocator,subbuf_id); +} + +// +// +// + +void +skc_allocator_host_create(struct skc_runtime * const runtime) +{ + skc_suballocator_create(runtime, + &runtime->allocator.host.temp.suballocator, + "HOST ", + runtime->config->suballocator.host.subbufs, + SKC_RUNTIME_HOST_CACHELINE_SIZE, + runtime->config->suballocator.host.size); + + runtime->allocator.host.temp.extent = + skc_runtime_host_perm_alloc(runtime, + SKC_MEM_FLAGS_READ_WRITE, + runtime->config->suballocator.host.size); +} + +void +skc_allocator_host_dispose(struct skc_runtime * const runtime) +{ + skc_suballocator_dispose(runtime,&runtime->allocator.host.temp.suballocator); + + skc_runtime_host_perm_free(runtime,runtime->allocator.host.temp.extent); +} + +// +// +// diff --git a/src/compute/skc/allocator_host.h b/src/compute/skc/allocator_host.h new file mode 100644 index 0000000000..d6519c8a70 --- /dev/null +++ b/src/compute/skc/allocator_host.h @@ -0,0 +1,59 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "suballocator.h" + +// +// +// + +typedef enum skc_mem_flags_e { + + SKC_MEM_FLAGS_READ_WRITE, + SKC_MEM_FLAGS_WRITE_ONLY, + SKC_MEM_FLAGS_READ_ONLY + +} skc_mem_flags_e; + +// +// +// + +struct skc_allocator_host +{ +#if 0 + struct { + // in case we want to instrument perm allocs + } perm; +#endif + + struct { + struct skc_suballocator suballocator; + skc_uchar * extent; + } temp; +}; + +// +// +// + +void +skc_allocator_host_create(struct skc_runtime * const runtime); + +void +skc_allocator_host_dispose(struct skc_runtime * const runtime); + +// +// +// diff --git a/src/compute/skc/assert_skc.c b/src/compute/skc/assert_skc.c new file mode 100644 index 0000000000..4902f980f2 --- /dev/null +++ b/src/compute/skc/assert_skc.c @@ -0,0 +1,86 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> +#include <stdio.h> + +// +// +// + +#include "assert_skc.h" + +// +// +// + +#define SKC_ERR_TO_STR(err) case err: return #err + +// +// +// + +char const * +skc_get_error_string(skc_err const err) +{ + switch(err) + { + SKC_ERR_TO_STR(SKC_ERR_SUCCESS); + SKC_ERR_TO_STR(SKC_ERR_NOT_IMPLEMENTED); + SKC_ERR_TO_STR(SKC_ERR_POOL_EMPTY); + SKC_ERR_TO_STR(SKC_ERR_CONDVAR_WAIT); + SKC_ERR_TO_STR(SKC_ERR_LAYER_ID_INVALID); + SKC_ERR_TO_STR(SKC_ERR_LAYER_NOT_EMPTY); + SKC_ERR_TO_STR(SKC_ERR_TRANSFORM_WEAKREF_INVALID); + SKC_ERR_TO_STR(SKC_ERR_STROKE_STYLE_WEAKREF_INVALID); + SKC_ERR_TO_STR(SKC_ERR_COMMAND_NOT_READY); + SKC_ERR_TO_STR(SKC_ERR_COMMAND_NOT_COMPLETED); + SKC_ERR_TO_STR(SKC_ERR_COMMAND_NOT_STARTED); + SKC_ERR_TO_STR(SKC_ERR_COMMAND_NOT_READY_OR_COMPLETED); + SKC_ERR_TO_STR(SKC_ERR_COMPOSITION_SEALED); + SKC_ERR_TO_STR(SKC_ERR_STYLING_SEALED); + SKC_ERR_TO_STR(SKC_ERR_HANDLE_INVALID); + SKC_ERR_TO_STR(SKC_ERR_HANDLE_OVERFLOW); + + default: + return "UNKNOWN SKC ERROR CODE"; + } +} + +// +// +// + +skc_err +assert_skc(skc_err const err, char const * const file, int const line, bool const abort) +{ + if (err != SKC_ERR_SUCCESS) + { + char const * const skc_err_str = skc_get_error_string(err); + + fprintf(stderr, + "\"%s\", line %d: skc_assert (%d) = \"%s\"", + file,line,err,skc_err_str); + + if (abort) + { + // stop profiling and reset device here if necessary + exit(err); + } + } + + return err; +} + +// +// +// diff --git a/src/compute/skc/assert_skc.h b/src/compute/skc/assert_skc.h new file mode 100644 index 0000000000..15f5b3a832 --- /dev/null +++ b/src/compute/skc/assert_skc.h @@ -0,0 +1,33 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" + +// +// +// + +skc_err +skc_assert_skc(void const * const ptr, char const * const file, int const line, bool const abort); + +// +// +// + +#define skc(...) skc_assert_skc((skc_##__VA_ARGS__), __FILE__, __LINE__, true); +#define skc_ok(err) skc_assert_skc((err ), __FILE__, __LINE__, true); + +// +// +// diff --git a/src/compute/skc/assert_state.h b/src/compute/skc/assert_state.h new file mode 100644 index 0000000000..b4724f9699 --- /dev/null +++ b/src/compute/skc/assert_state.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#pragma once + +// +// +// + +#include "macros.h" + +// +// +// + +#if 1 + +#include <assert.h> + +#define SKC_ASSERT_STATE_DECLARE(st) st state +#define SKC_ASSERT_STATE_MEMBER(sp) SKC_CONCAT(sp,->state) +#define SKC_ASSERT_STATE_INIT(sp,to) SKC_ASSERT_STATE_MEMBER(sp) = (to) +#define SKC_ASSERT_STATE_TRANSITION(from,to,sp) assert(SKC_ASSERT_STATE_MEMBER(sp) == (from)); SKC_ASSERT_STATE_INIT(sp,to) +#define SKC_ASSERT_STATE_ASSERT(at,sp) assert(SKC_ASSERT_STATE_MEMBER(sp) == (at)) + +#else + +#define SKC_ASSERT_STATE_DECLARE(st) +#define SKC_ASSERT_STATE_INIT(sp,to) +#define SKC_ASSERT_STATE_TRANSITION(from,to,sp) +#define SKC_ASSERT_STATE_ASSERT(at,sp) + +#endif + +// +// +// diff --git a/src/compute/skc/atomic_cl.h b/src/compute/skc/atomic_cl.h new file mode 100644 index 0000000000..c196c36390 --- /dev/null +++ b/src/compute/skc/atomic_cl.h @@ -0,0 +1,72 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_ATOMIC_CL +#define SKC_ONCE_ATOMIC_CL + +// +// git cl upload is bleating about needing an #include before and #if +// so we're unneccesarily reloading the types and OpenCL header +// + +#include "types.h" + +#if (__OPENCL_C_VERSION__ <= 120 /*CL_VERSION_1_2*/) + +#define SKC_ATOMIC_UINT uint +#define SKC_ATOMIC_INT int + +#define SKC_ATOMIC_ADD_LOCAL_RELAXED_DEVICE(p,v) atomic_add(p,v) +#define SKC_ATOMIC_ADD_LOCAL_RELAXED_SUBGROUP(p,v) atomic_add(p,v) + +#define SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(p,v) atomic_add(p,v) +#define SKC_ATOMIC_ADD_GLOBAL_RELAXED_SUBGROUP(p,v) atomic_add(p,v) + +#else // __OPENCL_C_VERSION__ > __CL_VERSION_1_2 + +// +// REMOVE THESE DEFINES ASAP -- ONLY HERE BECAUSE THE INTEL CODE +// BUILDER UTILITY DOESN'T SUPPORT CREATING AN ATOMIC TYPE BUFFER +// + +#ifdef SKC_SUPPORT_BROKEN_INTEL_CODE_BUILDER + +#define SKC_ATOMIC_UINT uint +#define SKC_ATOMIC_CAST_LOCAL(p) (__local atomic_uint volatile * restrict const)(p) +#define SKC_ATOMIC_CAST_GLOBAL(p) (__global atomic_uint volatile * restrict const)(p) + +#else + +#define SKC_ATOMIC_UINT atomic_uint +#define SKC_ATOMIC_CAST_LOCAL(p) (p) +#define SKC_ATOMIC_CAST_GLOBAL(p) (p) + +#endif + + +#define SKC_ATOMIC_ADD_LOCAL_RELAXED_DEVICE(p,v) atomic_fetch_add_explicit(SKC_ATOMIC_CAST_LOCAL(p), \ + v,memory_order_relaxed,memory_scope_device) +#define SKC_ATOMIC_ADD_LOCAL_RELAXED_SUBGROUP(p,v) atomic_fetch_add_explicit(SKC_ATOMIC_CAST_LOCAL(p), \ + v,memory_order_relaxed,memory_scope_sub_group) + +#define SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(p,v) atomic_fetch_add_explicit(SKC_ATOMIC_CAST_GLOBAL(p), \ + v,memory_order_relaxed,memory_scope_device) +#define SKC_ATOMIC_ADD_GLOBAL_RELAXED_SUBGROUP(p,v) atomic_fetch_add_explicit(SKC_ATOMIC_CAST_GLOBAL(p), \ + v,memory_order_relaxed,memory_scope_sub_group) + +#endif + +// +// +// + +#endif // SKC_ONCE_ATOMIC_CL + +// +// +// diff --git a/src/compute/skc/block.h b/src/compute/skc/block.h new file mode 100644 index 0000000000..753f2ac7ac --- /dev/null +++ b/src/compute/skc/block.h @@ -0,0 +1,228 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_BLOCK +#define SKC_ONCE_BLOCK + +// +// +// + +#include "types.h" +#include "macros.h" + +// +// Hard requirements: +// +// - A TTXB "block pool" extent that is at least 1GB. +// +// - A virtual surface of at least 8K x 8K +// +// - A physical surface of __don't really care__ because it's +// advantageous to tile the physical surface into sub-surface +// rectangles so that multiple linear (smaller) TTCK sorts are +// simultaneously performed. +// +// +// EXTENT TTXB BITS +// SIZE (MB) +-------------------------------------+ +// | 22 23 24 25 26 * 27 * | +// +----+-------------------------------------+ +// | 8 | 128 256 512 1024 2048 4096 | +// TTXB | 16 | 256 512 1024 2048 4096 8192 | +// WORDS | 32 | 512 1024 2048 4096 8192 16384 | +// | 64 | 1024 2048 4096 8192 16384 32768 | +// +----+-------------------------------------+ +// +// +// SUB-SURFACE X/Y BITS +// TILE SIZE +------------------------------------------------------+ +// | 5 6 7 8 9 10 11 12 13 | +// +----+------------------------------------------------------+ +// | 3 | 256 512 1024 2048 4096 8192 16384 32768 65536 | +// TILE | 4 | 512 1024 2048 4096 8192 16384 32768 65536 128K | +// SIDE | 5 | 1024 2048 4096 8192 16384 32768 65536 128K 256K | +// BITS | 6 | 2048 4096 8192 16384 32768 65536 128K 256K 512K | +// | 7 | 4096 8192 16384 32768 65536 128K 256K 512K 1024K | +// +----+------------------------------------------------------+ +// TILES^2 | 1024 4096 16384 65536 256K 1M 4M 16M 64M | +// +------------------------------------------------------+ +// +// The following values should be pretty future-proof across all GPUs: +// +// - 27 bits of block id space implies a max of 4GB-32GB of +// rasterized paths depending on the size of the TTXB block. +// This could enable interesting use cases. +// +// - A minimum block size is 16 words (64 bytes) and a maximum of 32 +// words (128 bytes) greatly simplifies portability. It's unlikely +// that a large GPU can service a tile larger than 32x32 pixels. +// Additionally, on smaller devices, rectangular tiles will have a +// minimum height of 16 pixels. Note that a minimum subblock size +// is probably 8 words (32 bytes). +// +// - A virtual rasterization surface that's from +/-32768K to +// +/-128K depending on the target's rasterization tile size. +// +// - A physical sub-surface tile (or entire surface) from 4Kx4K to +// 16Kx16K depending on the target's rasterization tile size. +// +// - Support for a minimum of 256K layers. If necessary, this can +// convseratively raised to 1m or 2m layers by either implementing +// surface tiling or when the target supports large raster tiles. +// +// - Keys that (optionally) only require a 32-bit high word +// comparison. +// +// +// TAGGED BLOCK ID +// +// 0 5 31 +// | | ID | +// | TAG | SUBBLOCK | BLOCK | +// +-----+----------+--------+ +// | 5 | N | 27 - N | +// +// There are 27 bits of subblocks and 5 bits of tag. +// +// +// TTRK (64-bit COMPARE) +// +// 0 63 +// | TTSB ID | X | Y | RASTER COHORT ID | +// +---------+------+------+------------------+ +// | 27 | 12 | 12 | 13 | +// +// +// TTRK (32-BIT COMPARE) +// +// 0 63 +// | TTSB ID | N/A | X | Y | RASTER COHORT ID | +// +---------+-----+------+------+------------------+ +// | 27 | 5 | 12 | 12 | 8 | +// +// +// TTSK v2: +// +// 0 63 +// | TTSB ID | IS_PREFIX | N/A | X | Y | +// +---------+-----------+------+----+----+ +// | 27 | 1 (=0) | 12 | 12 | 12 | +// +// +// TTPK v2: +// +// 0 63 +// | TTPB ID | IS_PREFIX | SPAN | X | Y | +// +---------+-----------+------+-----+-----+ +// | 27 | 1 (=1) | 12 | 12 | 12 | +// +// +// TTCK (32-BIT COMPARE) v1: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 18 | 7 | 7 | +// +// +// TTCK (32-BIT COMPARE) v2: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 15 | 9 | 8 | +// +// +// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 27 | 1 | 1 | 18 | 9 | 8 | +// +// + + +#define SKC_TAGGED_BLOCK_ID_BITS_ID 27 // this size is cast in stone +#define SKC_TAGGED_BLOCK_ID_BITS_TAG 5 // which leaves 5 bits of tag + +// +// +// + +typedef enum skc_block_id_tag { + + SKC_BLOCK_ID_TAG_PATH_LINE, // 0 -- 4 segments + SKC_BLOCK_ID_TAG_PATH_QUAD, // 1 -- 6 segments + SKC_BLOCK_ID_TAG_PATH_CUBIC, // 2 -- 8 segments + SKC_BLOCK_ID_TAG_PATH_RAT_QUAD, // 3 -- 8 segments : 6 + w0 + na + SKC_BLOCK_ID_TAG_PATH_RAT_CUBIC, // 4 -- 10 segments : 8 + w0 + w1 + SKC_BLOCK_ID_TAG_PATH_NEXT, // 5 -- this represents the end of path tags + + // + // TAGS [6-30] ARE AVAILABLE + // + + SKC_BLOCK_ID_TAG_INVALID = (1u << SKC_TAGGED_BLOCK_ID_BITS_TAG) - 1, // all 1's + SKC_BLOCK_ID_TAG_COUNT, + +} skc_block_id_tag; + +// +// +// + +#define SKC_TAGGED_BLOCK_ID_INVALID SKC_UINT_MAX // all 1's + +// +// +// + +typedef skc_uint skc_block_id_t; + +// +// +// + +typedef skc_uint skc_tagged_block_id_t; + +union skc_tagged_block_id +{ + skc_uint u32; + +#if !defined(__OPENCL_C_VERSION__) + struct { + skc_uint tag : SKC_TAGGED_BLOCK_ID_BITS_TAG; + skc_uint id : SKC_TAGGED_BLOCK_ID_BITS_ID; + }; +#else + // + // OPENCL BIT-FIELD EXTRACT/INSERT + // +#endif +}; + +// +// +// + +#define SKC_TAGGED_BLOCK_ID_MASK_TAG SKC_BITS_TO_MASK(SKC_TAGGED_BLOCK_ID_BITS_TAG) + +#define SKC_TAGGED_BLOCK_ID_GET_TAG(bst) ((bst) & SKC_TAGGED_BLOCK_ID_MASK_TAG) +#define SKC_TAGGED_BLOCK_ID_GET_ID(bst) ((bst) >> SKC_TAGGED_BLOCK_ID_BITS_TAG) + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/block_pool_cl.h b/src/compute/skc/block_pool_cl.h new file mode 100644 index 0000000000..c88370919e --- /dev/null +++ b/src/compute/skc/block_pool_cl.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_BLOCK_POOL +#define SKC_ONCE_BLOCK_POOL + +// +// +// + +#include "types.h" + +// +// +// + +union skc_block_pool_size +{ + skc_uint3 u32v3; + + struct { + skc_uint pool_size; // number of blocks + skc_uint ring_pow2; // rounded-up pow2 of pool_size + skc_uint ring_mask; // ring_pow2 - 1 + }; +}; + +// +// +// + +union skc_block_pool_atomic +{ + skc_uint2 u32v2; + + skc_uint u32a2[2]; + + struct { + skc_uint reads; + skc_uint writes; + }; +}; + +#define SKC_BP_ATOMIC_OFFSET_READS 0 +#define SKC_BP_ATOMIC_OFFSET_WRITES 1 + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/block_pool_cl_12.h b/src/compute/skc/block_pool_cl_12.h new file mode 100644 index 0000000000..6fa8a39ca0 --- /dev/null +++ b/src/compute/skc/block_pool_cl_12.h @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "block_pool_cl.h" +#include "extent_cl_12.h" + +// +// device side block pool +// + +struct skc_block_pool +{ + union skc_block_pool_size const * size; + + struct skc_extent_pdrw blocks; + struct skc_extent_pdrw ids; + struct skc_extent_phr_pdrw atomics; +}; + +// +// +// diff --git a/src/compute/skc/block_pool_init.cl b/src/compute/skc/block_pool_init.cl new file mode 100644 index 0000000000..023dff44cf --- /dev/null +++ b/src/compute/skc/block_pool_init.cl @@ -0,0 +1,64 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" + +// +// BEST TO RUN THESE ON AN OUT-OF-ORDER CQ +// + +__kernel +SKC_BP_INIT_IDS_KERNEL_ATTRIBS +void +skc_kernel_block_pool_init_ids(__global uint * const ids, uint const bp_size) +{ + uint const gid = get_global_id(0); + + // + // FIXME -- TUNE FOR ARCH -- evaluate if it's much faster to + // accomplish this with fewer threads and using either IPC and/or + // vector stores -- it should be on certain architectures! + // + + // + // initialize pool with sequence + // + if (gid < bp_size) + ids[gid] = gid * SKC_DEVICE_SUBBLOCKS_PER_BLOCK; +} + +// +// +// + +__kernel +SKC_BP_INIT_ATOMICS_KERNEL_ATTRIBS +void +skc_kernel_block_pool_init_atomics(__global uint * const bp_atomics, uint const bp_size) +{ + // the version test is to squelch a bug with the Intel OpenCL CPU + // compiler declaring it supports the cl_intel_subgroups extension +#if defined(cl_intel_subgroups) || defined (cl_khr_subgroups) + uint const tid = get_sub_group_local_id(); +#else + uint const tid = get_local_id(0); +#endif + + // + // launch two threads and store [ 0, bp_size ] + // + bp_atomics[tid] = tid * bp_size; +} + +// +// +// diff --git a/src/compute/skc/cl_20/extent.c b/src/compute/skc/cl_20/extent.c new file mode 100644 index 0000000000..4c073e8b69 --- /dev/null +++ b/src/compute/skc/cl_20/extent.c @@ -0,0 +1,787 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#include <string.h> + +// #include "extent.h" + +// +// EXTENT TYPES +// +// Classification of operations on allocated GPU memory +// +// h = host +// d = device +// +// c = append using non-atomic incremented count +// x = append using atomically incremented index +// p = allocated from pool of indices +// g = gathered by pull kernel +// s = size is available +// +// w1 = write once +// wN = write many +// +// r1 = read once +// rN = read many +// +// rw = read/write many +// +// host<>device memory model +// +--------------------+--------------------+ +// extent type | split | shared | examples +// ---------------------+--------------------+--------------------+-------------------- +// | | | +// extent_atomic | device+mapped | device+mapped | atomically op'd device extent + read-only host snapshot +// | | | +// extent_dxrw | device | device | ttsk_array, ttpk_array, ttck_array, *_offsets +// extent_hcw1_dr1 | mapped | mapped | command_queue, buffer +// extent_hcrw | host | host | queue +// | | | +// ---------------------+--------------------+--------------------+-------------------- +// | | | +// extent_hcw1_drN | memcpy'd | mapped | stack_transforms, stack_stroke_props +// extent_hgw1_drN | scatter/gather | mapped | layer_props +// | | | +// block_pool_dprw | device | device | ttsb_pool, ttpb_pool +// block_pool_hp_drw | device | device | raster_pool +// | | | +// ---------------------+--------------------+--------------------+-------------------- +// | | | +// block_pool_hp_drw | block_pool_hp_drw | block_pool_hp_drw | path_block_pool +// staging buffer | extent_hw_dr | -- | +// | | | +// + +// +// HIGH-LEVEL EXTENTS ARE BUILT FROM SIMPLER STRUCTURES +// + +// +// COUNTERS FOR POOLS -- TYPICALLY ATOMIC WHEN ON DEVICE +// + +union skc_ring +{ + skc_uint2 u32v2; + + skc_uint u32a2[2]; + + struct { + skc_uint reads; // number of reads + skc_uint writes; // number of writes + }; +}; + +// +// POOL OF INDICES TO BLOCKS +// + +struct skc_pool_h +{ + skc_uint * indices; +}; + +struct skc_pool_d +{ + cl_mem * indices; // FIXME -- READ POOL INDICES THROUGH CONSTANT CACHE? +}; + +// +// LOW-LEVEL EXTENTS -- SIZES ARE STORED ELSEWHERE +// + +struct skc_extent_hrw +{ + void * hrw; // host pointer to host extent -- read/write +}; + +struct skc_extent_drw +{ + cl_mem drw; // device pointer to device extent -- read/write +}; + +struct skc_extent_hw_dr +{ + void * hw; // host pointer to shared extent -- write-only + write-combined + cl_mem dr; // device pointer to shared extent -- read-only +}; + +// +// +// + +#if 0 +static +void * +skc_runtime_svm_alloc(struct skc_runtime_cl * const runtime_cl, size_t const size) +{ + return clSVMAlloc(runtime_cl->context, + CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, + size, + 0); +} + +static +void * +skc_runtime_svm_atomic_alloc(struct skc_runtime_cl * const runtime_cl, size_t const size) // WE DON'T NEED THIS HERE +{ + return clSVMAlloc(runtime_cl->context, + CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS, + size, + 0); +} + +static +void +skc_runtime_svm_free(struct skc_runtime_cl * const runtime_cl, void * const buffer) +{ + clSVMFree(runtime_cl->context,buffer); +} +#endif + +// +// +// + +void +skc_command_queue_fill_device(struct skc_command_queue * const cq, + cl_mem buffer, + void const * const pattern, + size_t const pattern_size, + size_t const size); + +void * +skc_command_queue_map_wi(struct skc_command_queue * const cq, + cl_mem buffer); + +void +skc_command_queue_unmap(struct skc_command_queue * const cq, + cl_mem buffer, + void * const mapped); + +void +skc_command_queue_read(struct skc_command_queue * const cq, + cl_mem buffer, + void * const ptr); + +// +// +// + +struct skc_extent_hrw * +skc_extent_hrw_alloc(struct skc_allocator * const allocator, + size_t const size) +{ + struct skc_extent_hrw * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->hrw = skc_allocator_alloc_host(allocator,size); + + return extent; +} + + + +void +skc_extent_hrw_free(struct skc_allocator * const allocator, + struct skc_extent_hrw * const extent) +{ + skc_allocator_free_host(allocator,extent->hrw); + skc_allocator_free_host(allocator,extent); +} + +// +// +// + +struct skc_extent_drw * +skc_extent_drw_alloc(struct skc_allocator * const allocator, + size_t const size) +{ + struct skc_extent_drw * extent; + + extent = skc_allocator_alloc_host (allocator,sizeof(*extent)); + extent->drw = skc_allocator_alloc_device(allocator,size); + + return extent; +} + +void +skc_extent_drw_free(struct skc_allocator * const allocator, + struct skc_extent_drw * const extent) +{ + skc_allocator_free_device(allocator,extent->drw); + skc_allocator_free_host (allocator,extent); +} + +void +skc_extent_drw_fill(struct skc_command_queue * const cq, + struct skc_extent_drw * const extent, + void const * const pattern, + size_t const pattern_size, + size_t const size) +{ + skc_command_queue_fill_device(cq,extent->drw,pattern,pattern_size,size); +} + +// +// WRITE-COMBINED / WRITE-INVALIDATE +// + +struct skc_extent_hw_dr * +skc_extent_hw_dr_alloc(struct skc_allocator * const allocator, + size_t const size) +{ + struct skc_extent_hw_dr * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->hw = NULL; + extent->dr = skc_allocator_alloc_device_wc(allocator,size); // write-combined mem + + return extent; +} + +void +skc_extent_hw_dr_free(struct skc_allocator * const allocator, + struct skc_extent_hw_dr * const extent) +{ + skc_allocator_free_device(allocator,extent->dr); + skc_allocator_free_host (allocator,extent); +} + +void +skc_extent_hw_dr_map(struct skc_command_queue * const cq, + struct skc_extent_hw_dr * const extent) +{ + extent->hw = skc_command_queue_map_wi(cq,extent->dr); +} + +void +skc_extent_hw_dr_unmap(struct skc_command_queue * const cq, + struct skc_extent_hw_dr * const extent) +{ + skc_command_queue_unmap(cq,extent->dr,extent->hw); +} + +void +skc_extent_hw_dr_memcpy(struct skc_extent_hw_dr * const extent, + void const * SKC_RESTRICT const src, + size_t const offset, + size_t const size) +{ + void * SKC_RESTRICT const dst = (char *)extent->hw + offset; + + memcpy(dst,src,size); +} +// +// SNAPSHOT +// + +struct skc_extent_hr_drw +{ + void * hr; // host pointer to shared extent -- readable snapshot + cl_mem drw; // device pointer to shared extent -- read/write +}; + +struct skc_extent_hr_drw * +skc_extent_hr_drw_alloc(struct skc_allocator * const allocator, + size_t const size) +{ + struct skc_extent_hr_drw * extent; + + extent = skc_allocator_alloc_host (allocator,sizeof(*extent)); + extent->hr = skc_allocator_alloc_host (allocator,size); + extent->drw = skc_allocator_alloc_device(allocator,size); + + return extent; +} + +void +skc_extent_hr_drw_free(struct skc_allocator * const allocator, + struct skc_extent_hr_drw * const extent) +{ + skc_allocator_free_host (allocator,extent->hr); + skc_allocator_free_device(allocator,extent->drw); + skc_allocator_free_host (allocator,extent); +} + +void +skc_extent_hr_drw_snap(struct skc_command_queue * const cq, + struct skc_extent_hr_drw * const extent, + size_t const size) +{ + skc_command_queue_read(cq,extent->drw,extent->hr); +} + +void +skc_extent_hr_drw_fill(struct skc_command_queue * const cq, + struct skc_extent_hr_drw * const extent, + void const * const pattern, + size_t const pattern_size, + size_t const size) +{ + skc_command_queue_fill_device(cq,extent->drw,pattern,pattern_size,size); +} + +// +// +// + +struct skc_extent_atomic +{ + struct skc_extent_hr_drw * hr_drw; + size_t size; // typically a very small extent +}; + +// +// +// + +struct skc_extent_atomic * +skc_extent_atomic_alloc(struct skc_allocator * const allocator, + size_t const size) +{ + struct skc_extent_atomic * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->hr_drw = skc_extent_hr_drw_alloc(allocator,size); + extent->size = size; + + return extent; +} + +void +skc_extent_atomic_free(struct skc_allocator * const allocator, + struct skc_extent_atomic * const extent) +{ + skc_extent_hr_drw_free (allocator,extent->hr_drw); + skc_allocator_free_host(allocator,extent); +} + +void +skc_extent_atomic_snap(struct skc_command_queue * const cq, + struct skc_extent_atomic const * const extent) +{ + skc_extent_hr_drw_snap(cq,extent->hr_drw,extent->size); +} + +void +skc_extent_atomic_zero(struct skc_command_queue * const cq, + struct skc_extent_atomic const * const extent) +{ + skc_uint const zero = 0; + + skc_extent_hr_drw_fill(cq,extent->hr_drw,&zero,sizeof(zero),extent->size); +} + +// +// +// + +struct skc_extent_dxrw +{ + struct skc_extent_drw * drw; + + size_t elem_size; + skc_uint elem_count; + +#if 0 // SKC_EXTENT_ATOMIC_IS_IGNORED + struct skc_extent_atomic * atomic; + size_t atomic_offset; +#endif +}; + +// +// +// + +struct skc_extent_dxrw * +skc_extent_dxrw_alloc(struct skc_allocator * const allocator, + size_t const elem_size, + skc_uint const elem_count, + struct skc_extent_atomic * const atomic, + size_t const atomic_offset) +{ + struct skc_extent_dxrw * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->drw = skc_extent_drw_alloc(allocator,elem_size * elem_count); + + extent->elem_size = elem_size; + extent->elem_count = elem_count; + + // + // note that passing in the atomic and its member has no real use at + // this point since the current programming style requires passing + // in the atomic extent -- which may have multiple members -- to the + // compute kernel + // +#if 0 // SKC_EXTENT_ATOMIC_IS_IGNORED + extent->atomic = atomic; + extent->atomic_offset = atomic_offset; +#endif + + return extent; +} + +void +skc_extent_dxrw_free(struct skc_allocator * const allocator, + struct skc_extent_dxrw * const extent) +{ + skc_extent_drw_free (allocator,extent->drw); + skc_allocator_free_host(allocator,extent); +} + +// +// +// + +struct skc_extent_hcrw +{ + struct skc_extent_hrw * hrw; + size_t elem_size; + skc_uint elem_count; + skc_uint counter; +}; + +// +// +// + +struct skc_extent_hcrw * +skc_extent_hcrw_alloc(struct skc_allocator * const allocator, + size_t const elem_size, + skc_uint const elem_count) +{ + struct skc_extent_hcrw * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->hrw = skc_extent_hrw_alloc(allocator,elem_size * elem_count); + extent->elem_size = elem_size; + extent->elem_count = elem_count; + extent->counter = 0; + + return extent; +} + +void +skc_extent_hcrw_free(struct skc_allocator * const allocator, + struct skc_extent_hcrw * const extent) +{ + skc_extent_hrw_free (allocator,extent->hrw); + skc_allocator_free_host(allocator,extent); +} + +void +skc_extent_hcrw_reset(struct skc_extent_hcrw * const extent) +{ + extent->counter = 0; +} + +skc_bool +skc_extent_hcrw_is_full(struct skc_extent_hcrw const * const extent) +{ + return (extent->counter == extent->elem_count); +} + +// +// +// + +struct skc_extent_hcw1_dr1 +{ + struct skc_extent_hw_dr * hw_dr; // mapped memory + size_t elem_size; + skc_uint elem_count; + skc_uint counter; +}; + +// +// +// + +struct skc_extent_hcw1_dr1 * +skc_extent_hcw1_dr1_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count) +{ + struct skc_extent_hcw1_dr1 * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->hw_dr = skc_extent_hw_dr_alloc(allocator,elem_size * elem_count); + extent->elem_size = elem_size; + extent->elem_count = elem_count; + extent->counter = 0; + + return extent; +} + +void +skc_extent_hcw1_dr1_free(struct skc_allocator * const allocator, + struct skc_extent_hcw1_dr1 * const extent) +{ + skc_extent_hw_dr_free (allocator,extent->hw_dr); + skc_allocator_free_host(allocator,extent); +} + +void +skc_extent_hcw1_dr1_map(struct skc_command_queue * const cq, + struct skc_extent_hcw1_dr1 * const extent) +{ + skc_extent_hw_dr_map(cq,extent->hw_dr); +} + +void +skc_extent_hcw1_dr1_unmap(struct skc_command_queue * const cq, + struct skc_extent_hcw1_dr1 * const extent) +{ + skc_extent_hw_dr_unmap(cq,extent->hw_dr); +} + +void +skc_extent_hcw1_dr1_reset(struct skc_extent_hcw1_dr1 * const extent) +{ + extent->counter = 0; +} + +skc_bool +skc_extent_hcw1_dr1_is_full(struct skc_extent_hcw1_dr1 const * const extent) +{ + return (extent->counter == extent->elem_count); +} + +skc_uint +skc_extent_hcw1_dr1_rem(struct skc_extent_hcw1_dr1 * const extent) +{ + return extent->elem_count - extent->counter; +} + +void +skc_extent_hcw1_dr1_append(struct skc_extent_hcw1_dr1 * const extent, + void const * SKC_RESTRICT const elem_ptr, + skc_uint const elem_count_clamped) +{ + skc_extent_hw_dr_memcpy(extent->hw_dr, + elem_ptr, + extent->elem_size * extent->counter, + extent->elem_size * elem_count_clamped); +} + +// +// +// + +struct skc_extent_hcw1_drN_unified +{ + struct skc_extent_hw_dr * hw_dr; // mapped memory + size_t elem_size; + skc_uint elem_count; + skc_uint counter; +}; + +// +// +// + +struct skc_extent_hcw1_drN_unified * +skc_extent_hcw1_drN_unified_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count) +{ + struct skc_extent_hcw1_drN_unified * extent; + + extent = skc_allocator_alloc_host(allocator,sizeof(*extent)); + extent->hw_dr = skc_extent_hw_dr_alloc(allocator,elem_size * elem_count); + extent->elem_size = elem_size; + extent->elem_count = elem_count; + extent->counter = 0; + + return extent; +} + +void +skc_extent_hcw1_drN_unified_free(struct skc_allocator * const allocator, + struct skc_extent_hcw1_drN_unified * const extent) +{ + skc_extent_hw_dr_free (allocator,extent->hw_dr); + skc_allocator_free_host(allocator,extent); +} + +void +skc_extent_hcw1_drN_unified_map(struct skc_command_queue * const cq, + struct skc_extent_hcw1_drN_unified * const extent) +{ + skc_extent_hw_dr_map(cq,extent->hw_dr); +} + + +void +skc_extent_hcw1_drN_unified_unmap(struct skc_command_queue * const cq, + struct skc_extent_hcw1_drN_unified * const extent) +{ + skc_extent_hw_dr_unmap(cq,extent->hw_dr); +} + +void +skc_extent_hcw1_drN_unified_reset(struct skc_extent_hcw1_drN_unified * const extent) +{ + extent->counter = 0; +} + +skc_bool +skc_extent_hcw1_drN_unified_is_full(struct skc_extent_hcw1_drN_unified const * const extent) +{ + return (extent->counter == extent->elem_count); +} + + +skc_uint +skc_extent_hcw1_drN_unified_rem(struct skc_extent_hcw1_drN_unified * const extent) +{ + return extent->elem_count - extent->counter; +} + + +void +skc_extent_hcw1_drN_unified_append(struct skc_extent_hcw1_drN_unified * const extent, + void const * SKC_RESTRICT const elem_ptr, + skc_uint const elem_count_clamped) +{ + skc_extent_hw_dr_memcpy(extent->hw_dr, + elem_ptr, + extent->elem_size * extent->counter, + extent->elem_size * elem_count_clamped); +} + +// +// +// + +struct skc_id_pool_hp * +skc_id_pool_hp_alloc(struct skc_allocator * const allocator, + skc_uint const count) +{ + return NULL; +} + +void +skc_id_pool_hp_free(struct skc_allocator * const allocator, + struct skc_id_pool_hp * const extent) +{ + ; +} + +void +skc_id_pool_hp_acquire(struct skc_id_pool_hp * const extent, + skc_uint * const id) +{ + ; +} + +void +skc_id_pool_hp_release_1(struct skc_id_pool_hp * const extent, + skc_uint const id) +{ + ; +} + +void +skc_id_pool_hp_release_n(struct skc_id_pool_hp * const extent, + skc_uint const * const id, + skc_uint const count) +{ + ; +} + +// +// +// + +struct skc_block_pool_dprw * +skc_block_pool_dprw_alloc(struct skc_allocator * const allocator, + union skc_ring * const ring_d, + skc_uint const block_size, + skc_uint const block_count) +{ + return NULL; +} + +void +skc_block_pool_dprw_free(struct skc_allocator * const allocator, + struct skc_block_pool_dprw * const extent) +{ + ; +} + +// +// +// + +struct skc_extent_hgw1_drN * +skc_extent_hgw1_drN_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count) +{ + return NULL; +} + +void +skc_extent_hgw1_drN_free(struct skc_allocator * const allocator, + struct skc_extent_hgw1_drN * const extent) +{ + ; +} + +void +skc_extent_hgw1_drN_reset(struct skc_extent_hgw1_drN * const extent) +{ + ; +} + +void +skc_extent_hgw1_drN_snap(struct skc_command_queue * const cq, + struct skc_extent_hgw1_drN const * const extent) +{ + ; +} + +// +// +// + +#if 0 + +// +// +// + +struct skc_block_pool_hp_drw * +skc_block_pool_hp_drw_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count) +{ + return NULL; +} + +void +skc_block_pool_hp_drw_free(struct skc_allocator * const allocator, + struct skc_block_pool_hp_drw * const extent) +{ + ; +} + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/cl_20/extent.h b/src/compute/skc/cl_20/extent.h new file mode 100644 index 0000000000..2993968a50 --- /dev/null +++ b/src/compute/skc/cl_20/extent.h @@ -0,0 +1,390 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "allocator.h" + +// +// EXTENT TYPES +// +// Classification of operations on allocated GPU memory +// +// h = host +// d = device +// +// c = append using non-atomic incremented count +// x = append using atomically incremented index +// p = allocated from pool of indices +// g = gathered by pull kernel +// +// w1 = write once +// wN = write many +// +// r1 = read once +// rN = read many +// +// rw = read/write many +// +// host<>device memory model +// +--------------------+--------------------+ +// extent type | split | shared | examples +// ---------------------+--------------------+--------------------+-------------------- +// | | | +// extent_atomic | device+mapped | device+mapped | atomically op'd device extent + read-only host snapshot +// | | | +// extent_dxrw | device | device | ttsk_array, ttpk_array, ttck_array, *_offsets +// extent_hcw1_dr1 | mapped | mapped | command_queue, buffer +// extent_hcrw | host | host | queue +// | | | +// ---------------------+--------------------+--------------------+-------------------- +// | | | +// extent_hcw1_drN | memcpy'd | mapped | stack_transforms, stack_stroke_props +// extent_hgw1_drN | scatter/gather | mapped | layer_props +// | | | +// block_pool_dprw | device | device | ttsb_pool, ttpb_pool +// block_pool_hp_drw | device | device | raster_pool +// | | | +// ---------------------+--------------------+--------------------+-------------------- +// | | | +// block_pool_hp_drw | block_pool_hp_drw | block_pool_hp_drw | path_block_pool +// staging buffer | extent_hw_dr | -- | +// | | | +// + +struct skc_extent_hrw; +struct skc_extent_drw; + +struct skc_extent_hrw_drN; +struct skc_extent_hw1_drN; +struct skc_extent_hrN_drw; + +struct skc_extent_atomic; + +struct skc_extent_hcrw; +struct skc_extent_dxrw; + +struct skc_block_pool_dprw; + +struct skc_id_pool_hp; + +struct skc_extent_hcw1_dr1; +struct skc_extent_hcw1_drN; +struct skc_extent_hgw1_drN; + +// +// +// + +void * +skc_extent_hrw_drN_get_hrw(struct skc_extent_hrw_drN * extent); + +void * +skc_extent_hw1_drN_get_hw1(struct skc_extent_hw1_drN * extent); + +// +// +// + +struct skc_extent_hrw * +skc_extent_hrw_alloc(struct skc_allocator * const allocator, + size_t const size); + +void +skc_extent_hrw_free(struct skc_allocator * const allocator, + struct skc_extent_hrw * const extent); + +void * +skc_extent_hrw_get_hrw(struct skc_extent_hrw * extent); + +// +// +// + +struct skc_extent_drw * +skc_extent_drw_alloc(struct skc_allocator * const allocator, + size_t const size); + +void +skc_extent_drw_free(struct skc_allocator * const allocator, + struct skc_extent_drw * const extent); + +void +skc_extent_drw_fill(struct skc_command_queue * const cq, + struct skc_extent_drw * const extent, + void const * const pattern, + size_t const pattern_size, + size_t const size); + +// +// +// + +struct skc_extent_hw_dr * +skc_extent_hw_dr_alloc(struct skc_allocator * const allocator, + size_t const size); + +void +skc_extent_hw_dr_free(struct skc_allocator * const allocator, + struct skc_extent_hw_dr * const extent); + +void +skc_extent_hw_dr_map(struct skc_command_queue * const cq, + struct skc_extent_hw_dr * const extent); + +void +skc_extent_hw_dr_unmap(struct skc_command_queue * const cq, + struct skc_extent_hw_dr * const extent); + +void +skc_extent_hw_dr_memcpy(struct skc_extent_hw_dr * const extent, + void const * SKC_RESTRICT const src, + size_t const offset, + size_t const size); +// +// +// + +struct skc_extent_hr_drw * +skc_extent_hr_drw_alloc(struct skc_allocator * const allocator, + size_t const size); + +void +skc_extent_hr_drw_free(struct skc_allocator * const allocator, + struct skc_extent_hr_drw * const extent); + +void +skc_extent_hr_drw_snap(struct skc_command_queue * const cq, + struct skc_extent_hr_drw * const extent, + size_t const size); + +void +skc_extent_hr_drw_fill(struct skc_command_queue * const cq, + struct skc_extent_hr_drw * const extent, + void const * const pattern, + size_t const pattern_size, + size_t const size); + +// +// +// + +struct skc_extent_atomic * +skc_extent_atomic_alloc(struct skc_allocator * const allocator, + size_t const size); + +void +skc_extent_atomic_free(struct skc_allocator * const allocator, + struct skc_extent_atomic * const extent); + +void +skc_extent_atomic_snap(struct skc_command_queue * const cq, + struct skc_extent_atomic const * const extent); + +void +skc_extent_atomic_zero(struct skc_command_queue * const cq, + struct skc_extent_atomic const * const extent); + +// +// +// + + +struct skc_extent_dxrw * +skc_extent_dxrw_alloc(struct skc_allocator * const allocator, + size_t const elem_size, + skc_uint const elem_count, + struct skc_extent_atomic * const atomic, + size_t const atomic_offset); + +void +skc_extent_dxrw_free(struct skc_allocator * const allocator, + struct skc_extent_dxrw * const extent); + +// +// +// + +struct skc_extent_hcrw * +skc_extent_hcrw_alloc(struct skc_allocator * const allocator, + size_t const elem_size, + skc_uint const elem_count); + +void +skc_extent_hcrw_free(struct skc_allocator * const allocator, + struct skc_extent_hcrw * const extent); + +void +skc_extent_hcrw_reset(struct skc_extent_hcrw * const extent); + +skc_bool +skc_extent_hcrw_is_full(struct skc_extent_hcrw const * const extent); + +// +// +// + +struct skc_extent_hcw1_dr1 * +skc_extent_hcw1_dr1_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count); + +void +skc_extent_hcw1_dr1_free(struct skc_allocator * const allocator, + struct skc_extent_hcw1_dr1 * const extent); + +void +skc_extent_hcw1_dr1_map(struct skc_command_queue * const cq, + struct skc_extent_hcw1_dr1 * const extent); + +void +skc_extent_hcw1_dr1_unmap(struct skc_command_queue * const cq, + struct skc_extent_hcw1_dr1 * const extent); + +void +skc_extent_hcw1_dr1_reset(struct skc_extent_hcw1_dr1 * const extent); + +skc_bool +skc_extent_hcw1_dr1_is_full(struct skc_extent_hcw1_dr1 const * const extent); + +skc_uint +skc_extent_hcw1_dr1_rem(struct skc_extent_hcw1_dr1 * const extent); + +void +skc_extent_hcw1_dr1_append(struct skc_extent_hcw1_dr1 * const extent, + void const * SKC_RESTRICT const elem_ptr, + skc_uint const elem_count_clamped); + +// +// Note: on a shared memory device this reuses the hcw1_dr1 +// implementation and unmaps the extent instead of copying +// + +struct skc_extent_hcw1_drN_unified * +skc_extent_hcw1_drN_unified_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count); + +void +skc_extent_hcw1_drN_unified_free(struct skc_allocator * const allocator, + struct skc_extent_hcw1_drN_unified * const extent); + +void +skc_extent_hcw1_drN_unified_map(struct skc_command_queue * const cq, + struct skc_extent_hcw1_drN_unified * const extent); + +void +skc_extent_hcw1_drN_unified_unmap(struct skc_command_queue * const cq, + struct skc_extent_hcw1_drN_unified * const extent); + +void +skc_extent_hcw1_drN_unified_reset(struct skc_extent_hcw1_drN_unified * const extent); + +skc_bool +skc_extent_hcw1_drN_unified_is_full(struct skc_extent_hcw1_drN_unified const * const extent); + +skc_uint +skc_extent_hcw1_drN_unified_rem(struct skc_extent_hcw1_drN_unified * const extent); + +void +skc_extent_hcw1_drN_unified_append(struct skc_extent_hcw1_drN_unified * const extent, + void const * SKC_RESTRICT const elem_ptr, + skc_uint const elem_count_clamped); +// +// +// + +struct skc_id_pool_hp * +skc_id_pool_hp_alloc(struct skc_allocator * const allocator, + skc_uint const count); + +void +skc_id_pool_hp_free(struct skc_allocator * const allocator, + struct skc_id_pool_hp * const extent); + +void +skc_id_pool_hp_acquire(struct skc_id_pool_hp * const extent, + skc_uint * const id); + +void +skc_id_pool_hp_release_1(struct skc_id_pool_hp * const extent, + skc_uint const id); + +void +skc_id_pool_hp_release_n(struct skc_id_pool_hp * const extent, + skc_uint const * const id, + skc_uint const count); + +// +// +// + +struct skc_block_pool_dprw * +skc_block_pool_dprw_alloc(struct skc_allocator * const allocator, + union skc_ring * const ring_d, + skc_uint const block_size, + skc_uint const block_count); + +void +skc_block_pool_dprw_free(struct skc_allocator * const allocator, + struct skc_block_pool_dprw * const extent); + +// +// +// + +struct skc_extent_hgw1_drN_unified * +skc_extent_hgw1_drN_unified_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count); + +void +skc_extent_hgw1_drN_unified_free(struct skc_allocator * const allocator, + struct skc_extent_hgw1_drN_unified * const extent); + +void +skc_extent_hgw1_drN_unified_reset(struct skc_extent_hgw1_drN_unified * const extent); + +void +skc_extent_hgw1_drN_unified_snap(struct skc_command_queue * const cq, + struct skc_extent_hgw1_drN_unified const * const extent); + +// +// +// + +#if 0 + +// +// +// + +struct skc_block_pool_hp_drw * +skc_block_pool_hp_drw_alloc(struct skc_allocator * const allocator, + skc_uint const elem_size, + skc_uint const elem_count); + +void +skc_block_pool_hp_drw_free(struct skc_allocator * const allocator, + struct skc_block_pool_hp_drw * const extent); + +// +// +// + +#endif + +// +// +// + diff --git a/src/compute/skc/cl_20/ring_cl_svm_fine.cpp b/src/compute/skc/cl_20/ring_cl_svm_fine.cpp new file mode 100644 index 0000000000..9552c81f2d --- /dev/null +++ b/src/compute/skc/cl_20/ring_cl_svm_fine.cpp @@ -0,0 +1,89 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// Fine-grained shared virtual memory ring +// +// There is limited support for C11 atomics in C compilers so +// implement this module in C++11 +// + +extern "C" { + +#include "runtime.h" +#include "ring_cl_svm_fine.h" + +} + +// +// +// + +#include <atomic> + +// +// +// + +union skc_ring +{ + std::atomic<skc_uint> rw[2]; + + struct { + std::atomic<skc_uint> reads; // number of reads + std::atomic<skc_uint> writes; // number of writes + }; +}; + +// +// +// + +union skc_ring * +skc_ring_cl_svm_fine_alloc(struct skc_runtime_impl * const runtime_impl) +{ + return (union skc_ring *) + clSVMAlloc(runtime_impl->context, + CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER | CL_MEM_SVM_ATOMICS, + sizeof(union skc_ring), + 0); +} + +void +skc_ring_cl_svm_fine_init(union skc_ring * const ring, skc_uint writes) +{ + ring->reads = ATOMIC_VAR_INIT(0); + ring->writes = ATOMIC_VAR_INIT(writes); +} + +void +skc_ring_cl_svm_fine_free(struct skc_runtime_impl * const runtime_impl, union skc_ring * const ring) +{ + clSVMFree(runtime_impl->context,ring); +} + +// +// +// + +skc_uint +skc_ring_cl_svm_fine_read(union skc_ring * const ring, skc_uint const n) +{ + return atomic_fetch_add_explicit(&ring->reads,n,std::memory_order_relaxed); +} + +skc_uint +skc_ring_cl_svm_fine_write(union skc_ring * const ring, skc_uint const n) +{ + return atomic_fetch_add_explicit(&ring->writes,n,std::memory_order_relaxed); +} + +// +// +// + diff --git a/src/compute/skc/cl_20/ring_cl_svm_fine.h b/src/compute/skc/cl_20/ring_cl_svm_fine.h new file mode 100644 index 0000000000..65ff9f71f3 --- /dev/null +++ b/src/compute/skc/cl_20/ring_cl_svm_fine.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// Fine-grained shared virtual memory ring +// + +#include "runtime.h" +#include "types.h" + +// +// +// + +union skc_ring * +skc_ring_cl_svm_fine_alloc(struct skc_runtime_impl * const runtime_impl); + +void +skc_ring_cl_svm_fine_free(struct skc_runtime_impl * const runtime_impl, union skc_ring * const ring); + +// +// +// + +void +skc_ring_cl_svm_fine_init(union skc_ring * const ring, skc_uint writes); + +// +// +// + +skc_uint +skc_ring_cl_svm_fine_read(union skc_ring * const ring, skc_uint const n); + +skc_uint +skc_ring_cl_svm_fine_write(union skc_ring * const ring, skc_uint const n); + +// +// +// + diff --git a/src/compute/skc/common.h b/src/compute/skc/common.h new file mode 100644 index 0000000000..618ba2242e --- /dev/null +++ b/src/compute/skc/common.h @@ -0,0 +1,125 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_COMMON_ONCE +#define SKC_COMMON_ONCE + +// +// structures common to both host and device -- placeholder until +// everything shakes out +// + +union skc_transform +{ + // + // Transform is always scaled s.t. w2 is 1.0f + // + skc_float f32a8[8]; + + skc_float8 f32v8; + + struct { + skc_float sx; + skc_float shx; + skc_float tx; + + skc_float shy; + skc_float sy; + skc_float ty; + + skc_float w0; + skc_float w1; + }; +}; + +// +// +// + +union skc_path_clip +{ + skc_float f32a4[4]; // FIXME -- use the SIMD4 representation trick + + skc_float4 f32v4; + + struct { + skc_float x0; + skc_float y0; + skc_float x1; + skc_float y1; + }; +}; + +// +// host-side path fill cmd that is expanded into rasterization cmds +// +// FIXME -- these magic numbers will be replaced with tile.h constants +// +// FIXME -- make this command opaque by moving it into the platform impl +// +// FIXME -- NEED TO EVALUATE IF THIS DISTRIBUTION OF BITS IS GOING TO +// BE TOO SMALL -- plenty of room to jiggle these bits +// + +#define SKC_CMD_FILL_BITS_TRANSFORM 12 // distinct transforms -- perhaps too generous +#define SKC_CMD_FILL_BITS_CLIP 12 // distinct clips -- perhaps too generous +#define SKC_CMD_FILL_BITS_COHORT 8 // perhaps too small + +// +// +// + +typedef skc_uint skc_path_h; // host path handle + +union skc_cmd_fill +{ + skc_ulong u64; + + skc_uint2 u32v2; + + struct { + skc_path_h path; // host path id +#if defined(__OPENCL_C_VERSION__) + skc_uint tcc; +#else + skc_uint transform : SKC_CMD_FILL_BITS_TRANSFORM; + skc_uint clip : SKC_CMD_FILL_BITS_CLIP; + skc_uint cohort : SKC_CMD_FILL_BITS_COHORT; +#endif + }; +}; + +// +// +// + +typedef skc_uint skc_raster_h; + +union skc_cmd_place +{ + skc_uint4 u32v4; + + struct { + skc_raster_h raster_h; + skc_uint layer_id; + skc_uint tx; + skc_uint ty; + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_cmd_place) == sizeof(skc_uint4)); + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/composition.c b/src/compute/skc/composition.c new file mode 100644 index 0000000000..d9d51ba25a --- /dev/null +++ b/src/compute/skc/composition.c @@ -0,0 +1,101 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "composition.h" +// #include "common.h" +// #include "context.h" + +// +// high level composition object +// + +skc_err +skc_composition_retain(skc_composition_t composition) +{ + composition->ref_count += 1; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_composition_release(skc_composition_t composition) +{ + composition->release(composition->impl); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +skc_err +skc_composition_seal(skc_composition_t composition) +{ + // + // seal the composition + // + composition->seal(composition->impl); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +skc_err +skc_composition_unseal(skc_composition_t composition, bool reset) +{ + // + // unseal the composition + // + composition->unseal(composition->impl,reset); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +skc_err +skc_composition_place(skc_composition_t composition, + skc_raster_t const * rasters, + skc_layer_id const * layer_ids, + float const * txs, + float const * tys, + uint32_t count) // NOTE: A PER-PLACE CLIP IS POSSIBLE +{ + return composition->place(composition->impl,rasters,layer_ids,txs,tys,count); +} + +// +// +// + +skc_err +skc_composition_get_bounds(skc_composition_t composition, int32_t bounds[4]) +{ + // + // not working yet -- need to think about the semantics + // + // Option 1: return tight bounds of entire composition + // Option 2: ? + // + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/composition.h b/src/compute/skc/composition.h new file mode 100644 index 0000000000..cb83cfddbe --- /dev/null +++ b/src/compute/skc/composition.h @@ -0,0 +1,47 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "types.h" + +// +// +// + +struct skc_composition +{ + struct skc_context * context; + struct skc_composition_impl * impl; + + // + // FIXME -- this collection of pfn's isn't complete + // + skc_err (* place )(struct skc_composition_impl * const impl, + skc_raster_t const * rasters, + skc_layer_id const * layer_ids, + skc_float const * txs, + skc_float const * tys, + skc_uint count); + + void (* unseal )(struct skc_composition_impl * const impl, skc_bool const reset); + void (* seal )(struct skc_composition_impl * const impl); + void (* bounds )(struct skc_composition_impl * const impl, skc_int bounds[4]); + void (* release)(struct skc_composition_impl * const impl); + + skc_int ref_count; +}; + +// +// +// diff --git a/src/compute/skc/composition_cl_12.c b/src/compute/skc/composition_cl_12.c new file mode 100644 index 0000000000..7853564636 --- /dev/null +++ b/src/compute/skc/composition_cl_12.c @@ -0,0 +1,823 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> +#include <stdio.h> + +#include "hs/cl/hs_cl_launcher.h" + +#include "common/cl/assert_cl.h" + +#include "composition_cl_12.h" +#include "config_cl.h" + +#include "context.h" +#include "raster.h" +#include "handle.h" + +#include "runtime_cl_12.h" + +#include "common.h" +#include "tile.h" + +// +// TTCK (32-BIT COMPARE) v1: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 18 | 7 | 7 | +// +// +// TTCK (32-BIT COMPARE) v2: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 15 | 9 | 8 | +// +// +// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 27 | 1 | 1 | 18 | 9 | 8 | +// + +union skc_ttck +{ + skc_ulong u64; + skc_uint2 u32v2; + + struct { + skc_uint id : SKC_TTCK_LO_BITS_ID; + skc_uint prefix : SKC_TTCK_LO_BITS_PREFIX; + skc_uint escape : SKC_TTCK_LO_BITS_ESCAPE; + skc_uint layer_lo : SKC_TTCK_LO_BITS_LAYER; + skc_uint layer_hi : SKC_TTCK_HI_BITS_LAYER; + skc_uint x : SKC_TTCK_HI_BITS_X; + skc_uint y : SKC_TTCK_HI_BITS_Y; + }; + + struct { + skc_ulong na0 : SKC_TTCK_LO_BITS_ID_PREFIX_ESCAPE; + skc_ulong layer : SKC_TTCK_BITS_LAYER; + skc_ulong na1 : SKC_TTCK_HI_BITS_YX; + }; + + struct { + skc_uint na2; + skc_uint na3 : SKC_TTCK_HI_BITS_LAYER; + skc_uint yx : SKC_TTCK_HI_BITS_YX; + }; +}; + +// +// FIXME -- accept floats on host but convert to subpixel offsets +// before appending to command ring +// + +#define SKC_PLACE_CMD_TX_CONVERT(f) 0 +#define SKC_PLACE_CMD_TY_CONVERT(f) 0 + +// +// COMPOSITION PLACE +// +// This is a snapshot of the host-side command queue. +// +// Note that the composition command extent could be implemented as +// either a mapped buffer or simply copied to an ephemeral extent. +// +// This implementation may vary between compute platforms. +// + +struct skc_composition_place +{ + struct skc_composition_impl * impl; + + cl_command_queue cq; + + struct skc_extent_phw1g_tdrNs_snap cmds; + + skc_subbuf_id_t id; +}; + +// +// Forward declarations +// + +static +void +skc_composition_unseal_block(struct skc_composition_impl * const impl, + skc_bool const block); + +// +// +// + +static +void +skc_composition_pfn_release(struct skc_composition_impl * const impl) +{ + if (--impl->composition->ref_count != 0) + return; + + // + // otherwise, dispose of all resources + // + + // the unsealed state is a safe state to dispose of resources + skc_composition_unseal_block(impl,true); // block + + struct skc_runtime * const runtime = impl->runtime; + + // free host composition + skc_runtime_host_perm_free(runtime,impl->composition); + + // release the cq + skc_runtime_release_cq_in_order(runtime,impl->cq); + + // release kernels + cl(ReleaseKernel(impl->kernels.place)); + cl(ReleaseKernel(impl->kernels.segment)); + + // release extents + skc_extent_phw1g_tdrNs_free(runtime,&impl->cmds.extent); + skc_extent_phrw_free (runtime,&impl->saved.extent); + skc_extent_phr_pdrw_free (runtime,&impl->atomics); + + skc_extent_pdrw_free (runtime,&impl->keys); + skc_extent_pdrw_free (runtime,&impl->offsets); + + // free composition impl + skc_runtime_host_perm_free(runtime,impl); +} + +// +// +// + +static +void +skc_composition_place_grid_pfn_dispose(skc_grid_t const grid) +{ + struct skc_composition_place * const place = skc_grid_get_data(grid); + struct skc_composition_impl * const impl = place->impl; + struct skc_runtime * const runtime = impl->runtime; + + // release cq + skc_runtime_release_cq_in_order(runtime,place->cq); + + // unmap the snapshot (could be a copy) + skc_extent_phw1g_tdrNs_snap_free(runtime,&place->cmds); + + // release place struct + skc_runtime_host_temp_free(runtime,place,place->id); + + // release impl + skc_composition_pfn_release(impl); +} + +// +// +// + +static +void +skc_composition_place_read_complete(skc_grid_t const grid) +{ + skc_grid_complete(grid); +} + +static +void +skc_composition_place_read_cb(cl_event event, cl_int status, skc_grid_t const grid) +{ + SKC_CL_CB(status); + + struct skc_composition_place * const place = skc_grid_get_data(grid); + struct skc_composition_impl * const impl = place->impl; + struct skc_runtime * const runtime = impl->runtime; + struct skc_scheduler * const scheduler = runtime->scheduler; + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(scheduler,skc_composition_place_read_complete,grid); +} + +static +void +skc_composition_place_grid_pfn_execute(skc_grid_t const grid) +{ + // + // FILLS EXPAND + // + // need result of cmd counts before launching RASTERIZE grids + // + // - OpenCL 1.2: copy atomic counters back to host and launch RASTERIZE grids from host + // - OpenCL 2.x: have a kernel size and launch RASTERIZE grids from device + // - or launch a device-wide grid that feeds itself but that's unsatisfying + // + struct skc_composition_place * const place = skc_grid_get_data(grid); + struct skc_composition_impl * const impl = place->impl; + struct skc_runtime * const runtime = impl->runtime; + + skc_uint const work_size = skc_extent_ring_snap_count(place->cmds.snap); + skc_uint4 const clip = { 0, 0, SKC_UINT_MAX, SKC_UINT_MAX }; + + // initialize kernel args + cl(SetKernelArg(impl->kernels.place,0,SKC_CL_ARG(impl->runtime->block_pool.blocks.drw))); + cl(SetKernelArg(impl->kernels.place,1,SKC_CL_ARG(impl->atomics.drw))); + cl(SetKernelArg(impl->kernels.place,2,SKC_CL_ARG(impl->keys.drw))); + cl(SetKernelArg(impl->kernels.place,3,SKC_CL_ARG(place->cmds.drN))); + cl(SetKernelArg(impl->kernels.place,4,SKC_CL_ARG(runtime->handle_pool.map.drw))); + cl(SetKernelArg(impl->kernels.place,5,SKC_CL_ARG(clip))); // FIXME -- convert the clip to yx0/yx1 format + cl(SetKernelArg(impl->kernels.place,6,SKC_CL_ARG(work_size))); + + // launch kernel + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_PLACE, + place->cq, + impl->kernels.place, + work_size, + 0,NULL,NULL); + // + // copy atomics back after every place launch + // + cl_event complete; + + skc_extent_phr_pdrw_read(&impl->atomics,place->cq,&complete); + + cl(SetEventCallback(complete,CL_COMPLETE,skc_composition_place_read_cb,grid)); + cl(ReleaseEvent(complete)); + + // flush command queue + cl(Flush(place->cq)); +} + +// +// +// + +static +void +skc_composition_snap(struct skc_composition_impl * const impl) +{ + skc_composition_retain(impl->composition); + + skc_subbuf_id_t id; + + struct skc_composition_place * const place = skc_runtime_host_temp_alloc(impl->runtime, + SKC_MEM_FLAGS_READ_WRITE, + sizeof(*place),&id,NULL); + + // save the subbuf id + place->id = id; + + // save backpointer + place->impl = impl; + + // set grid data + skc_grid_set_data(impl->grids.place,place); + + // acquire command queue + place->cq = skc_runtime_acquire_cq_in_order(impl->runtime); + + // checkpoint the ring + skc_extent_ring_checkpoint(&impl->cmds.ring); + + // make a snapshot + skc_extent_phw1g_tdrNs_snap_init(impl->runtime,&impl->cmds.ring,&place->cmds); + + // unmap the snapshot (could be a copy) + skc_extent_phw1g_tdrNs_snap_alloc(impl->runtime, + &impl->cmds.extent, + &place->cmds, + place->cq, + NULL); + + skc_grid_force(impl->grids.place); +} + +// +// +// + +static +void +skc_composition_pfn_seal(struct skc_composition_impl * const impl) +{ + // return if sealing or sealed + if (impl->state >= SKC_COMPOSITION_STATE_SEALING) + return; + + struct skc_runtime * const runtime = impl->runtime; + struct skc_scheduler * const scheduler = runtime->scheduler; + + // + // otherwise, wait for UNSEALING > UNSEALED transition + // + if (impl->state == SKC_COMPOSITION_STATE_UNSEALING) + { + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_COMPOSITION_STATE_UNSEALED); + } + else // or we were already unsealed + { + // flush is there is work in progress + skc_uint const count = skc_extent_ring_wip_count(&impl->cmds.ring); + + if (count > 0) { + skc_composition_snap(impl); + } + } + + // + // now unsealed so we need to start sealing... + // + impl->state = SKC_COMPOSITION_STATE_SEALING; + + // + // the seal operation implies we should force start all dependencies + // that are still in a ready state + // + skc_grid_force(impl->grids.sort); +} + +// +// +// + +void +skc_composition_sort_execute_complete(struct skc_composition_impl * const impl) +{ + // we're sealed + impl->state = SKC_COMPOSITION_STATE_SEALED; + + // this grid is done + skc_grid_complete(impl->grids.sort); +} + +static +void +skc_composition_sort_execute_cb(cl_event event, cl_int status, struct skc_composition_impl * const impl) +{ + SKC_CL_CB(status); + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(impl->runtime->scheduler,skc_composition_sort_execute_complete,impl); +} + +static +void +skc_composition_sort_grid_pfn_execute(skc_grid_t const grid) +{ + struct skc_composition_impl * const impl = skc_grid_get_data(grid); + + // we should be sealing + assert(impl->state == SKC_COMPOSITION_STATE_SEALING); + + struct skc_place_atomics * const atomics = impl->atomics.hr; + +#ifndef NDEBUG + fprintf(stderr,"composition sort: %u\n",atomics->keys); +#endif + + if (atomics->keys > 0) + { + uint32_t keys_padded_in, keys_padded_out; + + hs_pad(atomics->keys,&keys_padded_in,&keys_padded_out); + + hs_sort(impl->cq, + impl->keys.drw, + impl->keys.drw, + atomics->keys, + keys_padded_in, + keys_padded_out, + false); + + cl(SetKernelArg(impl->kernels.segment,0,SKC_CL_ARG(impl->keys.drw))); + cl(SetKernelArg(impl->kernels.segment,1,SKC_CL_ARG(impl->offsets.drw))); + cl(SetKernelArg(impl->kernels.segment,2,SKC_CL_ARG(impl->atomics.drw))); + + // find start of each tile + skc_device_enqueue_kernel(impl->runtime->device, + SKC_DEVICE_KERNEL_ID_SEGMENT_TTCK, + impl->cq, + impl->kernels.segment, + atomics->keys, + 0,NULL,NULL); + } + + cl_event complete; + + // next stage needs to know number of key segments + skc_extent_phr_pdrw_read(&impl->atomics,impl->cq,&complete); + + // register a callback + cl(SetEventCallback(complete,CL_COMPLETE,skc_composition_sort_execute_cb,impl)); + cl(ReleaseEvent(complete)); + + // flush cq + cl(Flush(impl->cq)); +} + +// +// +// + +static +void +skc_composition_raster_release(struct skc_composition_impl * const impl) +{ + // + // reference counts to rasters can only be released when the + // composition is unsealed and the atomics are reset. + // + skc_runtime_raster_device_release(impl->runtime, + impl->saved.extent.hrw, + impl->saved.count); + // reset count + impl->saved.count = 0; +} + +// +// +// + +static +void +skc_composition_unseal_block(struct skc_composition_impl * const impl, + skc_bool const block) +{ + // return if already unsealed + if (impl->state == SKC_COMPOSITION_STATE_UNSEALED) + return; + + // + // otherwise, we're going to need to pump the scheduler + // + struct skc_scheduler * const scheduler = impl->runtime->scheduler; + + // + // wait for UNSEALING > UNSEALED transition + // + if (impl->state == SKC_COMPOSITION_STATE_UNSEALING) + { + if (block) { + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_COMPOSITION_STATE_UNSEALED); + } + return; + } + + // + // wait for SEALING > SEALED transition ... + // + if (impl->state == SKC_COMPOSITION_STATE_SEALING) + { + // wait if sealing + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_COMPOSITION_STATE_SEALED); + } + + // wait for rendering locks to be released + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->lock_count > 0); + + // + // no need to visit UNSEALING state with this implementation + // + + // acquire a new grid + impl->grids.sort = SKC_GRID_DEPS_ATTACH(impl->runtime->deps, + NULL, // the composition state guards this + impl, + NULL, // no waiting + skc_composition_sort_grid_pfn_execute, + NULL); // no dispose + + // mark composition as unsealed + impl->state = SKC_COMPOSITION_STATE_UNSEALED; +} + +// +// can only be called on a composition that was just unsealed +// +static +void +skc_composition_reset(struct skc_composition_impl * const impl) +{ + // zero the atomics + skc_extent_phr_pdrw_zero(&impl->atomics,impl->cq,NULL); + + // flush it + cl(Flush(impl->cq)); + + // release all the rasters + skc_composition_raster_release(impl); +} + +static +void +skc_composition_unseal_block_reset(struct skc_composition_impl * const impl, + skc_bool const block, + skc_bool const reset) +{ + skc_composition_unseal_block(impl,block); + + if (reset) { + skc_composition_reset(impl); + } +} + +// +// +// + +static +void +skc_composition_pfn_unseal(struct skc_composition_impl * const impl, skc_bool const reset) +{ + skc_composition_unseal_block_reset(impl,false,reset); +} + +// +// only needs to create a grid +// + +static +void +skc_composition_place_create(struct skc_composition_impl * const impl) +{ + // acquire a grid + impl->grids.place = SKC_GRID_DEPS_ATTACH(impl->runtime->deps, + &impl->grids.place, + NULL, + NULL, // no waiting + skc_composition_place_grid_pfn_execute, + skc_composition_place_grid_pfn_dispose); + + // assign happens-after relationship + skc_grid_happens_after_grid(impl->grids.sort,impl->grids.place); +} + + +static +skc_err +skc_composition_pfn_place(struct skc_composition_impl * const impl, + skc_raster_t const * rasters, + skc_layer_id const * layer_ids, + skc_float const * txs, + skc_float const * tys, + skc_uint count) +{ + // block and yield if not unsealed + skc_composition_unseal_block(impl,true); + + // + // validate and retain all rasters + // + skc_err err; + + err = skc_runtime_handle_device_validate_retain(impl->runtime, + SKC_TYPED_HANDLE_TYPE_IS_RASTER, + rasters, + count); + if (err) + return err; + + skc_runtime_handle_device_retain(impl->runtime,rasters,count); + + // + // save the stripped handles + // + skc_raster_t * saved = impl->saved.extent.hrw; + + saved += impl->saved.count; + impl->saved.count += count; + + for (skc_uint ii=0; ii<count; ii++) { + saved[ii] = SKC_TYPED_HANDLE_TO_HANDLE(*rasters++); + } + + // + // - declare the place grid happens after the raster + // - copy place commands into ring + // + do { + skc_uint rem; + + // find out how much room is left in then ring's snap + // if the place ring is full -- let it drain + SKC_SCHEDULER_WAIT_WHILE(impl->runtime->scheduler,(rem = skc_extent_ring_wip_rem(&impl->cmds.ring)) == 0); + + // append commands + skc_uint avail = min(rem,count); + + // decrement count + count -= avail; + + // launch a place kernel after copying commands? + skc_bool const is_wip_full = (avail == rem); + + // if there is no place grid then create one + if (impl->grids.place == NULL) + { + skc_composition_place_create(impl); + } + + // + // FIXME -- OPTIMIZATION? -- the ring_wip_index_inc() test can + // be avoided by splitting into at most two intervals. It should + // be plenty fast as is though so leave for now. + // + union skc_cmd_place * const cmds = impl->cmds.extent.hw1; + + if ((txs == NULL) && (tys == NULL)) + { + while (avail-- > 0) + { + skc_raster_t const raster = *saved++; + + skc_grid_happens_after_handle(impl->grids.place,raster); + + cmds[skc_extent_ring_wip_index_inc(&impl->cmds.ring)] = + (union skc_cmd_place){ raster, *layer_ids++, 0, 0 }; + } + } + else if (txs == NULL) + { + while (avail-- > 0) + { + skc_raster_t const raster = *saved++; + + skc_grid_happens_after_handle(impl->grids.place,raster); + + cmds[skc_extent_ring_wip_index_inc(&impl->cmds.ring)] = + (union skc_cmd_place){ raster, + *layer_ids++, + 0, + SKC_PLACE_CMD_TY_CONVERT(*tys++) }; + } + } + else if (tys == NULL) + { + while (avail-- > 0) + { + skc_raster_t const raster = *saved++; + + skc_grid_happens_after_handle(impl->grids.place,raster); + + cmds[skc_extent_ring_wip_index_inc(&impl->cmds.ring)] = + (union skc_cmd_place){ raster, + *layer_ids++, + SKC_PLACE_CMD_TX_CONVERT(*txs++), + 0 }; + } + } + else + { + while (avail-- > 0) + { + skc_raster_t const raster = *saved++; + + skc_grid_happens_after_handle(impl->grids.place,raster); + + cmds[skc_extent_ring_wip_index_inc(&impl->cmds.ring)] = + (union skc_cmd_place){ raster, + *layer_ids++, + SKC_PLACE_CMD_TX_CONVERT(*txs++), + SKC_PLACE_CMD_TY_CONVERT(*tys++) }; + } + } + + // launch place kernel? + if (is_wip_full) { + skc_composition_snap(impl); + } + } while (count > 0); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +static +void +skc_composition_pfn_bounds(struct skc_composition_impl * const impl, skc_int bounds[4]) +{ + // + // FIXME -- not implemented yet + // + // impl bounds will be copied back after sealing + // + bounds[0] = SKC_INT_MIN; + bounds[1] = SKC_INT_MIN; + bounds[2] = SKC_INT_MAX; + bounds[3] = SKC_INT_MAX; +} + +// +// +// + +void +skc_composition_retain_and_lock(struct skc_composition * const composition) +{ + skc_composition_retain(composition); + + composition->impl->lock_count += 1; +} + +void +skc_composition_unlock_and_release(struct skc_composition * const composition) +{ + composition->impl->lock_count -= 1; + + skc_composition_pfn_release(composition->impl); +} + +// +// +// + +skc_err +skc_composition_cl_12_create(struct skc_context * const context, + struct skc_composition * * const composition) +{ + struct skc_runtime * const runtime = context->runtime; + + // retain the context + // skc_context_retain(context); + + // allocate impl + struct skc_composition_impl * const impl = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*impl)); + + // allocate composition + (*composition) = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(**composition)); + + (*composition)->context = context; + (*composition)->impl = impl; + (*composition)->ref_count = 1; + + (*composition)->place = skc_composition_pfn_place; + (*composition)->unseal = skc_composition_pfn_unseal; + (*composition)->seal = skc_composition_pfn_seal; + (*composition)->bounds = skc_composition_pfn_bounds; + (*composition)->release = skc_composition_pfn_release; + + // intialize impl + impl->composition = (*composition); + impl->runtime = runtime; + + SKC_ASSERT_STATE_INIT(impl,SKC_COMPOSITION_STATE_SEALED); + + impl->lock_count = 0; + + impl->grids.sort = NULL; + impl->grids.place = NULL; + + // acquire command queue for sealing/unsealing + impl->cq = skc_runtime_acquire_cq_in_order(runtime); + + // acquire kernels + impl->kernels.place = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_PLACE); + impl->kernels.segment = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_SEGMENT_TTCK); + + // get config + struct skc_config const * const config = runtime->config; + + // initialize ring size with config values + skc_extent_ring_init(&impl->cmds.ring, + config->composition.cmds.elem_count, + config->composition.cmds.snap_count, + sizeof(union skc_cmd_place)); + + skc_extent_phw1g_tdrNs_alloc(runtime,&impl->cmds.extent ,sizeof(union skc_cmd_place) * config->composition.cmds.elem_count); + skc_extent_phrw_alloc (runtime,&impl->saved.extent,sizeof(skc_raster_t) * config->composition.raster_ids.elem_count); + skc_extent_phr_pdrw_alloc (runtime,&impl->atomics ,sizeof(struct skc_place_atomics)); + + skc_extent_pdrw_alloc (runtime,&impl->keys ,sizeof(skc_ttxk_t) * config->composition.keys.elem_count); + skc_extent_pdrw_alloc (runtime,&impl->offsets ,sizeof(skc_uint) * (1u << SKC_TTCK_HI_BITS_YX)); // 1MB + + // nothing saved + impl->saved.count = 0; + + // unseal the composition, zero the atomics, etc. + skc_composition_unseal_block_reset(impl,false,true); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/composition_cl_12.h b/src/compute/skc/composition_cl_12.h new file mode 100644 index 0000000000..4f52090658 --- /dev/null +++ b/src/compute/skc/composition_cl_12.h @@ -0,0 +1,105 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> + +#include "composition.h" +#include "assert_state.h" +#include "grid.h" +#include "extent_cl_12.h" +#include "extent_ring.h" + +// +// composition states +// + +typedef enum skc_composition_state_e { + + SKC_COMPOSITION_STATE_UNSEALING, + SKC_COMPOSITION_STATE_UNSEALED, + SKC_COMPOSITION_STATE_SEALING, + SKC_COMPOSITION_STATE_SEALED + +} skc_composition_state_e; + +// +// IMPL +// + +struct skc_composition_impl +{ + struct skc_composition * composition; + struct skc_runtime * runtime; + + SKC_ASSERT_STATE_DECLARE(skc_composition_state_e); + + skc_int lock_count; // wip renders + + struct { + skc_grid_t sort; + skc_grid_t place; + } grids; + + cl_command_queue cq; + + struct { + cl_kernel place; + cl_kernel segment; + } kernels; + + // raster ids must be held until the composition is reset or + // released and then their refcounts can be decremented + struct { + struct skc_extent_phrw extent; + skc_uint count; + } saved; + + struct { + struct skc_extent_ring ring; // how many slots left? + struct skc_extent_phw1g_tdrNs extent; // wip command extent + } cmds; + + // composition extent length + struct skc_extent_phr_pdrw atomics; + + // composition ttck extent + struct skc_extent_pdrw keys; + + // key offsets in sealed and sorted ttck extent + struct skc_extent_pdrw offsets; +}; + +// +// ATOMICS +// + +struct skc_place_atomics +{ + skc_uint keys; + skc_uint offsets; +}; + +// +// ONLY VISIBLE WITHIN THIS RUNTIME +// + +void +skc_composition_retain_and_lock(struct skc_composition * const composition); + +void +skc_composition_unlock_and_release(struct skc_composition * const composition); + +// +// +// diff --git a/src/compute/skc/config_cl.h b/src/compute/skc/config_cl.h new file mode 100644 index 0000000000..0172857b07 --- /dev/null +++ b/src/compute/skc/config_cl.h @@ -0,0 +1,147 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "runtime_cl.h" +#include "block_pool_cl.h" + +// +// FIXME -- define individual structs before defining skc_config +// + +struct skc_config +{ + struct { + struct { + skc_uint size; + skc_uint subbufs; + } host; // alignment determined by compiler + struct { + skc_uint size; + skc_uint subbufs; + } device; // alignment determined by device + } suballocator; + + struct { + skc_uint size; + } scheduler; + + struct { + skc_uint bytes; // bytes per subblock -- pow2 + skc_uint words; // words per subblock -- pow2 + // skc_uint words_log2; + } subblock; + + struct { + skc_uint bytes; // bytes per block -- pow2 + skc_uint words; // words per block -- pow2 + skc_uint subblocks; // subblocks per block -- block.bytes >= subblock.bytes + // skc_uint subblocks_log2; + } block; + + union skc_block_pool_size block_pool; + + struct { + skc_cq_type_e type; + skc_uint size; + } cq_pool; + + struct { + skc_uint size; // a large fraction of block pool size + skc_uint width; // determines number of launched reclamation subgroups + skc_uint recs; // how many in-flight width-subgroup reclamation grids + } handle_pool; + + struct { + skc_uint width; // tile width in pixels + skc_uint height; // tile height in pixels + skc_uint ratio; // subblocks per TTPB + } tile; + + struct { + struct { + skc_uint count; // # of subbufs in buffer + } buffer; + + struct { + skc_uint count; // # of blocks/commands in subbuf + } subbuf; + + struct { + size_t buffer; // block.bytes * subbuf.blocks * subbuf.count + size_t subbuf; // block.bytes * subbuf.blocks -- multiple of CL_DEVICE_MEM_BASE_ADDR_ALIGN + } block; + + struct { + size_t buffer; // sizeof(skc_uint) * subbuf.blocks * subbuf.count + size_t subbuf; // sizeof(skc_uint) * subbuf.blocks -- multiple of CL_DEVICE_MEM_BASE_ADDR_ALIGN + } command; + // + // skc_uint paths_lowat; + // + } paths_copy; + + struct { + struct { + skc_uint elem_count; + skc_uint snap_count; + } path_ids; + + struct { + skc_uint elem_count; + skc_uint snap_count; + } transforms; + + struct { + skc_uint elem_count; + skc_uint snap_count; + } clips; + + struct { + skc_uint elem_count; + skc_uint snap_count; + } fill; + + struct { + skc_uint elem_count; + skc_uint snap_count; + } raster_ids; + + struct { + skc_uint cmds; + } expand; + + struct { + skc_uint keys; + } rasterize; + } raster_cohort; + + struct { + struct { + skc_uint elem_count; + skc_uint snap_count; + } cmds; + + struct { + skc_uint elem_count; + } raster_ids; + + struct { + skc_uint elem_count; + } keys; + } composition; +}; + +// +// +// diff --git a/src/compute/skc/context.c b/src/compute/skc/context.c new file mode 100644 index 0000000000..8aac2ef3d1 --- /dev/null +++ b/src/compute/skc/context.c @@ -0,0 +1,180 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> +#include <assert.h> // FIXME -- replace with an SKC assert for non-debug builds + +#include "skc.h" +#include "context.h" + +// +// FIXME -- THE RUNTIME AND DEVICE WILL DYNAMICALLY LOADED +// + +// temporarily +#include "runtime_cl_12.h" + +// +// CONTEXT +// + +skc_err +skc_context_create(skc_context_t * context, + char const * target_platform_substring, + char const * target_device_substring, + intptr_t context_properties[]) +{ + (*context) = malloc(sizeof(**context)); + + // + // FIXME -- don't directly grab a CL runtime but for now juts create + // the CL_12 runtime here + // + skc_err err; + + err = skc_runtime_cl_12_create(*context, + target_platform_substring, + target_device_substring, + context_properties); + return err; +} + +skc_err +skc_context_retain(skc_context_t context) +{ + return SKC_ERR_SUCCESS; +} + + +skc_err +skc_context_release(skc_context_t context) +{ + skc_err err = skc_runtime_cl_12_dispose(context); + + free(context); + + return err; +} + + +skc_err +skc_context_reset(skc_context_t context) +{ + return SKC_ERR_SUCCESS; +} + +// +// +// + +bool +skc_context_yield(skc_context_t context) +{ + return context->yield(context->runtime); +} + +void +skc_context_wait(skc_context_t context) +{ + context->wait(context->runtime); +} + +// +// +// + +skc_err +skc_path_builder_create(skc_context_t context, skc_path_builder_t * path_builder) +{ + return context->path_builder(context,path_builder); +} + +skc_err +skc_path_retain(skc_context_t context, skc_path_t const * paths, uint32_t count) +{ + return context->path_retain(context->runtime,paths,count); +} + +skc_err +skc_path_release(skc_context_t context, skc_path_t const * paths, uint32_t count) +{ + return context->path_release(context->runtime,paths,count); +} + +skc_err +skc_path_flush(skc_context_t context, skc_path_t const * paths, uint32_t count) +{ + return context->path_flush(context->runtime,paths,count); +} + +// +// +// + +skc_err +skc_raster_builder_create(skc_context_t context, skc_raster_builder_t * raster_builder) +{ + return context->raster_builder(context,raster_builder); +} + +skc_err +skc_raster_retain(skc_context_t context, skc_raster_t const * rasters, uint32_t count) +{ + return context->raster_retain(context->runtime,rasters,count); +} + +skc_err +skc_raster_release(skc_context_t context, skc_raster_t const * rasters, uint32_t count) +{ + return context->raster_release(context->runtime,rasters,count); +} + +skc_err +skc_raster_flush(skc_context_t context, skc_raster_t const * rasters, uint32_t count) +{ + return context->raster_flush(context->runtime,rasters,count); +} + +// +// +// + +skc_err +skc_styling_create(skc_context_t context, + skc_styling_t * styling, + uint32_t layers_count, + uint32_t groups_count, + uint32_t extras_count) +{ + return context->styling(context, + styling, + layers_count, + groups_count, + extras_count); +} + +skc_err +skc_composition_create(skc_context_t context, skc_composition_t * composition) +{ + return context->composition(context,composition); +} + + +skc_err +skc_surface_create(skc_context_t context, skc_surface_t * surface) +{ + return context->surface(context,surface); +} + +// +// +// diff --git a/src/compute/skc/context.h b/src/compute/skc/context.h new file mode 100644 index 0000000000..65da835c9c --- /dev/null +++ b/src/compute/skc/context.h @@ -0,0 +1,103 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "types.h" + +// +// FIXME -- relax the const correctness +// + +struct skc_context +{ + struct skc_runtime * runtime; + + // + // + // + + bool (* yield )(struct skc_runtime * const runtime); + + void (* wait )(struct skc_runtime * const runtime); + + // + // + // + + skc_err (* path_builder )(struct skc_context * const context, + skc_path_builder_t * const path_builder); + + skc_err (* path_retain )(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count); + + skc_err (* path_release )(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count); + + skc_err (* path_flush )(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count); + + // + // + // + + skc_err (* raster_builder )(struct skc_context * const context, + skc_raster_builder_t * const raster_builder); + + skc_err (* raster_retain )(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count); + + skc_err (* raster_release )(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count); + + skc_err (* raster_flush )(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count); + // + // + // + + skc_err (* composition )(struct skc_context * const context, + skc_composition_t * const composition); + + // + // + // + + skc_err (* styling )(struct skc_context * const context, + skc_styling_t * const styling, + uint32_t const layers_count, + uint32_t const groups_count, + uint32_t const extras_count); + + // + // + // + + skc_err (* surface )(struct skc_context * const context, + skc_surface_t * const surface); + // + // + // + + skc_int refcount; +}; + +// +// +// diff --git a/src/compute/skc/cq_pool_cl.c b/src/compute/skc/cq_pool_cl.c new file mode 100644 index 0000000000..80cfe34cf8 --- /dev/null +++ b/src/compute/skc/cq_pool_cl.c @@ -0,0 +1,152 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#ifndef NDEBUG +#include <stdio.h> +#endif + +// +// +// + +#include <string.h> + +// +// +// + +#include "runtime_cl_12.h" + +// +// This implementation is probably excessive. +// +// The command queue pool could easily be replaced with simply an LRU +// or even round-robin reuse pool. Even a small number of aliased +// command queues can probably enough concurrency. +// + +#define SKC_CQ_POOL_EXPAND 1 + +// +// +// + +void +skc_cq_pool_create(struct skc_runtime * const runtime, + struct skc_cq_pool * const pool, + skc_uint const type, + skc_uint const size) +{ + pool->type = type; + pool->size = size + 1; // an empty spot + pool->reads = 0; + pool->writes = size; + pool->cq = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,pool->size * sizeof(*pool->cq)); + + for (skc_uint ii=0; ii<size; ii++) { + pool->cq[ii] = skc_runtime_cl_create_cq(&runtime->cl,pool->type); + } + pool->cq[size] = NULL; +} + +// +// +// + +void +skc_cq_pool_dispose(struct skc_runtime * const runtime, + struct skc_cq_pool * pool) +{ + // + // FIXME -- release the command queues after waiting for the ring to + // be full with pool.size queues? + // + skc_runtime_host_perm_free(runtime,pool->cq); +} + +// +// +// + +static +void +skc_cq_pool_write(struct skc_cq_pool * const pool, + cl_command_queue cq) +{ + pool->cq[pool->writes++ % pool->size] = cq; +} + +// +// only expand when completely empty +// + +static +void +skc_cq_pool_expand(struct skc_runtime * const runtime, + struct skc_cq_pool * const pool, + skc_uint expand) +{ +#ifndef NDEBUG + fprintf(stderr,"Expanding the cq_pool by: %u (%u)\n",expand,pool->size); +#endif + + // free old + skc_runtime_host_perm_free(runtime,pool->cq); + + // the ring is empty + pool->size += expand; + pool->cq = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,pool->size * sizeof(*pool->cq)); + pool->reads = 0; + pool->writes = expand; + + for (skc_uint ii=0; ii<expand; ii++) + pool->cq[ii] = skc_runtime_cl_create_cq(&runtime->cl,pool->type); +} + +// +// +// + +static +cl_command_queue +skc_cq_pool_read(struct skc_runtime * const runtime, + struct skc_cq_pool * const pool) +{ + // any command queues left? + if (pool->reads == pool->writes) + skc_cq_pool_expand(runtime,pool,SKC_CQ_POOL_EXPAND); + + cl_command_queue cq = pool->cq[pool->reads++ % pool->size]; + + return cq; +} + +// +// +// + +cl_command_queue +skc_runtime_acquire_cq_in_order(struct skc_runtime * const runtime) +{ + return skc_cq_pool_read(runtime,&runtime->cq_pool); +} + +void +skc_runtime_release_cq_in_order(struct skc_runtime * const runtime, + cl_command_queue cq) +{ + skc_cq_pool_write(&runtime->cq_pool,cq); +} + +// +// +// diff --git a/src/compute/skc/cq_pool_cl.h b/src/compute/skc/cq_pool_cl.h new file mode 100644 index 0000000000..0cc73a2f82 --- /dev/null +++ b/src/compute/skc/cq_pool_cl.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +#include "types.h" + +// +// Why we need to wrap command queue creation: +// +// - command queue creation is expensive +// +// - the CL 1.2 function is deprecated in 2.0 +// + +struct skc_cq_pool +{ + skc_cq_type_e type; + skc_uint size; + skc_uint reads; + skc_uint writes; + cl_command_queue * cq; +}; + +//l +// +// + +void +skc_cq_pool_create(struct skc_runtime * const runtime, + struct skc_cq_pool * const pool, + skc_uint const type, + skc_uint const size); + +void +skc_cq_pool_dispose(struct skc_runtime * const runtime, + struct skc_cq_pool * pool); + +// +// +// diff --git a/src/compute/skc/device_cl_12.h b/src/compute/skc/device_cl_12.h new file mode 100644 index 0000000000..637b61ae10 --- /dev/null +++ b/src/compute/skc/device_cl_12.h @@ -0,0 +1,95 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> + +// +// +// + +#define SKC_CL_ARG(arg) sizeof(arg),&arg + +// +// +// + +typedef enum skc_device_kernel_id { + SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_IDS, + SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_ATOMICS, + + SKC_DEVICE_KERNEL_ID_PATHS_ALLOC, + SKC_DEVICE_KERNEL_ID_PATHS_COPY, + + SKC_DEVICE_KERNEL_ID_FILLS_EXPAND, + + SKC_DEVICE_KERNEL_ID_RASTERIZE_ALL, + SKC_DEVICE_KERNEL_ID_RASTERIZE_LINES, + SKC_DEVICE_KERNEL_ID_RASTERIZE_QUADS, + SKC_DEVICE_KERNEL_ID_RASTERIZE_CUBICS, + SKC_DEVICE_KERNEL_ID_RASTERIZE_RAT_QUADS, + SKC_DEVICE_KERNEL_ID_RASTERIZE_RAT_CUBICS, + + SKC_DEVICE_KERNEL_ID_SEGMENT_TTRK, + SKC_DEVICE_KERNEL_ID_RASTERS_ALLOC, + + SKC_DEVICE_KERNEL_ID_PREFIX, + SKC_DEVICE_KERNEL_ID_PLACE, + SKC_DEVICE_KERNEL_ID_SEGMENT_TTCK, + + SKC_DEVICE_KERNEL_ID_RENDER, + + SKC_DEVICE_KERNEL_ID_PATHS_RECLAIM, + SKC_DEVICE_KERNEL_ID_RASTERS_RECLAIM, + + // + SKC_DEVICE_KERNEL_ID_COUNT + +} skc_device_kernel_id; + +// +// +// + +void +skc_device_create(struct skc_runtime * const runtime); + + +void +skc_device_dispose(struct skc_runtime * const runtime); + + +// +// multi-threading/context/device requires multiple kernel instances +// + +cl_kernel +skc_device_acquire_kernel(struct skc_device * const device, + skc_device_kernel_id const type); + +// +// grid shape can vary greatly by target platform +// +void +skc_device_enqueue_kernel(struct skc_device * const device, + skc_device_kernel_id const type, + cl_command_queue cq, + cl_kernel kernel, + size_t const work_size, + cl_uint num_events_in_wait_list, + cl_event const * const event_wait_list, + cl_event * const event); + +// +// +// diff --git a/src/compute/skc/device_cl_12_avx2.h b/src/compute/skc/device_cl_12_avx2.h new file mode 100644 index 0000000000..e68579c0f7 --- /dev/null +++ b/src/compute/skc/device_cl_12_avx2.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_DEVICE_CL_12_AVX2_H +#define SKC_ONCE_DEVICE_CL_12_AVX2_H + +// +// +// + +#define SKC_DEVICE_BLOCK_WORDS_LOG2 6 +#define SKC_DEVICE_SUBBLOCK_WORDS_LOG2 4 + +// +// +// + +#define SKC_DEVICE_BLOCK_WORDS (1u << SKC_DEVICE_BLOCK_WORDS_LOG2) +#define SKC_DEVICE_SUBBLOCK_WORDS (1u << SKC_DEVICE_SUBBLOCK_WORDS_LOG2) + +// +// +// + +#define SKC_DEVICE_SUBBLOCKS_PER_BLOCK (SKC_DEVICE_BLOCK_WORDS / SKC_DEVICE_SUBBLOCK_WORDS) + +// +// +// + +#define SKC_COPY_PATHS_THREADS_PER_BLOCK SKC_DEVICE_SUBBLOCK_WORDS +#define SKC_COPY_PATHS_ELEM_WORDS 1 + +// +// +// + +#define SKC_EXPAND_FILLS_THREADS_PER_BLOCK SKC_DEVICE_SUBBLOCK_WORDS +#define SKC_EXPAND_FILLS_ELEM_WORDS 1 + +// +// +// + +#define SKC_RASTERIZE_THREADS_PER_BLOCK SKC_DEVICE_SUBBLOCK_WORDS + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/device_cl_12_gen9.c b/src/compute/skc/device_cl_12_gen9.c new file mode 100644 index 0000000000..5b4d9d2dd2 --- /dev/null +++ b/src/compute/skc/device_cl_12_gen9.c @@ -0,0 +1,942 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +#include "common/cl/assert_cl.h" +#include "macros.h" + +#include "config_cl.h" +#include "runtime_cl_12.h" + +#include "raster.h" +#include "tile.h" + +#include "hs/cl/hs_cl_launcher.h" +#include "hs/cl/gen9/hs_cl.h" + +// +// +// + +#define SKC_KERNEL_SPIRV 0 +#define SKC_KERNEL_BINARY 1 +#define SKC_KERNEL_SRC 0 + +// +// +// + +#if SKC_KERNEL_SPIRV + +#include "block_pool_init.pre.spv.inl" +#include "paths_copy.pre.spv.inl" +#include "fills_expand.pre.spv.inl" +#include "rasterize.pre.spv.inl" +#include "segment_ttrk.pre.spv.inl" +#include "rasters_alloc.pre.spv.inl" +#include "prefix.pre.spv.inl" +#include "place.pre.spv.inl" +#include "segment_ttck.pre.spv.inl" +#include "render.pre.spv.inl" +#include "paths_reclaim.pre.spv.inl" +#include "rasters_reclaim.pre.spv.inl" + +#elif SKC_KERNEL_BINARY + +#include "block_pool_init.pre.bin.inl" +#include "paths_copy.pre.bin.inl" +#include "fills_expand.pre.bin.inl" +#include "rasterize.pre.bin.inl" +#include "segment_ttrk.pre.bin.inl" +#include "rasters_alloc.pre.bin.inl" +#include "prefix.pre.bin.inl" +#include "place.pre.bin.inl" +#include "segment_ttck.pre.bin.inl" +#include "render.pre.bin.inl" +#include "paths_reclaim.pre.bin.inl" +#include "rasters_reclaim.pre.bin.inl" + +#elif SKC_KERNEL_SRC + +#include "block_pool_init.pre.src.inl" +#include "paths_copy.pre.src.inl" +#include "fills_expand.pre.src.inl" +#include "rasterize.pre.src.inl" +#include "segment_ttrk.pre.src.inl" +#include "rasters_alloc.pre.src.inl" +#include "prefix.pre.src.inl" +#include "place.pre.src.inl" +#include "segment_ttck.pre.src.inl" +#include "render.pre.src.inl" +#include "paths_reclaim.pre.src.inl" +#include "rasters_reclaim.pre.src.inl" + +#endif + +// +// +// + +#include "device_cl_12_gen9.h" + +// +// FIXME -- THE CONFIG INITIALIZATION IS ONLY HERE TEMPORARILY +// + +static +struct skc_config const config = + { + .suballocator = { + .host = { + .size = 1024 * 1024, // words + .subbufs = 1024 // must be <= (1 << (8 * sizeof(skc_subbuf_id_t))) + }, + .device = { + .size = 128 * 1024 * 1024, + .subbufs = 1024 // must be <= (1 << (8 * sizeof(skc_subbuf_id_t))) + } + }, + + .scheduler = { + .size = 4096 // 128 // fixme -- this is just for testing -- too big + }, + + .subblock = { + .words = SKC_DEVICE_SUBBLOCK_WORDS, // words per subblock -- pow2 + .bytes = SKC_DEVICE_SUBBLOCK_WORDS * sizeof(skc_uint) // bytes per subblock -- pow2 + }, + + .block = { + .words = SKC_DEVICE_BLOCK_WORDS, // words per block -- pow2 + .bytes = SKC_DEVICE_BLOCK_WORDS * sizeof(skc_uint), // bytes per block -- pow2 + .subblocks = SKC_DEVICE_BLOCK_WORDS / SKC_DEVICE_SUBBLOCK_WORDS // subblocks per block -- block.bytes >= subblock.bytes + }, + + .block_pool = { + .pool_size = 524288, // blocks in pool -- 128 MB + .ring_pow2 = 524288, // blocks in pool rounded up pow2 + .ring_mask = 524288 - 1 + }, + + .cq_pool = { +#ifndef NDEBUG + .type = SKC_CQ_TYPE_IN_ORDER_PROFILING, +#else + .type = 0, +#endif + .size = 8 + }, + + .handle_pool = { + .size = 262144, // large fraction of block pool size (for now, 1:2) + .width = SKC_RECLAIM_ARRAY_SIZE, + .recs = 256 // too many? too few? + }, + + .tile = { + .width = SKC_TILE_WIDTH, // tile width in pixels + .height = SKC_TILE_HEIGHT, // tile height in pixels + .ratio = SKC_TILE_HEIGHT / SKC_TILE_WIDTH // subblocks per TTPB + }, + + .paths_copy = { + + .buffer = { + .count = 16 // # of subbufs in buffer + }, + + .subbuf = { + .count = 1024 // # of blocks/commands in subbuf + }, + + .block = { + .subbuf = SKC_DEVICE_BLOCK_WORDS * sizeof(skc_uint) * 1024, // block.bytes * subbuf.blocks -- multiple of CL_DEVICE_MEM_BASE_ADDR_ALIGN + .buffer = SKC_DEVICE_BLOCK_WORDS * sizeof(skc_uint) * 1024 * 16 // block.bytes * subbuf.blocks * subbuf.count + }, + + .command = { + .subbuf = sizeof(skc_uint) * 1024, // sizeof(skc_uint) * subbuf.blocks -- multiple of CL_DEVICE_MEM_BASE_ADDR_ALIGN + .buffer = sizeof(skc_uint) * 1024 * 16 // sizeof(skc_uint) * subbuf.blocks * subbuf.count + }, + + // skc_uint paths_lowat; + }, + + .raster_cohort = { + .path_ids = { + .elem_count = 8192, + .snap_count = 1024 // FIXME -- THIS SHOULD BE WAYYYY BIGGER + }, + + .transforms = { + .elem_count = 8192, + .snap_count = 1024 // FIXME -- THIS SHOULD BE WAYYYY BIGGER + }, + + .clips = { + .elem_count = 8192, + .snap_count = 1024 // FIXME -- THIS SHOULD BE WAYYYY BIGGER + }, + + .fill = { + .elem_count = 8192, + .snap_count = 1024 // FIXME -- THIS SHOULD BE WAYYYY BIGGER + }, + + .raster_ids = { + .elem_count = 8192, + .snap_count = (1<<SKC_TTRK_HI_BITS_COHORT) // 256 + }, + + .expand = { + .cmds = 1024*128, + }, + + .rasterize = { + .keys = 1024*1024 + } + }, + + .composition = { + .cmds = { + .elem_count = 1024*16, + .snap_count = 1024 + }, + .raster_ids = { + .elem_count = 1024*1024 + }, + .keys = { + .elem_count = 1024*1024, + } + }, + }; + +// +// +// + +static char const cl_build_options_optimized[] = + "-cl-std=CL1.2 " + "-cl-single-precision-constant " + "-cl-denorms-are-zero " + "-cl-mad-enable " + "-cl-no-signed-zeros " + "-cl-fast-relaxed-math " + "-cl-kernel-arg-info "; + +static char const cl_build_options_debug[] = + "-cl-std=CL1.2 -cl-kernel-arg-info -g"; // -s c:/users/allanmac/home/google/skia_internal/src/compute/skc"; + +// #define SKC_BUILD_OPTIONS cl_build_options_debug +#define SKC_BUILD_OPTIONS cl_build_options_optimized + +// +// +// + +struct skc_program_source +{ + char const * name; + char const * options; + char const * src; + size_t const srclen; +}; + +// +// THIS IS A RELATIVELY COMPACT WAY OF DECLARING EACH PROGRAM SOURCE +// AND ITS BUILD OPTIONS +// + +union skc_program_sources +{ + struct { + struct skc_program_source block_pool_init; + struct skc_program_source paths_copy; + struct skc_program_source fills_expand; + struct skc_program_source rasterize; + struct skc_program_source segment_ttrk; + struct skc_program_source rasters_alloc; + struct skc_program_source prefix; + struct skc_program_source place; + struct skc_program_source segment_ttck; + struct skc_program_source render; + struct skc_program_source paths_reclaim; + struct skc_program_source rasters_reclaim; + }; + struct skc_program_source sources[]; +}; + +typedef size_t * (*skc_grid_shaper)(size_t const work_size, + cl_uint * const work_dim, + size_t * const global_work_size, + size_t * const local_work_size); +struct skc_program_kernel +{ + char const * name; + skc_grid_shaper shaper; + skc_device_kernel_id id; +}; + +union skc_program_kernels +{ + struct { + struct skc_program_kernel block_pool_init[2]; + struct skc_program_kernel paths_copy [2]; + struct skc_program_kernel fills_expand [1]; + struct skc_program_kernel rasterize [6]; + struct skc_program_kernel segment_ttrk [1]; + struct skc_program_kernel rasters_alloc [1]; + struct skc_program_kernel prefix [1]; + struct skc_program_kernel place [1]; + struct skc_program_kernel segment_ttck [1]; + struct skc_program_kernel render [1]; + struct skc_program_kernel paths_reclaim [1]; + struct skc_program_kernel rasters_reclaim[1]; + }; + struct skc_program_kernel kernels[]; +}; + +// +// +// + +#if SKC_KERNEL_SPIRV // PROGRAM IS SPIR-V +#define SKC_KERNEL_SUFFIX(n) n ## _pre_spv +#elif SKC_KERNEL_BINARY // PROGRAM IS BINARY +#define SKC_KERNEL_SUFFIX(n) n ## _pre_ir +#elif SKC_KERNEL_SRC // PROGRAM IS SOURCE CODE +#define SKC_KERNEL_SUFFIX(n) n ## _pre_cl +#else +#error "SKC_KERNEL_???" +#endif + +// +// +// + +#define SKC_PROGRAM_SOURCE_EXPAND(k,s,o) .k = { SKC_STRINGIFY(k), o, s, sizeof(s) } +#define SKC_PROGRAM_SOURCE(k,o) SKC_PROGRAM_SOURCE_EXPAND(k,SKC_KERNEL_SUFFIX(k),o) +#define SKC_PROGRAM_KERNEL(k) "skc_kernel_" SKC_STRINGIFY(k), SKC_CONCAT(skc_device_shaper_,k) + +// +// +// + +static +size_t * +skc_device_shaper_block_pool_init_ids(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = work_size; + + return NULL; // let runtime figure out local work size +} + +static +size_t * +skc_device_shaper_block_pool_init_atomics(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = 2; + + return NULL; // let runtime figure out local work size +} + +static +size_t * +skc_device_shaper_paths_alloc(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = 1; + + return NULL; // let runtime figure out local work size +} + + +static +size_t * +skc_device_shaper_paths_copy(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = SKC_PATHS_COPY_SUBGROUP_SIZE * work_size; +#if 0 + work_local [0] = SKC_PATHS_COPY_SUBGROUP_SIZE; + + return work_local; +#else + return NULL; // let runtime figure out local work size +#endif +} + +static +size_t * +skc_device_shaper_fills_expand(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = SKC_FILLS_EXPAND_SUBGROUP_SIZE * work_size; + work_local [0] = SKC_FILLS_EXPAND_SUBGROUP_SIZE; + + return work_local; +} + +static +size_t * +skc_device_shaper_rasterize(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = SKC_RASTERIZE_SUBGROUP_SIZE * work_size; + work_local [0] = SKC_RASTERIZE_SUBGROUP_SIZE; + + return work_local; +} + +static +size_t * +skc_device_shaper_rasterize_all(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + return skc_device_shaper_rasterize(work_size,work_dim,work_global,work_local); +} + +static +size_t * +skc_device_shaper_rasterize_lines(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + return skc_device_shaper_rasterize(work_size,work_dim,work_global,work_local); +} + +static +size_t * +skc_device_shaper_rasterize_quads(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + return skc_device_shaper_rasterize(work_size,work_dim,work_global,work_local); +} + +static +size_t * +skc_device_shaper_rasterize_cubics(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + return skc_device_shaper_rasterize(work_size,work_dim,work_global,work_local); +} + +static +size_t * +skc_device_shaper_rasterize_rat_quads(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + return skc_device_shaper_rasterize(work_size,work_dim,work_global,work_local); +} + +static +size_t * +skc_device_shaper_rasterize_rat_cubics(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + return skc_device_shaper_rasterize(work_size,work_dim,work_global,work_local); +} + +static +size_t * +skc_device_shaper_rasters_alloc(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + // round up to whole groups + size_t gs = SKC_ROUND_UP(work_size,SKC_RASTERS_ALLOC_GROUP_SIZE); + + work_dim [0] = 1; + work_global[0] = gs; + work_local [0] = SKC_RASTERS_ALLOC_GROUP_SIZE; + + return work_local; +} + +static +size_t * +skc_device_shaper_segment_ttrk(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + // work_size is number of keys -- round up to a whole slab + size_t keys_ru = SKC_ROUND_UP(work_size,HS_LANES_PER_WARP*HS_KEYS_PER_LANE); + + work_dim [0] = 1; + work_global[0] = keys_ru / HS_KEYS_PER_LANE; + work_local [0] = HS_LANES_PER_WARP; // or just return NULL + + return work_local; +} + +static +size_t * +skc_device_shaper_segment_ttck(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + // work_size is number of keys -- round up to a whole slab + size_t keys_ru = SKC_ROUND_UP(work_size,HS_LANES_PER_WARP*HS_KEYS_PER_LANE); + + work_dim [0] = 1; + work_global[0] = keys_ru / HS_KEYS_PER_LANE; + work_local [0] = HS_LANES_PER_WARP; // or just return NULL + + return work_local; +} + +static +size_t * +skc_device_shaper_prefix(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = SKC_PREFIX_SUBGROUP_SIZE * work_size; + work_local [0] = SKC_PREFIX_SUBGROUP_SIZE; + + return work_local; +} + +static +size_t * +skc_device_shaper_place(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = SKC_PLACE_SUBGROUP_SIZE * work_size; + work_local [0] = SKC_PLACE_SUBGROUP_SIZE; + + return work_local; +} + +static +size_t * +skc_device_shaper_render(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + work_dim [0] = 1; + work_global[0] = SKC_RENDER_SUBGROUP_SIZE * work_size; + work_local [0] = SKC_RENDER_SUBGROUP_SIZE; + + return work_local; +} + +static +size_t * +skc_device_shaper_paths_reclaim(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + assert(work_size == SKC_RECLAIM_ARRAY_SIZE); + + work_dim [0] = 1; + work_global[0] = SKC_RECLAIM_ARRAY_SIZE * SKC_PATHS_RECLAIM_SUBGROUP_SIZE; + + return NULL; // let runtime figure out local work size +} + +static +size_t * +skc_device_shaper_rasters_reclaim(size_t const work_size, + cl_uint * const work_dim, + size_t * const work_global, + size_t * const work_local) +{ + assert(work_size == SKC_RECLAIM_ARRAY_SIZE); + + work_dim [0] = 1; + work_global[0] = SKC_RECLAIM_ARRAY_SIZE * SKC_PATHS_RECLAIM_SUBGROUP_SIZE; + + return NULL; // let runtime figure out local work size +} + +// +// +// + +static union skc_program_sources const program_sources = { + SKC_PROGRAM_SOURCE(block_pool_init,SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(paths_copy, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(fills_expand, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(rasterize, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(segment_ttrk, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(rasters_alloc, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(prefix, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(place, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(segment_ttck, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(render, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(paths_reclaim, SKC_BUILD_OPTIONS), + SKC_PROGRAM_SOURCE(rasters_reclaim,SKC_BUILD_OPTIONS) +}; + +static union skc_program_kernels const program_kernels = { + + .block_pool_init = { { SKC_PROGRAM_KERNEL(block_pool_init_ids), SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_IDS }, + { SKC_PROGRAM_KERNEL(block_pool_init_atomics), SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_ATOMICS } }, + + .paths_copy = { { SKC_PROGRAM_KERNEL(paths_alloc), SKC_DEVICE_KERNEL_ID_PATHS_ALLOC }, + { SKC_PROGRAM_KERNEL(paths_copy) , SKC_DEVICE_KERNEL_ID_PATHS_COPY } }, + + .fills_expand = { { SKC_PROGRAM_KERNEL(fills_expand), SKC_DEVICE_KERNEL_ID_FILLS_EXPAND } }, + + .rasterize = { { SKC_PROGRAM_KERNEL(rasterize_all), SKC_DEVICE_KERNEL_ID_RASTERIZE_ALL }, + { SKC_PROGRAM_KERNEL(rasterize_lines), SKC_DEVICE_KERNEL_ID_RASTERIZE_LINES }, + { SKC_PROGRAM_KERNEL(rasterize_quads), SKC_DEVICE_KERNEL_ID_RASTERIZE_QUADS }, + { SKC_PROGRAM_KERNEL(rasterize_cubics), SKC_DEVICE_KERNEL_ID_RASTERIZE_CUBICS }, + { SKC_PROGRAM_KERNEL(rasterize_rat_quads), SKC_DEVICE_KERNEL_ID_RASTERIZE_RAT_QUADS }, + { SKC_PROGRAM_KERNEL(rasterize_rat_cubics), SKC_DEVICE_KERNEL_ID_RASTERIZE_RAT_CUBICS } }, + + .segment_ttrk = { { SKC_PROGRAM_KERNEL(segment_ttrk), SKC_DEVICE_KERNEL_ID_SEGMENT_TTRK } }, + + .rasters_alloc = { { SKC_PROGRAM_KERNEL(rasters_alloc), SKC_DEVICE_KERNEL_ID_RASTERS_ALLOC } }, + + .prefix = { { SKC_PROGRAM_KERNEL(prefix), SKC_DEVICE_KERNEL_ID_PREFIX } }, + + .place = { { SKC_PROGRAM_KERNEL(place), SKC_DEVICE_KERNEL_ID_PLACE } }, + + .segment_ttck = { { SKC_PROGRAM_KERNEL(segment_ttck) , SKC_DEVICE_KERNEL_ID_SEGMENT_TTCK } }, + + .render = { { SKC_PROGRAM_KERNEL(render), SKC_DEVICE_KERNEL_ID_RENDER } }, + + .paths_reclaim = { { SKC_PROGRAM_KERNEL(paths_reclaim), SKC_DEVICE_KERNEL_ID_PATHS_RECLAIM } }, + + .rasters_reclaim = { { SKC_PROGRAM_KERNEL(rasters_reclaim), SKC_DEVICE_KERNEL_ID_RASTERS_RECLAIM } } +}; + +// +// +// + +struct skc_device +{ + // + // FIXME -- an OpenCL 2.1+ device would clone these kernels in a + // multithreaded system. + // + // Not having the ability to clone kernels (yet set their sticky + // args) was an oversight in previous versions of OpenCL. + // + // For now, we can probably get away with just a single kernel + // instance as long as args are set and the kernel is launched + // before having its arguments stomped on. + // + cl_kernel kernels [SKC_DEVICE_KERNEL_ID_COUNT]; + size_t reqd_szs[SKC_DEVICE_KERNEL_ID_COUNT][3]; +}; + +// +// CREATE KERNELS +// + +static +void +skc_device_create_kernels(struct skc_runtime * const runtime, + struct skc_program_kernel const * const kernels, + skc_uint const kernel_count, + cl_program program) +{ + for (skc_uint ii=0; ii<kernel_count; ii++) + { + cl_int cl_err; + + char const * name = kernels[ii].name; + skc_uint const id = kernels[ii].id; + + fprintf(stderr,"\t\"%s\"\n",name); + + // create the kernel + runtime->device->kernels[id] = clCreateKernel(program,name,&cl_err); cl_ok(cl_err); + + // + // release program now + // + // FIXME -- if/when we multithread then we need to clone kernels + // (>=2.1) or keep programs around (<=2.0) + // + + // get workgroup size + cl(GetKernelWorkGroupInfo(runtime->device->kernels[id], + runtime->cl.device_id, + CL_KERNEL_COMPILE_WORK_GROUP_SIZE, + sizeof(runtime->device->reqd_szs[0]), + runtime->device->reqd_szs[id], + NULL)); + + // + // GEN9+ PROBING + // +#define SKC_TARGET_GEN9 +#ifdef SKC_TARGET_GEN9 + +#define CL_DEVICE_SUB_GROUP_SIZES_INTEL 0x4108 +#define CL_KERNEL_SPILL_MEM_SIZE_INTEL 0x4109 +#define CL_KERNEL_COMPILE_SUB_GROUP_SIZE_INTEL 0x410A + + cl_ulong spill_mem_size; + + cl(GetKernelWorkGroupInfo(runtime->device->kernels[id], + runtime->cl.device_id, + CL_KERNEL_SPILL_MEM_SIZE_INTEL, + sizeof(spill_mem_size), + &spill_mem_size, + NULL)); + + fprintf(stderr,"\t\tspill mem size: %lu bytes\n", + (unsigned long)spill_mem_size); + + cl_ulong local_mem_size; + + cl(GetKernelWorkGroupInfo(runtime->device->kernels[id], + runtime->cl.device_id, + CL_KERNEL_LOCAL_MEM_SIZE, + sizeof(local_mem_size), + &local_mem_size, + NULL)); + + fprintf(stderr,"\t\tlocal mem size: %lu bytes\n", + (unsigned long)local_mem_size); +#endif + } +} + +static +void +skc_device_build_program(struct skc_runtime * const runtime, + struct skc_program_source const * const source, + struct skc_program_kernel const * const kernels, + skc_uint const kernel_count) +{ + cl_program program; + + fprintf(stderr,"%-20s: ",source->name); + + cl_int cl_err; + +#if SKC_KERNEL_SPIRV // PROGRAM IS SPIR-V + + fprintf(stderr,"Creating (SPIR-V) ... "); + + program = clCreateProgramWithIL(runtime->cl.context, + source->src, + source->srclen, + &cl_err); + +#elif SKC_KERNEL_BINARY // PROGRAM IS BINARY + + fprintf(stderr,"Creating (Binary) ... "); + + cl_int status; + program = clCreateProgramWithBinary(runtime->cl.context, + 1, + &runtime->cl.device_id, + &source->srclen, + (unsigned char const *[]){ source->src }, + &status, + &cl_err); + +#elif SKC_KERNEL_SRC // PROGRAM IS SOURCE CODE + + fprintf(stderr,"Creating (Source) ... "); + + program = clCreateProgramWithSource(runtime->cl.context, + 1, + (char const *[]){ source->src }, + &source->srclen, + &cl_err); +#else + +#error "SKC_KERNEL_???" + +#endif + + cl_ok(cl_err); + + fprintf(stderr,"Building ... "); + + // build the program + cl(BuildProgram(program, + 1, + &runtime->cl.device_id, + source->options, // build options are ignored by binary + NULL, + NULL)); + + fprintf(stderr,"Done\n"); + + // build the kernels + skc_device_create_kernels(runtime,kernels,kernel_count,program); + + // we're done with program for now + // can always recover it from a kernel instance + cl(ReleaseProgram(program)); +} + +// +// RELEASE KERNELS +// + +static +void +skc_device_release_kernels(struct skc_device * const device) +{ + for (skc_int ii=0; ii<SKC_COUNT_OF(device->kernels); ii++) + cl(ReleaseKernel(device->kernels[ii])); +} + + + +cl_kernel +skc_device_acquire_kernel(struct skc_device * const device, + skc_device_kernel_id const type) +{ + cl_kernel kernel = device->kernels[type]; + + cl(RetainKernel(kernel)); + + return kernel; +} + +// +// INITIALIZE KERNEL ARGS +// +// FIXME +// +// pre-assign any kernel arguments that are never going to change -- +// for example, the block pool +// + +// +// +// + +#define SKC_DEVICE_BUILD_PROGRAM(p) \ + skc_device_build_program(runtime,&program_sources.p,program_kernels.p,SKC_COUNT_OF(program_kernels.p)) + + +void +skc_device_create(struct skc_runtime * const runtime) +{ + struct skc_device * const device = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*device)); + + // hang device off of runtime + runtime->device = device; + + // hang config off of runtime + runtime->config = &config; + + // create kernels + SKC_DEVICE_BUILD_PROGRAM(block_pool_init); + SKC_DEVICE_BUILD_PROGRAM(paths_copy); + SKC_DEVICE_BUILD_PROGRAM(fills_expand); + SKC_DEVICE_BUILD_PROGRAM(rasterize); + SKC_DEVICE_BUILD_PROGRAM(segment_ttrk); + SKC_DEVICE_BUILD_PROGRAM(rasters_alloc); + SKC_DEVICE_BUILD_PROGRAM(prefix); + SKC_DEVICE_BUILD_PROGRAM(place); + SKC_DEVICE_BUILD_PROGRAM(segment_ttck); + SKC_DEVICE_BUILD_PROGRAM(render); + SKC_DEVICE_BUILD_PROGRAM(paths_reclaim); + SKC_DEVICE_BUILD_PROGRAM(rasters_reclaim); + + // create HotSort instance -- FIXME -- how this occurs needs to be cleaned up + hs_create(runtime->cl.context,runtime->cl.device_id,NULL); +} + +void +skc_device_dispose(struct skc_runtime * const runtime) +{ + // + // FIXME -- dispose of programs, kernels, etc. + // + + skc_runtime_host_perm_free(runtime,runtime->device); +} + +// +// FIXME -- just pass the device type +// + +void +skc_device_enqueue_kernel(struct skc_device * const device, + skc_device_kernel_id const type, + cl_command_queue cq, + cl_kernel kernel, + size_t const work_size, + cl_uint num_events_in_wait_list, + cl_event const * const event_wait_list, + cl_event * const event) +{ + if (work_size == 0) + return; + + cl_uint work_dim [1]; + size_t work_global[3]; + size_t work_local [3]; + + size_t * work_local_ptr = program_kernels.kernels[type].shaper(work_size, + work_dim, + work_global, + work_local); + cl(EnqueueNDRangeKernel(cq, + kernel,// device->kernels[type], + work_dim[0], + NULL, + work_global, + work_local_ptr, + num_events_in_wait_list, + event_wait_list, + event)); +} + +// +// +// diff --git a/src/compute/skc/device_cl_12_gen9.h b/src/compute/skc/device_cl_12_gen9.h new file mode 100644 index 0000000000..dd69a845c2 --- /dev/null +++ b/src/compute/skc/device_cl_12_gen9.h @@ -0,0 +1,335 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_DEVICE_CL_12_GEN9_H +#define SKC_ONCE_DEVICE_CL_12_GEN9_H + +// +// FIXME -- THERE ARE SOME DUPLICATED TYPEDEFS IN THIS FILE +// +// THESE WILL GO AWAY AS THE TYPING GET POLISHED AND SIMPLIFIED +// + +#include "block.h" + +// +// HOW TO SELECT A SUBBLOCK AND BLOCK SIZES: +// +// 1) The subblock size should match the natural SIMT/SIMD width of +// the target device. +// +// 2) Either a square or rectangular (1:2) tile size is chosen. The +// tile size is usually determined by the amount of SMEM available +// to a render kernel subgroup and desired multiprocessor +// occupancy. +// +// 3) If the tile is rectangular then the block size must be at least +// twice the size of the subblock size. +// +// 4) A large block size can decrease allocation overhead but there +// will be diminishing returns as the block size increases. +// + +#define SKC_DEVICE_BLOCK_WORDS_LOG2 6 // CHANGE "WORDS" TO "SIZE" ? +#define SKC_DEVICE_SUBBLOCK_WORDS_LOG2 3 + +#define SKC_TILE_WIDTH_LOG2 SKC_DEVICE_SUBBLOCK_WORDS_LOG2 +#define SKC_TILE_HEIGHT_LOG2 (SKC_DEVICE_SUBBLOCK_WORDS_LOG2 + 1) + +///////////////////////////////////////////////////////////////// +// +// BLOCK POOL INIT +// + +#define SKC_BP_INIT_IDS_KERNEL_ATTRIBS +#define SKC_BP_INIT_ATOMICS_KERNEL_ATTRIBS __attribute__((reqd_work_group_size(2,1,1))) + +///////////////////////////////////////////////////////////////// +// +// PATHS ALLOC +// + +#define SKC_PATHS_ALLOC_KERNEL_ATTRIBS __attribute__((reqd_work_group_size(1,1,1))) + +///////////////////////////////////////////////////////////////// +// +// PATHS COPY +// + +#define SKC_PATHS_COPY_SUBGROUP_SIZE_LOG2 SKC_DEVICE_SUBBLOCK_WORDS_LOG2 // FIXME -- SUBGROUP OR THREADS PER BLOCK? +#define SKC_PATHS_COPY_ELEM_WORDS 1 +#define SKC_PATHS_COPY_ELEM_EXPAND() SKC_EXPAND_1() + +#define SKC_PATHS_COPY_KERNEL_ATTRIBS __attribute__((intel_reqd_sub_group_size(SKC_PATHS_COPY_SUBGROUP_SIZE))) + +#define SKC_IS_NOT_PATH_HEAD(sg,I) ((sg) + get_sub_group_local_id() >= SKC_PATH_HEAD_WORDS) + +typedef skc_uint skc_paths_copy_elem; +typedef skc_uint skc_pb_idx_v; + +///////////////////////////////////////////////////////////////// +// +// FILLS EXPAND +// + +#define SKC_FILLS_EXPAND_SUBGROUP_SIZE_LOG2 SKC_DEVICE_SUBBLOCK_WORDS_LOG2 +#define SKC_FILLS_EXPAND_ELEM_WORDS 1 + +#define SKC_FILLS_EXPAND_KERNEL_ATTRIBS __attribute__((intel_reqd_sub_group_size(SKC_FILLS_EXPAND_SUBGROUP_SIZE))) + +///////////////////////////////////////////////////////////////// +// +// RASTER ALLOC +// +// NOTE -- Intel subgroup shuffles aren't supported in SIMD32 which is +// why use of the subgroup broadcast produces a compiler error. So a +// subgroup of size 16 is this widest we can require. +// + +#define SKC_RASTERS_ALLOC_GROUP_SIZE 16 + +#if (SKC_RASTERS_ALLOC_GROUP_SIZE <= 16) + +#define SKC_RASTERS_ALLOC_KERNEL_ATTRIBS __attribute__((intel_reqd_sub_group_size(SKC_RASTERS_ALLOC_GROUP_SIZE))) +#define SKC_RASTERS_ALLOC_LOCAL_ID() get_sub_group_local_id() +#define SKC_RASTERS_ALLOC_INCLUSIVE_ADD(v) sub_group_scan_inclusive_add(v) +#define SKC_RASTERS_ALLOC_BROADCAST(v,i) sub_group_broadcast(v,i) + +#else + +#define SKC_RASTERS_ALLOC_KERNEL_ATTRIBS __attribute__((reqd_work_group_size(SKC_RASTERS_ALLOC_GROUP_SIZE,1,1))) +#define SKC_RASTERS_ALLOC_LOCAL_ID() get_local_id(0) +#define SKC_RASTERS_ALLOC_INCLUSIVE_ADD(v) work_group_scan_inclusive_add(v) +#define SKC_RASTERS_ALLOC_BROADCAST(v,i) work_group_broadcast(v,i) + +#endif + +///////////////////////////////////////////////////////////////// +// +// RASTERIZE +// + +#define SKC_RASTERIZE_SUBGROUP_SIZE SKC_DEVICE_SUBBLOCK_WORDS +#define SKC_RASTERIZE_VECTOR_SIZE_LOG2 0 +#define SKC_RASTERIZE_WORKGROUP_SUBGROUPS 1 + +#define SKC_RASTERIZE_KERNEL_ATTRIBS \ + __attribute__((intel_reqd_sub_group_size(SKC_RASTERIZE_SUBGROUP_SIZE))) \ + __attribute__((reqd_work_group_size(SKC_RASTERIZE_SUBGROUP_SIZE * SKC_RASTERIZE_WORKGROUP_SUBGROUPS, 1, 1))) + +#define SKC_RASTERIZE_FLOAT float +#define SKC_RASTERIZE_UINT uint +#define SKC_RASTERIZE_INT int +#define SKC_RASTERIZE_PREDICATE bool +#define SKC_RASTERIZE_POOL uint + +#define SKC_RASTERIZE_TILE_HASH_X_BITS 1 +#define SKC_RASTERIZE_TILE_HASH_Y_BITS 2 + +typedef skc_block_id_t skc_block_id_v_t; +typedef skc_uint2 skc_ttsk_v_t; +typedef skc_uint2 skc_ttsk_s_t; + +// SKC_STATIC_ASSERT(SKC_RASTERIZE_POOL_SIZE > SKC_RASTERIZE_SUBGROUP_SIZE); + +///////////////////////////////////////////////////////////////// +// +// PREFIX +// + +#define SKC_PREFIX_SUBGROUP_SIZE 8 // for now this had better be SKC_DEVICE_SUBBLOCK_WORDS +#define SKC_PREFIX_WORKGROUP_SUBGROUPS 1 + +#define SKC_PREFIX_KERNEL_ATTRIBS \ + __attribute__((intel_reqd_sub_group_size(SKC_PREFIX_SUBGROUP_SIZE))) \ + __attribute__((reqd_work_group_size(SKC_PREFIX_SUBGROUP_SIZE * SKC_PREFIX_WORKGROUP_SUBGROUPS, 1, 1))) + +#define SKC_PREFIX_TTP_V skc_uint2 +#define SKC_PREFIX_TTS_V_BITFIELD skc_int + +#define SKC_PREFIX_TTS_VECTOR_INT_EXPAND SKC_EXPAND_1 + +#define SKC_PREFIX_SMEM_ZERO ulong +#define SKC_PREFIX_SMEM_ZERO_WIDTH (sizeof(SKC_PREFIX_SMEM_ZERO) / sizeof(skc_ttp_t)) +#define SKC_PREFIX_SMEM_COUNT_BLOCK_ID 8 + +#define SKC_PREFIX_BLOCK_ID_V_SIZE SKC_PREFIX_SUBGROUP_SIZE + +#define SKC_PREFIX_TTXK_V_SIZE SKC_PREFIX_SUBGROUP_SIZE +#define SKC_PREFIX_TTXK_V_MASK (SKC_PREFIX_TTXK_V_SIZE - 1) + +typedef skc_uint skc_bp_elem_t; + +typedef skc_uint2 skc_ttrk_e_t; +typedef skc_uint2 skc_ttsk_v_t; +typedef skc_uint2 skc_ttsk_s_t; +typedef skc_uint2 skc_ttpk_s_t; +typedef skc_uint2 skc_ttxk_v_t; + +typedef skc_int skc_tts_v_t; + +typedef skc_int skc_ttp_t; + +typedef skc_uint skc_raster_yx_s; + +typedef skc_block_id_t skc_block_id_v_t; +typedef skc_block_id_t skc_block_id_s_t; + +///////////////////////////////////////////////////////////////// +// +// PLACE +// + +#define SKC_PLACE_SUBGROUP_SIZE 16 +#define SKC_PLACE_WORKGROUP_SUBGROUPS 1 + +#define SKC_PLACE_KERNEL_ATTRIBS \ + __attribute__((intel_reqd_sub_group_size(SKC_PLACE_SUBGROUP_SIZE))) \ + __attribute__((reqd_work_group_size(SKC_PLACE_SUBGROUP_SIZE * SKC_PLACE_WORKGROUP_SUBGROUPS, 1, 1))) + +typedef skc_uint skc_bp_elem_t; + +typedef skc_uint skc_ttsk_lo_t; +typedef skc_uint skc_ttsk_hi_t; + +typedef skc_uint skc_ttpk_lo_t; +typedef skc_uint skc_ttpk_hi_t; + +typedef skc_uint skc_ttxk_lo_t; +typedef skc_uint skc_ttxk_hi_t; + +typedef skc_uint2 skc_ttck_t; + +typedef skc_bool skc_pred_v_t; +typedef skc_int skc_int_v_t; + +///////////////////////////////////////////////////////////////// +// +// RENDER +// + +#define SKC_ARCH_GEN9 + +#if defined(__OPENCL_C_VERSION__) +#pragma OPENCL EXTENSION cl_khr_fp16 : enable +#endif + +#define SKC_RENDER_SUBGROUP_SIZE 8 +#define SKC_RENDER_WORKGROUP_SUBGROUPS 1 + +#define SKC_RENDER_KERNEL_ATTRIBS \ + __attribute__((intel_reqd_sub_group_size(SKC_RENDER_SUBGROUP_SIZE))) \ + __attribute__((reqd_work_group_size(SKC_RENDER_SUBGROUP_SIZE * SKC_RENDER_WORKGROUP_SUBGROUPS, 1, 1))) + +#define SKC_RENDER_SCANLINE_VECTOR_SIZE 2 + +#define SKC_RENDER_REGS_COLOR_R 2 +#define SKC_RENDER_REGS_COVER_R 3 + +#define SKC_RENDER_TTSB_EXPAND() SKC_EXPAND_1() + +#define SKC_RENDER_TTS_V skc_int +#define SKC_RENDER_TTS_V_BITFIELD skc_int + +#define SKC_RENDER_TTP_V skc_int2 +#define SKC_RENDER_AREA_V skc_int2 + +#define SKC_RENDER_TILE_COLOR_PAIR half2 +#define SKC_RENDER_TILE_COLOR_PAIR_LOAD(x,v) vload2(x,v) + +#define SKC_RENDER_SURFACE_COLOR half4 +#define SKC_RENDER_SURFACE_WRITE write_imageh + +// #define SKC_RENDER_TTXB_VECTOR_INT int2 +// #define SKC_RENDER_TTXB_VECTOR_UINT uint2 + +#define SKC_RENDER_WIDE_AA ulong // SLM = 64 bytes/clock + +#define SKC_RENDER_TILE_COLOR half2 +#define SKC_RENDER_TILE_COVER half2 + +#define SKC_RENDER_ACC_COVER_INT int2 +#define SKC_RENDER_ACC_COVER_UINT uint2 + +#define SKC_RENDER_GRADIENT_FLOAT float2 +#define SKC_RENDER_GRADIENT_INT int2 +#define SKC_RENDER_GRADIENT_STOP int2 +#define SKC_RENDER_GRADIENT_FRAC half2 +#define SKC_RENDER_GRADIENT_COLOR_STOP half + +#define SKC_RENDER_SURFACE_U8_RGBA uint2 + +#define SKC_RENDER_TILE_COLOR_VECTOR uint16 +#define SKC_RENDER_TILE_COLOR_VECTOR_COMPONENT uint +#define SKC_RENDER_TILE_COLOR_VECTOR_COUNT ((sizeof(SKC_RENDER_TILE_COLOR) * 4 * SKC_TILE_WIDTH) / sizeof(SKC_RENDER_TILE_COLOR_VECTOR)) + +///////////////////////////////////////////////////////////////// +// +// PATHS & RASTERS RECLAIM +// +// FIXME -- investigate enabling the stride option for a smaller grid +// that iterates over a fixed number of threads. Since reclamation is +// a low-priority task, it's probably reasonable to trade longer +// reclamation times for lower occupancy of the device because it +// might delay the fastpath of the pipeline. +// + +#define SKC_RECLAIM_ARRAY_SIZE (7 * 8 / 2) // 8 EUs with 7 hardware threads divided by 2 is half a sub-slice + +///////////////////////////////////////////////////////////////// +// +// PATHS RECLAIM +// + +#define SKC_PATHS_RECLAIM_SUBGROUP_SIZE_LOG2 SKC_DEVICE_SUBBLOCK_WORDS_LOG2 // FIXME -- SUBGROUP OR THREADS PER BLOCK? +#define SKC_PATHS_RECLAIM_LOCAL_ELEMS 1 +#define SKC_PATHS_RECLAIM_KERNEL_ATTRIBS __attribute__((intel_reqd_sub_group_size(SKC_PATHS_RECLAIM_SUBGROUP_SIZE))) + +///////////////////////////////////////////////////////////////// +// +// RASTERS RECLAIM +// + +#define SKC_RASTERS_RECLAIM_SUBGROUP_SIZE_LOG2 SKC_DEVICE_SUBBLOCK_WORDS_LOG2 // FIXME -- SUBGROUP OR THREADS PER BLOCK? +#define SKC_RASTERS_RECLAIM_LOCAL_ELEMS 1 +#define SKC_RASTERS_RECLAIM_KERNEL_ATTRIBS __attribute__((intel_reqd_sub_group_size(SKC_RASTERS_RECLAIM_SUBGROUP_SIZE))) + +// +// COMMON -- FIXME -- HOIST THESE ELSEWHERE +// + +#define SKC_DEVICE_BLOCK_WORDS (1u << SKC_DEVICE_BLOCK_WORDS_LOG2) +#define SKC_DEVICE_SUBBLOCK_WORDS (1u << SKC_DEVICE_SUBBLOCK_WORDS_LOG2) + +#define SKC_DEVICE_BLOCK_DWORDS (SKC_DEVICE_BLOCK_WORDS / 2) + +#define SKC_DEVICE_BLOCK_WORDS_MASK SKC_BITS_TO_MASK(SKC_DEVICE_BLOCK_WORDS_LOG2) +#define SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK SKC_BITS_TO_MASK(SKC_DEVICE_BLOCK_WORDS_LOG2 - SKC_DEVICE_SUBBLOCK_WORDS_LOG2) + +#define SKC_DEVICE_SUBBLOCKS_PER_BLOCK (SKC_DEVICE_BLOCK_WORDS / SKC_DEVICE_SUBBLOCK_WORDS) + +#define SKC_TILE_RATIO (SKC_TILE_HEIGHT / SKC_TILE_WIDTH) + +// +// +// + +#define SKC_PATHS_COPY_SUBGROUP_SIZE (1 << SKC_PATHS_COPY_SUBGROUP_SIZE_LOG2) +#define SKC_PATHS_RECLAIM_SUBGROUP_SIZE (1 << SKC_PATHS_RECLAIM_SUBGROUP_SIZE_LOG2) +#define SKC_RASTERS_RECLAIM_SUBGROUP_SIZE (1 << SKC_RASTERS_RECLAIM_SUBGROUP_SIZE_LOG2) +#define SKC_FILLS_EXPAND_SUBGROUP_SIZE (1 << SKC_FILLS_EXPAND_SUBGROUP_SIZE_LOG2) + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/export_cl_12.h b/src/compute/skc/export_cl_12.h new file mode 100644 index 0000000000..e577282791 --- /dev/null +++ b/src/compute/skc/export_cl_12.h @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" + +// +// +// + +skc_err +skc_path_builder_cl_12_create(struct skc_context * const context, + struct skc_path_builder * * const path_builder); + +// +// +// + +skc_err +skc_raster_builder_cl_12_create(struct skc_context * const context, + struct skc_raster_builder * * const raster_builder); + +// +// +// + +skc_err +skc_composition_cl_12_create(struct skc_context * const context, + struct skc_composition * * const composition); + +// +// +// + +skc_err +skc_styling_cl_12_create(struct skc_context * const context, + struct skc_styling * * const styling, + uint32_t const layers_count, + uint32_t const groups_count, + uint32_t const extras_count); + +// +// +// + +skc_err +skc_surface_cl_12_create(struct skc_context * const context, + struct skc_surface * * const surface); + +// +// +// + diff --git a/src/compute/skc/extent_cl_12.c b/src/compute/skc/extent_cl_12.c new file mode 100644 index 0000000000..73676d8063 --- /dev/null +++ b/src/compute/skc/extent_cl_12.c @@ -0,0 +1,459 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> + +#include "common/cl/assert_cl.h" +#include "extent_cl_12.h" +#include "runtime_cl_12.h" + +// +// DURABLE R/W HOST EXTENT -- STANDARD CACHED MEMORY +// + +void +skc_extent_phrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrw * const extent, + size_t const size) +{ + extent->hrw = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,size); +} + +void +skc_extent_phrw_free(struct skc_runtime * const runtime, + struct skc_extent_phrw * const extent) +{ + skc_runtime_host_perm_free(runtime,extent->hrw); +} + +// +// DURABLE R/W DEVICE EXTENT -- ALLOCATED FROM DEVICE HEAP +// + +void +skc_extent_pdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_pdrw * const extent, + size_t const size) +{ + extent->drw = skc_runtime_device_perm_alloc(runtime, + CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, + size); +} + +void +skc_extent_pdrw_free(struct skc_runtime * const runtime, + struct skc_extent_pdrw * const extent) +{ + skc_runtime_device_perm_free(runtime,extent->drw); +} + +// +// EPHEMERAL DEVICE R/W EXTENT -- ALLOCATED QUICKLY FROM A MANAGED RING +// + +void +skc_extent_tdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_tdrw * const extent, + size_t const size) +{ + extent->size = size; + extent->drw = skc_runtime_device_temp_alloc(runtime, + CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, + size,&extent->id,NULL); +} + +void +skc_extent_tdrw_free(struct skc_runtime * const runtime, + struct skc_extent_tdrw * const extent) +{ + skc_runtime_device_temp_free(runtime,extent->drw,extent->id); +} + +void +skc_extent_tdrw_zero(struct skc_extent_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + if (extent->size == 0) + return; + + skc_uint const zero = 0; + + cl(EnqueueFillBuffer(cq, + extent->drw, + &zero, + sizeof(zero), + 0, + extent->size, + 0,NULL,event)); +} + +// +// DURABLE SMALL EXTENTS BACKING ATOMICS +// + +void +skc_extent_phr_pdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_phr_pdrw * const extent, + size_t const size) +{ + extent->size = size; + extent->hr = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_ONLY,size); + extent->drw = skc_runtime_device_perm_alloc(runtime,CL_MEM_READ_WRITE,size); +} + +void +skc_extent_phr_pdrw_free(struct skc_runtime * const runtime, + struct skc_extent_phr_pdrw * const extent) +{ + skc_runtime_host_perm_free(runtime,extent->hr); + skc_runtime_device_perm_free(runtime,extent->drw); +} + +void +skc_extent_phr_pdrw_read(struct skc_extent_phr_pdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + if (extent->size == 0) + return; + + cl(EnqueueReadBuffer(cq, + extent->drw, + CL_FALSE, + 0, + extent->size, + extent->hr, + 0,NULL,event)); +} + +void +skc_extent_phr_pdrw_zero(struct skc_extent_phr_pdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + if (extent->size == 0) + return; + + skc_uint const zero = 0; + + cl(EnqueueFillBuffer(cq, + extent->drw, + &zero, + sizeof(zero), + 0, + extent->size, + 0,NULL,event)); +} + +// +// EPHEMERAL SMALL EXTENTS BACKING ATOMICS +// + +void +skc_extent_thr_tdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_thr_tdrw * const extent, + size_t const size) +{ + extent->size = size; + extent->hr = skc_runtime_host_temp_alloc(runtime, + SKC_MEM_FLAGS_READ_WRITE, + size,&extent->id.hr,NULL); + extent->drw = skc_runtime_device_temp_alloc(runtime, + CL_MEM_READ_WRITE, + size, + &extent->id.drw, + NULL); +} + +void +skc_extent_thr_tdrw_free(struct skc_runtime * const runtime, + struct skc_extent_thr_tdrw * const extent) +{ + skc_runtime_host_temp_free(runtime,extent->hr,extent->id.hr); + skc_runtime_device_temp_free(runtime,extent->drw,extent->id.drw); +} + +void +skc_extent_thr_tdrw_read(struct skc_extent_thr_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + if (extent->size == 0) + return; + + cl(EnqueueReadBuffer(cq, + extent->drw, + CL_FALSE, + 0, + extent->size, + extent->hr, + 0,NULL,event)); +} + +void +skc_extent_thr_tdrw_zero(struct skc_extent_thr_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + if (extent->size == 0) + return; + + skc_uint const zero = 0; + + cl(EnqueueFillBuffer(cq, + extent->drw, + &zero, + sizeof(zero), + 0, + extent->size, + 0,NULL,event)); +} + +// +// DURABLE W/1 HOST RING WITH AN EPHEMERAL R/N DEVICE SNAPSHOT +// + +void +skc_extent_phw1g_tdrNs_alloc(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs * const extent, + size_t const size) +{ + extent->hw1 = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_WRITE_ONLY,size); +} + +void +skc_extent_phw1g_tdrNs_free(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs * const extent) +{ + skc_runtime_host_perm_free(runtime,extent->hw1); +} + +void +skc_extent_phw1g_tdrNs_snap_init(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring, + struct skc_extent_phw1g_tdrNs_snap * const snap) +{ + snap->snap = skc_extent_ring_snap_alloc(runtime,ring); +} + +void +skc_extent_phw1g_tdrNs_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs * const extent, + struct skc_extent_phw1g_tdrNs_snap * const snap, + cl_command_queue const cq, + cl_event * const event) +{ + struct skc_extent_ring const * const ring = snap->snap->ring; + + skc_uint const count = skc_extent_ring_snap_count(snap->snap); + size_t const size = count * ring->size.elem; + + snap->drN = skc_runtime_device_temp_alloc(runtime, + CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY, + size,&snap->id,NULL); + + if (count == 0) + return; + + // possibly two copies + skc_uint const index_lo = snap->snap->reads & ring->size.mask; + skc_uint const count_max = ring->size.pow2 - index_lo; + skc_uint const count_lo = min(count_max,count); + size_t const bytes_lo = count_lo * ring->size.elem; + + if (count > count_max) + { + skc_uint const bytes_hi = (count - count_max) * ring->size.elem; + + cl(EnqueueWriteBuffer(cq, + snap->drN, + CL_FALSE, + bytes_lo, + bytes_hi, + extent->hw1, // offset_hi = 0 + 0,NULL,NULL)); + } + + size_t const offset_lo = index_lo * ring->size.elem; + + cl(EnqueueWriteBuffer(cq, + snap->drN, + CL_FALSE, + 0, + bytes_lo, + (skc_uchar*)extent->hw1 + offset_lo, + 0,NULL,event)); + +} + +void +skc_extent_phw1g_tdrNs_snap_free(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs_snap * const snap) +{ + skc_runtime_device_temp_free(runtime,snap->drN,snap->id); + skc_extent_ring_snap_free(runtime,snap->snap); +} + +// +// DURABLE R/W HOST RING WITH AN EPHEMERAL R/N DEVICE SNAPSHOT +// + +void +skc_extent_phrwg_tdrNs_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs * const extent, + size_t const size) +{ + extent->hrw = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,size); // WRITE-ONCE +} + +void +skc_extent_phrwg_tdrNs_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs * const extent) +{ + skc_runtime_host_perm_free(runtime,extent->hrw); +} + +void +skc_extent_phrwg_tdrNs_snap_init(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring, + struct skc_extent_phrwg_tdrNs_snap * const snap) +{ + snap->snap = skc_extent_ring_snap_alloc(runtime,ring); +} + +void +skc_extent_phrwg_tdrNs_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs * const extent, + struct skc_extent_phrwg_tdrNs_snap * const snap, + cl_command_queue const cq, + cl_event * const event) +{ + struct skc_extent_ring const * const ring = snap->snap->ring; + + skc_uint const count = skc_extent_ring_snap_count(snap->snap); + size_t const size = count * ring->size.elem; + + snap->drN = skc_runtime_device_temp_alloc(runtime, + CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY, + size,&snap->id,NULL); + + if (count == 0) + return; + + // possibly two copies + skc_uint const index_lo = snap->snap->reads & ring->size.mask; + skc_uint const count_max = ring->size.pow2 - index_lo; + skc_uint const count_lo = min(count_max,count); + size_t const bytes_lo = count_lo * ring->size.elem; + + if (count > count_max) + { + skc_uint const count_hi = count - count_max; + skc_uint const bytes_hi = count_hi * ring->size.elem; + + cl(EnqueueWriteBuffer(cq, + snap->drN, + CL_FALSE, + bytes_lo, + bytes_hi, + extent->hrw, // offset_hi = 0 + 0,NULL,NULL)); + } + + size_t offset_lo = index_lo * ring->size.elem; + + cl(EnqueueWriteBuffer(cq, + snap->drN, + CL_FALSE, + 0, + bytes_lo, + (skc_uchar*)extent->hrw + offset_lo, + 0,NULL,event)); + +} + +void +skc_extent_phrwg_tdrNs_snap_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs_snap * const snap) +{ + skc_runtime_device_temp_free(runtime,snap->drN,snap->id); + skc_extent_ring_snap_free(runtime,snap->snap); +} + +// +// DURABLE HOST R/W RING WITH AN EPHEMERAL HOST R/1 SNAPSHOT +// +// Note that because the ring and snapshot are both in host memory and +// the snapshot blocks progress until freed we can simply point the +// fake ephemeral snapshot at the ring's durable extent. +// + +void +skc_extent_phrwg_thr1s_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s * const extent, + size_t const size) +{ + extent->hrw = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,size); // WRITE-ONCE +} + +void +skc_extent_phrwg_thr1s_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s * const extent) +{ + skc_runtime_host_perm_free(runtime,extent->hrw); +} + +void +skc_extent_phrwg_thr1s_snap_init(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring, + struct skc_extent_phrwg_thr1s_snap * const snap) +{ + snap->snap = skc_extent_ring_snap_alloc(runtime,ring); +} + +void +skc_extent_phrwg_thr1s_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s * const extent, + struct skc_extent_phrwg_thr1s_snap * const snap) +{ + struct skc_extent_ring const * const ring = snap->snap->ring; + + skc_uint const count = skc_extent_ring_snap_count(snap->snap); + skc_uint const index_lo = snap->snap->reads & ring->size.mask; + skc_uint const count_max = ring->size.pow2 - index_lo; + + snap->count.lo = min(count_max,count); + snap->hr1.lo = (skc_uchar*)extent->hrw + (index_lo * ring->size.elem); + + if (count > count_max) + { + snap->count.hi = count - count_max; + snap->hr1.hi = extent->hrw; + } + else + { + snap->count.hi = 0; + snap->hr1.hi = NULL; + } +} + +void +skc_extent_phrwg_thr1s_snap_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s_snap * const snap) +{ + skc_extent_ring_snap_free(runtime,snap->snap); +} + +// +// +// diff --git a/src/compute/skc/extent_cl_12.h b/src/compute/skc/extent_cl_12.h new file mode 100644 index 0000000000..47ba951bb3 --- /dev/null +++ b/src/compute/skc/extent_cl_12.h @@ -0,0 +1,476 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> + +#include "suballocator.h" +#include "extent_ring.h" + +// +// Legend: +// +// p : durable +// t : ephemeral +// h : host +// d : device +// r : read +// w : write +// 1 : once -- e.g. w1 is 'write-once' +// N : many -- e.g. rN is 'read-many' +// g : ring +// s : ring snapshot +// +// Notes: +// +// rw : for now, read-write implies read-write many +// + +// +// DURABLE R/W HOST EXTENT -- STANDARD CACHED MEMORY +// + +struct skc_extent_phrw +{ + void * hrw; +}; + +void +skc_extent_phrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrw * const extent, + size_t const size); + +void +skc_extent_phrw_free(struct skc_runtime * const runtime, + struct skc_extent_phrw * const extent); + +// +// DURABLE R/W DEVICE EXTENT -- ALLOCATED FROM DEVICE HEAP +// + +struct skc_extent_pdrw +{ + cl_mem drw; +}; + +void +skc_extent_pdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_pdrw * const extent, + size_t const size); + +void +skc_extent_pdrw_free(struct skc_runtime * const runtime, + struct skc_extent_pdrw * const extent); + +// +// EPHEMERAL DEVICE R/W EXTENT -- ALLOCATED QUICKLY FROM A MANAGED RING +// + +struct skc_extent_tdrw +{ + size_t size; + cl_mem drw; + skc_subbuf_id_t id; +}; + +void +skc_extent_tdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_tdrw * const extent, + size_t const size); + +void +skc_extent_tdrw_free(struct skc_runtime * const runtime, + struct skc_extent_tdrw * const extent); + +void +skc_extent_tdrw_zero(struct skc_extent_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +// +// DURABLE SMALL EXTENTS BACKING ATOMICS +// + +struct skc_extent_phr_pdrw +{ + size_t size; // must be multiple of words + void * hr; + cl_mem drw; +}; + +void +skc_extent_phr_pdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_phr_pdrw * const extent, + size_t const size); + +void +skc_extent_phr_pdrw_free(struct skc_runtime * const runtime, + struct skc_extent_phr_pdrw * const extent); + +void +skc_extent_phr_pdrw_read(struct skc_extent_phr_pdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_phr_pdrw_zero(struct skc_extent_phr_pdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +// +// EPHEMERAL SMALL EXTENTS BACKING ATOMICS +// + +struct skc_extent_thr_tdrw +{ + size_t size; // must be multiple of words + + void * hr; + cl_mem drw; + + struct { + skc_subbuf_id_t hr; + skc_subbuf_id_t drw; + } id; +}; + +void +skc_extent_thr_tdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_thr_tdrw * const extent, + size_t const size); + +void +skc_extent_thr_tdrw_free(struct skc_runtime * const runtime, + struct skc_extent_thr_tdrw * const extent); + +void +skc_extent_thr_tdrw_read(struct skc_extent_thr_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_thr_tdrw_zero(struct skc_extent_thr_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +// +// DURABLE W/1 HOST RING WITH AN EPHEMERAL R/N DEVICE SNAPSHOT +// + +struct skc_extent_phw1g_tdrNs +{ + void * hw1; +}; + +struct skc_extent_phw1g_tdrNs_snap +{ + struct skc_extent_ring_snap * snap; + cl_mem drN; + skc_subbuf_id_t id; +}; + +void +skc_extent_phw1g_tdrNs_alloc(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs * const extent, + size_t const size); + +void +skc_extent_phw1g_tdrNs_free(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs * const extent); + +void +skc_extent_phw1g_tdrNs_snap_init(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring, + struct skc_extent_phw1g_tdrNs_snap * const snap); + +void +skc_extent_phw1g_tdrNs_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs * const extent, + struct skc_extent_phw1g_tdrNs_snap * const snap, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_phw1g_tdrNs_snap_free(struct skc_runtime * const runtime, + struct skc_extent_phw1g_tdrNs_snap * const snap); + +// +// DURABLE R/W HOST RING WITH AN EPHEMERAL R/N DEVICE SNAPSHOT +// + +struct skc_extent_phrwg_tdrNs +{ + void * hrw; +}; + +struct skc_extent_phrwg_tdrNs_snap +{ + struct skc_extent_ring_snap * snap; + cl_mem drN; + skc_subbuf_id_t id; +}; + +void +skc_extent_phrwg_tdrNs_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs * const extent, + size_t const size); + +void +skc_extent_phrwg_tdrNs_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs * const extent); + +void +skc_extent_phrwg_tdrNs_snap_init(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring, + struct skc_extent_phrwg_tdrNs_snap * const snap); + +void +skc_extent_phrwg_tdrNs_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs * const extent, + struct skc_extent_phrwg_tdrNs_snap * const snap, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_phrwg_tdrNs_snap_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_tdrNs_snap * const snap); + +// +// DURABLE HOST R/W RING WITH AN EPHEMERAL HOST R/1 SNAPSHOT +// +// Note that because the ring and snapshot are both in host memory and +// the snapshot blocks progress until freed we can simply point the +// fake ephemeral snapshot at the ring's durable extent. +// + +struct skc_extent_phrwg_thr1s +{ + void * hrw; +}; + +struct skc_extent_phrwg_thr1s_snap +{ + struct skc_extent_ring_snap * snap; + + struct { + skc_uint lo; + skc_uint hi; + } count; + + struct { + void * lo; + void * hi; + } hr1; +}; + +void +skc_extent_phrwg_thr1s_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s * const extent, + size_t const size); + +void +skc_extent_phrwg_thr1s_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s * const extent); + +void +skc_extent_phrwg_thr1s_snap_init(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring, + struct skc_extent_phrwg_thr1s_snap * const snap); + +void +skc_extent_phrwg_thr1s_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s * const extent, + struct skc_extent_phrwg_thr1s_snap * const snap); + +void +skc_extent_phrwg_thr1s_snap_free(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s_snap * const snap); + +// +// EPHEMERAL MAPPING +// +// ENTIRE EXTENT MAPPED TO R/W HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO R/W DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +#if 0 +struct skc_extent_thrw_tdrw +{ + size_t size; + cl_mem drw; + skc_subbuf_id_t id; +}; + +void +skc_extent_thrw_tdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_thrw_tdrw * const extent, + size_t const size); + +void +skc_extent_thrw_tdrw_free(struct skc_runtime * const runtime, + struct skc_extent_thrw_tdrw * const extent); + +void * +skc_extent_thrw_tdrw_map_size(struct skc_extent_thrw_tdrw * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event); + +void * +skc_extent_thrw_tdrw_map(struct skc_extent_thrw_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_thrw_tdrw_unmap(struct skc_extent_thrw_tdrw * const extent, + void * const hrN, + cl_command_queue const cq, + cl_event * const event); +#endif + +// +// DURABLE MAPPING +// +// ENTIRE EXTENT MAPPED TO R/W HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO R/W DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +struct skc_extent_phrw_pdrw +{ + size_t size; + cl_mem drw; +}; + +void +skc_extent_phrw_pdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrw_pdrw * const extent, + size_t const size); + +void +skc_extent_phrw_pdrw_free(struct skc_runtime * const runtime, + struct skc_extent_phrw_pdrw * const extent); + +void * +skc_extent_phrw_pdrw_map_size(struct skc_extent_phrw_pdrw * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event); + +void * +skc_extent_phrw_pdrw_map(struct skc_extent_phrw_pdrw * const extent, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_phrw_pdrw_unmap(struct skc_extent_phrw_pdrw * const extent, + void * const hrN, + cl_command_queue const cq, + cl_event * const event); + +// +// DURABLE MAPPING +// +// ENTIRE EXTENT MAPPED TO R/O HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO W/O DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +struct skc_extent_phrN_pdwN +{ + size_t size; + cl_mem dwN; +}; + +void +skc_extent_phrN_pdwN_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrN_pdwN * const extent, + size_t const size); + +void +skc_extent_phrN_pdwN_free(struct skc_runtime * const runtime, + struct skc_extent_phrN_pdwN * const extent); + +void * +skc_extent_phrN_pdwN_map_size(struct skc_extent_phrN_pdwN * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event); + +void * +skc_extent_phrN_pdwN_map(struct skc_extent_phrN_pdwN * const extent, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_phrN_pdwN_unmap(struct skc_extent_phrN_pdwN * const extent, + void * const hrN, + cl_command_queue const cq, + cl_event * const event); + +// +// DURABLE MAPPING +// +// ENTIRE EXTENT MAPPED TO W/O HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO R/O DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +struct skc_extent_phwN_pdrN +{ + size_t size; + cl_mem drN; +}; + +void +skc_extent_phwN_pdrN_alloc(struct skc_runtime * const runtime, + struct skc_extent_phwN_pdrN * const extent, + size_t const size); + +void +skc_extent_phwN_pdrN_free(struct skc_runtime * const runtime, + struct skc_extent_phwN_pdrN * const extent); + +void * +skc_extent_phwN_pdrN_map_size(struct skc_extent_phwN_pdrN * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event); + +void * +skc_extent_phwN_pdrN_map(struct skc_extent_phwN_pdrN * const extent, + cl_command_queue const cq, + cl_event * const event); + +void +skc_extent_phwN_pdrN_unmap(struct skc_extent_phwN_pdrN * const extent, + void * const hwm, + cl_command_queue const cq, + cl_event * const event); + +// +// +// diff --git a/src/compute/skc/extent_cl_12_unified.c b/src/compute/skc/extent_cl_12_unified.c new file mode 100644 index 0000000000..69c669ad54 --- /dev/null +++ b/src/compute/skc/extent_cl_12_unified.c @@ -0,0 +1,281 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// NOTE THAT NONE OF THESE EXTENTS CHECK FOR ZERO-SIZED ALLOCATIONS. +// THAT'S OK FOR NOW. +// + +#include <stdlib.h> + +#include "runtime_cl_12.h" +#include "extent_cl_12.h" +#include "common/cl/assert_cl.h" + +// +// EPHEMERAL MAPPING +// +// ENTIRE EXTENT MAPPED TO R/W HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO R/W DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +#if 0 + +#pragma message("struct skc_extent_thrw_tdrw will be removed once the sorter is installed.") + +void +skc_extent_thrw_tdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_thrw_tdrw * const extent, + size_t const size) +{ + extent->drw = skc_runtime_device_temp_alloc(runtime, + CL_MEM_READ_WRITE /* | CL_MEM_ALLOC_HOST_PTR */, + size,&extent->id,&extent->size); +} + +void +skc_extent_thrw_tdrw_free(struct skc_runtime * const runtime, + struct skc_extent_thrw_tdrw * const extent) +{ + skc_runtime_device_temp_free(runtime,extent->drw,extent->id); +} + +void * +skc_extent_thrw_tdrw_map_size(struct skc_extent_thrw_tdrw * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event) +{ + cl_int cl_err; + + void * hrw = clEnqueueMapBuffer(cq,extent->drw, + CL_FALSE, + CL_MAP_READ | CL_MAP_WRITE,0,size, + 0,NULL,event,&cl_err); cl_ok(cl_err); + + return hrw; +} + +void * +skc_extent_thrw_tdrw_map(struct skc_extent_thrw_tdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + return skc_extent_thrw_tdrw_map_size(extent,extent->size,cq,event); +} + +void +skc_extent_thrw_tdrw_unmap(struct skc_extent_thrw_tdrw * const extent, + void * const hrw, + cl_command_queue const cq, + cl_event * const event) +{ + cl(EnqueueUnmapMemObject(cq,extent->drw,hrw,0,NULL,event)); +} + +#endif + +// +// DURABLE MAPPING +// +// ENTIRE EXTENT MAPPED TO R/W HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO R/W DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +void +skc_extent_phrw_pdrw_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrw_pdrw * const extent, + size_t const size) +{ + cl_int cl_err; + + extent->size = size; + extent->drw = clCreateBuffer(runtime->cl.context, + CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, + size,NULL,&cl_err); cl_ok(cl_err); +} + +void +skc_extent_phrw_pdrw_free(struct skc_runtime * const runtime, + struct skc_extent_phrw_pdrw * const extent) +{ + cl(ReleaseMemObject(extent->drw)); +} + +void * +skc_extent_phrw_pdrw_map_size(struct skc_extent_phrw_pdrw * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event) +{ + cl_int cl_err; + + void * hrw = clEnqueueMapBuffer(cq,extent->drw, + CL_FALSE, + CL_MAP_READ | CL_MAP_WRITE,0,size, + 0,NULL,event,&cl_err); cl_ok(cl_err); + + return hrw; +} + +void * +skc_extent_phrw_pdrw_map(struct skc_extent_phrw_pdrw * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + return skc_extent_phrw_pdrw_map_size(extent,extent->size,cq,event); +} + +void +skc_extent_phrw_pdrw_unmap(struct skc_extent_phrw_pdrw * const extent, + void * const hrw, + cl_command_queue const cq, + cl_event * const event) +{ + cl(EnqueueUnmapMemObject(cq,extent->drw,hrw,0,NULL,event)); +} + +// +// DURABLE MAPPING +// +// ENTIRE EXTENT MAPPED TO R/O HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO W/O DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +void +skc_extent_phrN_pdwN_alloc(struct skc_runtime * const runtime, + struct skc_extent_phrN_pdwN * const extent, + size_t const size) +{ + cl_int cl_err; + + extent->size = size; + extent->dwN = clCreateBuffer(runtime->cl.context, + CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, + size,NULL,&cl_err); cl_ok(cl_err); +} + +void +skc_extent_phrN_pdwN_free(struct skc_runtime * const runtime, + struct skc_extent_phrN_pdwN * const extent) +{ + cl(ReleaseMemObject(extent->dwN)); +} + +void * +skc_extent_phrN_pdwN_map_size(struct skc_extent_phrN_pdwN * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event) +{ + cl_int cl_err; + + void * hrN = clEnqueueMapBuffer(cq,extent->dwN, + CL_FALSE, + CL_MAP_READ,0,size, + 0,NULL,event,&cl_err); cl_ok(cl_err); + + return hrN; +} + +void * +skc_extent_phrN_pdwN_map(struct skc_extent_phrN_pdwN * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + return skc_extent_phrN_pdwN_map_size(extent,extent->size,cq,event); +} + +void +skc_extent_phrN_pdwN_unmap(struct skc_extent_phrN_pdwN * const extent, + void * const hrN, + cl_command_queue const cq, + cl_event * const event) +{ + cl(EnqueueUnmapMemObject(cq,extent->dwN,hrN,0,NULL,event)); +} + +// +// DURABLE MAPPING +// +// ENTIRE EXTENT MAPPED TO W/O HOST MEMORY +// ENTIRE EXTENT UNMAPPED TO R/O DEVICE MEMORY +// +// Note: integrated vs. discrete GPUs will have different +// implementations because we don't want a GPU kernel repeatedly +// accessing pinned memory. +// + +void +skc_extent_phwN_pdrN_alloc(struct skc_runtime * const runtime, + struct skc_extent_phwN_pdrN * const extent, + size_t const size) +{ + cl_int cl_err; + + extent->size = size; + extent->drN = clCreateBuffer(runtime->cl.context, + CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, + size,NULL,&cl_err); cl_ok(cl_err); +} + +void +skc_extent_phwN_pdrN_free(struct skc_runtime * const runtime, + struct skc_extent_phwN_pdrN * const extent) +{ + cl(ReleaseMemObject(extent->drN)); +} + +void * +skc_extent_phwN_pdrN_map_size(struct skc_extent_phwN_pdrN * const extent, + size_t const size, + cl_command_queue const cq, + cl_event * const event) +{ + cl_int cl_err; + + void * hwN = clEnqueueMapBuffer(cq,extent->drN, + CL_FALSE, + CL_MAP_WRITE,0,size, + 0,NULL,event,&cl_err); cl_ok(cl_err); + + return hwN; +} + +void * +skc_extent_phwN_pdrN_map(struct skc_extent_phwN_pdrN * const extent, + cl_command_queue const cq, + cl_event * const event) +{ + return skc_extent_phwN_pdrN_map_size(extent,extent->size,cq,event); +} + +void +skc_extent_phwN_pdrN_unmap(struct skc_extent_phwN_pdrN * const extent, + void * const hwN, + cl_command_queue const cq, + cl_event * const event) +{ + cl(EnqueueUnmapMemObject(cq,extent->drN,hwN,0,NULL,event)); +} + +// +// +// diff --git a/src/compute/skc/extent_ring.c b/src/compute/skc/extent_ring.c new file mode 100644 index 0000000000..ca489441ab --- /dev/null +++ b/src/compute/skc/extent_ring.c @@ -0,0 +1,205 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdbool.h> + +#include "extent_ring.h" +#include "macros.h" + +// +// +// + +void +skc_extent_ring_init(struct skc_extent_ring * const ring, + skc_uint const size_pow2, + skc_uint const size_snap, + skc_uint const size_elem) +{ + ring->head = NULL; + ring->last = NULL; + + ring->outer.rw = (skc_uint2){ 0 }; + ring->inner.rw = (skc_uint2){ 0 }; + + // FIXME -- assert size is pow2 -- either here or statically in the config + + ring->size.pow2 = size_pow2; + ring->size.mask = size_pow2 - 1; + ring->size.snap = size_snap; + ring->size.elem = size_elem; +} + +// +// +// + +skc_uint +skc_extent_ring_rem(struct skc_extent_ring const * const ring) +{ + return ring->size.pow2 - (ring->outer.writes - ring->outer.reads); +} + +skc_bool +skc_extent_ring_is_full(struct skc_extent_ring const * const ring) +{ + return (ring->outer.writes - ring->outer.reads) == ring->size.pow2; +} + +skc_uint +skc_extent_ring_wip_count(struct skc_extent_ring const * const ring) +{ + return ring->outer.writes - ring->inner.reads; +} + +skc_uint +skc_extent_ring_wip_rem(struct skc_extent_ring const * const ring) +{ + return SKC_MIN_MACRO(skc_extent_ring_rem(ring),ring->size.snap) - skc_extent_ring_wip_count(ring); +} + +skc_bool +skc_extent_ring_wip_is_full(struct skc_extent_ring const * const ring) +{ + return skc_extent_ring_wip_count(ring) == SKC_MIN_MACRO(skc_extent_ring_rem(ring),ring->size.snap); +} + +skc_uint +skc_extent_ring_wip_index_inc(struct skc_extent_ring * const ring) +{ + return ring->outer.writes++ & ring->size.mask; +} + +// +// +// + +void +skc_extent_ring_checkpoint(struct skc_extent_ring * const ring) +{ + ring->inner.writes = ring->outer.writes; +} + +// +// +// + +struct skc_extent_ring_snap * +skc_extent_ring_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring) +{ + skc_subbuf_id_t id; + + struct skc_extent_ring_snap * snap = + skc_runtime_host_temp_alloc(runtime, + SKC_MEM_FLAGS_READ_WRITE, + sizeof(*snap),&id,NULL); + // save the id + snap->id = id; + + // back point to parent + snap->ring = ring; + snap->next = NULL; + + // save the inner boundaries of the ring to the snapshot + snap->reads = ring->inner.reads; + snap->writes = ring->inner.reads = ring->inner.writes; + + // mark not free + snap->is_free = false; + + // attach snap to ring + if (ring->head == NULL) + { + ring->head = snap; + ring->last = snap; + } + else + { + ring->last->next = snap; + ring->last = snap; + } + + return snap; +} + +// +// +// + +void +skc_extent_ring_snap_free(struct skc_runtime * const runtime, + struct skc_extent_ring_snap * const snap) +{ + // snap will be lazily freed + snap->is_free = true; + + // + // if this snapshot is no longer referenced then try to dispose of + // the ring buffer's leading unreferenced snapshots + // + struct skc_extent_ring * const ring = snap->ring; + struct skc_extent_ring_snap * curr = ring->head; + + if (!curr->is_free) + return; + + do { + // increment read counter + ring->outer.reads = curr->writes; + + struct skc_extent_ring_snap * const next = curr->next; + + skc_runtime_host_temp_free(runtime,curr,curr->id); + + curr = next; + + // this was the last snap... + if (curr == NULL) + { + ring->last = NULL; + break; + } + + // is the next free? + } while (curr->is_free); + + // update head + ring->head = curr; +} + +// +// +// + +skc_uint +skc_extent_ring_snap_count(struct skc_extent_ring_snap const * const snap) +{ + return snap->writes - snap->reads; +} + +skc_uint +skc_extent_ring_snap_from(struct skc_extent_ring_snap const * const snap) +{ + return snap->reads & snap->ring->size.mask; +} + +skc_uint +skc_extent_ring_snap_to(struct skc_extent_ring_snap const * const snap) +{ + return snap->writes & snap->ring->size.mask; +} + +// +// +// + diff --git a/src/compute/skc/extent_ring.h b/src/compute/skc/extent_ring.h new file mode 100644 index 0000000000..8bb468366b --- /dev/null +++ b/src/compute/skc/extent_ring.h @@ -0,0 +1,148 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "types.h" +#include "runtime.h" + +// +// The "ring" is a specialized extent designed to accumulate complete +// sequences of commands that are constructed by the host and executed +// on the device. +// +// Note that a sequence of commands is considered to be "complete" +// once a checkpoint has been invoked. +// +// Construction of paths and rasters depends on the checkpointing +// feature. +// +// Note that the ring no longer attempts to account for outstanding +// refcounts on the ring and its snaps. Waiting for snaps to complete +// is a responsibility best handled elsewhere and up the stack. +// + +struct skc_extent_ring +{ + struct skc_extent_ring_snap * head; + struct skc_extent_ring_snap * last; + + union { + skc_uint2 rw; + struct { + skc_uint reads; // number of reads + skc_uint writes; // number of writes + }; + } outer; + + union { + skc_uint2 rw; + struct { + skc_uint reads; // number of reads + skc_uint writes; // number of writes + }; + } inner; + + struct { + skc_uint pow2; // ring size must be pow2 + skc_uint mask; // modulo is a mask because size is pow2 + skc_uint snap; // max elements in a snapshot (not req'd to be pow2) + skc_uint elem; // size of element in bytes + } size; +}; + +// +// +// + +void +skc_extent_ring_init(struct skc_extent_ring * const ring, + skc_uint const size_pow2, + skc_uint const size_snap, + skc_uint const size_elem); + +// +// +// + +skc_bool +skc_extent_ring_rem(struct skc_extent_ring const * const ring); + +skc_bool +skc_extent_ring_is_full(struct skc_extent_ring const * const ring); + +skc_uint +skc_extent_ring_wip_count(struct skc_extent_ring const * const ring); + +skc_uint +skc_extent_ring_wip_rem(struct skc_extent_ring const * const ring); + +skc_bool +skc_extent_ring_wip_is_full(struct skc_extent_ring const * const ring); + +skc_uint +skc_extent_ring_wip_index_inc(struct skc_extent_ring * const ring); + +// +// +// + +void +skc_extent_ring_checkpoint(struct skc_extent_ring * const ring); + +// +// +// + +struct skc_extent_ring_snap +{ + struct skc_extent_ring * ring; // parent ring + struct skc_extent_ring_snap * next; // next snap + + skc_uint reads; // number of reads + skc_uint writes; // number of writes + + skc_bool is_free; + + skc_subbuf_id_t id; // id of host temp suballocation +}; + +// +// For now, all ring snaps allocations occur in "host temporary" +// memory. +// + +struct skc_extent_ring_snap * +skc_extent_ring_snap_alloc(struct skc_runtime * const runtime, + struct skc_extent_ring * const ring); + +void +skc_extent_ring_snap_free(struct skc_runtime * const runtime, + struct skc_extent_ring_snap * const snap); + +// +// +// + +skc_uint +skc_extent_ring_snap_count(struct skc_extent_ring_snap const * const snap); + +skc_uint +skc_extent_ring_snap_from(struct skc_extent_ring_snap const * const snap); + +skc_uint +skc_extent_ring_snap_to(struct skc_extent_ring_snap const * const snap); + +// +// +// + diff --git a/src/compute/skc/fills_expand.cl b/src/compute/skc/fills_expand.cl new file mode 100644 index 0000000000..b6f56794c5 --- /dev/null +++ b/src/compute/skc/fills_expand.cl @@ -0,0 +1,309 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "raster_builder_cl_12.h" +#include "atomic_cl.h" +#include "block.h" +#include "path.h" +#include "common.h" + +// +// +// + +#define SKC_FILLS_EXPAND_SUBGROUP_SIZE_MASK (SKC_FILLS_EXPAND_SUBGROUP_SIZE - 1) + +#define SKC_FILLS_EXPAND_ELEMS_PER_BLOCK (SKC_DEVICE_BLOCK_WORDS / SKC_FILLS_EXPAND_ELEM_WORDS) +#define SKC_FILLS_EXPAND_ELEMS_PER_SUBBLOCK (SKC_DEVICE_SUBBLOCK_WORDS / SKC_FILLS_EXPAND_ELEM_WORDS) + +#define SKC_FILLS_EXPAND_ELEMS_PER_THREAD (SKC_FILLS_EXPAND_ELEMS_PER_BLOCK / SKC_FILLS_EXPAND_SUBGROUP_SIZE) + +// +// +// + +#define SKC_FILLS_EXPAND_X (SKC_DEVICE_BLOCK_WORDS / SKC_FILLS_EXPAND_SUBGROUP_SIZE) + +// +// +// + +#if ( SKC_FILLS_EXPAND_X == 1 ) +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND() SKC_EXPAND_1() +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST 0 + +#elif ( SKC_FILLS_EXPAND_X == 2 ) +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND() SKC_EXPAND_2() +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST 1 + +#elif ( SKC_FILLS_EXPAND_X == 4 ) +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND() SKC_EXPAND_4() +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST 3 + +#elif ( SKC_FILLS_EXPAND_X == 8 ) +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND() SKC_EXPAND_8() +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST 7 + +#elif ( SKC_FILLS_EXPAND_X == 16) +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND() SKC_EXPAND_16() +#define SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST 15 + +#else +#error "MISSING SKC_FILLS_EXPAND_X" +#endif + +// +// Fill and rasterize cmds only differ in their first word semantics +// + +union skc_cmd_expand +{ + union skc_cmd_fill fill; + union skc_cmd_rasterize rasterize; +}; + +// +// +// + +union skc_path_elem +{ + skc_uint u32; + skc_float f32; +}; + +// +// COMPILE-TIME AND RUN-TIME MACROS +// + +#define SKC_ELEM_IN_RANGE(X,I) \ + (skc_bool)SKC_GTE_MACRO(X,(I ) * SKC_FILLS_EXPAND_SUBGROUP_SIZE) && \ + (skc_bool)SKC_LT_MACRO(X,(I+1) * SKC_FILLS_EXPAND_SUBGROUP_SIZE) + +#define SKC_ELEM_GTE(X,I) \ + SKC_GTE_MACRO(X,(I+1) * SKC_FILLS_EXPAND_SUBGROUP_SIZE) + +// +// FIXME -- slate these for replacement +// + +#define SKC_BROADCAST(E,S,I) \ + sub_group_broadcast(E##I.u32,S - I * SKC_FILLS_EXPAND_SUBGROUP_SIZE) + +#define SKC_BROADCAST_LAST_HELPER(E,I) \ + sub_group_broadcast(E##I.u32,SKC_FILLS_EXPAND_SUBGROUP_SIZE - 1) + +#define SKC_BROADCAST_LAST(E,I) \ + SKC_BROADCAST_LAST_HELPER(E,I) + +// +// +// + +void +skc_cmds_out_append(__global union skc_cmd_rasterize * const cmds_out, + skc_uint * const out_idx, + union skc_cmd_expand * const cmd, + union skc_path_elem const e, + skc_uint const e_idx) +{ + // + // FIXME -- we can append a large number of nodeword indices to a + // local SMEM queue and flush when full. It may or may not be a + // performance win on some architectures. + // + skc_bool const is_elem = SKC_TAGGED_BLOCK_ID_GET_TAG(e.u32) < SKC_BLOCK_ID_TAG_PATH_NEXT; + skc_uint const offset = sub_group_scan_inclusive_add(is_elem ? 1 : 0); + + cmd->rasterize.nodeword = e_idx; + + if (is_elem) { + cmds_out[*out_idx + offset] = cmd->rasterize; + } + + *out_idx += sub_group_broadcast(offset,SKC_FILLS_EXPAND_SUBGROUP_SIZE-1); +} + +// +// +// + +__kernel +SKC_FILLS_EXPAND_KERNEL_ATTRIBS +void +skc_kernel_fills_expand(__global union skc_path_elem const * const blocks, + __global skc_uint volatile * const atomics, + __global skc_block_id_t const * const map, + __global union skc_cmd_fill const * const cmds_in, + __global union skc_cmd_rasterize * const cmds_out) +{ + // + // Need to harmonize the way we determine a subgroup's id. In this + // kernel it's not as important because no local memory is being + // used. Although the device/mask calc to determine subgroup and + // lanes is still proper, we might want to make it clearer that + // we're working with subgroups by using the subgroup API. + // + // every subgroup/simd that will work on the block loads the same command + // +#if (__OPENCL_VERSION__ < 200) + skc_uint const cmd_stride = get_num_sub_groups(); +#else + skc_uint const cmd_stride = get_enqueued_num_sub_groups(); // 2.0 supports non-uniform workgroups +#endif + skc_uint cmd_idx = get_group_id(0) * cmd_stride + get_sub_group_id(); + + // load fill command -- we reuse y component + union skc_cmd_expand cmd = { .fill = cmds_in[cmd_idx] }; + + // get the path header block from the map + skc_block_id_t id = map[cmd.fill.path]; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("expand[%u] = %u\n",cmd_idx,id); +#endif + + // + // blindly load all of the head elements into registers + // + skc_uint head_idx = id * SKC_FILLS_EXPAND_ELEMS_PER_SUBBLOCK + get_sub_group_local_id(); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + union skc_path_elem h##I = blocks[head_idx + I * SKC_FILLS_EXPAND_SUBGROUP_SIZE]; + + SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND(); + + // + // pick out count.nodes and count.prims from the header + // + skc_uint count_nodes, count_prims; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (SKC_ELEM_IN_RANGE(SKC_PATH_HEAD_OFFSET_NODES,I)) { \ + count_nodes = SKC_BROADCAST(h,SKC_PATH_HEAD_OFFSET_NODES,I); \ + } \ + if (SKC_ELEM_IN_RANGE(SKC_PATH_HEAD_OFFSET_PRIMS,I)) { \ + count_prims = SKC_BROADCAST(h,SKC_PATH_HEAD_OFFSET_PRIMS,I); \ + } + + SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND(); + + // + // debug of path head + // +#if 0 + skc_uint count_blocks; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (SKC_ELEM_IN_RANGE(SKC_PATH_HEAD_OFFSET_BLOCKS,I)) { \ + count_blocks = SKC_BROADCAST(h,SKC_PATH_HEAD_OFFSET_BLOCKS,I); \ + } + + SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND(); + + if (get_sub_group_local_id() == 0) + printf("path header = { %5u, %5u, %5u }\n", + count_blocks,count_nodes,count_prims); +#endif + + // + // acquire slots in the expanded cmd extent + // + // decrement prim_idx by 1 so we can use inclusive warp scan later + // + skc_uint out_idx = 0; + + if (get_sub_group_local_id() == 0) { + out_idx = SKC_ATOMIC_ADD_GLOBAL_RELAXED_SUBGROUP + (atomics+SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS,count_prims) - 1; + } + + out_idx = sub_group_broadcast(out_idx,0); + + // + // process ids trailing the path header + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_ELEM_GTE(SKC_PATH_HEAD_OFFSET_IDS,I)) { \ + if (SKC_ELEM_IN_RANGE(SKC_PATH_HEAD_OFFSET_IDS,I)) { \ + if (get_sub_group_local_id() + I * SKC_FILLS_EXPAND_SUBGROUP_SIZE < SKC_PATH_HEAD_OFFSET_IDS) { \ + h##I.u32 = SKC_TAGGED_BLOCK_ID_INVALID; \ + } \ + } \ + skc_cmds_out_append(cmds_out,&out_idx,&cmd,h##I, \ + head_idx + I * SKC_FILLS_EXPAND_SUBGROUP_SIZE); \ + } + + SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND(); + + // + // we're done if it was just the header + // + if (count_nodes == 0) + return; + + // + // otherwise, process the nodes + // + + // + // get id of next node + // + id = SKC_TAGGED_BLOCK_ID_GET_ID(SKC_BROADCAST_LAST(h,SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST)); + + // + // the following blocks are nodes + // + while (true) + { + // get index of each element + skc_uint node_idx = id * SKC_FILLS_EXPAND_ELEMS_PER_SUBBLOCK + get_sub_group_local_id(); + + // + // blindly load all of the node elements into registers + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + union skc_path_elem const n##I = blocks[node_idx + I * SKC_FILLS_EXPAND_SUBGROUP_SIZE]; + + SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND(); + + // + // append all valid ids + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + skc_cmds_out_append(cmds_out,&out_idx,&cmd,n##I, \ + node_idx + I * SKC_FILLS_EXPAND_SUBGROUP_SIZE); + + SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND(); + + // any more nodes? + if (--count_nodes == 0) + return; + + // + // get id of next node + // + id = SKC_TAGGED_BLOCK_ID_GET_ID(SKC_BROADCAST_LAST(n,SKC_FILLS_EXPAND_PATH_BLOCK_EXPAND_I_LAST)); + } +} + +// +// +// diff --git a/src/compute/skc/grid.c b/src/compute/skc/grid.c new file mode 100644 index 0000000000..934fa9f8bf --- /dev/null +++ b/src/compute/skc/grid.c @@ -0,0 +1,763 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <string.h> +#include <assert.h> +#include <stdbool.h> + +#include "grid.h" +#include "macros.h" +#include "runtime_cl_12.h" + +// +// SKC grid dependencies can be represented with a DAG. +// +// This dependency graph may be modified to include some sort of block +// pool barrier to make block recovery explicit (and guaranteed safe). +// +// +// PATH BUILDER +// | +// | +// | +// v +// RASTER BUILDER +// | +// +----+ | +----+ +// Set Ops | | | | | Set Ops +// | v v v | +// +--COMPOSITION STYLING--+ +// | | +// | +--------+ +// | | +// v v +// SURFACE +// +// +// STAGE DEPENDENCIES +// ============== ============================ +// PATH BUILDER - +// RASTER BUILDER PATH BUILDER +// COMPOSITION RASTER BUILDER, *COMPOSITION +// STYLING -, *STYLING +// SURFACE COMPOSITION, STYLING +// + +// +// How many active grids can/should we have? +// +// FIXME -- we'll need to provide a small level of indirection if we +// want to support a much larger number of work-in-progress grids +// +// For now and for simplicity, unify all grid ids in one set. +// + +typedef skc_uchar skc_grid_id_t; // 256 values +#define SKC_GRID_ID_INVALID SKC_UCHAR_MAX // 255 + +#define SKC_GRID_SIZE_WORDS 8 // 256 bits +#define SKC_GRID_SIZE_IDS ((32 * SKC_GRID_SIZE_WORDS) - 1) // 255 ids + +// +// +// + +typedef enum skc_grid_state_e { + + SKC_GRID_STATE_READY, + SKC_GRID_STATE_WAITING, + SKC_GRID_STATE_FORCED, + SKC_GRID_STATE_EXECUTING, + SKC_GRID_STATE_COMPLETE, + SKC_GRID_STATE_DETACHED, + + SKC_GRID_STATE_COUNT + +} skc_grid_state_e; + +// +// +// + +struct skc_grid_pfn_name +{ + skc_grid_pfn pfn; + char const * name; +}; + +// +// +// + +struct skc_grid +{ + skc_grid_state_e state; + skc_uint id; + + struct skc_grid_deps * deps; // backpointer to deps + void * * addr; // pointer to invalidate + + void * data; + + struct skc_grid_pfn_name waiting; // optional - if defined, typically used to yank the grid away from host + struct skc_grid_pfn_name execute; // optional - starts execution of waiting grid + struct skc_grid_pfn_name dispose; // optional - invoked when grid is complete + + struct { + skc_uint words[SKC_GRID_SIZE_WORDS]; // 0:inactive, 1:active + skc_uint count; + } before; + + struct { + skc_uint words[SKC_GRID_SIZE_WORDS]; // 0:inactive, 1:active + skc_uint count; + } after; +}; + +// +// +// + +struct skc_grid_deps +{ + struct skc_runtime * runtime; + struct skc_scheduler * scheduler; + + skc_grid_id_t * handle_map; + + struct skc_grid grids [SKC_GRID_SIZE_IDS]; // deps + pfns + data + skc_uint active[SKC_GRID_SIZE_WORDS]; // 1:inactive, 0:active + + skc_uint count; // number of active ids +}; + +// +// +// + +static +void +skc_grid_call(skc_grid_t const grid, struct skc_grid_pfn_name const * const pn) +{ + if (pn->pfn != NULL) { + pn->pfn(grid); + } +} + +static +void +skc_grid_schedule(skc_grid_t const grid, struct skc_grid_pfn_name const * const pn) +{ + if (pn->pfn != NULL) { + skc_scheduler_schedule(grid->deps->scheduler,pn->pfn,grid,pn->name); + } +} + +// +// +// + +static +void +skc_grid_invalidate(skc_grid_t const grid) +{ + if (grid->addr != NULL) { + *grid->addr = NULL; + } +} + +// +// +// + +#if 0 +skc_grid_t +skc_grid_move(skc_grid_t const grid, + skc_grid_state_e * const state, + skc_grid_t * const addr, + void * const data) +{ + skc_grid_invalidate(grid); + + grid->state = state; + grid->addr = addr; + grid->data = data; + + return grid; +} +#endif + +void * +skc_grid_get_data(skc_grid_t const grid) +{ + return grid->data; +} + +void +skc_grid_set_data(skc_grid_t const grid, void * const data) +{ + grid->data = data; +} + +// +// +// + +skc_grid_deps_t +skc_grid_deps_create(struct skc_runtime * const runtime, + struct skc_scheduler * const scheduler, + skc_uint const handle_pool_size) +{ + struct skc_grid_deps * const deps = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*deps)); + + // save runtime + deps->runtime = runtime; + deps->scheduler = scheduler; + + size_t const handle_map_size = sizeof(*deps->handle_map) * handle_pool_size; + + // allocate handle map + deps->handle_map = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,handle_map_size); + + // initialize handle map + memset(deps->handle_map,0xFF,handle_map_size); + + // grids + struct skc_grid * const grids = deps->grids; + +#if 0 // DELETE ME LATER + // initalize ids once -- could always infer id using offsetof() + for (skc_uint id=0; id < SKC_GRID_SIZE_IDS; id++) + grids[id].id = id; +#endif + + // mark all grids inactive except for last bit -- 1:inactive / 0:active + for (skc_uint ii=0; ii < SKC_GRID_SIZE_WORDS-1; ii++) + deps->active[ii] = 0xFFFFFFFF; + + // last bit is marked active so that it is never allocated + deps->active[SKC_GRID_SIZE_WORDS-1] = 0x7FFFFFFF; + + // nothing active + deps->count = 1; + + return deps; +} + +void +skc_grid_deps_dispose(skc_grid_deps_t const deps) +{ + // + // FIXME -- debug checks for active grids + // + skc_runtime_host_perm_free(deps->runtime,deps->handle_map); + skc_runtime_host_perm_free(deps->runtime,deps); +} + +// +// +// + +#ifndef NDEBUG + +void +skc_grid_deps_debug(struct skc_grid_deps const * const deps) +{ + fprintf(stderr, + "00000000000000001111111111111111\n" + "0123456789ABCDEF0123456789ABCDEF\n" + "--------------------------------\n"); + + for (skc_uint ii=0; ii<SKC_GRID_SIZE_WORDS; ii++) + { + skc_uint const a = deps->active[ii]; + fprintf(stderr, + "%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u" + "%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u%1u\n", + (a>>0x00)&1,(a>>0x01)&1,(a>>0x02)&1,(a>>0x03)&1, + (a>>0x04)&1,(a>>0x05)&1,(a>>0x06)&1,(a>>0x07)&1, + (a>>0x08)&1,(a>>0x09)&1,(a>>0x0A)&1,(a>>0x0B)&1, + (a>>0x0C)&1,(a>>0x0D)&1,(a>>0x0E)&1,(a>>0x0F)&1, + (a>>0x10)&1,(a>>0x11)&1,(a>>0x12)&1,(a>>0x13)&1, + (a>>0x14)&1,(a>>0x15)&1,(a>>0x16)&1,(a>>0x17)&1, + (a>>0x18)&1,(a>>0x19)&1,(a>>0x1A)&1,(a>>0x1B)&1, + (a>>0x1C)&1,(a>>0x1D)&1,(a>>0x1E)&1,(a>>0x1F)&1); + } + + fprintf(stderr,"\n"); +} + +#endif + +// +// +// + +skc_grid_t +skc_grid_deps_attach(skc_grid_deps_t const deps, + skc_grid_t * const addr, + void * const data, + skc_grid_pfn waiting_pfn, // upon READY > WAITING + skc_grid_pfn execute_pfn, // upon READY/WAITING > EXECUTING + skc_grid_pfn dispose_pfn, // upon EXECUTING > COMPLETE + char const * const waiting_name, + char const * const execute_name, + char const * const dispose_name) +{ + // FIXME -- no more ids -- either fatal or flush & wait for grids to be released + assert(deps->count < SKC_GRID_SIZE_IDS); + + // otherwise, an id exists so decrement count + deps->count += 1; + + // find first set bit (1:inactive) + skc_uint * active = deps->active; + skc_uint first = 0; + + while (1) + { + skc_uint const idx = SKC_LZCNT_32(*active); + + first += idx; + + if (idx < 32) + { + // make inactive bit active: 1 -> 0 + *active &= ~(0x80000000 >> idx); // 0:active + break; + } + + // otherwise, inspect next word for inactive bit + active += 1; + } + + struct skc_grid * const grid = deps->grids + first; + + // save grid pointer + if (addr != NULL) + *addr = grid; + + // initialize elem + *grid = (struct skc_grid){ + .state = SKC_GRID_STATE_READY, + .id = first, + .deps = deps, + .addr = addr, + .data = data, + .waiting = { .pfn = waiting_pfn, .name = waiting_name }, + .execute = { .pfn = execute_pfn, .name = execute_name }, + .dispose = { .pfn = dispose_pfn, .name = dispose_name }, + .before = { { 0 }, 0 }, + .after = { { 0 }, 0 } + }; + + return grid; +} + +// +// +// + +static +skc_bool +skc_grid_words_set(skc_uint ids[SKC_GRID_SIZE_WORDS], skc_uint const id) +{ + skc_uint * const ptr = ids + (id/32); + skc_uint const pre = *ptr; + skc_uint const post = pre | (0x80000000 >> (id & 0x1F)); // set + + *ptr = post; + + return pre != post; +} + +static +skc_bool +skc_grid_words_clear(skc_uint ids[SKC_GRID_SIZE_WORDS], skc_uint const id) +{ + skc_uint * const ptr = ids + (id/32); + skc_uint const pre = *ptr; + skc_uint const post = pre & ~(0x80000000 >> (id & 0x1F)); // clear + + *ptr = post; + + return pre != post; +} + +// +// we may want to allow the host to detach a grid +// + +static +void +skc_grid_detach(skc_grid_t const grid) +{ + // for now make sure grid is complete + // assert(*grid->state >= SKC_GRID_STATE_COMPLETE); + + // transition state + grid->state = SKC_GRID_STATE_DETACHED; + + // + // FIXME -- save profiling info + // + + if (skc_grid_words_set(grid->deps->active,grid->id)) // 1:inactive + grid->deps->count -= 1; +} + +// +// +// + +void +skc_grid_map(skc_grid_t const grid, skc_handle_t const handle) +{ + grid->deps->handle_map[handle] = grid->id; +} + +// +// +// + +void +skc_grid_deps_force(skc_grid_deps_t const deps, + skc_handle_t const * const handles, + skc_uint const count) +{ + // + // FIXME -- test to make sure handles aren't completely out of range integers + // + skc_grid_id_t * const handle_map = deps->handle_map; + + for (skc_uint ii=0; ii<count; ii++) + { + skc_grid_id_t grid_id = handle_map[SKC_TYPED_HANDLE_TO_HANDLE(handles[ii])]; + + if (grid_id != SKC_GRID_ID_INVALID) + { + skc_grid_t const grid = deps->grids + grid_id; + + skc_grid_force(grid); + + while (grid->state >= SKC_GRID_STATE_COMPLETE) + skc_scheduler_wait_one(deps->scheduler); + } + } +} + +void +skc_grid_deps_unmap(skc_grid_deps_t const deps, + skc_handle_t const * const handles, + skc_uint const count) +{ + skc_grid_id_t * const handle_map = deps->handle_map; + + for (skc_uint ii=0; ii<count; ii++) + handle_map[handles[ii]] = SKC_GRID_ID_INVALID; +} + +// +// NOTE: We want this routine to be very very fast. The array of bit +// flags is probably as fast as we can go for a modest number of +// grids. +// +// NOTE: The before grid should never be NULL. This means the grid's +// lifecycle should match the lifetime of the object it represents. +// This also means the grid "invalidation upon start" feature should +// be well understood before using it to clear the skc_grid_t. +// + +void +skc_grid_happens_after_grid(skc_grid_t const after, + skc_grid_t const before) +{ + assert(after->state == SKC_GRID_STATE_READY); + + if (before->state >= SKC_GRID_STATE_COMPLETE) + return; + + if (skc_grid_words_set(after->before.words,before->id)) + after->before.count += 1; + + if (skc_grid_words_set(before->after.words,after->id)) + before->after.count += 1; +} + +void +skc_grid_happens_after_handle(skc_grid_t const after, skc_handle_t const before) +{ + assert(after->state == SKC_GRID_STATE_READY); + + skc_uint const id_before = after->deps->handle_map[before]; + + if (id_before == SKC_GRID_ID_INVALID) + return; + + if (skc_grid_words_set(after->before.words,id_before)) + after->before.count += 1; + + skc_grid_t const grid_before = after->deps->grids + id_before; + + if (skc_grid_words_set(grid_before->after.words,after->id)) + grid_before->after.count += 1; +} + +// +// Remove dependency from grid +// + +static +void +skc_grid_clear_dependency(skc_grid_t const after, skc_uint const before) +{ + skc_bool const is_change = skc_grid_words_clear(after->before.words,before); + + assert(is_change); // for now let's make sure this is a rising edge + + after->before.count -= 1; + + if ((after->before.count == 0) && ((after->state == SKC_GRID_STATE_WAITING) || + (after->state == SKC_GRID_STATE_FORCED))) + { + // schedule grid for execution + after->state = SKC_GRID_STATE_EXECUTING; + skc_grid_schedule(after,&after->execute); + } +} + +// +// Start the ready grid and wait for dependencies to complete +// + +void +skc_grid_start(skc_grid_t const grid) +{ + // nothing to do if this grid isn't in a ready state + if (grid->state != SKC_GRID_STATE_READY) + return; + + // record transition through waiting state + grid->state = SKC_GRID_STATE_WAITING; + + // the waiting pfn may be null -- e.g. the path builder + // skc_grid_schedule(grid,&grid->waiting); + skc_grid_call(grid,&grid->waiting); + + // clear the reference + skc_grid_invalidate(grid); + + // execute if there are no dependencies + if (grid->before.count == 0) + { + // tell grid it can execute + grid->state = SKC_GRID_STATE_EXECUTING; + skc_grid_schedule(grid,&grid->execute); + } +} + +// +// Start this grid and all its ready dependencies +// + +void +skc_grid_force(skc_grid_t const grid) +{ + // return if this grid was forced, executing or complete + if (grid->state >= SKC_GRID_STATE_FORCED) + return; + + // if ready then move to waiting state + if (grid->state == SKC_GRID_STATE_READY) + { + // tell grid to wait for execution + grid->state = SKC_GRID_STATE_WAITING; + + // the waiting pfn may be null -- e.g. the path builder + // skc_grid_schedule(grid,&grid->waiting); + skc_grid_call(grid,&grid->waiting); + + // clear the reference + skc_grid_invalidate(grid); + } + + skc_uint before_count = grid->before.count; + + // if there are no grid dependencies then execute + if (before_count == 0) + { + // tell grid it can execute + grid->state = SKC_GRID_STATE_EXECUTING; + skc_grid_schedule(grid,&grid->execute); + } + else // otherwise, start or make waiting all dependencies + { + grid->state = SKC_GRID_STATE_FORCED; + + struct skc_grid * before = grid->deps->grids; + skc_uint * before_words = grid->before.words; + skc_uint active = *before_words++; + + while (true) + { + // find first active + skc_uint const idx = SKC_LZCNT_32(active); + + // no bits set so inspect next word + if (idx == 32) + { + active = *before_words++; + before += 1; + continue; + } + else // clear active + { + active &= ~(0x80000000 >> idx); + before_count -= 1; + } + + // otherwise, force this elem with dependent + skc_grid_force(before+idx); + + // no more bits? + if (before_count == 0) + break; + } + } +} + +// +// Notify grids dependent on this grid that this grid is complete +// + +void +skc_grid_complete(skc_grid_t const grid) +{ + // debug: grid was executing + assert(grid->state == SKC_GRID_STATE_EXECUTING); + + // move grid to completion and dispose after notifying dependents + grid->state = SKC_GRID_STATE_COMPLETE; + + skc_uint after_count = grid->after.count; + + if (after_count > 0) + { + // find set bits + struct skc_grid * after = grid->deps->grids; + skc_uint * after_words = grid->after.words; + skc_uint active = *after_words++; + + while (true) + { + // find first active + skc_uint const idx = SKC_LZCNT_32(active); + + // no bits set so inspect next word + if (idx == 32) + { + active = *after_words++; + after += 1; + continue; + } + else // clear active + { + active &= ~(0x80000000 >> idx); + after_count -= 1; + } + + // otherwise, clear this dependency + skc_grid_clear_dependency(after+idx,grid->id); + + // no more bits? + if (after_count == 0) + break; + } + } + + // dispose of resources + skc_grid_call(grid,&grid->dispose); + + // we don't need to hang on to this grid id any longer + skc_grid_detach(grid); +} + +/////////////////////////////////////////////////////////////////////////// +// +// ALTERNATIVE IMPLEMENTATION WOULD SUPPORT A VARIABLE NUMBER OF +// ACTIVE GRIDS PER STAGE PRESUMABLY RESULTING IN SLIGHTLY LESS MEMORY +// USAGE. +// +// THE #1 OBJECTIVE OF THE GRID IMPLEMENTATION IS TO ENSURE THAT THE +// "HAPPENS-BEFORE" DECLARATION REMAINS ***FAST*** SINCE IT WILL BE +// CALLED FREQUENTLY. THUS THE |GRIDS|^2 BIT ARRAY... +// +// WE DON'T NEED THIS RIGHT NOW... +// + +#if 0 + +// +// For now, make them all the same size +// + +#define SKC_GRID_STAGE_WORDS_PATH_BUILDER SKC_GRID_MASK_WORDS +#define SKC_GRID_STAGE_WORDS_RASTER_BUILDER SKC_GRID_MASK_WORDS +#define SKC_GRID_STAGE_WORDS_COMPOSITION SKC_GRID_MASK_WORDS +#define SKC_GRID_STAGE_WORDS_STYLING SKC_GRID_MASK_WORDS +#define SKC_GRID_STAGE_WORDS_SURFACE_COMPOSITION SKC_GRID_MASK_WORDS +#define SKC_GRID_STAGE_WORDS_SURFACE_STYLING SKC_GRID_MASK_WORDS + +// +// +// + +typedef enum skc_grid_stage_type { + + SKC_GRID_STAGE_TYPE_PATH_BUILDER, + SKC_GRID_STAGE_TYPE_RASTER_BUILDER, + SKC_GRID_STAGE_TYPE_COMPOSITION, + SKC_GRID_STAGE_TYPE_STYLING, + SKC_GRID_STAGE_TYPE_SURFACE_COMPOSITION, + SKC_GRID_STAGE_TYPE_SURFACE_STYLING, + + SKC_GRID_STAGE_TYPE_COUNT + +} skc_grid_stage_type; + +// +// +// + +union skc_grid_id +{ + skc_grid_id_t u32; + + struct { + skc_ushort index; + skc_ushort stage; + }; +} + +SKC_STATIC_ASSERT(sizeof(union skc_grid_id) == sizeof(skc_uint)); + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/grid.h b/src/compute/skc/grid.h new file mode 100644 index 0000000000..006625efd1 --- /dev/null +++ b/src/compute/skc/grid.h @@ -0,0 +1,167 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "handle.h" +#include "scheduler.h" + +// +// The requirement is that every grid struct begin with an skc_grid_t +// + +typedef struct skc_grid * skc_grid_t; +typedef struct skc_grid_deps * skc_grid_deps_t; + +// +// +// + +typedef void (* skc_grid_pfn)(skc_grid_t const grid); + +// +// +// + +#define SKC_IS_GRID_INVALID(grid) (grid == NULL) + +// +// +// + +#define SKC_GRID_DEPS_ATTACH(deps,addr,data,waiting_pfn,execute_pfn,dispose_pfn) \ + skc_grid_deps_attach(deps,addr,data, \ + waiting_pfn,execute_pfn,dispose_pfn, \ + #waiting_pfn,#execute_pfn,#dispose_pfn) \ +// +// +// + +skc_grid_deps_t +skc_grid_deps_create(struct skc_runtime * const runtime, + struct skc_scheduler * const scheduler, + skc_uint const handle_pool_size); + +void +skc_grid_deps_dispose(skc_grid_deps_t const deps); + +// +// +// + +#ifndef NDEBUG +void +skc_grid_deps_debug(struct skc_grid_deps const * const deps); +#endif + +// +// +// + +skc_grid_t +skc_grid_deps_attach(skc_grid_deps_t const deps, + skc_grid_t * const addr, + void * const data, + skc_grid_pfn waiting_pfn, // upon READY > WAITING + skc_grid_pfn execute_pfn, // upon READY/WAITING > EXECUTING + skc_grid_pfn dispose_pfn, // upon EXECUTING > COMPLETE + char const * const waiting_name, + char const * const execute_name, + char const * const dispose_name); + +#if 0 +// +// Not using this yet -- needs to properly detach and reclaim a ready +// grid's resources +// +void +skc_grid_detach(skc_grid_t const grid); +#endif + +// +// +// + +void * +skc_grid_get_data(skc_grid_t const grid); + +void +skc_grid_set_data(skc_grid_t const grid, void * const data); + +// +// +// + +void +skc_grid_map(skc_grid_t const grid, skc_handle_t const handle); + +// +// +// + +void +skc_grid_deps_force(skc_grid_deps_t const deps, + skc_handle_t const * const handles, + skc_uint const count); + +void +skc_grid_deps_unmap(skc_grid_deps_t const deps, + skc_handle_t const * const handles, + skc_uint const count); + +// +// +// + +void +skc_grid_happens_after_grid(skc_grid_t const after, + skc_grid_t const before); + +void +skc_grid_happens_after_handle(skc_grid_t const after, + skc_handle_t const before); + +// +// should be called by host +// + +void +skc_grid_start(skc_grid_t const grid); + +void +skc_grid_force(skc_grid_t const grid); + +// +// should be called by the scheduler +// + +void +skc_grid_complete(skc_grid_t const grid); + +// +// +// + +#if 0 +// +// delete when ready +// +skc_grid_t +skc_grid_move(skc_grid_t const grid, + skc_grid_state_e * const state, + skc_grid_t * const addr, + void * const data); +#endif + +// +// +// diff --git a/src/compute/skc/handle.h b/src/compute/skc/handle.h new file mode 100644 index 0000000000..3751b653c9 --- /dev/null +++ b/src/compute/skc/handle.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "types.h" + +// +// Add defensive high guard-bit flags to the opaque path and raster +// handles. This is tested once and stripped down to a handle. +// +// union skc_typed_handle +// { +// skc_uint u32; +// +// struct { +// skc_uint handle : 30; +// skc_uint is_path : 1; +// skc_uint is_raster : 1; +// }; +// struct { +// skc_uint na : 30; +// skc_uint type : 2; +// }; +// } +// + +typedef enum skc_typed_handle_type_e +{ + SKC_TYPED_HANDLE_TYPE_IS_PATH = 0x40000000, + SKC_TYPED_HANDLE_TYPE_IS_RASTER = 0x80000000 +} skc_typed_handle_type_e; + +typedef skc_uint skc_typed_handle_t; +typedef skc_uint skc_handle_t; + +// +// +// + +#define SKC_TYPED_HANDLE_MASK_TYPE (SKC_TYPED_HANDLE_TYPE_IS_PATH | SKC_TYPED_HANDLE_TYPE_IS_RASTER) + +#define SKC_TYPED_HANDLE_TO_HANDLE(h) ((h) & ~SKC_TYPED_HANDLE_MASK_TYPE) + +#define SKC_TYPED_HANDLE_IS_TYPE(h,t) ((h) & (t)) +#define SKC_TYPED_HANDLE_IS_PATH(h) ((h) & SKC_TYPED_HANDLE_TYPE_IS_PATH) +#define SKC_TYPED_HANDLE_IS_RASTER(h) ((h) & SKC_TYPED_HANDLE_TYPE_IS_RASTER) + +// +// +// diff --git a/src/compute/skc/handle_pool_cl_12.c b/src/compute/skc/handle_pool_cl_12.c new file mode 100644 index 0000000000..65288c3656 --- /dev/null +++ b/src/compute/skc/handle_pool_cl_12.c @@ -0,0 +1,752 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdio.h> +#include <assert.h> + +// +// +// + +#include "common/cl/assert_cl.h" + +#include "block.h" +#include "grid.h" +#include "config_cl.h" +#include "runtime_cl_12.h" + +// +// FIXME -- these comments are now quite stale +// +// +// HANDLE/ACQUIRE RELEASE +// +// The runtime vends handles just in case we decide to exploit shared +// virtual memory. But for most platforms and devices we will have a +// pool of host-managed handles and on the device there will be a +// table that maps the host handle to a device-managed memory block. +// +// HANDLE READINESS +// +// A host handle may reference a path or a raster which is not ready +// for use further down the pipeline because it hasn't yet been +// processed by the device. +// +// The simplest scheme for providing every handle a readiness state is +// to build a map that that marks a new handle as being not-ready +// while being processed by a particular grid id. When the final +// sub-pipeline grid responsible for the path or raster is complete, +// then mark the handle as being ready and eventually return the grid +// id back to the pool. This can be performed on a separate thread. +// +// The side-benefit of this approach is that a handle's reference +// count integral type can spare some bits for its associated grid id. +// +// A more memory-intensive approach uses a 64-bit epoch+grid key and +// relies on the ~56 bits of epoch space to avoid any post +// sub-pipeline status update by assuming that a handle and grid will +// match or mismatch when queried. +// + +#define SKC_HANDLE_REFCNT_HOST_BITS (SKC_MEMBER_SIZE(union skc_handle_refcnt,h) * 8) +#define SKC_HANDLE_REFCNT_DEVICE_BITS (SKC_MEMBER_SIZE(union skc_handle_refcnt,d) * 8) + +#define SKC_HANDLE_REFCNT_HOST_MAX SKC_BITS_TO_MASK(SKC_HANDLE_REFCNT_HOST_BITS) +#define SKC_HANDLE_REFCNT_DEVICE_MAX SKC_BITS_TO_MASK(SKC_HANDLE_REFCNT_DEVICE_BITS) + +// +// +// + +static +void +skc_handle_reclaim_create(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool, + skc_handle_reclaim_type_e const reclaim_type, + skc_device_kernel_id const kernel_id) +{ + struct skc_handle_reclaim * const reclaim = handle_pool->reclaim + reclaim_type; + + // init counters + reclaim->bih.rem = 0; + + // acquire kernel + reclaim->kernel = skc_device_acquire_kernel(runtime->device,kernel_id); + reclaim->kernel_id = kernel_id; + + // set default args + cl(SetKernelArg(reclaim->kernel,0,SKC_CL_ARG(runtime->block_pool.ids.drw))); + cl(SetKernelArg(reclaim->kernel,1,SKC_CL_ARG(runtime->block_pool.blocks.drw))); + cl(SetKernelArg(reclaim->kernel,2,SKC_CL_ARG(runtime->block_pool.atomics.drw))); + cl(SetKernelArg(reclaim->kernel,3,SKC_CL_ARG(runtime->config->block_pool.ring_mask))); + cl(SetKernelArg(reclaim->kernel,4,SKC_CL_ARG(runtime->handle_pool.map.drw))); +} + +static +void +skc_handle_reclaim_dispose(struct skc_runtime * const runtime, + skc_handle_reclaim_type_e const reclaim_type) +{ + struct skc_handle_reclaim * const reclaim = runtime->handle_pool.reclaim + reclaim_type; + + cl(ReleaseKernel(reclaim->kernel)); +} + +// +// +// + +#define SKC_HANDLE_POOL_BLOCKS_PAD 8 + +void +skc_handle_pool_create(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool, + skc_uint const size, + skc_uint const width, + skc_uint const recs) +{ + skc_uint const blocks = (size + width - 1) / width; + skc_uint const blocks_padded = blocks + SKC_HANDLE_POOL_BLOCKS_PAD; + skc_uint const handles = blocks * width; + skc_uint const handles_padded = blocks_padded * width; + skc_uint const recs_padded = recs + 2; // one for pointer and one for head node + + skc_extent_pdrw_alloc(runtime,&handle_pool->map,handles * sizeof(skc_block_id_t)); + + handle_pool->handle.indices = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,handles_padded * sizeof(*handle_pool->handle.indices)); + handle_pool->handle.refcnts = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,handles * sizeof(*handle_pool->handle.refcnts)); + handle_pool->block.indices = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,blocks_padded * sizeof(*handle_pool->block.indices)); + handle_pool->recs = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,recs_padded * sizeof(*handle_pool->recs)); + + // initialize handles and refcnts + for (skc_uint ii=0; ii<handles; ii++) + handle_pool->handle.indices[ii] = ii; + + for (skc_uint ii=0; ii<handles; ii++) + handle_pool->handle.refcnts[ii].hd = 0; + + handle_pool->handle.count = handles; + + // initialize block accounting + for (skc_uint ii=0; ii<blocks_padded; ii++) + handle_pool->block.indices[ii] = ii; + + handle_pool->block.count = blocks_padded; + handle_pool->block.width = width; + + handle_pool->block.tos = blocks; // pop = pre-decrement / push = post-increment + handle_pool->block.bos = blocks; // pop = post-increment / push = pre-decrement + + // initialize recs -- first two elements are interpreted differently + handle_pool->recs[0].runtime = runtime; + handle_pool->recs[1] = (union skc_handle_reclaim_rec){ .rem = recs, .head = 2 }; + + for (skc_uint ii=2; ii<recs_padded; ii++) + handle_pool->recs[ii] = (union skc_handle_reclaim_rec){ .index = ii, .next = ii+1 }; + + handle_pool->recs[recs_padded-1].next = SKC_UINT_MAX; + + // initialize acquire + handle_pool->acquire.rem = 0; + + // create reclaimers + skc_handle_reclaim_create(runtime, + handle_pool, + SKC_HANDLE_RECLAIM_TYPE_PATH, + SKC_DEVICE_KERNEL_ID_PATHS_RECLAIM); + + skc_handle_reclaim_create(runtime, + handle_pool, + SKC_HANDLE_RECLAIM_TYPE_RASTER, + SKC_DEVICE_KERNEL_ID_RASTERS_RECLAIM); +} + +// +// +// + +void +skc_handle_pool_dispose(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool) +{ + skc_handle_reclaim_dispose(runtime,SKC_HANDLE_RECLAIM_TYPE_RASTER); + skc_handle_reclaim_dispose(runtime,SKC_HANDLE_RECLAIM_TYPE_PATH); + + skc_runtime_host_perm_free(runtime,handle_pool->recs); + skc_runtime_host_perm_free(runtime,handle_pool->block.indices); + skc_runtime_host_perm_free(runtime,handle_pool->handle.refcnts); + skc_runtime_host_perm_free(runtime,handle_pool->handle.indices); + + skc_extent_pdrw_free(runtime,&handle_pool->map); +} + +// +// +// + +static +skc_uint +skc_handle_pool_block_readable_pop(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool) +{ + SKC_SCHEDULER_WAIT_WHILE(runtime->scheduler,handle_pool->block.tos == 0); + + skc_uint const index = handle_pool->block.indices[--handle_pool->block.tos]; + +#if 0 + skc_handle_t * handles = handle_pool->handle.indices + (index + 1) * handle_pool->block.width; + for (skc_uint ii=0; ii<handle_pool->block.width; ii++) + printf("R-: %u\n",*--handles); +#endif + + return index; +} + +static +void +skc_handle_pool_block_readable_push(struct skc_handle_pool * const handle_pool, + skc_uint const index) +{ + handle_pool->block.indices[handle_pool->block.tos++] = index; + +#if 0 + skc_handle_t * handles = handle_pool->handle.indices + (index + 1) * handle_pool->block.width; + for (skc_uint ii=0; ii<handle_pool->block.width; ii++) + printf("R+: %u\n",*--handles); +#endif +} + + +static +skc_uint +skc_handle_pool_block_writable_pop(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool) +{ + SKC_SCHEDULER_WAIT_WHILE(runtime->scheduler,handle_pool->block.bos == handle_pool->block.count); + + return handle_pool->block.indices[handle_pool->block.bos++]; +} + +static +void +skc_handle_pool_block_writable_push(struct skc_handle_pool * const handle_pool, + skc_uint const block_idx) +{ + handle_pool->block.indices[--handle_pool->block.bos] = block_idx; +} + +// +// May need to acquire the path or raster handle *early* just to be +// sure one exists +// + +skc_handle_t +skc_runtime_handle_device_acquire(struct skc_runtime * const runtime) +{ + struct skc_handle_pool * const handle_pool = &runtime->handle_pool; + + // acquire a block of handles at a time + if (handle_pool->acquire.rem == 0) + { + skc_uint const block_idx = skc_handle_pool_block_readable_pop(runtime,handle_pool); + + handle_pool->acquire.block = block_idx; + handle_pool->acquire.rem = handle_pool->block.width; + handle_pool->acquire.handles = handle_pool->handle.indices + (block_idx + 1) * handle_pool->block.width; + } + + // load handle from next block slot + skc_uint const rem = --handle_pool->acquire.rem; + skc_handle_t const handle = *--handle_pool->acquire.handles; + + // initialize refcnt for handle + handle_pool->handle.refcnts[handle] = (union skc_handle_refcnt){ .h = 1, .d = 1 }; + + // if this was the last handle in the block then move the block id + // to the reclamation stack to be used as a scratchpad + if (rem == 0) { + skc_handle_pool_block_writable_push(handle_pool,handle_pool->acquire.block); + } + + return handle; +} + +// +// +// + +static +void +skc_handle_reclaim_completion(union skc_handle_reclaim_rec * const recN) +{ + // get root rec which contains pointer to runtime + union skc_handle_reclaim_rec * const rec0 = recN - recN->index; + union skc_handle_reclaim_rec * const rec1 = rec0 + 1; + + // return block for reading + skc_handle_pool_block_readable_push(&rec0->runtime->handle_pool,recN->block); + + // recN is new head of list + recN->next = rec1->head; + rec1->head = recN->index; + rec1->rem += 1; +} + +static +void +skc_handle_reclaim_cb(cl_event event, cl_int status, union skc_handle_reclaim_rec * const recN) +{ + SKC_CL_CB(status); + + union skc_handle_reclaim_rec * const rec0 = recN - recN->index; + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(rec0->runtime->scheduler,skc_handle_reclaim_completion,recN); +} + +// +// FIXME -- is there an issue launching on the host thread? +// + +static +void +skc_handle_reclaim_launch(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool, + struct skc_handle_reclaim * const reclaim, + union skc_handle_reclaim_rec * const recN) +{ + cl(SetKernelArg(reclaim->kernel, + 5, + handle_pool->block.width * sizeof(skc_handle_t), + reclaim->bih.handles)); + + // acquire a cq + cl_command_queue cq = skc_runtime_acquire_cq_in_order(runtime); + + cl_event complete; + + // the kernel grid is shaped by the target device + skc_device_enqueue_kernel(runtime->device, + reclaim->kernel_id, + cq, + reclaim->kernel, + handle_pool->block.width, + 0,NULL,&complete); + + cl(SetEventCallback(complete,CL_COMPLETE,skc_handle_reclaim_cb,recN)); + cl(ReleaseEvent(complete)); + + // kickstart kernel execution + cl(Flush(cq)); + + // release the cq + skc_runtime_release_cq_in_order(runtime,cq); +} + +// +// reclaim a handle +// + +static +union skc_handle_reclaim_rec * +skc_handle_acquire_reclaim_rec(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool) +{ + union skc_handle_reclaim_rec * const rec1 = handle_pool->recs + 1; + + SKC_SCHEDULER_WAIT_WHILE(runtime->scheduler,rec1->rem == 0); + + union skc_handle_reclaim_rec * const recN = handle_pool->recs + rec1->head; + + rec1->head = recN->next; + rec1->rem -= 1; + + // fprintf(stderr,"rec1->rem = %u\n",rec1->rem); + + return recN; +} + +static +void +skc_runtime_device_reclaim(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool, + struct skc_handle_reclaim * const reclaim, + skc_handle_t const handle) +{ + // grab a new block? + if (reclaim->bih.rem == 0) + { + skc_uint const block_idx = skc_handle_pool_block_writable_pop(runtime,handle_pool); + + reclaim->bih.block = block_idx; + reclaim->bih.rem = handle_pool->block.width; + reclaim->bih.handles = handle_pool->handle.indices + (block_idx + 1) * handle_pool->block.width; + } + + // store handle -- handle's refcnt was already set to {0:0} + *--reclaim->bih.handles = handle; + + // if block is full then launch reclamation kernel + if (--reclaim->bih.rem == 0) + { + union skc_handle_reclaim_rec * recN = skc_handle_acquire_reclaim_rec(runtime,handle_pool); + + recN->block = reclaim->bih.block; + + skc_handle_reclaim_launch(runtime,handle_pool,reclaim,recN); + } +} + +// +// Validate host-provided handles before retaining. +// +// Retain validation consists of: +// +// - correct handle type +// - handle is in range of pool +// - host refcnt is not zero +// - host refcnt is not at the maximum value +// +// After validation, retain the handles for the host +// + +static +skc_err +skc_runtime_handle_host_validated_retain(struct skc_runtime * const runtime, + skc_typed_handle_type_e const handle_type, + skc_typed_handle_t const * const typed_handles, + uint32_t const count) +{ + // + // FIXME -- test to make sure handles aren't completely out of range integers + // + + union skc_handle_refcnt * const refcnts = runtime->handle_pool.handle.refcnts; + + for (skc_uint ii=0; ii<count; ii++) + { + skc_typed_handle_t const typed_handle = typed_handles[ii]; + + if (!SKC_TYPED_HANDLE_IS_TYPE(typed_handle,handle_type)) + { + return SKC_ERR_HANDLE_INVALID; + } + else + { + skc_handle_t const handle = SKC_TYPED_HANDLE_TO_HANDLE(typed_handle); + + if (handle >= runtime->handle_pool.handle.count) + { + return SKC_ERR_HANDLE_INVALID; + } + else + { + union skc_handle_refcnt * const refcnt_ptr = refcnts + handle; + skc_uint const host = refcnt_ptr->h; + + if (host == 0) + { + return SKC_ERR_HANDLE_INVALID; + } + else if (host == SKC_HANDLE_REFCNT_HOST_MAX) + { + return SKC_ERR_HANDLE_OVERFLOW; + } + } + } + } + + // + // all the handles validated, so retain them all.. + // + for (skc_uint ii=0; ii<count; ii++) + refcnts[SKC_TYPED_HANDLE_TO_HANDLE(typed_handles[ii])].h++; + + return SKC_ERR_SUCCESS; +} + +// +// +// + +skc_err +skc_runtime_path_host_retain(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count) +{ + return skc_runtime_handle_host_validated_retain(runtime, + SKC_TYPED_HANDLE_TYPE_IS_PATH, + paths, + count); +} + +skc_err +skc_runtime_raster_host_retain(struct skc_runtime * const runtime, + skc_path_t const * rasters, + uint32_t count) +{ + return skc_runtime_handle_host_validated_retain(runtime, + SKC_TYPED_HANDLE_TYPE_IS_RASTER, + rasters, + count); +} + +// +// +// + +skc_err +skc_runtime_raster_host_flush(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count) +{ + skc_grid_deps_force(runtime->deps,rasters,count); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_runtime_path_host_flush(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count) +{ + skc_grid_deps_force(runtime->deps,paths,count); + + return SKC_ERR_SUCCESS; +} + +// +// Validate host-provided handles before releasing. +// +// Release validation consists of: +// +// - correct handle type +// - handle is in range of pool +// - host refcnt is not zero +// +// After validation, release the handles for the host +// + +static +skc_err +skc_runtime_host_validated_release(struct skc_runtime * const runtime, + skc_typed_handle_type_e const type, + skc_handle_reclaim_type_e const reclaim_type, + skc_typed_handle_t const * const handles, + uint32_t const count) +{ + struct skc_handle_pool * const handle_pool = &runtime->handle_pool; + union skc_handle_refcnt * const refcnts = handle_pool->handle.refcnts; + + for (skc_uint ii=0; ii<count; ii++) + { + skc_typed_handle_t const typed_handle = handles[ii]; + + if (!SKC_TYPED_HANDLE_IS_TYPE(typed_handle,type)) + { + return SKC_ERR_HANDLE_INVALID; + } + else + { + skc_handle_t const handle = SKC_TYPED_HANDLE_TO_HANDLE(typed_handle); + + if (handle >= handle_pool->handle.count) + { + return SKC_ERR_HANDLE_INVALID; + } + else + { + union skc_handle_refcnt * const refcnt_ptr = refcnts + handle; + skc_uint const host = refcnt_ptr->h; + + if (host == 0) + { + return SKC_ERR_HANDLE_INVALID; + } + } + } + } + + // + // all the handles validated, so release them all.. + // + struct skc_handle_reclaim * const reclaim = handle_pool->reclaim + reclaim_type; + + for (skc_uint ii=0; ii<count; ii++) + { + skc_handle_t const handle = SKC_TYPED_HANDLE_TO_HANDLE(handles[ii]); + union skc_handle_refcnt * const refcnt_ptr = refcnts + handle; + union skc_handle_refcnt refcnt = *refcnt_ptr; + + refcnt.h -= 1; + *refcnt_ptr = refcnt; + + if (refcnt.hd == 0) { + skc_runtime_device_reclaim(runtime,handle_pool,reclaim,handle); + } + } + + return SKC_ERR_SUCCESS; +} + +// +// +// + +skc_err +skc_runtime_path_host_release(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count) +{ + return skc_runtime_host_validated_release(runtime, + SKC_TYPED_HANDLE_TYPE_IS_PATH, + SKC_HANDLE_RECLAIM_TYPE_PATH, + paths, + count); +} + +skc_err +skc_runtime_raster_host_release(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count) +{ + return skc_runtime_host_validated_release(runtime, + SKC_TYPED_HANDLE_TYPE_IS_RASTER, + SKC_HANDLE_RECLAIM_TYPE_RASTER, + rasters, + count); +} + +// +// Validate host-provided handles before retaining on the device. +// +// - correct handle type +// - handle is in range of pool +// - host refcnt is not zero +// - device refcnt is not at the maximum value +// + +skc_err +skc_runtime_handle_device_validate_retain(struct skc_runtime * const runtime, + skc_typed_handle_type_e const type, + skc_typed_handle_t const * handles, + uint32_t count) +{ + union skc_handle_refcnt * const refcnts = runtime->handle_pool.handle.refcnts; + + while (count-- > 0) + { + skc_typed_handle_t const typed_handle = *handles++; + + if (!SKC_TYPED_HANDLE_IS_TYPE(typed_handle,type)) + { + return SKC_ERR_HANDLE_INVALID; + } + else + { + skc_handle_t const handle = SKC_TYPED_HANDLE_TO_HANDLE(typed_handle); + + if (handle >= runtime->handle_pool.handle.count) + { + return SKC_ERR_HANDLE_INVALID; + } + else + { + union skc_handle_refcnt * const refcnt_ptr = refcnts + handle; + union skc_handle_refcnt refcnt = *refcnt_ptr; + + if (refcnt.h == 0) + { + return SKC_ERR_HANDLE_INVALID; + } + else if (refcnt.d == SKC_HANDLE_REFCNT_DEVICE_MAX) + { + return SKC_ERR_HANDLE_OVERFLOW; + } + } + } + } + + return SKC_ERR_SUCCESS; +} + +// +// After validation, retain the handles for the device +// + +void +skc_runtime_handle_device_retain(struct skc_runtime * const runtime, + skc_handle_t const * handles, + uint32_t count) +{ + union skc_handle_refcnt * const refcnts = runtime->handle_pool.handle.refcnts; + + while (count-- > 0) + refcnts[SKC_TYPED_HANDLE_TO_HANDLE(*handles++)].d++; +} + +// +// Release the device-held handles -- no validation required! +// + +static +void +skc_runtime_handle_device_release(struct skc_runtime * const runtime, + skc_handle_reclaim_type_e const reclaim_type, + skc_handle_t const * handles, + skc_uint count) +{ + struct skc_handle_pool * const handle_pool = &runtime->handle_pool; + union skc_handle_refcnt * const refcnts = handle_pool->handle.refcnts; + struct skc_handle_reclaim * const reclaim = handle_pool->reclaim + reclaim_type; + + while (count-- > 0) { + skc_handle_t const handle = *handles++; + union skc_handle_refcnt * const refcnt_ptr = refcnts + handle; + union skc_handle_refcnt refcnt = *refcnt_ptr; + + refcnt.d -= 1; + *refcnt_ptr = refcnt; + +#if 0 + printf("%8u = { %u, %u }\n",handle,refcnt.h,refcnt.d); +#endif + + if (refcnt.hd == 0) { + skc_runtime_device_reclaim(runtime,handle_pool,reclaim,handle); + } + } +} + +// +// +// + +void +skc_runtime_path_device_release(struct skc_runtime * const runtime, + skc_handle_t const * handles, + skc_uint count) +{ + skc_runtime_handle_device_release(runtime,SKC_HANDLE_RECLAIM_TYPE_PATH,handles,count); +} + +void +skc_runtime_raster_device_release(struct skc_runtime * const runtime, + skc_handle_t const * handles, + skc_uint count) +{ + skc_runtime_handle_device_release(runtime,SKC_HANDLE_RECLAIM_TYPE_RASTER,handles,count); +} + +// +// +// diff --git a/src/compute/skc/handle_pool_cl_12.h b/src/compute/skc/handle_pool_cl_12.h new file mode 100644 index 0000000000..4fefae3552 --- /dev/null +++ b/src/compute/skc/handle_pool_cl_12.h @@ -0,0 +1,177 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "macros.h" +#include "handle.h" +#include "extent_cl_12.h" +#include "device_cl_12.h" + +// +// FIXME -- THIS DOCUMENTATION IS STALE NOW THAT A REFERENCE COUNT REP +// IS A {HOST:DEVICE} PAIR. +// +// Host-side handle pool +// +// The bulk size of the three extents is currently 6 bytes of overhead +// per number of host handles. The number of host handles is usually +// less than the number of blocks in the pool. Note that the maximum +// number of blocks is 2^27. +// +// A practical instantiation might provide a combined 2^20 path and +// raster host handles. This would occupy 6 MB of host RAM for the +// 32-bit handle, 8-bit reference count and 8-bit handle-to-grid map. +// +// Also note that we could use isolated/separate path and raster block +// pools. Worst case, this would double the memory footprint of SKC. +// +// Host-side handle reference count +// +// [0 ] : release +// [1..UMAX] : retain +// +// In a garbage-collected environment we might want to rely on an +// existing mechanism for determing whether a handle is live. +// +// Otherwise, we probably want to have a 16 or 32-bit ref count. +// +// The handle reference count is defensive and will not allow the host +// to underflow a handle that's still retained by the pipeline. +// +// The single reference counter is split into host and device counts. +// + +union skc_handle_refcnt +{ + skc_ushort hd; // host and device + + struct { + skc_uchar h; // host + skc_uchar d; // device + }; +}; + +SKC_STATIC_ASSERT(SKC_MEMBER_SIZE(union skc_handle_refcnt,hd) == + SKC_MEMBER_SIZE(union skc_handle_refcnt,h) + + SKC_MEMBER_SIZE(union skc_handle_refcnt,d)); + +// +// +// + +struct skc_handle_bih +{ + skc_uint block; + skc_uint rem; + skc_handle_t * handles; +}; + +struct skc_handle_reclaim +{ + struct skc_handle_bih bih; + + cl_kernel kernel; + skc_device_kernel_id kernel_id; +}; + +union skc_handle_reclaim_rec +{ + // ELEMENT 0 + struct skc_runtime * runtime; + + // ELEMENT 1 + struct { + skc_uint rem; // # of available records + skc_uint head; // index of first record + }; + + // ELEMENTS 2+ + struct { + skc_uint index; // index of this record -- never modified + union { + skc_uint next; // index of next record + skc_uint block; // block index of reclaimed handles + }; + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_handle_reclaim_rec) == sizeof(skc_uint2)); + +// +// +// + +typedef enum skc_handle_reclaim_type_e { + + SKC_HANDLE_RECLAIM_TYPE_PATH, + SKC_HANDLE_RECLAIM_TYPE_RASTER, + + SKC_HANDLE_RECLAIM_TYPE_COUNT + +} skc_handle_reclaim_type_e; + +struct skc_handle_pool +{ + // + // FIXME -- should we be pedantic and make these always-host-side + // allocations "extents" as well? I think it's OK not being an + // extent structure for now and is mostly consistent with the rest + // of the code. + // + // FIXME -- the cbs[] array is a little idiosyncratic but the intent + // is to avoid storing the 64-bit backpointer inside of every single + // record. This can be harmonized later. Note that only a few + // hundred outstanding callbacks would represent many many subgroups + // of work and would fully occupy the GPU (if we allow it). + // + // + struct skc_extent_pdrw map; // device-managed extent mapping a host handle to device block id + + struct { + skc_handle_t * indices; // array of individual host handles -- fragmented into blocks + union skc_handle_refcnt * refcnts; // array of reference counts indexed by an individual handle + skc_uint count; + } handle; + + struct { + skc_uint * indices; // stack of indices to fixed-size blocks of host handles + skc_uint count; // number of handles -- valid from [0,size) + skc_uint width; // width of a fixed-size block of handles + skc_uint tos; // grows upward / push++ / --pop / # fixed-size blocks for reading + skc_uint bos; // grows downward / --push / pop++ / # fixed-size blocks for writing + } block; + + union skc_handle_reclaim_rec * recs; // array of reclaim records + + struct skc_handle_bih acquire; + struct skc_handle_reclaim reclaim[SKC_HANDLE_RECLAIM_TYPE_COUNT]; +}; + +// +// +// + +void +skc_handle_pool_create(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool, + skc_uint const size, + skc_uint const width, + skc_uint const recs); + +void +skc_handle_pool_dispose(struct skc_runtime * const runtime, + struct skc_handle_pool * const handle_pool); + +// +// +// diff --git a/src/compute/skc/interop.c b/src/compute/skc/interop.c new file mode 100644 index 0000000000..6697bb7e83 --- /dev/null +++ b/src/compute/skc/interop.c @@ -0,0 +1,629 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <glad/glad.h> +#include <glfw/glfw3.h> + +// +// +// + +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <math.h> + +// +// +// + +#include "common/cl/assert_cl.h" +#include "types.h" + +// +// +// + +#include "interop.h" +#include "context.h" +#include "runtime_cl_12.h" + +// +// +// + +#include "svg2skc/transform_stack.h" + +// +// +// + +#if 1 +#define SKC_IMAGE_FORMAT GL_RGBA8 +#else +#define SKC_IMAGE_FORMAT GL_RGBA16F +#endif + +// +// +// + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +// +// +// + +struct skc_interop_fb +{ + cl_context context; + + GLuint fbo; + GLuint rbo; + + cl_mem mem; + + int width; + int height; + + bool is_srgb; + bool is_vsync_on; + bool is_fullscreen; + bool is_iconified; + bool is_resized; + bool is_spinning; + bool is_info; + + skc_float scale; + skc_float2 translate; + float rotate_theta; +}; + +static struct skc_interop_fb fb = + { + .mem = NULL, + + .is_srgb = true, + .is_vsync_on = false, + .is_fullscreen = false, + .is_iconified = false, + .is_resized = true, + .is_spinning = false, + .is_info = false, + + .scale = 1.0f, + .translate = { 0.0f, 0.0f }, + .rotate_theta = 0.0f + }; + +// +// FPS COUNTER FROM HERE: +// +// http://antongerdelan.net/opengl/glcontext2.html +// + +static +void +skc_interop_fps(GLFWwindow * window) +{ + if (fb.is_fullscreen) + return; + + // static fps counters + static double stamp_prev = 0.0; + static int frame_count = 0; + + // locals + double const stamp_curr = glfwGetTime(); + double const elapsed = stamp_curr - stamp_prev; + + if (elapsed >= 0.5) + { + stamp_prev = stamp_curr; + + double const fps = (double)frame_count / elapsed; + + char tmp[64]; + + sprintf_s(tmp,64,"(%d x %d) - VSync %s - sRGB %s - FPS: %.2f", + fb.width,fb.height, + fb.is_vsync_on ? "ON" : "OFF", + fb.is_srgb ? "ENABLED" : "DISABLED", + fps); + + glfwSetWindowTitle(window,tmp); + + frame_count = 0; + } + + frame_count++; +} + +// +// INITIALIZE GLFW/GLAD +// + +static +void +skc_interop_error_callback(int error, char const * description) +{ + fputs(description,stderr); +} + +// +// +// + +static +void +skc_interop_iconify_callback(GLFWwindow * window, int iconified) +{ + fb.is_iconified = iconified; +} + +// +// +// + +static +void +skc_interop_key_callback(GLFWwindow * window, int key, int scancode, int action, int mods) +{ + if (action == GLFW_RELEASE) + return; + + switch (key) + { + case GLFW_KEY_EQUAL: + fb.rotate_theta = 0.0f; + break; + + case GLFW_KEY_I: + fb.is_info = true; + break; + + case GLFW_KEY_R: + fb.is_spinning ^= true; + break; + + case GLFW_KEY_S: + fb.is_srgb ^= true; + if (fb.is_srgb) + glEnable(GL_FRAMEBUFFER_SRGB); + else + glDisable(GL_FRAMEBUFFER_SRGB); + break; + + case GLFW_KEY_V: + fb.is_vsync_on ^= true; + glfwSwapInterval(fb.is_vsync_on ? 1 : 0); + break; + + case GLFW_KEY_W: + glfwSetWindowSize(window,1024,1024); + break; + + case GLFW_KEY_ESCAPE: + glfwSetWindowShouldClose(window,GL_TRUE); + break; + } +} + +static +void +skc_interop_window_size_callback(GLFWwindow * window, int width, int height) +{ + fb.width = width; + fb.height = height; + fb.is_resized = true; + +#if 0 + skc_render_kernel_set_clip(0,0,width,height); +#endif +} + +static +void +skc_interop_scale(double const scale_offset) +{ +#define SKC_SCALE_FACTOR 1.05 + + static double scale_exp = 0.0; + + scale_exp += scale_offset; + fb.scale = (float)pow(SKC_SCALE_FACTOR,scale_exp); +} + +static +void +skc_interop_scroll_callback(GLFWwindow * window, double xoffset, double yoffset) +{ + bool const ctrl = + (glfwGetKey(window,GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) || + (glfwGetKey(window,GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS); + + if (!ctrl) + return; + + skc_interop_scale(yoffset); +} + +static +void +skc_interop_translate(float const dx, float const dy) +{ + float const dx_scaled = dx / fb.scale; + float const dy_scaled = dy / fb.scale; + + float const cos_theta = cosf(fb.rotate_theta); // replace with cospi if available + float const sin_theta = sinf(fb.rotate_theta); // replace with sinpi if available + + fb.translate.x += dx_scaled*cos_theta + dy_scaled*sin_theta; + fb.translate.y += dy_scaled*cos_theta - dx_scaled*sin_theta; +} + +static +void +skc_interop_cursor_position_callback(GLFWwindow * window, double x, double y) +{ + int const state = glfwGetMouseButton(window,GLFW_MOUSE_BUTTON_LEFT); + + static bool is_mouse_dragging = false; + static float x_prev=0.0, y_prev=0.0; + + float const mx = (float)x; + float const my = (float)y; + + if (state == GLFW_PRESS) + { + if (is_mouse_dragging) + { + const bool ctrl = + (glfwGetKey(window,GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) || + (glfwGetKey(window,GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS); + + if (ctrl) + { + float const cx = 0.5f * fb.width; + float const cy = 0.5f * fb.height; + + // find angle between mouse and center + float const vx = x_prev - cx; + float const vy = y_prev - cy; + + float const wx = mx - cx; + float const wy = my - cy; + + float const len = sqrtf((vx*vx + vy*vy) * (wx*wx + wy*wy)); + + if (len > 0.0f) + { + float const dot = vx*wx + vy*wy; + float const da = acosf(dot / len); + + if (vx*wy - vy*wx >= 0.0f) + fb.rotate_theta += da; + else + fb.rotate_theta -= da; + + fb.rotate_theta = fmodf(fb.rotate_theta,(float)(M_PI*2.0)); + } + } + else + { + skc_interop_translate(mx - x_prev, + my - y_prev); + } + } + else + { + is_mouse_dragging = true; + } + + x_prev = mx; + y_prev = my; + } + else + { + is_mouse_dragging = false; + } +} + +// +// +// + +static +void +skc_interop_resize() +{ + fb.is_resized = false; + + // release the image2d + if (fb.mem != NULL) + cl(ReleaseMemObject(fb.mem)); + + // resize rbo + glNamedRenderbufferStorage(fb.rbo, + SKC_IMAGE_FORMAT, + fb.width, + fb.height); + + // attach rbo to fbo + glNamedFramebufferRenderbuffer(fb.fbo, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + fb.rbo); + // + // + // + cl_int cl_err; + + fb.mem = clCreateFromGLRenderbuffer(fb.context, + CL_MEM_WRITE_ONLY, + fb.rbo, + &cl_err); cl_ok(cl_err); + // + // for debugging porpoises! + // + cl_image_format format; + + cl(GetImageInfo(fb.mem, + CL_IMAGE_FORMAT, + sizeof(format), + &format, + NULL)); +} + +// +// +// + +static +void +skc_interop_acquire() +{ + // frame buffer object + glCreateFramebuffers(1,&fb.fbo); + + // render buffer object w/a color buffer + glCreateRenderbuffers(1,&fb.rbo); + + // size rbo + glNamedRenderbufferStorage(fb.rbo, + SKC_IMAGE_FORMAT, + fb.width, + fb.height); + + // attach rbo to fbo + glNamedFramebufferRenderbuffer(fb.fbo, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + fb.rbo); +} + +void +skc_interop_register(skc_context_t context) +{ + fb.context = context->runtime->cl.context; +} + +// +// +// + +void +skc_interop_init(GLFWwindow * * window) +{ + // + // INITIALIZE GLFW/GLAD + // + glfwSetErrorCallback(skc_interop_error_callback); + + if (!glfwInit()) + exit(EXIT_FAILURE); + + GLFWmonitor * const primary = glfwGetPrimaryMonitor(); + GLFWvidmode const * const mode = glfwGetVideoMode(primary); + + if (fb.is_fullscreen) + { + fb.width = mode->width; + fb.height = mode->height; + } + else + { + fb.width = 1600; + fb.height = 1024; + } + + glfwWindowHint(GLFW_ALPHA_BITS, 0); + glfwWindowHint(GLFW_DEPTH_BITS, 0); + glfwWindowHint(GLFW_STENCIL_BITS, 0); + + glfwWindowHint(GLFW_SRGB_CAPABLE, GL_TRUE); + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); + + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + *window = glfwCreateWindow(fb.width,fb.height, + "Skia Compute", + fb.is_fullscreen ? primary : NULL, + NULL); + + if (*window == NULL) + { + glfwTerminate(); + exit(EXIT_FAILURE); + } + + glfwMakeContextCurrent(*window); + + // set up GLAD + gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); + + // ignore vsync for now + glfwSwapInterval(fb.is_vsync_on ? 1 : 0); + + // only copy r/g/b + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); + + // enable SRGB, disable scissor + glEnable(GL_FRAMEBUFFER_SRGB); + glDisable(GL_SCISSOR_TEST); + + // + // SET USER POINTER AND CALLBACKS + // + glfwSetKeyCallback (*window,skc_interop_key_callback); + glfwSetFramebufferSizeCallback(*window,skc_interop_window_size_callback); + glfwSetScrollCallback (*window,skc_interop_scroll_callback); + glfwSetCursorPosCallback (*window,skc_interop_cursor_position_callback); + glfwSetWindowIconifyCallback (*window,skc_interop_iconify_callback); + + // + // + // + fprintf(stderr, + "GL_VENDOR : %s\n" + "GL_RENDERER : %s\n", + glGetString(GL_VENDOR), + glGetString(GL_RENDERER)); + + // + // acquire an FBO/RBO + // + skc_interop_acquire(); +} + +// +// +// + +#define SKC_ROTATE_STEP ((float)(M_PI / 180.0)) + +static +void +skc_interop_transform(struct skc_transform_stack * ts) +{ + // OpenGL'ism + skc_transform_stack_push_affine(ts, + 1.0f, 0.0f,0.0f, + 0.0f,-1.0f,(float)fb.height); + // multiply + skc_transform_stack_concat(ts); + + // spinner... + if (fb.is_spinning) + fb.rotate_theta = fmodf(fb.rotate_theta + SKC_ROTATE_STEP,(float)(M_PI*2.0)); + + // always rotate and scale around surface center point + skc_transform_stack_push_rotate_scale_xy(ts, + fb.rotate_theta, + fb.scale,fb.scale, + 0.5f*fb.width,0.5f*fb.height); + skc_transform_stack_concat(ts); + + // where did the mouse take us? + skc_transform_stack_push_translate(ts, + fb.translate.x,fb.translate.y); + skc_transform_stack_concat(ts); +} + + +void +skc_interop_poll(GLFWwindow * window, + struct skc_transform_stack * ts) +{ + // wait until uniconified + while (fb.is_iconified) + { + glfwWaitEvents(); + continue; + } + + // what's happended? + glfwPollEvents(); + + // resize? + if (fb.is_resized) + skc_interop_resize(); + + // monitor fps + skc_interop_fps(window); + + skc_interop_transform(ts); +} + +// +// +// + +void +skc_interop_blit(GLFWwindow * window) +{ + // blit skc rbo + glBlitNamedFramebuffer(fb.fbo,0, + 0,0,fb.width,fb.height, + 0,0,fb.width,fb.height, + GL_COLOR_BUFFER_BIT, + GL_NEAREST); + +#if 0 + // + // FIXME -- this clear does nothing! + // + // As a hack we're clearing the interop'd RBO with a + // clEnqueueFillImage(). + // + float const rgba[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + // GLenum const attachments[] = { GL_COLOR_ATTACHMENT0 }; + // glInvalidateNamedFramebufferData(fb.fbo,1,attachments); + glClearNamedFramebufferfv(fb.fbo,GL_COLOR,0,rgba); +#endif + + // swap buffers + glfwSwapBuffers(window); +} + +// +// +// + +void * +skc_interop_get_fb(GLFWwindow * window) +{ + glFlush(); + + return fb.mem; +} + +// +// +// + +void +skc_interop_get_dim(uint32_t dim[2]) +{ + dim[0] = fb.width; + dim[1] = fb.height; +} + +// +// +// + + diff --git a/src/compute/skc/interop.h b/src/compute/skc/interop.h new file mode 100644 index 0000000000..112d365764 --- /dev/null +++ b/src/compute/skc/interop.h @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" + +// +// +// + +void +skc_interop_init(GLFWwindow * * window); + +void +skc_interop_register(skc_context_t context); + +void +skc_interop_poll(GLFWwindow * window, + struct skc_transform_stack * ts); + +void * +skc_interop_get_fb(GLFWwindow * window); + +void +skc_interop_get_dim(uint32_t dim[2]); + +void +skc_interop_blit(GLFWwindow * window); + +// +// +// diff --git a/src/compute/skc/macros.h b/src/compute/skc/macros.h new file mode 100644 index 0000000000..1d5e5082ad --- /dev/null +++ b/src/compute/skc/macros.h @@ -0,0 +1,204 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_MACROS +#define SKC_ONCE_MACROS + +// +// +// + +#include "types.h" + +// +// +// + +#define SKC_RESTRICT __restrict + +// +// +// + +#define SKC_CONSTANT __constant +#define SKC_GLOBAL __global + +// +// +// + +#define SKC_CALLBACK __stdcall + +// +// +// + +#define SKC_TRUE 1 +#define SKC_FALSE 0 + +// +// +// + +#define SKC_EMPTY +#define SKC_COMMA , + +// +// INDEX, SUFFIX, COMPONENT, PUNCTUATION, RGBA +// + +#define SKC_EXPAND_1() \ + SKC_EXPAND_X(0,SKC_EMPTY,SKC_EMPTY,SKC_EMPTY,SKC_EMPTY) + +#define SKC_EXPAND_2() \ + SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,.even) \ + SKC_EXPAND_X(1, 1,.s1,SKC_EMPTY,.odd) + +#define SKC_EXPAND_4() \ + SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,.even.even) \ + SKC_EXPAND_X(1, 1,.s1,SKC_COMMA,.odd.even) \ + SKC_EXPAND_X(2, 2,.s2,SKC_COMMA,.even.odd) \ + SKC_EXPAND_X(3, 3,.s3,SKC_EMPTY,.odd.odd) + +#define SKC_EXPAND_8() \ + SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(1, 1,.s1,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(2, 2,.s2,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(3, 3,.s3,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(4, 4,.s4,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(5, 5,.s5,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(6, 6,.s6,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(7, 7,.s7,SKC_EMPTY,SKC_EMPTY) + +#define SKC_EXPAND_16() \ + SKC_EXPAND_X(0, 0,.s0,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(1, 1,.s1,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(2, 2,.s2,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(3, 3,.s3,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(4, 4,.s4,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(5, 5,.s5,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(6, 6,.s6,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(7, 7,.s7,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(8, 8,.s8,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(9, 9,.s9,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(10,A,.sA,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(11,B,.sB,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(12,C,.sC,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(13,D,.sD,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(14,E,.sE,SKC_COMMA,SKC_EMPTY) \ + SKC_EXPAND_X(15,F,.sF,SKC_EMPTY,SKC_EMPTY) + +// +// +// + +#define SKC_BITS_TO_MASK(n) (((skc_uint)1<<(n))-1) +#define SKC_BITS_TO_MASK_64(n) (((skc_ulong)1<<(n))-1) + +#define SKC_BITS_TO_MASK_AT(n,b) (SKC_BITS_TO_MASK(n)<<(b)) +#define SKC_BITS_TO_MASK_AT_64(n,b) (SKC_BITS_TO_MASK_64(n)<<(b)) + +// +// IF BFE IS SUPPORTED BY THE PLATFORM THEN IMPLEMENT DIFFERENTLY +// + +#define SKC_BFE(x,n,i) (((x) & SKC_BITS_TO_MASK_AT(n,i)) >> (i)) + +// +// IF BFI IS SUPPORTED BY THE PLATFORM THEN IMPLEMENT DIFFERENTLY +// +// Note this BFI assumes the destination bits were already set to zero +// + +#define SKC_BFI(d,n,i,v) ((((v) & SKC_BITS_TO_MASK(n)) << (i)) | (d)) + +// +// +// + +#define SKC_STRINGIFY2(a) #a +#define SKC_STRINGIFY(a) SKC_STRINGIFY2(a) + +// +// +// + +#define SKC_EVAL(x) x +#define SKC_CONCAT(a,b) SKC_EVAL(a)##SKC_EVAL(b) + +// +// +// + +#define SKC_MAX_MACRO(a,b) (((a) > (b)) ? (a) : (b)) +#define SKC_MIN_MACRO(a,b) (((a) < (b)) ? (a) : (b)) +#define SKC_GTE_MACRO(a,b) ((a) >= (b)) +#define SKC_LT_MACRO(a,b) ((a) < (b)) + +// +// +// + +#define SKC_COUNT_OF(x) (sizeof(x) / sizeof(x)[0]) +#define SKC_OFFSET_OF(t,m) ((size_t)&(((t*)0)->m)) +#define SKC_MEMBER_SIZE(t,m) sizeof(((t*)0)->m) + + +// +// Returns rounded up next power-of-2 for non-zero -- via bit +// twiddling hacks, etc. +// + +#define SKC_P2_OR_RS(n,x) ((x)|(x)>>n) +#define SKC_POW2_RU_U32(x) (1+SKC_P2_OR_RS(16,SKC_P2_OR_RS(8,SKC_P2_OR_RS(4,SKC_P2_OR_RS(2,SKC_P2_OR_RS(1,x-1)))))) + +// +// Round up +// + +#define SKC_ROUND_DOWN(v,q) (((v) / (q)) * (q)) +#define SKC_ROUND_UP(v,q) ((((v) + (q) - 1) / (q)) * (q)) + +#define SKC_ROUND_DOWN_POW2(v,q) ((v) & ~((q) - 1)) +#define SKC_ROUND_UP_POW2(v,q) SKC_ROUND_DOWN_POW2((v) + (q) - 1,q) + +// +// +// + +#if !defined(__OPENCL_C_VERSION__) + +#define SKC_STATIC_ASSERT(p) static_assert((p),#p) + +#else + +#define SKC_STATIC_ASSERT(p) + +#endif + +// +// Returns 1-based bit position of MSB +// + +#define SKC_MSB_4(x,n) (((x>>(n-0))&1)+((x>>(n-1))&1)+((x>>(n-2))&1)+((x>>(n-3))&1)) +#define SKC_MSB_7654(x) SKC_MSB_4(x,31)+SKC_MSB_4(x,27)+SKC_MSB_4(x,23)+SKC_MSB_4(x,19) +#define SKC_MSB_3210(x) SKC_MSB_4(x,15)+SKC_MSB_4(x,11)+SKC_MSB_4(x, 7)+SKC_MSB_4(x, 3) +#define SKC_MSB_U32(x) ( SKC_MSB_7654(((skc_uint)x)) + SKC_MSB_3210(((skc_uint)x)) ) + +// +// FIXME -- handle other compilers besides MSVC/x86 +// + +#define SKC_LZCNT_32(v) __lzcnt(v) + +// +// +// + +#endif + diff --git a/src/compute/skc/main.c b/src/compute/skc/main.c new file mode 100644 index 0000000000..ad18b29375 --- /dev/null +++ b/src/compute/skc/main.c @@ -0,0 +1,277 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSVG_DOC-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <glad/glad.h> +#include <GLFW/glfw3.h> + +// +// +// + +#include <stdio.h> +#include <stdlib.h> +#include <conio.h> + +#include "svg/svg_doc.h" +#include "svg2skc/svg2skc.h" +#include "svg2skc/transform_stack.h" + +// +// +// + +#include <CL/opencl.h> +#include "interop.h" + +// +// +// + +void +skc_runtime_cl_12_debug(struct skc_context * const context); + +// +// +// + + + +// +// +// + +static +void +is_render_complete(skc_surface_t surface, + skc_styling_t styling, + skc_composition_t composition, + bool * quit) +{ + *quit = true; +} + +// +// +// + +int +main(int argc, char** argv) +{ + // + // + // + if (argc <= 1) + { + fprintf(stderr,"-- missing filename\n"); + return EXIT_FAILURE; // no filename + } + + // + // load test file + // + // #include "test/lion.inl" + + struct svg_doc * svg_doc = svg_doc_parse(argv[1],false); + + fprintf(stderr,"p/r/l = %u / %u / %u\n", + svg_doc_path_count(svg_doc), + svg_doc_raster_count(svg_doc), + svg_doc_layer_count(svg_doc)); + + // + // fire up GL + // + GLFWwindow * window; + + skc_interop_init(&window); + + // + // get GL and device contexts + // + HGLRC hGLRC = wglGetCurrentContext(); + HDC hDC = wglGetCurrentDC(); + + // + // + // + cl_context_properties context_properties[] = + { + CL_CONTEXT_PLATFORM, (cl_context_properties)-1, + CL_GL_CONTEXT_KHR, (cl_context_properties)hGLRC, + CL_WGL_HDC_KHR, (cl_context_properties)hDC, + 0 + }; + + // + // create context + // + skc_context_t context; + + skc_err err = skc_context_create(&context,"Intel","Graphics",context_properties); + + // + // associate + // + skc_interop_register(context); + + // + // create path builder + // + skc_path_builder_t path_builder; + + err = skc_path_builder_create(context,&path_builder); + + // + // create raster builder + // + skc_raster_builder_t raster_builder; + + err = skc_raster_builder_create(context,&raster_builder); + + // + // create a composition + // + skc_composition_t composition; + + err = skc_composition_create(context,&composition); + + // + // create a styling instance + // + skc_styling_t styling; + + err = skc_styling_create(context, + &styling, + svg_doc_layer_count(svg_doc), + 1000, + 2 * 1024 * 1024); + + // + // create a surface + // + skc_surface_t surface; + + err = skc_surface_create(context,&surface); + + // + // create a transform stack + // + struct skc_transform_stack * ts = skc_transform_stack_create(32); + + // prime the transform stack with subpixel scale + skc_transform_stack_push_scale(ts,32.0,32.0); + + // + // rasterize, render and reclaim svg until escape + // + while (!glfwWindowShouldClose(window)) + { + // save stack + uint32_t const ts_save = skc_transform_stack_save(ts); + + // poll glfw + skc_interop_poll(window,ts); + + // decode paths + skc_path_t * paths = svg_doc_paths_decode(svg_doc,path_builder); + + // decode rasters + skc_raster_t * rasters = svg_doc_rasters_decode(svg_doc,ts,paths,raster_builder); + + // restore the transform stack + skc_transform_stack_restore(ts,ts_save); + + // decode layers -- places rasters + svg_doc_layers_decode(svg_doc,rasters,composition,styling,true/*is_srgb*/); + + // seal the composition + skc_composition_seal(composition); + + bool quit = false; + uint32_t const clip[] = { 0, 0, 65535, 65535 }; // tile clip is <= 9 bits (512) + + // render the styled composition to the surface + skc_surface_render(surface,clip,styling,composition, + is_render_complete,&quit, + skc_interop_get_fb(window)); + + // release the paths + svg_doc_paths_release(svg_doc,paths,context); + + // rasters have been released + svg_doc_rasters_release(svg_doc,rasters,context); + + // spin until framebuffer is rendered + while (!quit) { + // fprintf(stderr,"WAITING ON: !quit\n"); + skc_context_wait(context); + } + + // blit and swap + skc_interop_blit(window); + + // print out some useful debug info + skc_runtime_cl_12_debug(context); + + // rewind the doc + svg_doc_rewind(svg_doc); + + // + // I don't like this being here + // + float const rgba[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + uint32_t rect[4] = { 0 }; + + skc_interop_get_dim(rect+2); + + skc_surface_clear(surface,rgba,rect, + skc_interop_get_fb(window)); + + // exit(EXIT_SUCCESS); + + // reset styling + skc_styling_reset(styling); + + // unseal the composition + skc_composition_unseal(composition,true); + } + + // + // dispose of mundane resources + // + skc_transform_stack_release(ts); + + // + // dispose of all SKC resources + // + err = skc_surface_release(surface); + err = skc_styling_release(styling); + err = skc_composition_release(composition); + err = skc_raster_builder_release(raster_builder); + err = skc_path_builder_release(path_builder); + err = skc_context_release(context); + + // + // GLFW CLEANUP + // + glfwDestroyWindow(window); + glfwTerminate(); + + // + // + // + return EXIT_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/make_all.bat b/src/compute/skc/make_all.bat new file mode 100644 index 0000000000..4772cc73b4 --- /dev/null +++ b/src/compute/skc/make_all.bat @@ -0,0 +1,15 @@ +@ECHO OFF
+
+CMD /C make_inl_cl.bat block_pool_init.cl
+CMD /C make_inl_cl.bat fills_expand.cl
+CMD /C make_inl_cl.bat paths_copy.cl
+CMD /C make_inl_cl.bat rasterize.cl
+CMD /C make_inl_cl.bat segment_ttrk.cl
+CMD /C make_inl_cl.bat rasters_alloc.cl
+CMD /C make_inl_cl.bat prefix.cl
+CMD /C make_inl_cl.bat place.cl
+CMD /C make_inl_cl.bat segment_ttck.cl
+CMD /C make_inl_cl.bat render.cl
+CMD /C make_inl_cl.bat paths_reclaim.cl
+CMD /C make_inl_cl.bat rasters_reclaim.cl
+
diff --git a/src/compute/skc/make_inl_cl.bat b/src/compute/skc/make_inl_cl.bat new file mode 100644 index 0000000000..777a5f3bc2 --- /dev/null +++ b/src/compute/skc/make_inl_cl.bat @@ -0,0 +1,72 @@ +@ECHO OFF
+
+SET OPENCL_STD=-cl-std=CL1.2
+SET OPENCL_PRE=__OPENCL_C_VERSION__=120
+
+:: OPENCL_STD=-cl-std=CL2.0
+:: OPENCL_PRE=__OPENCL_C_VERSION__=200
+
+::
+::
+::
+
+SET IOC=ioc64
+
+::
+::
+::
+
+SET IOC_IR_OPTS_OPT=%OPENCL_STD% -cl-single-precision-constant -cl-denorms-are-zero -cl-mad-enable -cl-no-signed-zeros -cl-fast-relaxed-math -cl-kernel-arg-info
+
+SET IOC_IR_OPTS_DBG=%OPENCL_STD% -cl-kernel-arg-info -g
+
+SET IOC_IR_OPTS=%IOC_IR_OPTS_OPT%
+
+::
+::
+::
+
+SET PRE_DIR=%~p1
+
+CD %PRE_DIR%
+
+SET PRE_CL=%~n1
+SET PRE_CL=%PRE_CL%.pre.cl
+
+SET PRE_SRC_INL=%~n1
+SET PRE_SRC_INL=%PRE_SRC_INL%.pre.src.inl
+
+SET PRE_BIN_IR=%~n1
+SET PRE_BIN_IR=%PRE_BIN_IR%.pre.ir
+
+SET PRE_BIN_INL=%~n1
+SET PRE_BIN_INL=%PRE_BIN_INL%.pre.bin.inl
+
+::
+:: *.pre.cl
+:: *.pre.src.inl
+::
+
+CMD /C cl -I . -I .. -I "%INTELOCLSDKROOT%\include" -D %OPENCL_PRE% -EP %1 -P -Fi"%PRE_CL%"
+CMD /C clang-format -style=Mozilla -i %PRE_CL%
+CMD /C dos2unix -q %PRE_CL%
+CMD /C xxd -i %PRE_CL% %PRE_SRC_INL%
+
+echo %PRE_CL%
+echo %PRE_SRC_INL%
+
+::
+:: *.pre.cl
+:: *.pre.src.inl
+::
+
+CMD /C touch %PRE_BIN_IR%
+ECHO ON
+@CMD /C %IOC% -cmd=build -bo="%IOC_IR_OPTS%" -device=gpu -input=%PRE_CL% -ir=%PRE_BIN_IR%
+@ECHO OFF
+CMD /C xxd -i %PRE_BIN_IR% %PRE_BIN_INL%
+
+echo %PRE_BIN_IR%
+echo %PRE_BIN_INL%
+
+
diff --git a/src/compute/skc/path.h b/src/compute/skc/path.h new file mode 100644 index 0000000000..effcb052db --- /dev/null +++ b/src/compute/skc/path.h @@ -0,0 +1,115 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_PATH +#define SKC_ONCE_PATH + +// +// +// + +#include "block.h" + +// +// +// + +union skc_path_header +{ + skc_uint4 u32v4; + + struct { + skc_uint handle; // host handle + skc_uint blocks; // # of S-segment blocks in path + skc_uint nodes; // # of S-segment node blocks -- not including header + skc_uint prims; // # of path elements: lines, quads, cubics, rat-quads, rat-cubics + }; +}; + +union skc_path_bounds +{ + skc_float4 f32v4; + + struct { + skc_float x0; + skc_float y0; + skc_float x1; + skc_float y1; + }; +}; + +// +// This head structure aliases a block. +// +// Blocks are at least 16 words. +// + +struct skc_path_head +{ + union skc_path_header header; // 4 + union skc_path_bounds bounds; // 4 + union skc_tagged_block_id tag_ids[]; // 8+ ids +}; + +#define SKC_PATH_HEAD_WORDS 8 + +#define SKC_PATH_HEAD_OFFSET_HANDLE 0 +#define SKC_PATH_HEAD_OFFSET_BLOCKS 1 +#define SKC_PATH_HEAD_OFFSET_NODES 2 +#define SKC_PATH_HEAD_OFFSET_PRIMS 3 + +#define SKC_PATH_HEAD_OFFSET_IDS 8 + +#define SKC_PATH_HEAD_WORDS_CALC (sizeof(struct skc_path_head) / sizeof(skc_uint)) +#define SKC_PATH_HEAD_OFFSET_HANDLE_CALC (SKC_OFFSET_OF(struct skc_path_head,header.handle) / sizeof(skc_uint)) +#define SKC_PATH_HEAD_OFFSET_BLOCKS_CALC (SKC_OFFSET_OF(struct skc_path_head,header.blocks) / sizeof(skc_uint)) +#define SKC_PATH_HEAD_OFFSET_NODES_CALC (SKC_OFFSET_OF(struct skc_path_head,header.nodes) / sizeof(skc_uint)) +#define SKC_PATH_HEAD_OFFSET_PRIMS_CALC (SKC_OFFSET_OF(struct skc_path_head,header.prims) / sizeof(skc_uint)) +#define SKC_PATH_HEAD_OFFSET_IDS_CALC (SKC_OFFSET_OF(struct skc_path_head,tag_ids) / sizeof(skc_uint)) + +// +// NOT ALL OPENCL PREPROCESSORS ARE HAPPY WITH CALCULATING OFFSET_OF() +// +// - Intel ioc compiler failed in the past +// + +#if !defined(__OPENCL_C_VERSION__) +SKC_STATIC_ASSERT(SKC_PATH_HEAD_WORDS == SKC_PATH_HEAD_WORDS_CALC); +SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_HANDLE == SKC_PATH_HEAD_OFFSET_HANDLE_CALC); +SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_BLOCKS == SKC_PATH_HEAD_OFFSET_BLOCKS_CALC); +SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_NODES == SKC_PATH_HEAD_OFFSET_NODES_CALC); +SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_PRIMS == SKC_PATH_HEAD_OFFSET_PRIMS_CALC); +SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_IDS == SKC_PATH_HEAD_OFFSET_IDS_CALC); +#endif + +// +// This node structure aliases a block. +// +// Blocks are at least 16 words. +// +// The last word in the block points to the next block +// +// The tag indicating a 'next' pointer is zero. +// + +#if !defined(__OPENCL_C_VERSION__) +struct skc_path_node +{ + union skc_tagged_block_id tag_ids[]; +}; +#endif + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/path_builder.c b/src/compute/skc/path_builder.c new file mode 100644 index 0000000000..15372de076 --- /dev/null +++ b/src/compute/skc/path_builder.c @@ -0,0 +1,272 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "path_builder.h" +#include "context.h" + +// +// +// + +skc_err +skc_path_builder_retain(skc_path_builder_t path_builder) +{ + ++path_builder->refcount; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_path_builder_release(skc_path_builder_t path_builder) +{ + SKC_ASSERT_STATE_ASSERT(SKC_PATH_BUILDER_STATE_READY,path_builder); + + path_builder->release(path_builder->impl); + + return SKC_ERR_SUCCESS; +} + +// +// PATH BODY +// + +skc_err +skc_path_begin(skc_path_builder_t path_builder) +{ + SKC_ASSERT_STATE_TRANSITION(SKC_PATH_BUILDER_STATE_READY, + SKC_PATH_BUILDER_STATE_BUILDING, + path_builder); + + // init path builder counters + path_builder->line .rem = 0; + path_builder->quad .rem = 0; + path_builder->cubic.rem = 0; + + // begin the path + path_builder->begin(path_builder->impl); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_path_end(skc_path_builder_t path_builder, skc_path_t * path) +{ + SKC_ASSERT_STATE_TRANSITION(SKC_PATH_BUILDER_STATE_BUILDING, + SKC_PATH_BUILDER_STATE_READY, + path_builder); + + // update path header with proper counts + path_builder->end(path_builder->impl,path); + + return SKC_ERR_SUCCESS; +} + +// +// PATH SEGMENT OPS +// + +static +void +skc_path_move_to_1(skc_path_builder_t path_builder, + float x0, float y0) +{ + path_builder->curr[0].x = x0; + path_builder->curr[0].y = y0; + path_builder->curr[1].x = x0; + path_builder->curr[1].y = y0; +} + +static +void +skc_path_move_to_2(skc_path_builder_t path_builder, + float x0, float y0, + float x1, float y1) +{ + path_builder->curr[0].x = x0; + path_builder->curr[0].y = y0; + path_builder->curr[1].x = x1; + path_builder->curr[1].y = y1; +} + +skc_err +skc_path_move_to(skc_path_builder_t path_builder, + float x0, float y0) +{ + skc_path_move_to_1(path_builder,x0,y0); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_path_close(skc_path_builder_t path_builder) +{ + // + // FIXME -- CLARIFY WHY SUBTLE AUTO-CLOSE BEHAVIORS _DON'T BELONG_ + // IN THE SKIA COMPUTE LAYER + // + // OR, BETTER YET, GET RID OF THIS FUNC ENTIRELY + // + return SKC_ERR_NOT_IMPLEMENTED; +} + +skc_err +skc_path_line_to(skc_path_builder_t path_builder, + float x1, float y1) +{ + if (path_builder->line.rem == 0) { + path_builder->new_line(path_builder->impl); + } + + --path_builder->line.rem; + + *path_builder->line.coords[0]++ = path_builder->curr[0].x; + *path_builder->line.coords[1]++ = path_builder->curr[0].y; + *path_builder->line.coords[2]++ = x1; + *path_builder->line.coords[3]++ = y1; + + skc_path_move_to_1(path_builder,x1,y1); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_path_quad_to(skc_path_builder_t path_builder, + float x1, float y1, + float x2, float y2) +{ + if (path_builder->quad.rem == 0) { + path_builder->new_quad(path_builder->impl); + } + + --path_builder->quad.rem; + + *path_builder->quad.coords[0]++ = path_builder->curr[0].x; + *path_builder->quad.coords[1]++ = path_builder->curr[0].y; + *path_builder->quad.coords[2]++ = x1; + *path_builder->quad.coords[3]++ = y1; + *path_builder->quad.coords[4]++ = x2; + *path_builder->quad.coords[5]++ = y2; + + skc_path_move_to_2(path_builder,x2,y2,x1,y1); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_path_quad_smooth_to(skc_path_builder_t path_builder, + float x2, float y2) +{ + float const x1 = path_builder->curr[0].x * 2.0f - path_builder->curr[1].x; + float const y1 = path_builder->curr[0].y * 2.0f - path_builder->curr[1].y; + + return skc_path_quad_to(path_builder,x1,y1,x2,y2); +} + +skc_err +skc_path_cubic_to(skc_path_builder_t path_builder, + float x1, float y1, + float x2, float y2, + float x3, float y3) +{ + if (path_builder->cubic.rem == 0) { + path_builder->new_cubic(path_builder->impl); + } + + --path_builder->cubic.rem; + + *path_builder->cubic.coords[0]++ = path_builder->curr[0].x; + *path_builder->cubic.coords[1]++ = path_builder->curr[0].y; + *path_builder->cubic.coords[2]++ = x1; + *path_builder->cubic.coords[3]++ = y1; + *path_builder->cubic.coords[4]++ = x2; + *path_builder->cubic.coords[5]++ = y2; + *path_builder->cubic.coords[6]++ = x3; + *path_builder->cubic.coords[7]++ = y3; + + skc_path_move_to_2(path_builder,x3,y3,x2,y2); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_path_cubic_smooth_to(skc_path_builder_t path_builder, + float x2, float y2, + float x3, float y3) +{ + float const x1 = path_builder->curr[0].x * 2.0f - path_builder->curr[1].x; + float const y1 = path_builder->curr[0].y * 2.0f - path_builder->curr[1].y; + + return skc_path_cubic_to(path_builder,x1,y1,x2,y2,x3,y3); +} + +// +// FIXME -- add rational quad and cubic support and move primitives +// like ellipse into an adapter. They do *not* belong in the core API. +// + +skc_err +skc_path_ellipse(skc_path_builder_t path_builder, + float cx, float cy, + float rx, float ry) +{ + // + // FIXME -- we can implement this with rationals later... + // + + // + // Approximate a circle with 4 cubics: + // + // http://en.wikipedia.org/wiki/B%C3%A9zier_spline#Approximating_circular_arcs + // + skc_path_move_to_1(path_builder, cx, cy + ry); + +#define KAPPA_FLOAT 0.55228474983079339840f // moar digits! + + float const kx = rx * KAPPA_FLOAT; + float const ky = ry * KAPPA_FLOAT; + + skc_err err; + + err = skc_path_cubic_to(path_builder, + cx + kx, cy + ry, + cx + rx, cy + ky, + cx + rx, cy); + + if (err) + return err; + + err = skc_path_cubic_to(path_builder, + cx + rx, cy - ky, + cx + kx, cy - ry, + cx, cy - ry); + + if (err) + return err; + + err = skc_path_cubic_to(path_builder, + cx - kx, cy - ry, + cx - rx, cy - ky, + cx - rx, cy); + + if (err) + return err; + + err = skc_path_cubic_to(path_builder, + cx - rx, cy + ky, + cx - kx, cy + ry, + cx, cy + ry); + return err; +} + +// +// +// diff --git a/src/compute/skc/path_builder.h b/src/compute/skc/path_builder.h new file mode 100644 index 0000000000..c8e36dfbdf --- /dev/null +++ b/src/compute/skc/path_builder.h @@ -0,0 +1,85 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "assert_state.h" + +// +// +// + +typedef enum skc_path_builder_state_e { + + SKC_PATH_BUILDER_STATE_READY, + SKC_PATH_BUILDER_STATE_BUILDING + +} skc_path_builder_state_e; + +// +// FIXME -- we might be able to bury more of this in the impl +// + +struct skc_coords_rem_count_line +{ + skc_uint rem; + skc_float * coords[4]; +}; + +struct skc_coords_rem_count_quad +{ + skc_uint rem; + skc_float * coords[6]; +}; + +struct skc_coords_rem_count_cubic +{ + skc_uint rem; + skc_float * coords[8]; +}; + +// +// +// + +struct skc_path_builder +{ + struct skc_context * context; + + struct skc_path_builder_impl * impl; + + void (* begin )(struct skc_path_builder_impl * const impl); + void (* end )(struct skc_path_builder_impl * const impl, skc_path_t * const path); + void (* new_line )(struct skc_path_builder_impl * const impl); + void (* new_quad )(struct skc_path_builder_impl * const impl); + void (* new_cubic)(struct skc_path_builder_impl * const impl); + void (* release )(struct skc_path_builder_impl * const impl); + + struct skc_coords_rem_count_line line; + struct skc_coords_rem_count_quad quad; + struct skc_coords_rem_count_cubic cubic; + + struct { + float x; + float y; + } curr[2]; + + skc_uint refcount; + + SKC_ASSERT_STATE_DECLARE(skc_path_builder_state_e); +}; + +// +// +// + diff --git a/src/compute/skc/path_builder_cl_12.c b/src/compute/skc/path_builder_cl_12.c new file mode 100644 index 0000000000..e915dffada --- /dev/null +++ b/src/compute/skc/path_builder_cl_12.c @@ -0,0 +1,1443 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <float.h> +#include <stdio.h> + +#include "common/cl/assert_cl.h" + +#include "context.h" +#include "handle.h" +#include "grid.h" +#include "path.h" +#include "path_builder.h" + +#include "config_cl.h" +#include "export_cl_12.h" +#include "runtime_cl_12.h" +#include "path_builder_cl_12.h" + +// +// OpenCL 1.2 devices support mapping of buffers into the host address +// space. +// +// Mapped buffers must be aligned on MIN_DATA_TYPE_ALIGN_SIZE bit +// boundary (e.g. 128 bytes). This complicates coordinating sharing +// of data between the host and the device. +// +// Some OpenCL 2.0 devices support fine-grained shared virtual memory +// pointers with byte-addressing and allow simpler coordination +// strategies at the cost of maintaining cache coherency. +// +// The path builder is focused on moving bulk path data from the host +// into the device-managed "block" memory pool and arranging it into a +// SIMT/SIMD-friendly data structure that can be efficiently read by +// the rasterizer. +// +// Note that one simplifying assumption is that the maximum length of +// a *single* path can't be larger than what fits in the single extent +// (which is split into M subbuffers). This would be a very long path +// and a legitimate size limitation. +// +// For some systems, it may be appropriate to never pull path data +// into the device-managed block pool and instead present the path +// data to the device in a temporarily available allocated memory +// "zone" of paths that can be discarded all at once. +// +// For other systems, it may be appropriate to simply copy the path +// data from host to device. +// +// But the majority of OpenCL (and VK, MTL, DX12) devices we'll be +// targeting support basic map/unmap functionality similar to OpenCL +// 1.2. Furthermore, not all OpenCL 2.0 devices support fine-grained +// sharing of memory and still require a map/unmap step... but note +// that they all support byte-aligned mapping and subbuffers. +// +// The general strategy that this particular CL_12 implementation uses +// is to allocate a large mappable bulk-data path buffer and an +// auxilary mappable command buffer. +// +// The buffers are split into a reasonable number of properly aligned +// subbuffers to enable simultaneous host and device access. +// + +// +// Blocks: +// 1 extent +// M mapped subbuffers (configurable) to allow for concurrency +// +// Commands: +// 1 extent +// M mapped subbuffers (configurable) to allow for concurrency +// +// Spans: +// M hi/lo structures +// +// { cl_sub, void*, event, base } +// +// - size of sub buffer +// - remaining +// +// - counts +// + +// +// For any kernel launch, at most one path will be discontiguous and +// defined across two sub-buffers. +// +// Nodes are updated locally until full and then stored so they will +// never be incomplete. Headers are stored locally until the path is +// ended so they will never be incomplete. +// +// A line, quad or cubic acquires 4/6/8 segments which may be spread +// across one or more congtiguous blocks. +// +// If a flush() occurs then the remaining columns of multi-segment +// paths are initialized with zero-length line, quad, cubic elements. +// +// Every block's command word has a type and a count acquired from a +// rolling counter. +// +// The kernel is passed two spans of blocks { base, count } to +// process. The grid is must process (lo.count + hi.count) blocks. +// + +struct skc_subbuffer_blocks +{ + cl_mem device; + void * host; +}; + +struct skc_subbuffer_cmds +{ + cl_mem device; + void * host; + cl_event map; +}; + +// +// ringdex is an index with range [0, blocks-per-subbuf * subbufs-per-buffer ) +// + +typedef skc_uint skc_ringdex_t; + +union skc_ringdex_expand +{ + div_t qr; + + struct { +#ifndef SKC_DIV_REM_BEFORE_QUOT // offsetof(div_t,quot) != 0 + skc_uint subbuf; + skc_uint block; +#else + skc_uint block; + skc_uint subbuf; +#endif + }; +}; + +// +// this record is executed by the grid +// + +struct skc_release_record +{ + struct skc_path_builder_impl * impl; // back pointer to impl + + skc_grid_t grid; // pointer to scheduled grid + + skc_uint from; // inclusive starting index : [from,to) + skc_uint to; // non-inclusive ending index : [from,to) +}; + +// +// +// + +struct skc_path_builder_impl +{ + struct skc_path_builder * path_builder; + + struct skc_runtime * runtime; + + cl_command_queue cq; + + struct { + cl_kernel alloc; + cl_kernel copy; + } kernels; + + // + // FIXME -- make this pointer to constant config + // + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + struct { + skc_uint subbufs; // how many subbufs in the buffer? + + struct { + skc_uint buffer; // how many blocks in the buffer? + skc_uint subbuf; // how many blocks in a subbuf? + } blocks_per; + } ring; + // + // ^^^^^^^^^^^ don't duplicate these constants ^^^^^^^^^^^^^^^^^^ + // + + struct { + cl_mem buffer; // backing buffer for blocks + struct skc_subbuffer_blocks * subbufs; // array of structures + } blocks; + + struct { + cl_mem buffer; // backing buffer for commands + struct skc_subbuffer_cmds * subbufs; // array of structures + } cmds; + + struct { + struct skc_release_record * records; // max release records is equal to max subbufs + skc_path_t * paths; // max paths is less than or equal to max commands + } release; + + cl_mem reads; // each kernel only requires one word to store the block pool "base" + + struct { + skc_uint rolling; // rolling counter used by cmds to map to block pool alloc + skc_ringdex_t from; + skc_ringdex_t to; + } prev; + + struct { + skc_ringdex_t from; + skc_ringdex_t to; + } curr; + + struct { + struct skc_path_head * head; // pointer to local path header -- not written until path end + struct skc_path_node * node; // pointer to local node -- may alias head until head is full + + struct { + skc_uint rolling; // rolling counter of wip node -- valid after one node is allocated + union skc_tagged_block_id * next; // next slot in node -- may initially point to head.ids + skc_uint rem; // how many id slots left in node block + } ids; + + struct { + skc_uint rem; // how many subblocks left in block? + skc_uint rolling; // rolling counter of block of subblocks + float * next; // next subblock in current subblock block + skc_uint idx; // index of next subblock + } subblocks; + + struct { + skc_uint one; // .block = 1 + skc_uint next; // rolling counter used by cmds to map to block pool alloc + } rolling; + + skc_ringdex_t to; // ringdex of _next_available_ command/block in ring -- FIXME -- should be current + } wip; +}; + +// +// FIXME -- move to a pow2 subbuffer size and dispense with division +// and modulo operations +// + +static +union skc_ringdex_expand +skc_ringdex_expand(struct skc_path_builder_impl * const impl, + skc_ringdex_t const ringdex) +{ + return (union skc_ringdex_expand){ + .qr = div(ringdex,impl->ring.blocks_per.subbuf) + }; +} + +static +void +skc_ringdex_wip_to_block_inc(struct skc_path_builder_impl * const impl) +{ + // + // FIXME - which is faster? + // +#if 1 + impl->wip.to = (impl->wip.to + 1) % impl->ring.blocks_per.buffer; +#else + impl->wip.to -= (impl->wip.to < impl->ring.blocks_per.buffer) ? -1 : impl->wip.to; +#endif + + // this path is too long -- for now assert() and die + assert(impl->wip.to != impl->curr.from); +} + +static +skc_ringdex_t +skc_ringdex_span(struct skc_path_builder_impl * const impl, + skc_ringdex_t const from, + skc_ringdex_t const to) +{ + return (to - from) % impl->ring.blocks_per.buffer; +} + +static +void +skc_ringdex_wip_to_subbuf_inc(struct skc_path_builder_impl * const impl) +{ + union skc_ringdex_expand const to = skc_ringdex_expand(impl,impl->wip.to); + + // nothing to do if this is the first block in the subbuf + if (to.block == 0) + return; + + skc_uint const new_subbuf = (to.subbuf + 1) % impl->ring.subbufs; + + // otherwise increment and mod + impl->wip.to = new_subbuf * impl->ring.blocks_per.subbuf; +} + +static +skc_bool +skc_ringdex_curr_is_equal(struct skc_path_builder_impl * const impl) +{ + return impl->curr.from == impl->curr.to; +} + +static +skc_bool +skc_ringdex_prev_is_equal(struct skc_path_builder_impl * const impl) +{ + return impl->prev.from == impl->prev.to; +} + +static +skc_uint +skc_ringdex_dont_map_last(struct skc_path_builder_impl * const impl, + skc_uint const to_block) +{ + // no blocks acquired OR this is last block in subbuf + return !((impl->wip.to == impl->curr.to) || (to_block == 0)); +} + +// +// +// + +static +struct skc_release_record * +skc_release_curr(struct skc_path_builder_impl * const impl) +{ + union skc_ringdex_expand curr_from = skc_ringdex_expand(impl,impl->curr.from); + + return impl->release.records + curr_from.subbuf; +} + +// +// FIXME -- get rid of all distant config references -- grab them at all at creation time +// + +static +void +skc_path_builder_pfn_begin(struct skc_path_builder_impl * const impl) +{ + // init header counters // { handle, blocks, nodes, prims } + impl->wip.head->header = (union skc_path_header){ + .handle = 0, + .blocks = 0, + .nodes = 0, + .prims = 0 + }; + + // FIXME -- BOUNDS SHOULD USE SIMD4 TRICK AND NEGATE ONE OF THE CORNERS + impl->wip.head->bounds = (union skc_path_bounds){ +FLT_MIN, +FLT_MIN, -FLT_MIN, -FLT_MIN }; + + // point wip ids at local head node + impl->wip.ids.next = impl->wip.head->tag_ids; // point to local head node + impl->wip.ids.rem = impl->runtime->config->block.words - SKC_PATH_HEAD_WORDS; // FIXME -- save this constant somewhere + + // start with no subblocks + impl->wip.subblocks.rem = 0; +} + +// +// +// + +static +void +skc_path_builder_impl_finalize_node(struct skc_path_builder_impl * const impl) +{ +#if 1 + // + // FIXME -- a Duff's device might be optimal here but would have to + // be customized per device since node's could be 16-128+ words + // + while (impl->wip.ids.rem > 0) + { + impl->wip.ids.rem -= 1; + impl->wip.ids.next->u32 = SKC_TAGGED_BLOCK_ID_INVALID; + impl->wip.ids.next += 1; + } +#else + memset(&impl->wip.ids.next->u32, + SKC_TAGGED_BLOCK_ID_INVALID, // 0xFF + sizeof(impl->wip.ids.next->u32) * impl->wip.ids.rem); + + impl->wip.ids.next += impl->wip.ids.rem; + impl->wip.ids.rem = 0; +#endif +} + +// +// +// + +static +void +skc_zero_float(skc_float * p, skc_uint rem) +{ + memset(p,0,sizeof(*p)*rem); +} + +static +void +skc_path_builder_finalize_subblocks(struct skc_path_builder * const path_builder) +{ + // + // FIXME -- it might be more performant to zero the remaining + // columns in a subblock -- a subblock at a time -- instead of the + // same column across all the subblocks + // +#if 0 + while (path_builder->line.rem > 0) + { + --path_builder->line.rem; + + *path_builder->line.coords[0]++ = 0.0f; + *path_builder->line.coords[1]++ = 0.0f; + *path_builder->line.coords[2]++ = 0.0f; + *path_builder->line.coords[3]++ = 0.0f; + } + + while (path_builder->quad.rem > 0) + { + --path_builder->quad.rem; + + *path_builder->line.coords[0]++ = 0.0f; + *path_builder->line.coords[1]++ = 0.0f; + *path_builder->line.coords[2]++ = 0.0f; + *path_builder->line.coords[3]++ = 0.0f; + *path_builder->line.coords[4]++ = 0.0f; + *path_builder->line.coords[5]++ = 0.0f; + } + + while (path_builder->cubic.rem > 0) + { + --path_builder->cubic.rem; + + *path_builder->line.coords[0]++ = 0.0f; + *path_builder->line.coords[1]++ = 0.0f; + *path_builder->line.coords[2]++ = 0.0f; + *path_builder->line.coords[3]++ = 0.0f; + *path_builder->line.coords[4]++ = 0.0f; + *path_builder->line.coords[5]++ = 0.0f; + *path_builder->line.coords[6]++ = 0.0f; + *path_builder->line.coords[7]++ = 0.0f; + } +#else + if (path_builder->line.rem > 0) + { + skc_zero_float(path_builder->line.coords[0],path_builder->line.rem); + skc_zero_float(path_builder->line.coords[1],path_builder->line.rem); + skc_zero_float(path_builder->line.coords[2],path_builder->line.rem); + skc_zero_float(path_builder->line.coords[3],path_builder->line.rem); + + path_builder->line.rem = 0; + } + + if (path_builder->quad.rem > 0) + { + skc_zero_float(path_builder->quad.coords[0],path_builder->quad.rem); + skc_zero_float(path_builder->quad.coords[1],path_builder->quad.rem); + skc_zero_float(path_builder->quad.coords[2],path_builder->quad.rem); + skc_zero_float(path_builder->quad.coords[3],path_builder->quad.rem); + skc_zero_float(path_builder->quad.coords[4],path_builder->quad.rem); + skc_zero_float(path_builder->quad.coords[5],path_builder->quad.rem); + + path_builder->quad.rem = 0; + } + + if (path_builder->cubic.rem > 0) + { + skc_zero_float(path_builder->cubic.coords[0],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[1],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[2],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[3],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[4],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[5],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[6],path_builder->cubic.rem); + skc_zero_float(path_builder->cubic.coords[7],path_builder->cubic.rem); + + path_builder->cubic.rem = 0; + } +#endif +} + +// +// +// + +static +void +skc_path_builder_impl_unmap(struct skc_path_builder_impl * const impl, + skc_uint from, + skc_uint to) +{ + // to might be out of range + to = to % impl->ring.subbufs; + +#if 0 + fprintf(stderr,"unmap: [%2u,%2u)\n",from,to); +#endif + + while (from != to) // 'to' might be out of range + { + // bring 'from' back in range + from = from % impl->ring.subbufs; + + struct skc_subbuffer_blocks * const blocks = impl->blocks.subbufs + from; + struct skc_subbuffer_cmds * const cmds = impl->cmds .subbufs + from; + + cl(EnqueueUnmapMemObject(impl->cq, + blocks->device, + blocks->host, + 0,NULL,NULL)); + + cl(EnqueueUnmapMemObject(impl->cq, + cmds->device, + cmds->host, + 0,NULL,NULL)); + + // bring from back in range + from = ++from % impl->ring.subbufs; + } +} + +// +// FIXME -- reuse this in create() +// + +static +void +skc_path_builder_impl_map(struct skc_path_builder_impl * const impl, + skc_uint from, + skc_uint to) +{ + // to might be out of range + to = to % impl->ring.subbufs; + +#if 0 + fprintf(stderr," map: [%2u,%2u)\n",from,to); +#endif + + while (from != to) + { + cl_int cl_err; + + struct skc_subbuffer_blocks * const blocks = impl->blocks.subbufs + from; + struct skc_subbuffer_cmds * const cmds = impl->cmds .subbufs + from; + + blocks->host = clEnqueueMapBuffer(impl->cq, + blocks->device, + CL_FALSE, + CL_MAP_WRITE_INVALIDATE_REGION, + 0,impl->runtime->config->paths_copy.block.subbuf, + 0,NULL,NULL, + &cl_err); cl_ok(cl_err); + + cl(ReleaseEvent(cmds->map)); + + cmds->host = clEnqueueMapBuffer(impl->cq, + cmds->device, + CL_FALSE, + CL_MAP_WRITE_INVALIDATE_REGION, + 0,impl->runtime->config->paths_copy.command.subbuf, + 0,NULL,&cmds->map, + &cl_err); cl_ok(cl_err); + + // bring from back in range + from = ++from % impl->ring.subbufs; + } + // + // FIXME -- when we switch to out of order queues we'll need a barrier here + // +} + +// +// +// + +static +void +skc_path_builder_release_dispose(struct skc_release_record * const release, + struct skc_path_builder_impl * const impl) +{ + struct skc_runtime * runtime = impl->runtime; + + if (release->from <= release->to) // no wrap + { + skc_path_t const * paths = impl->release.paths + release->from; + skc_uint count = release->to - release->from; + + skc_grid_deps_unmap(runtime->deps,paths,count); + skc_runtime_path_device_release(runtime,paths,count); + } + else // from > to implies wrap + { + skc_path_t const * paths_lo = impl->release.paths + release->from; + skc_uint count_lo = impl->ring.blocks_per.buffer - release->from; + + skc_grid_deps_unmap(runtime->deps,paths_lo,count_lo); + skc_runtime_path_device_release(runtime,paths_lo,count_lo); + + skc_grid_deps_unmap(runtime->deps,impl->release.paths,release->to); + skc_runtime_path_device_release(runtime,impl->release.paths,release->to); + } + + release->to = release->from; +} + +static +void +skc_path_builder_grid_pfn_dispose(skc_grid_t const grid) +{ + struct skc_release_record * const release = skc_grid_get_data(grid); + struct skc_path_builder_impl * const impl = release->impl; + + skc_path_builder_release_dispose(release,impl); +} + +static +void +// skc_path_builder_complete(struct skc_release_record * const release) +skc_path_builder_complete(skc_grid_t grid) +{ + // + // notify deps that this grid is complete enough for other grids to + // proceed + // + // the path builder still has some cleanup to do before all its + // resources can be reused + // + skc_grid_complete(grid); +} + +static +void +skc_path_builder_paths_copy_cb(cl_event event, cl_int status, skc_grid_t grid) +{ + SKC_CL_CB(status); + + struct skc_release_record * const release = skc_grid_get_data(grid); + + SKC_SCHEDULER_SCHEDULE(release->impl->runtime->scheduler,skc_path_builder_complete,grid); +} + +// +// +// + +static +void +skc_path_builder_grid_pfn_waiting(skc_grid_t const grid) +{ + struct skc_release_record * const release = skc_grid_get_data(grid); + struct skc_path_builder_impl * const impl = release->impl; + + // 1. flush incomplete subblocks of path elements + // 2. unmap subbuffer on cq.unmap + // 3. flush cq.unmap + // 4. launch kernel on cq.kernel but wait for unmap completion + // 5. flush cq.kernel + // 6. remap relevant subbuffers on cq.map but wait for kernel completion + // 7. flush cq.map + + // + // FIXME -- can be smarter about flushing if the wip paths are not + // in the same subbuf as curr.to + // + // THIS IS IMPORTANT TO FIX + // + + // flush incomplete subblocks + skc_path_builder_finalize_subblocks(impl->path_builder); + + // + // get range of subbufs that need to be unmapped + // + // note that impl->prev subbufs have already been unmapped + // + union skc_ringdex_expand curr_from = skc_ringdex_expand(impl,impl->curr.from); + union skc_ringdex_expand curr_to = skc_ringdex_expand(impl,impl->curr.to); + skc_uint const is_partial = curr_to.block > 0; + skc_uint const unmap_to = curr_to.subbuf + is_partial; + + // + // unmap all subbufs in range [from,to) + // + skc_path_builder_impl_unmap(impl,curr_from.subbuf,unmap_to); + + // + // launch kernels + // + skc_uint const pb_prev_span = skc_ringdex_span(impl,impl->prev.from,impl->prev.to); + skc_uint const pb_curr_span = skc_ringdex_span(impl,impl->curr.from,impl->curr.to); + skc_uint const pb_cmds = pb_prev_span + pb_curr_span; + + // + // 1) allocate blocks from pool + // + + // + // FIXME -- pack integers into struct/vector + // + cl(SetKernelArg(impl->kernels.alloc,0,SKC_CL_ARG(impl->runtime->block_pool.atomics.drw))); + cl(SetKernelArg(impl->kernels.alloc,1,SKC_CL_ARG(impl->reads))); + cl(SetKernelArg(impl->kernels.alloc,2,SKC_CL_ARG(curr_from.subbuf))); + cl(SetKernelArg(impl->kernels.alloc,3,SKC_CL_ARG(pb_cmds))); + + skc_device_enqueue_kernel(impl->runtime->device, + SKC_DEVICE_KERNEL_ID_PATHS_ALLOC, + impl->cq, + impl->kernels.alloc, + 1, + 0,NULL,NULL); + + // + // 2) copy blocks from unmapped device-accessible memory + // + + // + // FIXME -- pack integers into struct/vector and reduce 13 arguments down to 7 + // + cl(SetKernelArg(impl->kernels.copy, 0,SKC_CL_ARG(impl->runtime->handle_pool.map.drw))); + + cl(SetKernelArg(impl->kernels.copy, 1,SKC_CL_ARG(impl->runtime->block_pool.ids.drw))); + cl(SetKernelArg(impl->kernels.copy, 2,SKC_CL_ARG(impl->runtime->block_pool.blocks.drw))); + cl(SetKernelArg(impl->kernels.copy, 3,SKC_CL_ARG(impl->runtime->block_pool.size->ring_mask))); + + cl(SetKernelArg(impl->kernels.copy, 4,SKC_CL_ARG(impl->reads))); + cl(SetKernelArg(impl->kernels.copy, 5,SKC_CL_ARG(curr_from.subbuf))); + + cl(SetKernelArg(impl->kernels.copy, 6,SKC_CL_ARG(impl->cmds.buffer))); + cl(SetKernelArg(impl->kernels.copy, 7,SKC_CL_ARG(impl->blocks.buffer))); + + cl(SetKernelArg(impl->kernels.copy, 8,SKC_CL_ARG(impl->ring.blocks_per.buffer))); + cl(SetKernelArg(impl->kernels.copy, 9,SKC_CL_ARG(impl->prev.rolling))); + + cl(SetKernelArg(impl->kernels.copy,10,SKC_CL_ARG(impl->prev.from))); + cl(SetKernelArg(impl->kernels.copy,11,SKC_CL_ARG(pb_prev_span))); + cl(SetKernelArg(impl->kernels.copy,12,SKC_CL_ARG(impl->curr.from))); + + cl_event complete; + + skc_device_enqueue_kernel(impl->runtime->device, + SKC_DEVICE_KERNEL_ID_PATHS_COPY, + impl->cq, + impl->kernels.copy, + pb_cmds, + 0,NULL,&complete); + + // set a callback on completion + cl(SetEventCallback(complete,CL_COMPLETE, + skc_path_builder_paths_copy_cb, + grid)); + + // immediately release + cl(ReleaseEvent(complete)); + + // + // remap as many subbuffers as possible after the kernel completes + // + // note that remaps are async and enqueued on the same command queue + // as the kernel launch + // + // we can't remap subbuffers that are in the possibly empty range + // + // cases: + // + // - curr.to == wip.to which means no blocks have been acquired + // - curr.to points to first block in (next) subbuf + // - otherwise, wip acquired blocks in the curr.to subbuf + // + // check for these first 2 cases! + // + union skc_ringdex_expand const prev_from = skc_ringdex_expand(impl,impl->prev.from); + skc_uint const no_wip = impl->curr.to == impl->wip.to; + skc_uint map_to = curr_to.subbuf + (is_partial && no_wip); + + // remap all subbufs in range [from,to) + skc_path_builder_impl_map(impl,prev_from.subbuf,map_to); + + // flush command queue + cl(Flush(impl->cq)); + + // save rolling + impl->prev.rolling = impl->wip.rolling.next; + + // update prev and curr + if (no_wip) + { + // + // if there was no wip then round up to the next subbuf + // + skc_ringdex_wip_to_subbuf_inc(impl); + + // + // update prev/curr with with incremented wip + // + impl->prev.from = impl->prev.to = impl->wip.to; + impl->curr.from = impl->curr.to = impl->wip.to; + } + else + { + // + // update prev with wip partials + // + impl->prev.from = impl->curr.to; + impl->prev.to = impl->wip .to; + + // + // start curr on a new subbuf boundary + // + skc_ringdex_wip_to_subbuf_inc(impl); + + impl->curr.from = impl->wip.to; + impl->curr.to = impl->wip.to; + } +} + +// +// +// + +static +void +skc_path_builder_impl_acquire_subbuffer(struct skc_path_builder_impl * const impl, + skc_uint const subbuf) +{ + // + // FIXME -- move to a power-of-two subbuf size and kickstart path + // copies as early as possible + // + // FIXME -- the subbufs "self-clock" (flow control) the kernel + // launches and accounting. Combine all the subbuffers and release + // records into a single indexable struct instead of 3. + // + struct skc_subbuffer_cmds * const sc = impl->cmds.subbufs + subbuf; + struct skc_release_record * const release = impl->release.records + subbuf; + struct skc_scheduler * const scheduler = impl->runtime->scheduler; + + // can't proceed until the paths have been released + SKC_SCHEDULER_WAIT_WHILE(scheduler,release->from != release->to); + + // throw in a scheduler yield ... FIXME -- get rid of + skc_scheduler_yield(scheduler); + + // can't proceed until the subbuffer is mapped + cl(WaitForEvents(1,&sc->map)); +} + +// +// +// + +static +union skc_ringdex_expand +skc_path_builder_impl_acquire_block(struct skc_path_builder_impl * const impl) +{ + // break ringdex into components + union skc_ringdex_expand const to = skc_ringdex_expand(impl,impl->wip.to); + + // does wip ringdex point to a new subbuffer? + if (to.block == 0) + { + // potentially spin/block waiting for subbuffer + skc_path_builder_impl_acquire_subbuffer(impl,to.subbuf); + } + + // post increment wip.to + skc_ringdex_wip_to_block_inc(impl); + + return to; +} + +// +// +// + +static +skc_uint +skc_rolling_block(skc_uint const rolling, skc_uint const tag) +{ + return rolling | tag; +} + +static +skc_uint +skc_rolling_subblock(skc_uint const rolling, skc_uint const subblock, skc_uint const tag) +{ + return rolling | (subblock << SKC_TAGGED_BLOCK_ID_BITS_TAG) | tag; +} + +static +void +skc_rolling_inc(struct skc_path_builder_impl * const impl) +{ + impl->wip.rolling.next += impl->wip.rolling.one; +} + +// +// +// + +static +void * +skc_path_builder_impl_new_command(struct skc_path_builder_impl * const impl, + skc_uint const rolling, + skc_cmd_paths_copy_tag const tag) +{ + // bump blocks count + impl->wip.head->header.blocks += 1; + + // acquire a block + union skc_ringdex_expand const to = skc_path_builder_impl_acquire_block(impl); + + // make a pointer + union skc_tagged_block_id * const cmds_subbuf = impl->cmds.subbufs[to.subbuf].host; + + // store command for block + cmds_subbuf[to.block].u32 = skc_rolling_block(rolling,tag); + +#if 0 + // store command for block + cmds_subbuf[to.block].u32 = skc_rolling_block(impl->wip.rolling.next,tag); + + // increment rolling + skc_rolling_inc(impl); +#endif + + // return pointer to block + float * const blocks_subbuf = impl->blocks.subbufs[to.subbuf].host; + + // FIXME -- make it easier to get config constant + return blocks_subbuf + (to.block * impl->runtime->config->block.words); +} + +// +// +// + +static +void +skc_path_builder_impl_flush_node(struct skc_path_builder_impl * const impl) +{ + // store command to subbuf and get pointer to blocks subbuf + void * const block = skc_path_builder_impl_new_command(impl,impl->wip.ids.rolling, + SKC_CMD_PATHS_COPY_TAG_NODE); + + // copy head to blocks subbuf -- write-only + memcpy(block,impl->wip.node,impl->runtime->config->block.bytes); +} + +static +void +skc_path_builder_impl_flush_head(struct skc_path_builder_impl * const impl) +{ + // store command to subbuf and get pointer to blocks subbuf + void * const block = skc_path_builder_impl_new_command(impl,impl->wip.rolling.next, + SKC_CMD_PATHS_COPY_TAG_HEAD); + + // copy head to blocks subbuf -- write-only + memcpy(block,impl->wip.head,impl->runtime->config->block.bytes); + + // increment rolling + skc_rolling_inc(impl); + + // the 'to' index is non-inclusive so assign wip.to after flush_head + impl->curr.to = impl->wip.to; +} + +// +// +// + +static +void +skc_path_builder_impl_new_node_block(struct skc_path_builder_impl * const impl) +{ + // update final block id in node + impl->wip.ids.next->u32 = skc_rolling_block(impl->wip.rolling.next,SKC_BLOCK_ID_TAG_PATH_NEXT); + + // if wip.ids is not the header then flush now full wip node + if (impl->wip.head->header.nodes > 0) + skc_path_builder_impl_flush_node(impl); + + // bump node count + impl->wip.head->header.nodes += 1; + + // save current rolling + impl->wip.ids.rolling = impl->wip.rolling.next; + + // increment rolling + skc_rolling_inc(impl); + + // update wip.ids.* + impl->wip.ids.next = impl->wip.node->tag_ids; + impl->wip.ids.rem = impl->runtime->config->block.words; +} + +static +void +skc_path_builder_impl_new_segs_block(struct skc_path_builder_impl * const impl) +{ + impl->wip.subblocks.rem = impl->runtime->config->block.subblocks; // FIXME -- move constants closer to structure + impl->wip.subblocks.rolling = impl->wip.rolling.next; + impl->wip.subblocks.next = skc_path_builder_impl_new_command(impl,impl->wip.rolling.next, + SKC_CMD_PATHS_COPY_TAG_SEGS); + impl->wip.subblocks.idx = 0; + + // increment rolling + skc_rolling_inc(impl); +} + +// +// +// + +static +void +skc_path_builder_impl_acquire_subblocks(struct skc_path_builder_impl * const impl, + skc_block_id_tag tag, + skc_uint vertices, + float * * subblocks) +{ + // + // FIRST TAG RECORDS THE ELEMENT TYPE + // + while (true) + { + // if only one block id left in node then acquire new node block + // and append its block id as with a next tag + if (impl->wip.ids.rem == 1) + skc_path_builder_impl_new_node_block(impl); + + // if zero subblocks left then acquire a new subblock block and + // append its block id + if (impl->wip.subblocks.rem == 0) + skc_path_builder_impl_new_segs_block(impl); + + // save first command -- tag and subblocks may have been updated + impl->wip.ids.next->u32 = skc_rolling_subblock(impl->wip.subblocks.rolling,impl->wip.subblocks.idx,tag); + + // increment node block subblock pointer + impl->wip.ids.next += 1; + impl->wip.ids.rem -= 1; + + // how many vertices can we store + skc_uint rem = min(vertices,impl->wip.subblocks.rem); + + // decrement vertices + vertices -= rem; + impl->wip.subblocks.rem -= rem; + impl->wip.subblocks.idx += rem; + + // assign subblocks + do { + *subblocks++ = impl->wip.subblocks.next; + impl->wip.subblocks.next += impl->runtime->config->subblock.words; + // FIXME -- move constants closer to structure + } while (--rem > 0); + + // anything left to do? + if (vertices == 0) + break; + + // any tag after this will be a caboose command + tag = SKC_BLOCK_ID_TAG_PATH_NEXT; + } +} + +// +// +// + +static +void +skc_path_builder_pfn_end(struct skc_path_builder_impl * const impl, skc_path_t * const path) +{ + // finalize incomplete active subblocks -- we don't care about any + // remaining unused subblocks in block + skc_path_builder_finalize_subblocks(impl->path_builder); + + // mark remaining wips.ids in the head or node as invalid + skc_path_builder_impl_finalize_node(impl); + + // flush node if rem > 0 and node is not actually head + if (impl->wip.head->header.nodes >= 1) + skc_path_builder_impl_flush_node(impl); + + // acquire path host id + *path = skc_runtime_handle_device_acquire(impl->runtime); // FIXME -- MAY WANT TO GRAB AN ID ON BEGIN + + // save path host handle + impl->wip.head->header.handle = *path; + + // flush head -- acquires a block and bumps head->header.blocks + skc_path_builder_impl_flush_head(impl); + + // get current release + struct skc_release_record * const release = skc_release_curr(impl); + + // acquire grid if null + if (release->grid == NULL) + { + release->grid = + SKC_GRID_DEPS_ATTACH(impl->runtime->deps, + &release->grid, // NULL on start/force + release, // data payload + skc_path_builder_grid_pfn_waiting, + NULL, // no execute pfn + skc_path_builder_grid_pfn_dispose); + } + + // update grid map + skc_grid_map(release->grid,*path); + + // update path release + impl->release.paths[release->to] = *path; + + // increment release.to + release->to = (release->to + 1) % impl->ring.blocks_per.buffer; + + // add guard bit + *path |= SKC_TYPED_HANDLE_TYPE_IS_PATH; + +#if 1 + // + // eager kernel launch? + // + { + union skc_ringdex_expand const curr_from = skc_ringdex_expand(impl,impl->curr.from); + union skc_ringdex_expand const curr_to = skc_ringdex_expand(impl,impl->curr.to); + + if (curr_from.subbuf != curr_to.subbuf) + { + skc_grid_start(release->grid); + // skc_scheduler_yield(impl->runtime->scheduler); + } + } +#endif +} + +// +// FIXME -- clean up accessing of CONFIG constants in these 3 routines +// + +static +void +skc_path_builder_pfn_new_line(struct skc_path_builder_impl * const impl) +{ + // acquire subblock pointers + skc_path_builder_impl_acquire_subblocks(impl,SKC_BLOCK_ID_TAG_PATH_LINE,4, + impl->path_builder->line.coords); + + // increment line count + impl->wip.head->header.prims += 1; + + // update rem_count_xxx count + impl->path_builder->line.rem = impl->runtime->config->subblock.words; +} + +static +void +skc_path_builder_pfn_new_quad(struct skc_path_builder_impl * const impl) +{ + // acquire subblock pointers + skc_path_builder_impl_acquire_subblocks(impl,SKC_BLOCK_ID_TAG_PATH_QUAD,6, + impl->path_builder->quad.coords); + + // increment line count + impl->wip.head->header.prims += 1; + + // update rem_count_xxx count + impl->path_builder->quad.rem = impl->runtime->config->subblock.words; +} + +static +void +skc_path_builder_pfn_new_cubic(struct skc_path_builder_impl * const impl) +{ + // acquire subblock pointers + skc_path_builder_impl_acquire_subblocks(impl,SKC_BLOCK_ID_TAG_PATH_CUBIC,8, + impl->path_builder->cubic.coords); + + // increment line count + impl->wip.head->header.prims += 1; + + // update rem_count_xxx count + impl->path_builder->cubic.rem = impl->runtime->config->subblock.words; +} + +// +// +// + +static +void +skc_path_builder_pfn_release(struct skc_path_builder_impl * const impl) +{ + // decrement reference count + if (--impl->path_builder->refcount != 0) + return; + + // + // otherwise, dispose of everything + // + struct skc_runtime * const runtime = impl->runtime; + + // free path builder + skc_runtime_host_perm_free(impl->runtime,impl->path_builder); + + // release cq + skc_runtime_release_cq_in_order(runtime,impl->cq); + + // release kernels + cl(ReleaseKernel(impl->kernels.alloc)); + cl(ReleaseKernel(impl->kernels.copy)); + + // free blocks extents + cl(ReleaseMemObject(impl->blocks.buffer)); + skc_runtime_host_perm_free(runtime,impl->blocks.subbufs); + + cl(ReleaseMemObject(impl->cmds.buffer)); + skc_runtime_host_perm_free(runtime,impl->cmds.subbufs); + + // free records + skc_runtime_host_perm_free(runtime,impl->release.records); + skc_runtime_host_perm_free(runtime,impl->release.paths); + + // release staging head and node + skc_runtime_host_perm_free(runtime,impl->wip.head); + skc_runtime_host_perm_free(runtime,impl->wip.node); + + // release reads scratch array + cl(ReleaseMemObject(impl->reads)); + + // for all subbuffers + // unmap subbuffer + // release subbuffer + // printf("%s not releasing subbuffers\n",__func__); + + skc_runtime_host_perm_free(impl->runtime,impl); +} + +// +// +// + +skc_err +skc_path_builder_cl_12_create(struct skc_context * const context, + struct skc_path_builder * * const path_builder) +{ + // + // retain the context + // skc_context_retain(context); + // + struct skc_runtime * const runtime = context->runtime; + + // allocate path builder + (*path_builder) = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(**path_builder)); + + // init state + SKC_ASSERT_STATE_INIT((*path_builder),SKC_PATH_BUILDER_STATE_READY); + + (*path_builder)->context = context; + + // save opaque impl-specific pointers + (*path_builder)->begin = skc_path_builder_pfn_begin; + (*path_builder)->end = skc_path_builder_pfn_end; + (*path_builder)->new_line = skc_path_builder_pfn_new_line; + (*path_builder)->new_quad = skc_path_builder_pfn_new_quad; + (*path_builder)->new_cubic = skc_path_builder_pfn_new_cubic; + (*path_builder)->release = skc_path_builder_pfn_release; + + // initialize path builder counts + (*path_builder)->line.rem = 0; + (*path_builder)->quad.rem = 0; + (*path_builder)->cubic.rem = 0; + + (*path_builder)->refcount = 1; + + struct skc_path_builder_impl * const impl = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*impl)); + + (*path_builder)->impl = impl; + + // + // init impl + // + impl->path_builder = *path_builder; + impl->runtime = runtime; + + impl->cq = skc_runtime_acquire_cq_in_order(runtime); + + impl->kernels.alloc = skc_device_acquire_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_PATHS_ALLOC); + impl->kernels.copy = skc_device_acquire_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_PATHS_COPY); + + // + // FIXME -- let these config constants remain constant and in place + // + struct skc_config const * const config = runtime->config; + + impl->ring.subbufs = config->paths_copy.buffer.count; + impl->ring.blocks_per.buffer = config->paths_copy.subbuf.count * config->paths_copy.buffer.count; + impl->ring.blocks_per.subbuf = config->paths_copy.subbuf.count; + // + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // + + cl_int cl_err; + + // allocate large device-side extent for path data + impl->blocks.buffer = clCreateBuffer(runtime->cl.context, + CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, + config->paths_copy.block.buffer, // FIXME -- either use config or local constants everywhere + NULL,&cl_err); cl_ok(cl_err); + + // allocate small host-side array of pointers to mapped subbufs + impl->blocks.subbufs = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE, + impl->ring.subbufs * + sizeof(*impl->blocks.subbufs)); + + // allocate large device-side extent for path copy commands + impl->cmds.buffer = clCreateBuffer(runtime->cl.context, + CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, + config->paths_copy.command.buffer, + NULL,&cl_err); cl_ok(cl_err); + + // allocate small host-side array of pointers to mapped subbufs + impl->cmds.subbufs = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE, + impl->ring.subbufs * + sizeof(*impl->cmds.subbufs)); + + // allocate small host-side array of intervals of path handles + impl->release.records = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE, + impl->ring.subbufs * + sizeof(*impl->release.records)); + + // allocate large host-side array that is max # of path handles in flight + impl->release.paths = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE, + impl->ring.blocks_per.buffer * + sizeof(*impl->release.paths)); + + // small scratch used by kernels + impl->reads = clCreateBuffer(runtime->cl.context, + CL_MEM_READ_WRITE | CL_MEM_HOST_NO_ACCESS, + sizeof(skc_uint) * impl->ring.subbufs, + NULL,&cl_err); cl_ok(cl_err); + + // initialize release record with impl backpointer + for (skc_uint ii=0; ii<impl->ring.subbufs; ii++) + { + struct skc_release_record * record = impl->release.records + ii; + + record->impl = impl; + record->grid = NULL; + record->from = record->to = ii * impl->ring.blocks_per.subbuf; + } + + // + // allocate and map subbuffers -- we always check the command + // subbuffer's map/unmap events before touching it or its associated + // block subbuffer. + // + struct skc_subbuffer_blocks * sb = impl->blocks.subbufs; + struct skc_subbuffer_cmds * sc = impl->cmds .subbufs; + + cl_buffer_region rb = { 0, config->paths_copy.block.subbuf }; + cl_buffer_region rc = { 0, config->paths_copy.command.subbuf }; + + // for each subbuffer + for (skc_uint ii=0; ii<config->paths_copy.buffer.count; ii++) + { + sb->device = clCreateSubBuffer(impl->blocks.buffer, + CL_MEM_HOST_WRITE_ONLY, + CL_BUFFER_CREATE_TYPE_REGION, + &rb, + &cl_err); cl_ok(cl_err); + + sb->host = clEnqueueMapBuffer(impl->cq, + sb->device, + CL_FALSE, + CL_MAP_WRITE_INVALIDATE_REGION, + 0,rb.size, + 0,NULL,NULL, + &cl_err); cl_ok(cl_err); + + sc->device = clCreateSubBuffer(impl->cmds.buffer, + CL_MEM_HOST_WRITE_ONLY, + CL_BUFFER_CREATE_TYPE_REGION, + &rc, + &cl_err); cl_ok(cl_err); + + sc->host = clEnqueueMapBuffer(impl->cq, + sc->device, + CL_FALSE, + CL_MAP_WRITE_INVALIDATE_REGION, + 0,rc.size, + 0,NULL,&sc->map, + &cl_err); cl_ok(cl_err); + sb += 1; + sc += 1; + + rb.origin += rb.size; + rc.origin += rc.size; + } + + // + // initialize remaining members + // + impl->prev.from = 0; + impl->prev.to = 0; + impl->prev.rolling = 0; + + impl->curr.from = 0; + impl->curr.to = 0; + + impl->wip.to = 0; + + impl->wip.head = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,config->block.bytes); + impl->wip.node = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,config->block.bytes); + + impl->wip.rolling.one = SKC_BLOCK_ID_TAG_COUNT * config->block.subblocks; + impl->wip.rolling.next = 0; + + // for now, completely initialize builder before returning + cl(Finish(impl->cq)); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/path_builder_cl_12.h b/src/compute/skc/path_builder_cl_12.h new file mode 100644 index 0000000000..20bb13cbdf --- /dev/null +++ b/src/compute/skc/path_builder_cl_12.h @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef PATH_BUILDER_CL_12_ONCE +#define PATH_BUILDER_CL_12_ONCE + +// +// +// + +#include "block.h" + +// +// A tag type that fits into the block id tag bitfield +// + +typedef enum skc_cmd_paths_copy_tag { + + SKC_CMD_PATHS_COPY_TAG_SEGS, + SKC_CMD_PATHS_COPY_TAG_NODE, + SKC_CMD_PATHS_COPY_TAG_HEAD, + + SKC_CMD_PATHS_COPY_TAG_COUNT + +} skc_cmd_paths_copy_tag; + + +SKC_STATIC_ASSERT(SKC_CMD_PATHS_COPY_TAG_COUNT <= SKC_BLOCK_ID_TAG_COUNT); + +// +// +// + +#endif + +// +// +// + diff --git a/src/compute/skc/paths_copy.cl b/src/compute/skc/paths_copy.cl new file mode 100644 index 0000000000..06cc393c75 --- /dev/null +++ b/src/compute/skc/paths_copy.cl @@ -0,0 +1,543 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "path_builder_cl_12.h" +#include "path.h" +#include "block_pool_cl.h" + +// +// +// + +#if 0 + +// +// SIMD AVX2 +// + +#define SKC_PATHS_COPY_WORDS_PER_ELEM 8 +#define SKC_PATHS_COPY_SUBGROUP_SIZE 1 +#define SKC_PATHS_COPY_KERNEL_ATTRIBUTES + +typedef skc_uint8 skc_paths_copy_elem; +typedef skc_uint8 skc_pb_idx_v; + +#define SKC_PATHS_COPY_ELEM_EXPAND() SKC_EXPAND_8() + +#define SKC_IS_NOT_PATH_HEAD(sg,I) ((sg) + I >= SKC_PATH_HEAD_WORDS) + +#endif + +// +// +// + +#define SKC_PATHS_COPY_SUBGROUP_SIZE_MASK (SKC_PATHS_COPY_SUBGROUP_SIZE - 1) +#define SKC_PATHS_COPY_ELEMS_PER_BLOCK (SKC_DEVICE_BLOCK_WORDS / SKC_PATHS_COPY_ELEM_WORDS) +#define SKC_PATHS_COPY_ELEMS_PER_SUBBLOCK (SKC_DEVICE_SUBBLOCK_WORDS / SKC_PATHS_COPY_ELEM_WORDS) +#define SKC_PATHS_COPY_ELEMS_PER_THREAD (SKC_PATHS_COPY_ELEMS_PER_BLOCK / SKC_PATHS_COPY_SUBGROUP_SIZE) + +// FIXME -- use SUBGROUP terminology everywhere +#define SKC_PATHS_COPY_SUBGROUP_WORDS (SKC_PATHS_COPY_SUBGROUP_SIZE * SKC_PATHS_COPY_ELEM_WORDS) + +// +// +// + +#define SKC_PATHS_COPY_ELEMS_BEFORE_HEADER \ + (SKC_PATHS_COPY_SUBGROUP_SIZE * ((SKC_PATH_HEAD_WORDS / SKC_PATHS_COPY_ELEM_WORDS) / SKC_PATHS_COPY_SUBGROUP_WORDS)) + +#define SKC_PATHS_COPY_ELEMS_INCLUDING_HEADER \ + (SKC_PATHS_COPY_SUBGROUP_SIZE * ((SKC_PATH_HEAD_WORDS + SKC_PATHS_COPY_SUBGROUP_WORDS - 1) / SKC_PATHS_COPY_SUBGROUP_WORDS)) + +// #define SKC_PATHS_COPY_HEAD_ELEMS ((SKC_PATH_HEAD_WORDS + SKC_PATHS_COPY_ELEM_WORDS - 1) / SKC_PATHS_COPY_ELEM_WORDS) + +// +// +// + +// +// BIT-FIELD EXTRACT/INSERT ARE NOT AVAILABLE IN OPENCL +// + +#define SKC_CMD_PATHS_COPY_ONE_BITS (SKC_TAGGED_BLOCK_ID_BITS_TAG + SKC_DEVICE_SUBBLOCK_WORDS_LOG2) + +#define SKC_CMD_PATHS_COPY_ONE_MASK SKC_BITS_TO_MASK(SKC_CMD_PATHS_COPY_ONE_BITS) + +#define SKC_CMD_PATHS_COPY_ONE (1u << SKC_CMD_PATHS_COPY_ONE_BITS) + +#define SKC_CMD_PATHS_COPY_GET_TAG(ti) SKC_TAGGED_BLOCK_ID_GET_TAG(ti) + +#define SKC_CMD_PATHS_COPY_GET_ROLLING(ti) ((ti) >> SKC_CMD_PATHS_COPY_ONE_BITS) + +#define SKC_CMD_PATHS_COPY_UPDATE_ROLLING(ti,b) (((ti) & SKC_CMD_PATHS_COPY_ONE_MASK) | ((b) << SKC_TAGGED_BLOCK_ID_BITS_TAG)) + +// +// +// + +skc_uint +skc_sub_group_local_id() +{ +#if SKC_PATHS_COPY_SUBGROUP_SIZE > 1 + return get_sub_group_local_id(); +#else + return 0; +#endif +} + +// +// convert an atomic read counter offset to a block id +// + +skc_block_id_t +skc_bp_off_to_id(__global skc_block_id_t const * const bp_ids, + skc_uint const bp_idx_mask, + skc_uint const bp_reads, + skc_uint const bp_off) +{ + skc_uint const bp_idx = (bp_reads + bp_off) & bp_idx_mask; + + return bp_ids[bp_idx]; +} + +// +// +// + +void +skc_copy_segs(__global skc_paths_copy_elem * const bp_elems, // to + skc_uint const bp_elems_idx, + __global skc_paths_copy_elem const * const pb_elems, // from + skc_uint const pb_elems_idx) +{ + for (skc_uint ii=0; ii<SKC_PATHS_COPY_ELEMS_PER_BLOCK; ii+=SKC_PATHS_COPY_SUBGROUP_SIZE) + { + (bp_elems+bp_elems_idx)[ii] = (pb_elems+pb_elems_idx)[ii]; + } + +#if 0 + // + // NOTE THIS IS PRINTING 8 ROWS + // + printf("%5u : (%8u) : { { %5.0f, %5.0f }, { %5.0f, %5.0f } },\n", + (skc_uint)get_global_id(0),pb_elems_idx, + as_float((pb_elems+pb_elems_idx)[0*SKC_PATHS_COPY_SUBGROUP_SIZE]), + as_float((pb_elems+pb_elems_idx)[1*SKC_PATHS_COPY_SUBGROUP_SIZE]), + as_float((pb_elems+pb_elems_idx)[2*SKC_PATHS_COPY_SUBGROUP_SIZE]), + as_float((pb_elems+pb_elems_idx)[3*SKC_PATHS_COPY_SUBGROUP_SIZE])); + printf("%5u : (%8u) : { { %5.0f, %5.0f }, { %5.0f, %5.0f } },\n", + (skc_uint)get_global_id(0),pb_elems_idx, + as_float((pb_elems+pb_elems_idx)[4*SKC_PATHS_COPY_SUBGROUP_SIZE]), + as_float((pb_elems+pb_elems_idx)[5*SKC_PATHS_COPY_SUBGROUP_SIZE]), + as_float((pb_elems+pb_elems_idx)[6*SKC_PATHS_COPY_SUBGROUP_SIZE]), + as_float((pb_elems+pb_elems_idx)[7*SKC_PATHS_COPY_SUBGROUP_SIZE])); +#endif +} + +// +// +// + +void +skc_copy_node(__global skc_paths_copy_elem * const bp_elems, // to + skc_uint const bp_elems_idx, + __global skc_block_id_t const * const bp_ids, + skc_uint const bp_reads, + skc_uint const bp_idx_mask, + __global skc_paths_copy_elem const * const pb_elems, // from + skc_uint const pb_elems_idx, + skc_uint const pb_rolling) +{ + // + // remap block id tags bp_elems the host-side rolling counter pb_elems a + // device-side block pool id + // + for (skc_uint ii=0; ii<SKC_PATHS_COPY_ELEMS_PER_BLOCK; ii+=SKC_PATHS_COPY_SUBGROUP_SIZE) + { + // load block_id_tag words + skc_paths_copy_elem elem = (pb_elems + pb_elems_idx)[ii]; + + // calculate ahead of time -- if elem was invalid then bp_idx is definitely invalid + skc_pb_idx_v const bp_idx = (bp_reads + SKC_CMD_PATHS_COPY_GET_ROLLING(elem - pb_rolling)) & bp_idx_mask; + + // FIXME ^^^^^ THE IDX PROBABLY DOESN'T NEED TO BE SHIFTED TWICE AND WE CAN SAVE A FEW INSTRUCTIONS + + // + // FIXME -- SIMD can be fully parallelized since a bp_ids[] load + // will _always_ be safe as long as we don't use the loaded + // value! So... fix UPDATE_ROLLING to be SIMD-friendly instead + // of iterating over the vector components. + // + + // only convert if original elem is not invalid + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (elem C != SKC_TAGGED_BLOCK_ID_INVALID) { \ + skc_block_id_t const b = bp_ids[bp_idx C]; \ + elem C = SKC_CMD_PATHS_COPY_UPDATE_ROLLING(elem C,b); \ + } + + // printf("%2u: < %8X, %8X, %8X >\n",ii,bp_idx,b,elem C); + + SKC_PATHS_COPY_ELEM_EXPAND(); + + // store the elem back + (bp_elems+bp_elems_idx)[ii] = elem; + } +} + +// +// +// + +void +skc_host_map_update(__global skc_uint * const host_map, + skc_uint const block, + skc_paths_copy_elem const elem) +{ + // + // write first elem to map -- FIXME -- this is a little nasty + // because it relies on the the host handle always being the first + // word in the path header. + // + // OTOH, this is not unreasonable. The alternative is to have a + // separate kernel initializing the map. + // +#if SKC_PATHS_COPY_SUBGROUP_SIZE > 1 + if (get_sub_group_local_id() == SKC_PATH_HEAD_OFFSET_HANDLE) +#endif + { +#if SKC_PATHS_COPY_ELEM_WORDS == 1 + host_map[elem] = block; +#if 0 + printf("[%u] = %u\n",elem,block); +#endif +#else + host_map[elem.SKC_CONCAT(s,SKC_PATH_HEAD_OFFSET_HANDLE)] = block; +#endif + } +} + +// +// +// + +void +skc_copy_head(__global skc_uint * const host_map, + skc_uint const block, + __global skc_paths_copy_elem * const bp_elems, // to + skc_uint const bp_elems_idx, + __global skc_block_id_t const * const bp_ids, + skc_uint const bp_reads, + skc_uint const bp_idx_mask, + __global skc_paths_copy_elem const * const pb_elems, // from + skc_uint const pb_elems_idx, + skc_uint const pb_rolling) +{ + // + // if there are more path header words than there are + // threads-per-block then we can just copy the initial header words + // +#if ( SKC_PATHS_COPY_ELEMS_BEFORE_HEADER > 0 ) + for (skc_uint ii=0; ii<SKC_PATHS_COPY_ELEMS_BEFORE_HEADER; ii+=SKC_PATHS_COPY_SUBGROUP_SIZE) + { + skc_paths_copy_elem const elem = (pb_elems+pb_elems_idx)[ii]; + + (bp_elems+bp_elems_idx)[ii] = elem; + + if (ii == 0) { + skc_host_map_update(host_map,block,elem); + } + } +#endif + + // + // this is similar to copy node but the first H words of the path + // header are not modified and simply copied + // + for (skc_uint ii=SKC_PATHS_COPY_ELEMS_BEFORE_HEADER; ii<SKC_PATHS_COPY_ELEMS_INCLUDING_HEADER; ii+=SKC_PATHS_COPY_SUBGROUP_SIZE) + { + skc_paths_copy_elem elem = (pb_elems+pb_elems_idx)[ii]; + +#if ( SKC_PATHS_COPY_ELEMS_BEFORE_HEADER == 0 ) + if (ii == 0) { + skc_host_map_update(host_map,block,elem); + } +#endif + // calculate ahead of time -- if elem was invalid then bp_idx is definitely invalid + skc_pb_idx_v const bp_idx = (bp_reads + SKC_CMD_PATHS_COPY_GET_ROLLING(elem - pb_rolling)) & bp_idx_mask; + + // + // FIXME -- SIMD can be fully parallelized since a bp_ids[] load + // will _always_ be safe as long as we don't use the loaded + // value! So... fix UPDATE_ROLLING to be SIMD-friendly instead + // of iterating over the vector components. + // + + // FIXME ^^^^^ THE IDX PROBABLY DOESN'T NEED TO BE SHIFTED TWICE AND WE CAN SAVE A FEW INSTRUCTIONS + + // FIXME -- MIX MIX MIX MIX / SELECT + + // only convert if original elem is not invalid +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (SKC_IS_NOT_PATH_HEAD(ii,I) && (elem C != SKC_TAGGED_BLOCK_ID_INVALID)) { \ + skc_block_id_t const b = bp_ids[bp_idx C]; \ + elem C = SKC_CMD_PATHS_COPY_UPDATE_ROLLING(elem C,b); \ + } + + // printf("%2u: ( %8X, %8X, %8X )\n",ii,bp_idx,b,elem C); + + SKC_PATHS_COPY_ELEM_EXPAND(); + + // store the elem back + (bp_elems+bp_elems_idx)[ii] = elem; + } + + // + // the remaining words are treated like a node + // + for (skc_uint ii=SKC_PATHS_COPY_ELEMS_INCLUDING_HEADER; ii<SKC_PATHS_COPY_ELEMS_PER_BLOCK; ii+=SKC_PATHS_COPY_SUBGROUP_SIZE) + { + // load block_id_tag words + skc_paths_copy_elem elem = (pb_elems+pb_elems_idx)[ii]; + + // calculate ahead of time + skc_pb_idx_v const bp_idx = (bp_reads + SKC_CMD_PATHS_COPY_GET_ROLLING(elem - pb_rolling)) & bp_idx_mask; + + // + // FIXME -- SIMD can be fully parallelized since a bp_ids[] load + // will _always_ be safe as long as we don't use the loaded + // value! So... fix UPDATE_ROLLING to be SIMD-friendly instead + // of iterating over the vector components. + // + + // FIXME ^^^^^ THE IDX PROBABLY DOESN'T NEED TO BE SHIFTED TWICE AND WE CAN SAVE A FEW INSTRUCTIONS + + // only convert if original elem is not invalid +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (elem C != SKC_TAGGED_BLOCK_ID_INVALID) { \ + skc_block_id_t const b = bp_ids[bp_idx C]; \ + elem C = SKC_CMD_PATHS_COPY_UPDATE_ROLLING(elem C,b); \ + } + + // printf("%2u: [ %8X, %8X, %8X ]\n",ii,bp_idx,b,elem C); + + SKC_PATHS_COPY_ELEM_EXPAND(); + + // store the elem + (bp_elems+bp_elems_idx)[ii] = elem; + } +} + +// +// FIXME -- pack some of these constant integer args in a vec or struct +// + +__kernel +SKC_PATHS_COPY_KERNEL_ATTRIBS +void +skc_kernel_paths_copy +(__global skc_uint * const host_map, + + __global skc_block_id_t const * const bp_ids, + __global skc_paths_copy_elem * const bp_elems, + skc_uint const bp_idx_mask, // pow2 modulo mask for block pool ring + + __global skc_uint const * const bp_alloc, // block pool ring base + skc_uint const bp_alloc_idx,// which subbuf + + __global union skc_tagged_block_id const * const pb_cmds, + __global skc_paths_copy_elem const * const pb_elems, + + skc_uint const pb_size, // # of commands/blocks in buffer + skc_uint const pb_rolling, // shifted rolling counter base + + skc_uint const pb_prev_from, + skc_uint const pb_prev_span, + skc_uint const pb_curr_from) +{ + // + // THERE ARE 3 TYPES OF PATH COPYING COMMANDS: + // + // - HEAD + // - NODE + // - SEGS + // + // THESE ARE SUBGROUP ORIENTED KERNELS + // + // A SUBGROUP CAN OPERATE ON [1,N] BLOCKS + // + + // + // It's likely that peak bandwidth is achievable with a single + // workgroup. + // + // So let's keep the grids modestly sized and for simplicity and + // portability, let's assume that a single workgroup can perform all + // steps in the copy. + // + // Launch as large of a workgroup as possiblex + // + // 1. ATOMICALLY ALLOCATE BLOCKS BP_ELEMS POOL + // 2. CONVERT COMMANDS IN PB_ELEMS BLOCK OFFSETS + // 3. FOR EACH COMMAND: + // - HEAD: SAVED HEAD ID PB_ELEMS MAP. CONVERT AND COPY H INDICES. + // - NODE: CONVERT AND COPY B INDICES + // - SEGS: BULK COPY + // + // B : number of words in block -- always pow2 + // W : intelligently/arbitrarily chosen factor of B -- always pow2 + // + + // + // There are several approaches to processing the commands: + // + // 1. B threads are responsible for one block. All threads broadcast + // load a single command word. Workgroup size must be a facpb_elemsr of + // B. + // + // 2. W threads process an entire block. W will typically be the + // device's subgroup/warp/wave width. W threads broadcast load a + // single command word. + // + // 3. W threads process W blocks. W threads load W command words and + // process W blocks. + // + // Clearly (1) has low I/O intensity but will achieve high + // parallelism by activating the most possible threads. The downside + // of this kind of approach is that the kernel will occupy even a + // large GPU with low intensity work and reduce opportunities for + // concurrent kernel execution (of other kernels). + // + // See Vasily Volkov's CUDA presentation describing these tradeoffs. + // + // Note that there are many other approaches. For example, similar + // pb_elems (1) but each thread loads a pow2 vector of block data. + // + + // load the copied atomic read "base" from gmem + skc_uint const bp_reads = bp_alloc[bp_alloc_idx]; + // will always be less than 2^32 + skc_uint const gid = get_global_id(0); + // every subgroup/simd that will work on the block loads the same command + skc_uint const sg_idx = gid / SKC_PATHS_COPY_SUBGROUP_SIZE; + // path builder data can be spread across two spans + skc_uint pb_idx = sg_idx + ((sg_idx < pb_prev_span) ? pb_prev_from : pb_curr_from); + + // no need pb_elems make this branchless + if (pb_idx >= pb_size) + pb_idx -= pb_size; + + // broadcast load the command + union skc_tagged_block_id const pb_cmd = pb_cmds[pb_idx]; + + // what do we want pb_elems do with this block? + skc_cmd_paths_copy_tag const tag = SKC_CMD_PATHS_COPY_GET_TAG(pb_cmd.u32); + + // compute offset from rolling base to get index into block pool ring allocation + skc_uint const bp_off = SKC_CMD_PATHS_COPY_GET_ROLLING(pb_cmd.u32 - pb_rolling); + + // convert the pb_cmd's offset counter pb_elems a block id + skc_block_id_t const block = skc_bp_off_to_id(bp_ids,bp_idx_mask,bp_reads,bp_off); + +#if 0 + if (get_sub_group_local_id() == 0) { + printf("bp_off/reads = %u / %u\n",bp_off,bp_reads); + printf("< %8u >\n",block); + } +#endif + + // FIXME -- could make this 0 for SIMD, gid&mask or get_sub_group_local_id() + skc_uint const tid = gid & SKC_PATHS_COPY_SUBGROUP_SIZE_MASK; + + // calculate bp_elems (to) / pb_elems (from) + skc_uint const bp_elems_idx = block * SKC_PATHS_COPY_ELEMS_PER_SUBBLOCK + tid; + skc_uint const pb_elems_idx = pb_idx * SKC_PATHS_COPY_ELEMS_PER_BLOCK + tid; + + if (tag == SKC_CMD_PATHS_COPY_TAG_SEGS) + { +#if 0 + if (tid == 0) + printf("%3u, segs\n",bp_off); +#endif + skc_copy_segs(bp_elems, + bp_elems_idx, + pb_elems, + pb_elems_idx); + } + else if (tag == SKC_CMD_PATHS_COPY_TAG_NODE) + { +#if 0 + if (tid == 0) + printf("%3u, NODE\n",bp_off); +#endif + skc_copy_node(bp_elems, // to + bp_elems_idx, + bp_ids, + bp_reads, + bp_idx_mask, + pb_elems, // from + pb_elems_idx, + pb_rolling); + } + else // ( tag == SKC_CMD_PATHS_COPY_TAG_HEAD) + { +#if 0 + if (tid == 0) + printf("%3u, HEAD\n",bp_off); +#endif + skc_copy_head(host_map, + block, + bp_elems, // to + bp_elems_idx, + bp_ids, + bp_reads, + bp_idx_mask, + pb_elems, // from + pb_elems_idx, + pb_rolling); + } +} + +// +// +// + +__kernel +SKC_PATHS_ALLOC_KERNEL_ATTRIBS +void +skc_kernel_paths_alloc(__global skc_uint volatile * const bp_atomics, + __global skc_uint * const bp_alloc, + skc_uint const bp_alloc_idx, + skc_uint const pb_cmd_count) +{ + // + // allocate blocks in block pool + // + skc_uint const reads = atomic_add(bp_atomics+SKC_BP_ATOMIC_OFFSET_READS,pb_cmd_count); + + // store in slot + bp_alloc[bp_alloc_idx] = reads; + +#if 0 + printf("pc: %8u + %u\n",reads,pb_cmd_count); +#endif +} + +// +// +// diff --git a/src/compute/skc/paths_reclaim.cl b/src/compute/skc/paths_reclaim.cl new file mode 100644 index 0000000000..563160613c --- /dev/null +++ b/src/compute/skc/paths_reclaim.cl @@ -0,0 +1,390 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// FIXME -- a pre-allocation step could load the path header quads and +// total up the number of blocks in the workgroup or subgroup +// minimizing the number of later atomics adds. +// + +#include "device_cl_12_gen9.h" +#include "block_pool_cl.h" +#include "atomic_cl.h" +#include "block.h" +#include "path.h" +#include "common.h" + +// +// +// + +#define SKC_PATHS_RECLAIM_SUBGROUP_SIZE_MASK (SKC_PATHS_RECLAIM_SUBGROUP_SIZE - 1) + +#define SKC_PATHS_RECLAIM_SUBGROUP_ELEMS (SKC_PATHS_RECLAIM_SUBGROUP_SIZE * SKC_PATHS_RECLAIM_LOCAL_ELEMS) + +#define SKC_PATHS_RECLAIM_X (SKC_DEVICE_BLOCK_WORDS / SKC_PATHS_RECLAIM_SUBGROUP_ELEMS) + +// +// +// + +#if ( SKC_PATHS_RECLAIM_X == 1 ) +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_1() +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST 0 + +#elif ( SKC_PATHS_RECLAIM_X == 2 ) +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_2() +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST 1 + +#elif ( SKC_PATHS_RECLAIM_X == 4 ) +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_4() +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST 3 + +#elif ( SKC_PATHS_RECLAIM_X == 8 ) +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_8() +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST 7 + +#elif ( SKC_PATHS_RECLAIM_X == 16) +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_16() +#define SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST 15 + +#else +#error "MISSING SKC_PATHS_RECLAIM_X" +#endif + +// +// FIXME -- slate these for replacement +// + +#define SKC_BROADCAST(E,S,I) \ + sub_group_broadcast(E,S - I * SKC_PATHS_RECLAIM_SUBGROUP_SIZE) + +#define SKC_BROADCAST_LAST_HELPER(E,I) \ + sub_group_broadcast(E,SKC_PATHS_RECLAIM_SUBGROUP_SIZE - 1) + +#define SKC_BROADCAST_LAST(E,I) \ + SKC_BROADCAST_LAST_HELPER(E,I) + +// +// COMPILE-TIME PREDICATES +// + +#define SKC_PATHS_RECLAIM_ELEM_GTE(X,I) \ + SKC_GTE_MACRO(X,(I+1) * SKC_PATHS_RECLAIM_SUBGROUP_SIZE) + +#define SKC_PATHS_RECLAIM_ELEM_IN_RANGE(X,I) \ + (skc_bool)SKC_GTE_MACRO(X, I * SKC_PATHS_RECLAIM_SUBGROUP_SIZE) && \ + (skc_bool)SKC_LT_MACRO(X,(I+1) * SKC_PATHS_RECLAIM_SUBGROUP_SIZE) + +#define SKC_PATHS_RECLAIM_ENTIRELY_HEADER(I) \ + SKC_PATHS_RECLAIM_ELEM_GTE(SKC_PATH_HEAD_WORDS,I) + +#define SKC_PATHS_RECLAIM_PARTIALLY_HEADER(I) \ + SKC_PATHS_RECLAIM_ELEM_IN_RANGE(SKC_PATH_HEAD_WORDS,I) + +// +// RUN-TIME PREDICATES +// + +#define SKC_PATHS_RECLAIM_IS_HEADER(I) \ + (get_sub_group_local_id() + I * SKC_PATHS_RECLAIM_SUBGROUP_SIZE < SKC_PATH_HEAD_WORDS) + +// +// FIXME -- THIS BITFIELD SCAN APPROACH CAN BE PARAMETERIZED FOR ALL +// POSSIBLE PRACTICAL POWER-OF-TWO SUBGROUP AND SUBBLOCKS-PER-BLOCK +// COMBOS (NOT NECESSARILY POW2) +// +// FOR WIDER SUBGROUPS WITH BIG BLOCKS, WE WILL WANT TO USE A VECTOR +// UINT TYPE INSTEAD OF A ULONG. +// + +#define SKC_PATHS_RECLAIM_PACKED_COUNT_BITS SKC_PATHS_RECLAIM_SUBGROUP_SIZE_LOG2 +#define SKC_PATHS_RECLAIM_PACKED_COUNT_DECLARE skc_uint + +// +// +// + +#define SKC_PATHS_RECLAIM_PACKED_COUNT_MASK SKC_BITS_TO_MASK(SKC_PATHS_RECLAIM_PACKED_COUNT_BITS) + +#define SKC_PATHS_RECLAIM_PACKED_COUNT_IS_BLOCK(E,I) \ + (((E) & SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK) \ + ? 0 : (1u << SKC_PATHS_RECLAIM_PACKED_COUNT_BITS * I)) + +#define SKC_PATHS_RECLAIM_PACKED_COUNT_SCAN_EXCLUSIVE_ADD(S,C) \ + S = sub_group_scan_exclusive_add(C) + +#define SKC_PATHS_RECLAIM_PACKED_COUNT_GET(C,I) \ + (((C) >> (SKC_PATHS_RECLAIM_PACKED_COUNT_BITS * I)) & SKC_PATHS_RECLAIM_PACKED_COUNT_MASK) + +// +// +// + +struct skc_reclaim +{ + skc_path_h aN[SKC_RECLAIM_ARRAY_SIZE]; +}; + +__kernel +SKC_PATHS_RECLAIM_KERNEL_ATTRIBS +void +skc_kernel_paths_reclaim(__global skc_block_id_t * const bp_ids, // block pool ids ring + __global skc_uint * const bp_elems, // block pool blocks + __global skc_uint volatile * const bp_atomics, // read/write atomics + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const map, // path host-to-device map + struct skc_reclaim const reclaim) // array of host path ids +{ +#if (__OPENCL_VERSION__ < 200) + skc_uint const reclaim_stride = get_num_sub_groups(); +#else + skc_uint const reclaim_stride = get_enqueued_num_sub_groups(); // 2.0 supports non-uniform workgroups +#endif + skc_uint reclaim_idx = get_group_id(0) * reclaim_stride + get_sub_group_id(); + +#if 0 + // + // NOTE -- FOR NOW, THIS KERNEL ALWAYS LAUNCHES FIXED SIZE GRIDS BUT + // WE MIGHT WANT TO HAVE THE GRID LIMIT ITSELF TO A FRACTIONAL + // MULTIPROCESSOR IN ORDER TO MINIMIZE THE IMPACT OF A LARGE + // RECLAMATION JOB ON THE REST OF THE PIPELINE. + // + for (; reclaim_idx < SKC_RECLAIM_ARRAY_SIZE; reclaim_idx+=reclaim_stride) +#endif + { + // get host path id + skc_path_h const path = reclaim.aN[reclaim_idx]; + + // get the path header block from the map + skc_block_id_t id = map[path]; + + // + // blindly load all of the head elements into registers + // + skc_uint const head_idx = id * SKC_DEVICE_SUBBLOCK_WORDS + get_sub_group_local_id(); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + skc_uint h##I = bp_elems[head_idx + I * SKC_PATHS_RECLAIM_SUBGROUP_SIZE]; + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // + // pick out count.nodes and count.prims from the header + // + skc_uint count_blocks, count_nodes; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (SKC_PATHS_RECLAIM_ELEM_IN_RANGE(SKC_PATH_HEAD_OFFSET_BLOCKS,I)) { \ + count_blocks = SKC_BROADCAST(h##I,SKC_PATH_HEAD_OFFSET_BLOCKS,I); \ + } \ + if (SKC_PATHS_RECLAIM_ELEM_IN_RANGE(SKC_PATH_HEAD_OFFSET_NODES,I)) { \ + count_nodes = SKC_BROADCAST(h##I,SKC_PATH_HEAD_OFFSET_NODES,I); \ + } + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + +#if 0 + if (get_sub_group_local_id() == 0) { + printf("reclaim paths: %9u / %5u / %5u\n",path,count_blocks,count_nodes); + } +#endif + + // + // acquire a span in the block pool ids ring for reclaimed ids + // + // FIXME count_blocks and atomic add can be done in same lane + // + skc_uint bp_ids_base = 0; + + if (get_sub_group_local_id() == 0) { + bp_ids_base = SKC_ATOMIC_ADD_GLOBAL_RELAXED_SUBGROUP(bp_atomics+SKC_BP_ATOMIC_OFFSET_WRITES,count_blocks); + +#if 0 + printf("paths: bp_ids_base = %u\n",bp_ids_base); +#endif + } + + bp_ids_base = sub_group_broadcast(bp_ids_base,0); + + // + // shift away the tagged block id's tag + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PATHS_RECLAIM_ENTIRELY_HEADER(I)) { \ + h##I = h##I >> SKC_TAGGED_BLOCK_ID_BITS_TAG; \ + } + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // + // swap current id with next + // + if (get_sub_group_local_id() == SKC_PATHS_RECLAIM_SUBGROUP_SIZE - 1) + { + skc_block_id_t const next = SKC_CONCAT(h,SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST); + + SKC_CONCAT(h,SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST) = id; + + id = next; + } + + // + // - we'll skip subgroups that are entirely header + // + // - but we need to mark any header elements that partially fill + // a subgroup as invalid tagged block ids + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PATHS_RECLAIM_ENTIRELY_HEADER(I)) { \ + if (SKC_PATHS_RECLAIM_PARTIALLY_HEADER(I)) { \ + if (SKC_PATHS_RECLAIM_IS_HEADER(I)) { \ + h##I = SKC_TAGGED_BLOCK_ID_INVALID; \ + } \ + } \ + } + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + { + // + // count reclaimable blocks in each lane + // + SKC_PATHS_RECLAIM_PACKED_COUNT_DECLARE packed_count = ( 0 ); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PATHS_RECLAIM_ENTIRELY_HEADER(I)) { \ + packed_count |= SKC_PATHS_RECLAIM_PACKED_COUNT_IS_BLOCK(h##I,I); \ + } + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // + // scan to find index of each block + // + SKC_PATHS_RECLAIM_PACKED_COUNT_DECLARE packed_index = ( 0 ); + + SKC_PATHS_RECLAIM_PACKED_COUNT_SCAN_EXCLUSIVE_ADD(packed_index,packed_count); + + // + // store blocks back to ring + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PATHS_RECLAIM_ENTIRELY_HEADER(I)) { \ + skc_uint const index = SKC_PATHS_RECLAIM_PACKED_COUNT_GET(packed_index,I); \ + skc_uint const count = SKC_PATHS_RECLAIM_PACKED_COUNT_GET(packed_count,I); \ + skc_uint const bp_ids_idx = (bp_ids_base + index) & bp_mask; \ + if (count > 0) { \ + bp_ids[bp_ids_idx] = h##I; \ + } \ + skc_uint const total = index + count; \ + bp_ids_base += sub_group_broadcast(total,SKC_PATHS_RECLAIM_SUBGROUP_SIZE-1); \ + } + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // printf("P %7u ! %u\n",bp_ids_idx,h##I); + } + + // + // we're done if it was just the header + // + if (count_nodes == 0) + return; + + // + // otherwise, walk the nodes + // + do { + // id of next block is in last lane + id = sub_group_broadcast(id,SKC_PATHS_RECLAIM_SUBGROUP_SIZE-1); + + // get index of each element + skc_uint const node_idx = id * SKC_DEVICE_SUBBLOCK_WORDS + get_sub_group_local_id(); + + // + // blindly load all of the node elements into registers + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + skc_uint n##I = bp_elems[node_idx + I * SKC_PATHS_RECLAIM_SUBGROUP_SIZE]; + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // + // shift away the tagged block id's tag + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + n##I = n##I >> SKC_TAGGED_BLOCK_ID_BITS_TAG; + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // + // swap current id with next + // + if (get_sub_group_local_id() == SKC_PATHS_RECLAIM_SUBGROUP_SIZE - 1) + { + skc_block_id_t const next = SKC_CONCAT(n,SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST); + + SKC_CONCAT(n,SKC_PATHS_RECLAIM_BLOCK_EXPAND_I_LAST) = id; + + id = next; + } + + // + // count reclaimable blocks in each lane + // + SKC_PATHS_RECLAIM_PACKED_COUNT_DECLARE packed_count = ( 0 ); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + packed_count |= SKC_PATHS_RECLAIM_PACKED_COUNT_IS_BLOCK(n##I,I); + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // + // scan to find index of each block + // + SKC_PATHS_RECLAIM_PACKED_COUNT_DECLARE packed_index = ( 0 ); + + SKC_PATHS_RECLAIM_PACKED_COUNT_SCAN_EXCLUSIVE_ADD(packed_index,packed_count); + + // + // store blocks back to ring + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) { \ + skc_uint const index = SKC_PATHS_RECLAIM_PACKED_COUNT_GET(packed_index,I); \ + skc_uint const count = SKC_PATHS_RECLAIM_PACKED_COUNT_GET(packed_count,I); \ + skc_uint const bp_ids_idx = (bp_ids_base + index) & bp_mask; \ + if (count > 0) { \ + bp_ids[bp_ids_idx] = n##I; \ + } \ + skc_uint const total = index + count; \ + bp_ids_base += sub_group_broadcast(total,SKC_PATHS_RECLAIM_SUBGROUP_SIZE-1); \ + } + + SKC_PATHS_RECLAIM_BLOCK_EXPAND(); + + // printf("P %7u ! %u\n",bp_ids_idx,n##I); + + // any more nodes? + } while (--count_nodes > 0); + } +} + +// +// +// diff --git a/src/compute/skc/place.cl b/src/compute/skc/place.cl new file mode 100644 index 0000000000..00f16f7843 --- /dev/null +++ b/src/compute/skc/place.cl @@ -0,0 +1,871 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "common.h" +#include "atomic_cl.h" +#include "raster.h" +#include "tile.h" + +// +// +// + +#define SKC_PLACE_SUBGROUP_MASK (SKC_PLACE_SUBGROUP_SIZE - 1) +#define SKC_PLACE_SUBGROUP_LAST (SKC_PLACE_SUBGROUP_SIZE - 1) + +// +// +// + +#define SKC_PLACE_SMEM_COUNT_TTSK SKC_MAX_MACRO(SKC_RASTER_NODE_MAX_TTSK,SKC_PLACE_SUBGROUP_SIZE) +#define SKC_PLACE_SMEM_COUNT_TTPK SKC_RASTER_NODE_MAX_TTPK + +// +// +// + +#define SKC_PLACE_X (SKC_DEVICE_BLOCK_DWORDS / SKC_PLACE_SUBGROUP_SIZE) + +// +// +// + +#if ( SKC_PLACE_X == 1 ) +#define SKC_PLACE_EXPAND() SKC_EXPAND_1() +#define SKC_PLACE_EXPAND_I_LAST 0 + +#elif ( SKC_PLACE_X == 2 ) +#define SKC_PLACE_EXPAND() SKC_EXPAND_2() +#define SKC_PLACE_EXPAND_I_LAST 1 + +#elif ( SKC_PLACE_X == 4 ) +#define SKC_PLACE_EXPAND() SKC_EXPAND_4() +#define SKC_PLACE_EXPAND_I_LAST 3 + +#elif ( SKC_PLACE_X == 8 ) +#define SKC_PLACE_EXPAND() SKC_EXPAND_8() +#define SKC_PLACE_EXPAND_I_LAST 7 + +#elif ( SKC_PLACE_X == 16) +#define SKC_PLACE_EXPAND() SKC_EXPAND_16() +#define SKC_PLACE_EXPAND_I_LAST 15 +#endif + +// +// PREFIX STORES THE 64-BIT KEYS WITH TWO 32-BIT SUBGROUP-WIDE +// COALESCED WRITES. LO FIRST, FOLLOWED BY HI. +// +// THIS SLIGHTLY COMPLICATES LOADING BY THE PLACE KERNEL IF THE +// KERNELS USE DIFFERENT SUBGROUP SIZES. +// +// THE BENEFIT IS THAT THE RASTER RECLAIM KERNEL ONLY HAS TO LOAD THE +// LO WORD OF THE KEY SINCE IT CONTAINS THE BLOCK ID. +// +// NOTE: AT THIS POINT, ONLY INTEL'S HD GRAPHICS ARCHITECTURE UNDER +// OPENCL SUPPORTS SELECTING A SUBGROUP SIZE (8/16/32). VULKAN MAY +// ONLY SUPPORT A SUBGROUP SIZE OF 16. +// + +#if ( SKC_PREFIX_SUBGROUP_SIZE == SKC_PLACE_SUBGROUP_SIZE ) + +#define SKC_PLACE_STRIDE_H(L) (L) +#define SKC_PLACE_STRIDE_V_LO(I) (I * 2 * SKC_PLACE_SUBGROUP_SIZE) +#define SKC_PLACE_STRIDE_V_HI(I) (SKC_PLACE_STRIDE_V_LO(I) + SKC_PLACE_SUBGROUP_SIZE) + +#elif ( SKC_PREFIX_SUBGROUP_SIZE > SKC_PLACE_SUBGROUP_SIZE ) // same as above when ratio equals 1 + +#define SKC_PLACE_SUBGROUP_RATIO (SKC_PREFIX_SUBGROUP_SIZE / SKC_PLACE_SUBGROUP_SIZE) +#define SKC_PLACE_SUBGROUP_RATIO_MASK (SKC_PLACE_SUBGROUP_RATIO - 1) +#define SKC_PLACE_SUBGROUP_RATIO_SCALE(I) ((I / SKC_PLACE_SUBGROUP_RATIO) * 2 * SKC_PLACE_SUBGROUP_RATIO + (I & SKC_PLACE_SUBGROUP_RATIO_MASK)) + +#define SKC_PLACE_STRIDE_H(L) (L) +#define SKC_PLACE_STRIDE_V_LO(I) (SKC_PLACE_SUBGROUP_RATIO_SCALE(I) * SKC_PLACE_SUBGROUP_SIZE) +#define SKC_PLACE_STRIDE_V_HI(I) (SKC_PLACE_STRIDE_V_LO(I) + SKC_PLACE_SUBGROUP_RATIO * SKC_PLACE_SUBGROUP_SIZE) + +#elif ( SKC_PREFIX_SUBGROUP_SIZE < SKC_PLACE_SUBGROUP_SIZE ) // same as above when ratio equals 1 + +#define SKC_PLACE_SUBGROUP_RATIO (SKC_PLACE_SUBGROUP_SIZE / SKC_PREFIX_SUBGROUP_SIZE) +#define SKC_PLACE_SUBGROUP_RATIO_MASK (SKC_PLACE_SUBGROUP_SIZE / SKC_PLACE_SUBGROUP_RATIO - 1) // equal to prefix subgroup mask + +#define SKC_PLACE_STRIDE_H(L) (((L) & ~SKC_PLACE_SUBGROUP_RATIO_MASK) * 2 + ((L) & SKC_PLACE_SUBGROUP_RATIO_MASK)) +#define SKC_PLACE_STRIDE_V_LO(I) (I * 2 * SKC_PLACE_SUBGROUP_SIZE) +#define SKC_PLACE_STRIDE_V_HI(I) (SKC_PLACE_STRIDE_V_LO(I) + SKC_PLACE_SUBGROUP_SIZE / SKC_PLACE_SUBGROUP_RATIO) + +#endif + +// +// A COARSE COMPILE-TIME GUARD -- WILL ONLY MATTER WHEN SUBGROUP SIZE +// IS EQUAL TO THE RASTER HEADER SIZE (CURRENTLY 8) +// + +#define SKC_PLACE_IS_ALL_HEADER_ROW(i) (((i)+1) * SKC_PLACE_SUBGROUP_SIZE <= SKC_RASTER_HEAD_DWORDS) + +#define SKC_PLACE_IS_NOT_HEADER_ROW(i) ( (i) * SKC_PLACE_SUBGROUP_SIZE >= SKC_RASTER_HEAD_DWORDS) + +#define SKC_PLACE_IS_TRAILING_ROW(i) (((i)+1) * SKC_PLACE_SUBGROUP_SIZE == SKC_DEVICE_BLOCK_DWORDS) + +#define SKC_PLACE_IS_HEADER_ROW_KEY(i) ((i) * SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id() - SKC_RASTER_HEAD_DWORDS < (k)) + + +// +// Note: HEADER_LESS_THAN purposefully wraps unsigned integer to ~UINT_MAX +// +#define SKC_PLACE_HEADER_LESS_THAN(i,k) ((i) * SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id() - SKC_RASTER_HEAD_DWORDS < (k)) +#define SKC_PLACE_NODE_LESS_THAN(i,k) ((i) * SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id() < (k)) + +// +// TTSK v2: +// +// 0 63 +// | TTSB ID | PREFIX | SPAN | X | Y | +// +---------+--------+---------+-----+-----+ +// | 27 | 1 (=0) | 12 (=0) | 12 | 12 | +// +// +// TTPK v2: +// +// 0 63 +// | TTPB ID | PREFIX | SPAN | X | Y | +// +---------+--------+------+-----+-----+ +// | 27 | 1 (=1) | 12 | 12 | 12 | +// +// + +// +// TTCK (32-BIT COMPARE) v1: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 18 | 7 | 7 | +// +// +// TTCK (32-BIT COMPARE) v2: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 15 | 9 | 8 | +// +// +// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 27 | 1 | 1 | 18 | 9 | 8 | +// + +union skc_subgroup_smem +{ + skc_uint scratch[SKC_PLACE_SUBGROUP_SIZE]; // will only use SKC_PLACE_SUBGROUP_SIZE + + struct { + struct { + skc_ttsk_lo_t sk[SKC_PLACE_SMEM_COUNT_TTSK]; + skc_ttpk_lo_t pk[SKC_PLACE_SMEM_COUNT_TTPK]; + } lo; + + struct { + skc_ttsk_hi_t sk[SKC_PLACE_SMEM_COUNT_TTSK]; + skc_ttpk_hi_t pk[SKC_PLACE_SMEM_COUNT_TTPK]; + } hi; + + // skc_uint span[SKC_PLACE_SMEM_COUNT_TTPK]; + }; + +}; + +// +// scatter scan max +// +static +skc_int_v_t +skc_scatter_scan_max(__local union skc_subgroup_smem volatile * const smem, + skc_int_v_t const iss, + skc_int_v_t const ess) +{ + // + // prefix sums determine which lanes we're going to work on next + // + skc_pred_v_t const is_scratch_store = (iss > 0) && (ess < SKC_PLACE_SUBGROUP_SIZE); + skc_int_v_t const scratch_idx = max(ess,0); + + // + // SIMT + // + + // + // zero the volatile smem scratchpad using vector syntax + // + smem->scratch[get_sub_group_local_id()] = ( 0 ); + + // + // store source lane at starting lane + // + if (is_scratch_store) { + smem->scratch[scratch_idx] = get_sub_group_local_id(); + } + + // + // propagate lanes to right using max scan + // + skc_int_v_t const scratch = smem->scratch[get_sub_group_local_id()]; + skc_int_v_t const source = sub_group_scan_inclusive_max(scratch); + + return source; +} + +// +// +// + +static +skc_bool +skc_xk_clip(union skc_tile_clip const * const tile_clip, + skc_ttxk_t * const xk) +{ + // + // clip the sk and pk keys + // + // if fully clipped then return false + // + // alternatively -- we can expand all these keys in place + // + // alternatively -- keep sk and pk keys segregated because sk + // represents the vast majority of keys and are easier to process. + // don't mess with the fastpath! + // + return false; +} + +// +// +// + +static +skc_ttck_t +skc_sk_to_ck(__local union skc_subgroup_smem volatile * const smem, + union skc_cmd_place const * const cmd, + skc_uint const sk_idx) +{ + skc_uint const lo = smem->lo.sk[sk_idx]; // assumes prefix bit is 0 + skc_uint const hi = smem->hi.sk[sk_idx]; + + skc_ttck_t ck; + + ck.lo = lo | (cmd->layer_id << SKC_TTCK_LO_BITS_ID_PREFIX_ESCAPE); // FIXME -- preshift the layer id + + // FIXME -- x and y should already be clipped and shifted + skc_uint const x = (cmd->tx + SKC_BFE(hi,SKC_TTXK_HI_BITS_X,SKC_TTXK_HI_OFFSET_X)) << SKC_TTCK_HI_OFFSET_X; + skc_uint const y = (cmd->ty + SKC_BFE(hi,SKC_TTXK_HI_BITS_Y,SKC_TTXK_HI_OFFSET_Y)) << SKC_TTCK_HI_OFFSET_Y; + + ck.hi = (cmd->layer_id >> SKC_TTCK_HI_SHR_LAYER) | x | y; + + return ck; +} + +static +skc_ttck_t +skc_pk_to_ck(__local union skc_subgroup_smem volatile * const smem, + union skc_cmd_place const * const cmd, + skc_uint const pk_idx, + skc_uint const dx) +{ + skc_uint const lo = smem->lo.pk[pk_idx] & SKC_TTXK_LO_MASK_ID_PREFIX; // assumes prefix bit is 1 + skc_uint const hi = smem->hi.pk[pk_idx]; + + skc_ttck_t ck; + + ck.lo = lo | (cmd->layer_id << SKC_TTCK_LO_BITS_ID_PREFIX_ESCAPE); // FIXME -- preshift the layer id + + // FIXME -- x and y should already be clipped and shifted + skc_uint const x = (cmd->tx + dx + SKC_BFE(hi,SKC_TTXK_HI_BITS_X,SKC_TTXK_HI_OFFSET_X)) << SKC_TTCK_HI_OFFSET_X; + skc_uint const y = (cmd->ty + SKC_BFE(hi,SKC_TTXK_HI_BITS_Y,SKC_TTXK_HI_OFFSET_Y)) << SKC_TTCK_HI_OFFSET_Y; + + ck.hi = (cmd->layer_id >> SKC_TTCK_HI_SHR_LAYER) | x | y; + + return ck; +} + +// +// +// + +static +void +skc_ttsk_flush(__global SKC_ATOMIC_UINT volatile * const place_atomics, + __global skc_ttck_t * const ck_extent, + __local union skc_subgroup_smem volatile * const smem, + union skc_cmd_place const * const cmd, + skc_uint const sk) +{ + // + // Pretty sure you can never ever have an sk count equal to 0 + // + skc_uint ck_base = 0; + + // last lane performs the block pool allocation with an atomic increment + if (get_sub_group_local_id() == 0) { + ck_base = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(place_atomics,sk); + } + + // broadcast base to all lanes + ck_base = sub_group_broadcast(ck_base,0); + + // convert sk keys to ck keys + for (skc_uint ii=get_sub_group_local_id(); ii<sk; ii+=SKC_PLACE_SUBGROUP_SIZE) + { + ck_extent[ck_base+ii] = skc_sk_to_ck(smem,cmd,ii); + } +} + +// +// +// + +static +skc_int +skc_ttpk_get_span(__local union skc_subgroup_smem volatile * const smem, + skc_uint const idx) +{ + skc_uint const lo = smem->lo.pk[idx]; + skc_uint const hi = smem->hi.pk[idx]; + + skc_uint const span_lo = lo >> SKC_TTXK_LO_OFFSET_SPAN; + skc_uint const span_hi = (hi & SKC_BITS_TO_MASK(SKC_TTXK_HI_BITS_SPAN)) << SKC_TTXK_LO_BITS_SPAN; + + return (span_lo | span_hi) + 1; +} + +// +// +// + +static +void +skc_ttpk_flush(__global SKC_ATOMIC_UINT volatile * const place_atomics, + __global skc_ttck_t * const ck_extent, + __local union skc_subgroup_smem volatile * const smem, + union skc_cmd_place const * const cmd, + skc_uint const pk) +{ + // bail out if pk queue is empty + if (pk == 0) + return; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("%u\n",pk); +#endif + + // + // FIXME -- this nested loop iterates over the queue processing a + // subgroup of 64-bit keys at a time. This is probably not the most + // efficient approach so investigate how to store and iterate over a + // wider than subgroup (node-sized) queue of keys. + // + + // round up so we work with full subgroups + skc_uint const pk_ru = (pk + SKC_PLACE_SUBGROUP_SIZE - 1) & ~SKC_PLACE_SUBGROUP_MASK; + skc_uint ii = 0; + + // nested loop that expands all ttpk keys +#if (SKC_PLACE_SMEM_COUNT_TTPK > SKC_PLACE_SUBGROUP_SIZE) + for (; ii<pk_ru; ii+=SKC_PLACE_SUBGROUP_SIZE) +#endif + { + skc_uint idx = ii + get_sub_group_local_id(); + skc_int span = 0; + + // how many tiles does this ttpk span? + if (idx < pk) + span = skc_ttpk_get_span(smem,idx); + + // we need inclusive, exclusive and total + skc_int iss = sub_group_scan_inclusive_add(span); + skc_int ess = iss - span; + skc_int rem = sub_group_broadcast(iss,SKC_PLACE_SUBGROUP_SIZE-1); + + // printf("%u : %u\n",span,iss); + // continue; + + // atomically allocate space for the pk keys + skc_uint ck_base = 0; + + // last lane performs the block pool allocation with an atomic increment + if (get_sub_group_local_id() == 0) { + ck_base = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(place_atomics,rem); + } + + // broadcast atomically allocated extent base to all lanes + skc_uint ck_idx = sub_group_broadcast(ck_base,0) + get_sub_group_local_id(); + + // + // FIXME -- this loop would probably be faster if the ttpk keys + // were held in registers and accessed with shuffles instead of + // SMEM loads + // + + // + // loop until there are no more expanded pk keys + // + while (true) + { + skc_int const source = skc_scatter_scan_max(smem,iss,ess); + skc_int const dx = get_sub_group_local_id() - intel_sub_group_shuffle(ess,source); + + // store valid ck keys to gmem + if (get_sub_group_local_id() < rem) { + ck_extent[ck_idx] = skc_pk_to_ck(smem,cmd,ii+source,dx); + } + + // decrement remainder + rem -= SKC_PLACE_SUBGROUP_SIZE; + + if (rem <= 0) + break; + + // increment/decrement indices + ck_idx += SKC_PLACE_SUBGROUP_SIZE; + iss -= SKC_PLACE_SUBGROUP_SIZE; + ess -= SKC_PLACE_SUBGROUP_SIZE; + } + } +} + +// +// +// + +static +skc_uint +skc_ballot(skc_uint * const xk, skc_uint const is_xk) +{ +#if 0 + // + // FIXME -- when available, this should use the idiom: + // + // ballot() + lane_mask_less_than_or_equal + popcount() + // + // Supported by: + // + // - Vulkan 1.1 / SPIR-V 1.3 + // - CUDA + // - AVX2 (SSE*?) + // +#else + // + // otherwise, emulate with an inclusive scan (yuk) + // + skc_uint const prefix = sub_group_scan_inclusive_add(is_xk); + + skc_uint const xk_idx = *xk + prefix - is_xk; + + *xk += sub_group_broadcast(prefix,SKC_PLACE_SUBGROUP_LAST); + +#if 0 + printf("< %3u >\n",xk_idx); +#endif + + return xk_idx; +#endif +} + +// +// +// +__kernel +SKC_PLACE_KERNEL_ATTRIBS +void +skc_kernel_place(__global skc_bp_elem_t * const bp_elems, + __global SKC_ATOMIC_UINT volatile * const place_atomics, + __global skc_ttck_t * const ck_extent, + __global union skc_cmd_place const * const cmds, + __global skc_block_id_t * const map, + skc_uint4 const clip, + skc_uint const count) +{ + // + // declare shared memory block + // +#if ( SKC_PLACE_WORKGROUP_SUBGROUPS == 1 ) + __local union skc_subgroup_smem volatile smem[1]; +#else + __local union skc_subgroup_smem volatile smem_wg[SKC_PLACE_WORKGROUP_SUBGROUPS]; + __local union skc_subgroup_smem volatile * const smem = smem_wg + get_sub_group_id(); +#endif + + // + // This is a subgroup-centric kernel + // + // Which subgroup in the grid is this? + // + // TAKE NOTE: the Intel GEN compiler appears to be recognizing + // get_group_id(0) as a uniform but the alternative calculation used + // when there are multiple subgroups per workgroup is not + // cooperating and driving spillage elsewhere. + // + // Test the raster's translated bounds against the composition's + // tile clip + // + // There are 3 cases: + // + // - the raster is completely clipped -> return + // - the raster is partially clipped -> all keys must clipped + // - the raster is not clipped -> no keys are tested + // + // + // There are at least 4 implementations of place and we want to + // special-case them as much as possible so that, at the least, the + // fastpath remains fast. + // + // - implement NO CLIP + NO TRANSLATION fastpath -- CAN ATOMICALLY ALLOCATE SK+PK KEYS IN ONE STEP + // + // - implement CLIPPED + NO TRANSLATION path + // + // - implement NO CLIP + TRANSLATION path + // + // - implement CLIPPED + TRANSLATION path + // + // + // FIXME/OPTIMIZATION: split scan accumulator into a triple-bin + // 12:12:8 integer where: + // + // 12: ttsk + // 12: ttpk + // 8: /dev/null -- clipped or invalid key + // + // Three kinds of nodes in a raster's list: + // + // - the head node + // - an internal node + // - the final node + // + +#if ( SKC_PLACE_WORKGROUP_SUBGROUPS == 1 ) + skc_uint const cmd_idx = get_group_id(0); +#else + skc_uint const cmd_idx = get_group_id(0) * SKC_PLACE_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + + // load command + union skc_cmd_place const cmd = cmds[cmd_idx]; + + // get the raster header from the raster host id -- scalar + skc_block_id_t id = map[cmd.raster_h]; + + // + // load all of the head block ttxk keys into registers + // + // FIXME -- this pattern lends itself to using the higher + // performance Intel GEN block load instructions + // + skc_uint const head_id = id * SKC_DEVICE_SUBBLOCK_WORDS + SKC_PLACE_STRIDE_H(get_sub_group_local_id()); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + union skc_raster_node_elem const h##I = { \ + .u32v2 = { bp_elems[head_id + SKC_PLACE_STRIDE_V_LO(I)], \ + bp_elems[head_id + SKC_PLACE_STRIDE_V_HI(I)] } \ + }; + + SKC_PLACE_EXPAND(); + + // + // load raster header counts -- we only need the "nodes" and "keys" + // words but the keys we loaded are doublewords. + // + // FIXME -- this can be made portable with compile-time macro expansion + // + skc_uint nodes = sub_group_broadcast(h0.u32v2.lo,1); // SKC_RASTER_HEAD_OFFSET_COUNTS_NODES + skc_uint keys = sub_group_broadcast(h0.u32v2.hi,1); // SKC_RASTER_HEAD_OFFSET_COUNTS_KEYS + + // + // + // +#if 0 +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + printf("%5u : %6u : %3u : %08X . %08X - %08X\n", \ + nodes,keys, \ + I*SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id(), \ + h##I.u32v2.hi,h##I.u32v2.lo, \ + h##I.u32v2.lo & SKC_TTXK_LO_MASK_PREFIX); + + SKC_PLACE_EXPAND(); +#endif + + // +#if 0 + if (get_sub_group_local_id() == 0) { + printf("place: %u / %u / %u\n",head_id,nodes,keys); + } +#endif + + { + // + // classify every key in the header + // + // keys: 0 is not a key / 1 is a key + // skpk: 0 is sk / 1 is pk + // + skc_uint bits_keys = 0; + skc_uint bits_skpk = 0; + + // + // calculate bits_keys + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PLACE_IS_ALL_HEADER_ROW(I)) { \ + skc_uint const idx = I * SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id() - SKC_RASTER_HEAD_DWORDS; \ + if (idx < keys) { \ + bits_keys |= (1u << I); \ + } \ + if (SKC_PLACE_IS_TRAILING_ROW(I)) { \ + if (keys > SKC_RASTER_HEAD_COUNT_KEYS) { \ + if (get_sub_group_local_id() == SKC_PLACE_SUBGROUP_LAST) { \ + bits_keys &= ~(1u << I); \ + } \ + } \ + } \ + } + + SKC_PLACE_EXPAND(); + + // + // blindly calculate bits_skpk + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PLACE_IS_ALL_HEADER_ROW(I)) { \ + bits_skpk |= (h##I.xk.lo & SKC_TTXK_LO_MASK_PREFIX) >> (SKC_TTXK_LO_OFFSET_PREFIX - I); \ + } + + SKC_PLACE_EXPAND(); + +#if 0 + printf("%2X : %2X\n",bits_keys,bits_skpk); +#endif + + // + // next pointer is last element of last row. save it now because + // this might be recognized as a subgroup-uniform/scalar. + // + id = sub_group_broadcast(SKC_CONCAT(h,SKC_PLACE_EXPAND_I_LAST).next.node,SKC_PLACE_SUBGROUP_LAST); + + // + // append SK keys first + // + skc_uint const bits_sk = bits_keys & ~bits_skpk; + skc_uint sk = 0; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PLACE_IS_ALL_HEADER_ROW(I)) { \ + skc_uint is_sk = (bits_sk >> I) & 1; \ + skc_uint sk_idx = skc_ballot(&sk,is_sk); \ + if (is_sk) { \ + smem->lo.sk[sk_idx] = h##I.xk.lo; \ + smem->hi.sk[sk_idx] = h##I.xk.hi; \ + } \ + } + + SKC_PLACE_EXPAND(); + + // + // append PK keys next + // + skc_uint const bits_pk = bits_keys & bits_skpk; + skc_uint pk = 0; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_PLACE_IS_ALL_HEADER_ROW(I)) { \ + skc_uint is_pk = (bits_pk >> I) & 1; \ + skc_uint pk_idx = skc_ballot(&pk,is_pk); \ + if (is_pk) { \ + smem->lo.pk[pk_idx] = h##I.xk.lo; \ + smem->hi.pk[pk_idx] = h##I.xk.hi; \ + } \ + } + + SKC_PLACE_EXPAND(); + +#if 0 + printf("%2u * %2u\n",sk,pk); +#endif + // + // flush the keys + // + skc_ttsk_flush(place_atomics,ck_extent,smem,&cmd,sk); + skc_ttpk_flush(place_atomics,ck_extent,smem,&cmd,pk); + } + + // + // we're done if there was only a head node + // + if (nodes == 0) + return; + + // + // decrement keys + // + keys -= SKC_RASTER_HEAD_COUNT_KEYS; + + // + // otherwise, append keys in trailing nodes to smem + // + while (true) + { + // + // load all of the node block ttxk keys into registers + // + // FIXME -- this pattern lends itself to using the higher + // performance Intel GEN block load instructions + // + skc_uint const node_id = id * SKC_DEVICE_SUBBLOCK_WORDS + SKC_PLACE_STRIDE_H(get_sub_group_local_id()); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + union skc_raster_node_elem const n##I = { \ + .u32v2 = { bp_elems[node_id + SKC_PLACE_STRIDE_V_LO(I)], \ + bp_elems[node_id + SKC_PLACE_STRIDE_V_HI(I)] } \ + }; + + SKC_PLACE_EXPAND(); + +#if 0 +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + printf("%5u : %6u : %3u : %08X . %08X - %08X\n", \ + nodes,keys, \ + I*SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id(), \ + n##I.u32v2.hi,n##I.u32v2.lo, \ + n##I.u32v2.lo & SKC_TTXK_LO_MASK_PREFIX); + + SKC_PLACE_EXPAND(); +#endif + + // + // classify every key in the header + // + // keys: 0 is not a key / 1 is a key + // skpk: 0 is sk / 1 is pk + // + skc_uint bits_keys = 0; + skc_uint bits_skpk = 0; + + // + // calculate bits_keys + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) { \ + skc_uint const idx = I * SKC_PLACE_SUBGROUP_SIZE + get_sub_group_local_id(); \ + if (idx < keys) { \ + bits_keys |= (1u << I); \ + } \ + if (SKC_PLACE_IS_TRAILING_ROW(I)) { \ + if (keys > SKC_RASTER_NODE_COUNT_KEYS) { \ + if (get_sub_group_local_id() == SKC_PLACE_SUBGROUP_LAST) { \ + bits_keys &= ~(1u << I); \ + } \ + } \ + } \ + } + + SKC_PLACE_EXPAND(); + + // + // blindly calculate bits_skpk + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) { \ + bits_skpk |= (n##I.xk.lo & SKC_TTXK_LO_MASK_PREFIX) >> (SKC_TTXK_LO_OFFSET_PREFIX - I); \ + } + + SKC_PLACE_EXPAND(); + +#if 0 + printf("%2X : %2X\n",bits_keys,bits_skpk); +#endif + + // + // next pointer is last element of last row. save it now because + // this might be recognized as a subgroup-uniform/scalar. + // + id = sub_group_broadcast(SKC_CONCAT(n,SKC_PLACE_EXPAND_I_LAST).next.node,SKC_PLACE_SUBGROUP_LAST); + + // + // append SK keys first + // + skc_uint const bits_sk = bits_keys & ~bits_skpk; + skc_uint sk = 0; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) { \ + skc_uint is_sk = (bits_sk >> I) & 1; \ + skc_uint sk_idx = skc_ballot(&sk,is_sk); \ + if (is_sk) { \ + smem->lo.sk[sk_idx] = n##I.xk.lo; \ + smem->hi.sk[sk_idx] = n##I.xk.hi; \ + } \ + } + + SKC_PLACE_EXPAND(); + + // + // append PK keys next + // + skc_uint const bits_pk = bits_keys & bits_skpk; + skc_uint pk = 0; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) { \ + skc_uint is_pk = (bits_pk >> I) & 1; \ + skc_uint pk_idx = skc_ballot(&pk,is_pk); \ + if (is_pk) { \ + smem->lo.pk[pk_idx] = n##I.xk.lo; \ + smem->hi.pk[pk_idx] = n##I.xk.hi; \ + } \ + } + + SKC_PLACE_EXPAND(); + +#if 0 + printf("%2u * %2u\n",sk,pk); +#endif + // + // if total for either the sk or pk queue reaches the + // highwater mark then flush it to the extent + // + skc_ttsk_flush(place_atomics,ck_extent,smem,&cmd,sk); + skc_ttpk_flush(place_atomics,ck_extent,smem,&cmd,pk); + + // + // if this was the last node then we're done + // + if (--nodes == 0) + return; + + // + // otherwise decrement keys + // + keys -= SKC_RASTER_NODE_COUNT_KEYS; + } +} + +// +// +// diff --git a/src/compute/skc/prefix.cl b/src/compute/skc/prefix.cl new file mode 100644 index 0000000000..960b6cf5ff --- /dev/null +++ b/src/compute/skc/prefix.cl @@ -0,0 +1,1042 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "raster_builder_cl_12.h" +#include "block.h" +#include "raster.h" +#include "atomic_cl.h" +#include "macros.h" +#include "tile.h" + +// +// INPUT: +// +// TTRK (64-BIT COMPARE) +// +// 0 63 +// | TTSB ID | X | Y | COHORT ID | +// +---------+------+------+-----------+ +// | 27 | 12 | 12 | 13 | +// +// +// TTRK (32-BIT COMPARE) +// +// 0 63 +// | TTSB ID | N/A | X | Y | COHORT ID | +// +---------+-----+------+------+-----------+ +// | 27 | 5 | 12 | 12 | 8 | +// +// +// OUTPUT: +// +// TTSK v2: +// +// 0 63 +// | TTSB ID | PREFIX | N/A | X | Y | +// +---------+--------+------+----+----+ +// | 27 | 1 (=0) | 12 | 12 | 12 | +// +// +// TTPK v1: +// +// 0 63 +// | TTPB ID | ALL ZEROES | SPAN | X | Y | +// +---------+------------+------+-----+-----+ +// | 27 | 1 | 12 | 12 | 12 | +// +// +// TTPK v2: +// +// 0 63 +// | TTPB ID | PREFIX | SPAN | X | Y | +// +---------+--------+------+-----+-----+ +// | 27 | 1 (=1) | 12 | 12 | 12 | +// + +#define SKC_PREFIX_SUBGROUP_MASK (SKC_PREFIX_SUBGROUP_SIZE - 1) + +// +// smem accumulator +// + +union skc_subgroup_accum +{ + struct { + SKC_ATOMIC_INT ttp[SKC_TILE_HEIGHT]; + } atomic; + + struct { + skc_ttp_t ttp[SKC_TILE_HEIGHT]; + } aN; + + struct { + SKC_PREFIX_TTP_V ttp[SKC_PREFIX_SUBGROUP_SIZE]; + } vN; + + struct { + SKC_PREFIX_SMEM_ZERO ttp[SKC_TILE_HEIGHT / SKC_PREFIX_SMEM_ZERO_WIDTH]; + } zero; +}; + +// +// +// + +struct skc_subgroup_smem +{ + // prefix accumulator + union skc_subgroup_accum accum; +}; + +// +// +// + +static +skc_uint +skc_subgroup_lane() +{ +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + return get_sub_group_local_id(); +#else + return 0; +#endif +} + +// +// +// + +static +SKC_PREFIX_TTS_V_BITFIELD +skc_tts_get_dy(skc_tts_v_t const ttsv) +{ + // tts.dy is packed to fit in range [-32,31] and unpacked to [-32..-1,+1..+32] + SKC_PREFIX_TTS_V_BITFIELD const dy = ttsv >> SKC_TTS_OFFSET_DY; + + return dy - (~ttsv >> 31); +} + +static +SKC_PREFIX_TTS_V_BITFIELD +skc_tts_get_py(skc_tts_v_t const ttsv) +{ + return SKC_BFE(ttsv,SKC_TTS_BITS_TY-SKC_SUBPIXEL_RESL_Y_LOG2,SKC_TTS_OFFSET_TY+SKC_SUBPIXEL_RESL_Y_LOG2); +} + +// +// +// + +static +void +skc_accum_scatter(__local struct skc_subgroup_smem * const smem, skc_tts_v_t const tts_v) +{ + // get "altitude" + SKC_PREFIX_TTS_V_BITFIELD dy = skc_tts_get_dy(tts_v); + + // get the y pixel coordinate + SKC_PREFIX_TTS_V_BITFIELD py = skc_tts_get_py(tts_v); + + // + // FIXME -- benchmark performance of setting dy to 0 if tts_v is invalid? + // + // FIXME -- consider making TTS_INVALID a dy/py/etc. that's a no-op + // + +#if 0 + if (tts_v != SKC_TTS_INVALID) + printf("< %08X = %u : %d >\n",tts_v,py,dy); +#endif + + // + // scatter-add the "altitude" to accumulator + // +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // GPU/SIMT -- IMPLIES SUPPORT FOR ATOMIC SCATTER-ADD + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (tts_v C != SKC_TTS_INVALID) { \ + SKC_ATOMIC_ADD_LOCAL_RELAXED_SUBGROUP(smem->accum.atomic.ttp + py C, dy C); \ + } + +#else + // + // CPU/SIMD -- ITERATE OVER VECTOR, NO NEED FOR ATOMICS + // + // WITH SIMD, ONCE A TTS_INVALID IS DETECTED WE CAN QUIT + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (tts_v C == SKC_TTS_INVALID) \ + return; \ + smem->accum.aN.ttp[py C] = dy C; +#endif + + SKC_PREFIX_TTS_VECTOR_INT_EXPAND(); +} + +// +// The implication here is that if our device configuration has a +// rectangular 1:2 tile then we need a block size of at least 2 +// subblocks. The subblock size of course needs to match the length of +// the smallest tile side. +// + +static +void +skc_accum_flush(__local struct skc_subgroup_smem * const smem, + __global skc_bp_elem_t * const bp_elems, + skc_block_id_t const pb_id) +{ + // load the ttp elements + SKC_PREFIX_TTP_V const ttp_v = smem->accum.vN.ttp[get_sub_group_local_id()]; + skc_uint const offset = pb_id * (SKC_DEVICE_SUBBLOCK_WORDS / SKC_TILE_RATIO) + skc_subgroup_lane(); + +#if ( SKC_TILE_RATIO == 1 ) + + bp_elems[offset] = ttp_v; + +#elif ( SKC_TILE_RATIO == 2 ) + + vstore2(ttp_v,offset,bp_elems); + +#else + +#error("tile ratio greater than 2 not supported") + +#endif +} + +// +// +// + +static +void +skc_accum_reset(__local struct skc_subgroup_smem * const smem) +{ + for (uint ii=0; ii<SKC_TILE_HEIGHT / SKC_PREFIX_SMEM_ZERO_WIDTH / SKC_PREFIX_SUBGROUP_SIZE; ii++) + smem->accum.zero.ttp[ii * SKC_PREFIX_SUBGROUP_SIZE + skc_subgroup_lane()] = ( 0 ); +} + +// +// get next sk key +// + +static +skc_ttsk_s_t +skc_ttsk_v_get_next(skc_ttsk_v_t * const sk_v, + skc_uint * const sk_next, + skc_int * const rkpk_rem) +{ + // decrement count + *rkpk_rem -= 1; + +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // SIMT with subgroup support is easy + // + // SIMT without subgroup support can always emulate with smem + // +#if 0 + // + // BUG TICKLED BY FILTHY CODE -- Intel compiler doesn't properly + // broadcast a uint2 cast to a long. It was probably bad to do this + // anyway without a union wrapping the TTSK scalar type. + // + // Consider creating a union { ulong; uint2 } at a later date -- + // probably no need to ever do this unless it makes broadcast faster + // which is unlikely since it will probably be implemented as 2 + // 32-bit broadcasts. + // + // Additionally, the TTRK and TTXK key bitfield sizes are probably + // cast in stone and we aren't going to change them no matter + // architecture we're on. + // + skc_ttsk_s_t sk_s = sub_group_broadcast(SKC_AS(ulong)(*sk_v),(*sk_next)++); +#else + skc_ttsk_s_t sk_s; + + sk_s.lo = sub_group_broadcast(sk_v->lo,*sk_next); + sk_s.hi = sub_group_broadcast(sk_v->hi,*sk_next); + *sk_next += 1; +#endif + +#else + // + // SIMD will always grab component .s0 and then rotate the vector + // + sk_s = ( sk_v->s0 ); + + skc_ttsk_v_rotate_down(sk_v); + +#endif + + return sk_s; +} + +// +// +// + +static +skc_raster_yx_s +skc_ttsk_v_first(skc_ttsk_v_t * const sk_v, skc_uint const sk_next) +{ +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // SIMT with subgroup support is easy + // + // SIMT without subgroup support can always emulate with smem + // + skc_raster_yx_s const yx_s = sub_group_broadcast(sk_v->hi,sk_next); + +#else + // + // SIMD will always grab component .s0 and then rotate the vector + // + skc_raster_yx_s const yx_s = ( sk_v->s0.hi ); + +#endif + + return yx_s; +} + +// +// mask off ttsb id +// + +static +skc_block_id_s_t +skc_ttsk_s_get_ttsb_id(skc_ttsk_s_t const * const sk_s) +{ + return ( sk_s->lo & SKC_TTXK_LO_MASK_ID ); +} + +// +// load tts_v as early as possible +// + +static +skc_tts_v_t +skc_load_tts(__global skc_bp_elem_t * const bp_elems, + skc_block_id_s_t const sb_id) +{ + return ( bp_elems[sb_id * SKC_DEVICE_SUBBLOCK_WORDS + skc_subgroup_lane()] ); +} + +// +// massage ttrk keys into ttsk keys +// + +static +void +skc_ttrk_to_ttsk(skc_ttsk_v_t * const sk_v) +{ + sk_v->lo = sk_v->lo & SKC_TTXK_LO_MASK_ID; // clear high (N/A) bits + sk_v->hi = sk_v->hi << SKC_TTRK_HI_BITS_COHORT; // shift cohort away -- zeroes low bits +} + +// +// replenish ttsk keys +// + +static +void +skc_ttsk_v_replenish(skc_ttsk_v_t * const sk_v, + skc_uint * const sk_next, + skc_uint * const rks_next, + __global skc_ttrk_e_t const * const rks) +{ + // if there are still keys available then return + if (*sk_next < SKC_PREFIX_TTXK_V_SIZE) + return; + + // + // otherwise, replenish sk_v + // + // NOTE NOTE NOTE -- we are assuming rks[] extent size is always + // divisible by TTXK_V_SIZE and therefore loading some keys from the + // next raster is OK. + // + *sk_next = 0; + *rks_next += SKC_PREFIX_SUBGROUP_SIZE; + *sk_v = rks[*rks_next]; + +#if 0 + printf("* %08X ( %3u, %3u )\n", + sk_v->hi, + (sk_v->hi >> 12) & 0xFFF, + (sk_v->hi ) & 0xFFF); +#endif + + skc_ttrk_to_ttsk(sk_v); + +#if 0 + printf("! %08X ( %3u, %3u )\n", + sk_v->hi, + (sk_v->hi >> 20) & 0xFFF, + (sk_v->hi >> 8) & 0xFFF); +#endif +} + +// +// replenish block ids +// +// note that you can't overrun the block id pool since it's a ring +// + +static +void +skc_blocks_replenish(skc_uint * const blocks_next, + skc_uint * const blocks_idx, + skc_block_id_v_t * const blocks, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids) + +{ + *blocks_idx += SKC_PREFIX_BLOCK_ID_V_SIZE; + *blocks = bp_ids[*blocks_idx & bp_mask]; + *blocks_next = 0; + +#if 0 + printf("replenish blocks: %u\n",*blocks); +#endif +} + +// +// +// + +static +skc_block_id_t +skc_blocks_get_next(skc_uint * const blocks_next, + skc_uint * const blocks_idx, + skc_block_id_v_t * const blocks, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids) +{ + // replenish? + if (*blocks_next == SKC_PREFIX_BLOCK_ID_V_SIZE) + { + skc_blocks_replenish(blocks_next,blocks_idx,blocks,bp_mask,bp_ids); + } + +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // SIMT + // + skc_block_id_t id = sub_group_broadcast(*blocks,*blocks_next); + +#else + // + // SIMD + // + skc_block_id_t id = blocks->s0; + + skc_shuffle_down_1(*blocks); + +#endif + + *blocks_next += 1; + + return id; +} + +// +// subblock allocator +// + +#if ( SKC_DEVICE_SUBBLOCK_WORDS_LOG2 < SKC_DEVICE_BLOCK_WORDS_LOG2 ) + +static +skc_block_id_t +skc_subblocks_get_next_pb_id(skc_block_id_t * const subblocks, + skc_uint * const blocks_next, + skc_uint * const blocks_idx, + skc_block_id_v_t * const blocks, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids) +{ + if ((*subblocks & SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK) == 0) + { + *subblocks = skc_blocks_get_next(blocks_next,blocks_idx,blocks,bp_mask,bp_ids); + } + + skc_block_id_t const pb_id = *subblocks; + + *subblocks += SKC_TILE_RATIO; // note this is one or two subblocks + + return pb_id; +} + +#endif + +// +// append a ttsk key to the work-in-progress node +// + +static +void +skc_node_v_append_sk(skc_ttsk_s_t const * const sk_s, + + skc_ttxk_v_t * const xk_v, + skc_uint * const xk_v_next, + skc_uint * const xk_v_idx, + __global skc_bp_elem_t * const bp_elems, + + skc_int const rkpk_rem, + + skc_uint * const blocks_next, + skc_uint * const blocks_idx, + skc_block_id_v_t * const blocks, + skc_uint const bp_mask, + __global skc_block_id_t const * const bp_ids) +{ + // + // Append an sk key to the in-register xk_v vector + // + // If the work-in-progress node in gmem will only have room for one + // more key then: + // + // - if this was the final SK then write out xk_v and exit + // + // - otherwise, acquire a block id, link it, write out xk_v, + // prepare new node + // + // Note that this does *not* try to squeeze in a final key into the + // next node slot. This optimization isn't worth the added + // down-pipeline complexity. + // +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // SIMT + // + if (get_sub_group_local_id() == (*xk_v_next & SKC_PREFIX_TTXK_V_MASK)) + { + *xk_v = *sk_s; + } + + *xk_v_next += 1; + + // are there more keys coming? + if (rkpk_rem > 0) + { + // is the node almost full? + if (*xk_v_next == SKC_RASTER_NODE_DWORDS - 1) + { + skc_block_id_t const id = skc_blocks_get_next(blocks_next,blocks_idx,blocks,bp_mask,bp_ids); + + if (get_sub_group_local_id() == SKC_PREFIX_TTXK_V_SIZE - 1) + { + xk_v->lo = id; + xk_v->hi = SKC_UINT_MAX; // this initialization isn't necessary + } + + // store xk_v (uint2) to bp (uint) + bp_elems[*xk_v_idx ] = xk_v->lo; + bp_elems[*xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = xk_v->hi; +#if 0 + printf("S) %u : %08v2X\n",*xk_v_idx,*xk_v); +#endif + // reinitialize xk_v + xk_v->lo = SKC_UINT_MAX; + xk_v->hi = SKC_UINT_MAX; + + // update node elem idx + *xk_v_idx = id * SKC_DEVICE_SUBBLOCK_WORDS + get_sub_group_local_id(); + + // reset node count + *xk_v_next = 0; + } + // is xk_v full? + else if ((*xk_v_next & SKC_PREFIX_TTXK_V_MASK) == 0) + { + // store xk_v to bp + bp_elems[*xk_v_idx ] = xk_v->lo; + bp_elems[*xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = xk_v->hi; +#if 0 + printf("s) %u : %08v2X\n",*xk_v_idx,*xk_v); +#endif + // reinitialize xk_v + xk_v->lo = SKC_UINT_MAX; + xk_v->hi = SKC_UINT_MAX; + + // increment node elem idx + *xk_v_idx += SKC_PREFIX_SUBGROUP_SIZE * 2; + } + } + else + { + bp_elems[*xk_v_idx ] = xk_v->lo; + bp_elems[*xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = xk_v->hi; +#if 0 + printf("z) %u : %08v2X\n",*xk_v_idx,*xk_v); +#endif + while ((*xk_v_idx & SKC_DEVICE_BLOCK_WORDS_MASK) < SKC_DEVICE_BLOCK_WORDS - SKC_PREFIX_SUBGROUP_SIZE * 2) + { + *xk_v_idx += SKC_PREFIX_SUBGROUP_SIZE * 2; + + bp_elems[*xk_v_idx] = SKC_UINT_MAX; + bp_elems[*xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = SKC_UINT_MAX; + } + } + +#else + // + // SIMD + // + +#endif +} + +// +// +// + +static +skc_ttpk_s_t +skc_ttpk_create(skc_raster_yx_s const yx_prev, + skc_raster_yx_s const yx_next, + skc_block_id_t const pb_id) +{ + // - yx_prev is already incremented by one + // - yx_span is already shifted up at hi.x + skc_uint const yx_span = yx_next - yx_prev; + + skc_ttpk_s_t pk; + + // turn on prefix bit | shift span bits upward + pk.lo = pb_id | SKC_TTXK_LO_MASK_PREFIX | (yx_span << SKC_TTPK_LO_SHL_YX_SPAN); + + // shift down high span bits | yx of tile + pk.hi = (yx_span >> SKC_TTPK_HI_SHR_YX_SPAN) | yx_prev; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("* %08v2X : %u\n",pk,yx_span); +#endif + + return pk; +} + +// +// append a ttpk key to the work-in-progress node +// + +static +void +skc_node_v_append_pk(skc_ttpk_s_t const * const pk_s, + + skc_ttxk_v_t * const xk_v, + skc_uint * const xk_v_next, + skc_uint * const xk_v_idx, + __global skc_bp_elem_t * const bp_elems, + + skc_uint * const blocks_next, + skc_uint * const blocks_idx, + skc_block_id_v_t * const blocks, + skc_uint const bp_mask, + __global skc_block_id_t const * const bp_ids) +{ + // + // append a pk key to the in-register xk_v vector + // + // if the work-in-progress node in gmem will only have room for one + // more key then: + // + // - if this was the final SK then write out xk_v and exit + // + // - otherwise, acquire a block id, link it, write out xk_v, + // prepare new node + // +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // SIMT + // + if (get_sub_group_local_id() == (*xk_v_next & SKC_PREFIX_TTXK_V_MASK)) + { + *xk_v = *pk_s; + } + + *xk_v_next += 1; + + // is the node almost full? + if (*xk_v_next == SKC_RASTER_NODE_DWORDS - 1) + { + skc_block_id_t const id = skc_blocks_get_next(blocks_next,blocks_idx,blocks,bp_mask,bp_ids); + + if (get_sub_group_local_id() == SKC_PREFIX_TTXK_V_SIZE - 1) + { + xk_v->lo = id; + xk_v->hi = SKC_UINT_MAX; // this initialization isn't necessary + } + + // store xk_v to bp + bp_elems[*xk_v_idx ] = xk_v->lo; + bp_elems[*xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = xk_v->hi; +#if 0 + printf("P) %u : %08v2X\n",*xk_v_idx,*xk_v); +#endif + // reinitialize xk_v + xk_v->lo = SKC_UINT_MAX; + xk_v->hi = SKC_UINT_MAX; + + // update node elem idx + *xk_v_idx = id * SKC_DEVICE_SUBBLOCK_WORDS + get_sub_group_local_id(); + + // reset node count + *xk_v_next = 0; + } + // is xk_v full? + else if ((*xk_v_next & SKC_PREFIX_TTXK_V_MASK) == 0) + { + // store xk_v to bp + bp_elems[*xk_v_idx ] = xk_v->lo; + bp_elems[*xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = xk_v->hi; +#if 0 + printf("p) %u : %08v2X\n",*xk_v_idx,*xk_v); +#endif + // reinitialize xk_v + xk_v->lo = SKC_UINT_MAX; + xk_v->hi = SKC_UINT_MAX; + + // increment node elem idx + *xk_v_idx += SKC_PREFIX_SUBGROUP_SIZE * 2; + } + +#else + // + // SIMD + // +#endif +} + +// +// append the first 3 fields of meta info to the raster header +// + +static +void +skc_node_v_init_header(skc_ttxk_v_t * const xk_v, + skc_uint * const xk_v_next, + union skc_raster_cohort_meta_out const * const meta) +{ +#if ( SKC_PREFIX_SUBGROUP_SIZE > 1 ) + // + // SIMT + // + if (get_sub_group_local_id() < 2) + { + *xk_v = ((get_sub_group_local_id() & 1) == 0) ? meta->u32v4.lo : meta->u32v4.hi; + } + +#if 0 + if (get_sub_group_local_id() == 0) + printf("header: %08v4X\n",meta->u32v4); +#endif + + // + // increment counter: uint4 + uint4 = uint2 x 4 + // + *xk_v_next = 2 + 2; // +2 for unitialized bounds + +#else + // + // SIMD + // + +#endif +} + +// +// +// + +__kernel +SKC_PREFIX_KERNEL_ATTRIBS +void +skc_kernel_prefix(__global skc_uint const * const bp_atomics, + __global skc_block_id_t const * const bp_ids, + __global skc_bp_elem_t * const bp_elems, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_ttrk_e_t const * const rks, + __global skc_block_id_t * const map, + __global skc_uint const * const metas, + skc_uint const count) +{ + // + // declare shared memory block + // +#if ( SKC_PREFIX_WORKGROUP_SUBGROUPS == 1 ) + __local struct skc_subgroup_smem smem[1]; +#else + __local struct skc_subgroup_smem smems[SKC_PREFIX_WORKGROUP_SUBGROUPS]; + __local struct skc_subgroup_smem * restrict const smem = smems + get_sub_group_id(); +#endif + + // + // where is this subgroup in the grid? + // +#if ( SKC_PREFIX_WORKGROUP_SUBGROUPS == 1 ) + skc_uint const sgi = get_group_id(0); +#else + skc_uint const sgi = get_group_id(0) * SKC_PREFIX_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + + skc_uint const sgl = get_sub_group_local_id(); + + // + // return if this subgroup is excess + // +#if ( SKC_PREFIX_WORKGROUP_SUBGROUPS > 1 ) + if (sgi >= count) + return; +#endif + + // + // get meta info for this subgroup's raster + // + union skc_raster_cohort_meta_out const meta = { vload4(sgi,metas) }; + skc_uint const reads = metas[SKC_RASTER_COHORT_META_OFFSET_READS + sgi]; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("%3u : %5u / %5u / %5u / %5u / %u\n", + sgi, + meta.blocks, + meta.offset, + meta.nodes, + meta.keys, + reads); +#endif + + // + // preload blocks -- align on subgroup + // + skc_uint blocks_idx = (reads & ~SKC_PREFIX_SUBGROUP_MASK) + skc_subgroup_lane(); + skc_block_id_v_t blocks = bp_ids[blocks_idx & bp_mask]; + skc_uint blocks_next = (reads & SKC_PREFIX_SUBGROUP_MASK); + + // + // prime xk_v_idx with a block but note that OpenCL vstore_n() will scale the offset + // + skc_uint xk_v_idx = sub_group_broadcast(blocks,blocks_next++) * SKC_DEVICE_SUBBLOCK_WORDS + get_sub_group_local_id(); + + // + // initialize raster header -- assumes block is greater than 8 words (4 doublewords) + // + skc_ttxk_v_t xk_v = { SKC_UINT_MAX, SKC_UINT_MAX }; + skc_uint xk_v_next; + + skc_node_v_init_header(&xk_v,&xk_v_next,&meta); + + // + // no keys -- this is an empty raster! + // + if (meta.keys == 0) + { + bp_elems[xk_v_idx ] = xk_v.lo; + bp_elems[xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = xk_v.hi; + + while ((xk_v_idx & SKC_DEVICE_BLOCK_WORDS_MASK) < SKC_DEVICE_BLOCK_WORDS - SKC_PREFIX_SUBGROUP_SIZE * 2) + { + xk_v_idx += SKC_PREFIX_SUBGROUP_SIZE * 2; + + bp_elems[xk_v_idx] = SKC_UINT_MAX; + bp_elems[xk_v_idx+SKC_PREFIX_SUBGROUP_SIZE] = SKC_UINT_MAX; + } + + return; + } + + // + // load TTRK keys and in-place convert to TTSK keys + // + skc_uint rks_next = (meta.offset & ~SKC_PREFIX_SUBGROUP_MASK) + skc_subgroup_lane(); + skc_ttsk_v_t sk_v = rks[rks_next]; + skc_uint sk_next = (meta.offset & SKC_PREFIX_SUBGROUP_MASK); + skc_int rkpk_rem = meta.keys; // signed count of remaining rk+pk keys + +#if 0 + printf("* %08X ( %3u, %3u )\n", + sk_v.hi, + (sk_v.hi >> 12) & 0xFFF, + (sk_v.hi ) & 0xFFF); +#endif + + skc_ttrk_to_ttsk(&sk_v); + +#if 0 + printf("! %08X ( %3u, %3u )\n", + sk_v.hi, + (sk_v.hi >> 20) & 0xFFF, + (sk_v.hi >> 8) & 0xFFF); +#endif + + // + // subblocks + // +#if ( SKC_DEVICE_SUBBLOCK_WORDS_LOG2 < SKC_DEVICE_BLOCK_WORDS_LOG2 ) + skc_block_id_t subblocks = 0; +#endif + + // + // begin "scan" of tiles + // + skc_raster_yx_s yx_prev = skc_ttsk_v_first(&sk_v,sk_next); + + // + // zero the accumulator + // + skc_accum_reset(smem); + + while (true) + { + // get next rk key + skc_ttsk_s_t const sk_s = skc_ttsk_v_get_next(&sk_v,&sk_next,&rkpk_rem); + + // load ttsb id + skc_block_id_s_t const sb_id = skc_ttsk_s_get_ttsb_id(&sk_s); + + // load tts_v transaction "in flight" as early as possible + skc_tts_v_t const tts_v = skc_load_tts(bp_elems,sb_id); + +#if 0 + printf("{ %08X }\n",tts_v); +#endif + +#if 0 + if (get_sub_group_local_id() == 0) + printf("[ %d, %X ]\n",rkpk_rem,sb_id); +#endif + +#if 0 + if (get_sub_group_local_id() == 0) + printf("@ %08X ( %3u, %3u )\n",sk_s.hi,(sk_s.hi >> 20),(sk_s.hi >> 8) & 0xFFF); +#endif + + // + // FIXME -- SOME OF THESE COMPARISONS CAN BE PERFORMED AHEAD OF + // TIME AND SIMD'IZED + // + + // if yx's don't match then we're either issuing a ttpk or + // resetting the accumulator + if (sk_s.hi != yx_prev) + { + // if yx_next.y == yx_last.y then x changed + if (((sk_s.hi ^ yx_prev) & SKC_TTXK_HI_MASK_Y) == 0) + { + // + // if the tile is not square then it's ratio is 1:2 + // +#if SKC_DEVICE_SUBBLOCK_WORDS_LOG2 < SKC_DEVICE_BLOCK_WORDS_LOG2 + skc_block_id_t const pb_id = skc_subblocks_get_next_pb_id(&subblocks, + &blocks_next, + &blocks_idx, + &blocks, + bp_mask, + bp_ids); +#else + skc_block_id_t const pb_id = skc_blocks_get_next(&blocks_next, + &blocks_idx, + &blocks, + bp_mask, + bp_ids); +#endif + + // flush accumulated ttp vector to block/subblock at ttpb_id + skc_accum_flush(smem,bp_elems,pb_id); + +#if 0 + if (get_sub_group_local_id() == 0) + { + printf("%8u : ( %4u, %4u ) -> ( %4u, %4u )\n", + pb_id, + (yx_prev >> SKC_TTXK_HI_OFFSET_Y), + (yx_prev >> SKC_TTXK_HI_OFFSET_X) & 0xFFF, + (sk_s.hi >> SKC_TTXK_HI_OFFSET_Y) & 0xFFF, + (sk_s.hi >> SKC_TTXK_HI_OFFSET_X) & 0xFFF); + } +#endif + + // + // FIXME -- A SIMD-WIDE BLOCK OF TTPK KEYS CAN BE CREATED IN ONE STEP + // + rkpk_rem -= 1; + + // create the pk + skc_ttpk_s_t const pk_s = skc_ttpk_create(yx_prev+SKC_TTXK_HI_ONE_X,sk_s.hi,pb_id); + + // append pk key to xk buffer + skc_node_v_append_pk(&pk_s, + + &xk_v, + &xk_v_next, + &xk_v_idx, + bp_elems, + + &blocks_next, + &blocks_idx, + &blocks, + bp_mask, + bp_ids); + } + else if (rkpk_rem > 0) // we're starting a new tile row + { + skc_accum_reset(smem); + } + } + + // + // append sk key to node_v + // + // if rkpk_rem is zero then return from kernel + // + skc_node_v_append_sk(&sk_s, + + &xk_v, + &xk_v_next, + &xk_v_idx, + bp_elems, + + rkpk_rem, + + &blocks_next, + &blocks_idx, + &blocks, + bp_mask, + bp_ids); + + // we're done if no more sk keys + if (rkpk_rem == 0) + break; + + // move to new tile + yx_prev = sk_s.hi; + + // scatter tts values into accumulator + skc_accum_scatter(smem,tts_v); + + // replenish sk keys + skc_ttsk_v_replenish(&sk_v,&sk_next,&rks_next,rks); + } +} + +// +// +// diff --git a/src/compute/skc/raster.h b/src/compute/skc/raster.h new file mode 100644 index 0000000000..c2b95834b4 --- /dev/null +++ b/src/compute/skc/raster.h @@ -0,0 +1,178 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_RASTER +#define SKC_ONCE_RASTER + +// +// +// + +#include "block.h" + +// +// The raster "head" structure aliases a block. +// +// Blocks are guaranteed to be at least 16 words. +// +// Note that the end of the ttsk key sequence and beginning of the +// ttpk key sequence may share a node. +// +// Note that keys are 64-bits and the "next" id is only a 32-bit +// (27-bit tagged block id) so there is room for another next id or a +// key/node countdown. For now we'll leave the second to last word +// empty/unused. +// + +typedef skc_uint2 skc_ttsk_t; +typedef skc_uint2 skc_ttpk_t; +typedef skc_uint2 skc_ttxk_t; + +union skc_raster_node_next +{ + skc_uint2 u32v2; + + struct { + skc_block_id_t node; // low word + skc_uint na; + }; +}; + +// +// +// + +union skc_raster_node_elem +{ + skc_uint2 u32v2; + skc_ttsk_t sk; + skc_ttpk_t pk; + skc_ttxk_t xk; + union skc_raster_node_next next; +}; + +// +// +// + +union skc_raster_header +{ + skc_uint4 u32v4; + + struct { + skc_uint blocks; // # of blocks -- head+node+skb+pkb -- uint2.lo + skc_uint na; // unused -- uint2.hi + skc_uint nodes; // # of nodes -- not including header -- uint2.lo + skc_uint keys; // # of sk+pk keys -- uint2.hi + }; +}; + +// +// +// + +struct skc_raster_head +{ + union skc_raster_header header; // 3 counters and a spare + skc_int4 bounds; // sub-pixel resolution bounds + union skc_raster_node_elem elems[]; // 64-bit keys and index of next node +}; + +// +// +// + +#define SKC_RASTER_HEAD_WORDS 8 + +#define SKC_RASTER_HEAD_OFFSET_COUNTS_BLOCKS 0 +#define SKC_RASTER_HEAD_OFFSET_COUNTS_NA 1 +#define SKC_RASTER_HEAD_OFFSET_COUNTS_NODES 2 +#define SKC_RASTER_HEAD_OFFSET_COUNTS_KEYS 3 + +#define SKC_RASTER_HEAD_OFFSET_BOUNDS 4 +#define SKC_RASTER_HEAD_OFFSET_ELEMS 8 + +// +// +// + +#define SKC_RASTER_HEAD_WORDS_CALC (sizeof(struct skc_raster_head) / sizeof(skc_uint)) + +#define SKC_RASTER_HEAD_OFFSET_COUNTS_BLOCKS_CALC (SKC_OFFSET_OF(struct skc_raster_head,header.blocks) / sizeof(skc_uint)) +#define SKC_RASTER_HEAD_OFFSET_COUNTS_NODES_CALC (SKC_OFFSET_OF(struct skc_raster_head,header.nodes) / sizeof(skc_uint)) +#define SKC_RASTER_HEAD_OFFSET_COUNTS_KEYS_CALC (SKC_OFFSET_OF(struct skc_raster_head,header.keys) / sizeof(skc_uint)) + +#define SKC_RASTER_HEAD_OFFSET_BOUNDS_CALC (SKC_OFFSET_OF(struct skc_raster_head,bounds) / sizeof(skc_uint)) +#define SKC_RASTER_HEAD_OFFSET_ELEMS_CALC (SKC_OFFSET_OF(struct skc_raster_head,elems) / sizeof(skc_uint)) + +// +// NOT ALL OPENCL PREPROCESSORS ARE HAPPY WITH CALCULATING OFFSET_OF() +// +// - Intel ioc compiler failed in the past +// + +#if !defined(__OPENCL_C_VERSION__) +SKC_STATIC_ASSERT(SKC_RASTER_HEAD_WORDS == SKC_RASTER_HEAD_WORDS_CALC); +SKC_STATIC_ASSERT(SKC_RASTER_HEAD_OFFSET_COUNTS_BLOCKS == SKC_RASTER_HEAD_OFFSET_COUNTS_BLOCKS_CALC); +SKC_STATIC_ASSERT(SKC_RASTER_HEAD_OFFSET_COUNTS_NODES == SKC_RASTER_HEAD_OFFSET_COUNTS_NODES_CALC); +SKC_STATIC_ASSERT(SKC_RASTER_HEAD_OFFSET_COUNTS_KEYS == SKC_RASTER_HEAD_OFFSET_COUNTS_KEYS_CALC); +SKC_STATIC_ASSERT(SKC_RASTER_HEAD_OFFSET_BOUNDS == SKC_RASTER_HEAD_OFFSET_BOUNDS_CALC); +SKC_STATIC_ASSERT(SKC_RASTER_HEAD_OFFSET_ELEMS == SKC_RASTER_HEAD_OFFSET_ELEMS_CALC); +#endif + +// +// +// + +#if 0 +#if !defined(__OPENCL_C_VERSION__) +struct skc_raster_node +{ + union skc_raster_node_elem elems[]; +}; +#endif +#endif + +// +// +// + +#define SKC_RASTER_HEAD_DWORDS (SKC_RASTER_HEAD_WORDS / 2) +#define SKC_RASTER_NODE_DWORDS SKC_DEVICE_BLOCK_DWORDS + +// +// + +#define SKC_RASTER_NODE_COUNT_KEYS (SKC_DEVICE_BLOCK_DWORDS - 1) +#define SKC_RASTER_HEAD_COUNT_KEYS (SKC_RASTER_NODE_COUNT_KEYS - SKC_RASTER_HEAD_DWORDS) + +// +// these are the most possible keys that could be produced by a node +// + +#define SKC_RASTER_HEAD_MAX_TTSK SKC_RASTER_HEAD_COUNT_KEYS +#define SKC_RASTER_HEAD_MAX_TTPK ((SKC_DEVICE_BLOCK_DWORDS - SKC_RASTER_HEAD_DWORDS) / 2) + +#define SKC_RASTER_NODE_MAX_TTSK SKC_RASTER_NODE_COUNT_KEYS // a node could be all TTSK keys minus next pointer +#define SKC_RASTER_NODE_MAX_TTPK (SKC_RASTER_NODE_DWORDS / 2) // a node could be at most half TTPK keys and (half-1) TTSK keys + +#define SKC_RASTER_HEAD_MIN_TTSK (SKC_RASTER_HEAD_MAX_TTSK - SKC_RASTER_NODE_MAX_TTPK) +#define SKC_RASTER_HEAD_MIN_TTPK 0 + +#define SKC_RASTER_NODE_MIN_TTSK (SKC_RASTER_NODE_MAX_TTSK - SKC_RASTER_NODE_MAX_TTPK) +#define SKC_RASTER_NODE_MIN_TTPK 0 + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/raster_builder.c b/src/compute/skc/raster_builder.c new file mode 100644 index 0000000000..6da8071e61 --- /dev/null +++ b/src/compute/skc/raster_builder.c @@ -0,0 +1,321 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdlib.h> +#include <memory.h> +#include <float.h> + +#include "raster_builder.h" + +#include "context.h" +#include "weakref.h" + +#include "scheduler.h" +#include "handle.h" + +#include "common.h" + +// +// +// + +#ifndef NDEBUG + +#include <stdio.h> + +#define SKC_CONTEXT_WAIT_DEBUG(p) \ + fprintf(stderr,"WAITING ON: " p "\n") + +#else + +#define SKC_CONTEXT_WAIT_DEBUG(p) + +#endif + +// +// +// + +#define SKC_CONTEXT_WAIT_WHILE(c,p) \ + while (p) { \ + SKC_CONTEXT_WAIT_DEBUG(#p); \ + skc_context_wait(c); \ + } + +// +// +// + +#if 0 + +// +// IDENTITY TRANSFORM +// + +static +float const skc_transform_identity[8] = + { + 1.0f, 0.0f, 0.0f, // sx shx tx + 0.0f, 1.0f, 0.0f, // shy sy ty + 0.0f, 0.0f // w0 w1 1 <-- always 1 + }; + +float const * const skc_transform_identity_ptr = skc_transform_identity; + +// +// DEFAULT RASTER CLIP +// + +static +float const skc_raster_clip_default[4] = + { + -FLT_MAX, -FLT_MAX, // lower left corner of bounding box + +FLT_MAX, +FLT_MAX // upper right corner of bounding box + }; + +float const * const skc_raster_clip_default_ptr = skc_raster_clip_default; + +#endif + +// +// +// + +skc_err +skc_raster_builder_retain(skc_raster_builder_t raster_builder) +{ + raster_builder->refcount += 1; + + return SKC_ERR_SUCCESS; +} + +//xbli +// +// + +skc_err +skc_raster_builder_release(skc_raster_builder_t raster_builder) +{ + SKC_ASSERT_STATE_ASSERT(SKC_RASTER_BUILDER_STATE_READY,raster_builder); + + raster_builder->release(raster_builder->impl); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +static +skc_bool +skc_raster_builder_path_ids_append(struct skc_raster_builder * const raster_builder, + union skc_cmd_fill * const cmd, + skc_path_t const path) +{ + SKC_CONTEXT_WAIT_WHILE(raster_builder->context,skc_extent_ring_is_full(&raster_builder->path_ids.ring)); + + cmd->path = path; + + raster_builder->path_ids.extent[skc_extent_ring_wip_index_inc(&raster_builder->path_ids.ring)] = path; + + return skc_extent_ring_wip_is_full(&raster_builder->path_ids.ring); +} + +static +skc_bool +skc_raster_builder_transforms_append(struct skc_raster_builder * const raster_builder, + union skc_cmd_fill * const cmd, + skc_transform_weakref_t * const transform_weakref, + skc_float const * const transform) +{ + // + // FIXME -- check weakref + // + SKC_CONTEXT_WAIT_WHILE(raster_builder->context,skc_extent_ring_is_full(&raster_builder->transforms.ring)); + + cmd->transform = skc_extent_ring_wip_count(&raster_builder->transforms.ring); + + skc_uint const base = skc_extent_ring_wip_index_inc(&raster_builder->transforms.ring); + + memcpy(raster_builder->transforms.extent[base].f32a8,transform,sizeof(skc_float8)); + + return skc_extent_ring_wip_is_full(&raster_builder->transforms.ring); +} + +static +skc_bool +skc_raster_builder_clips_append(struct skc_raster_builder * const raster_builder, + union skc_cmd_fill * const cmd, + skc_raster_clip_weakref_t * const raster_clip_weakref, + skc_float const * const raster_clip) +{ + // + // FIXME -- check weakref + // + SKC_CONTEXT_WAIT_WHILE(raster_builder->context,skc_extent_ring_is_full(&raster_builder->clips.ring)); + + cmd->clip = skc_extent_ring_wip_count(&raster_builder->clips.ring); + + skc_uint const base = skc_extent_ring_wip_index_inc(&raster_builder->clips.ring); + + memcpy(raster_builder->clips.extent[base].f32a4,raster_clip,sizeof(skc_float4)); + + return skc_extent_ring_wip_is_full(&raster_builder->clips.ring); +} + +static +skc_bool +skc_raster_builder_cmds_append(struct skc_raster_builder * const raster_builder, + union skc_cmd_fill * const cmd) +{ + SKC_CONTEXT_WAIT_WHILE(raster_builder->context,skc_extent_ring_is_full(&raster_builder->fill_cmds.ring)); + + cmd->cohort = skc_extent_ring_wip_count(&raster_builder->raster_ids.ring); + + skc_uint const base = skc_extent_ring_wip_index_inc(&raster_builder->fill_cmds.ring); + + raster_builder->fill_cmds.extent[base] = *cmd; + +#if 0 + fprintf(stderr,"[ %4u, %4u, %4u, %4u ]\n", + cmd->path, + cmd->transform, + cmd->clip, + cmd->cohort); +#endif + + return skc_extent_ring_wip_is_full(&raster_builder->fill_cmds.ring); +} + +// +// +// + +static +skc_bool +skc_raster_builder_raster_ids_append(struct skc_raster_builder * const raster_builder, + skc_raster_t const raster) +{ + SKC_CONTEXT_WAIT_WHILE(raster_builder->context,skc_extent_ring_is_full(&raster_builder->raster_ids.ring)); + + raster_builder->raster_ids.extent[skc_extent_ring_wip_index_inc(&raster_builder->raster_ids.ring)] = raster; + + return skc_extent_ring_wip_is_full(&raster_builder->raster_ids.ring); +} + +// +// +// + +static +void +skc_raster_builder_checkpoint(struct skc_raster_builder * const raster_builder) +{ + skc_extent_ring_checkpoint(&raster_builder->path_ids .ring); + skc_extent_ring_checkpoint(&raster_builder->transforms.ring); + skc_extent_ring_checkpoint(&raster_builder->clips .ring); + skc_extent_ring_checkpoint(&raster_builder->fill_cmds .ring); + skc_extent_ring_checkpoint(&raster_builder->raster_ids.ring); +} + +// +// RASTER OPS +// + +skc_err +skc_raster_begin(skc_raster_builder_t raster_builder) +{ + SKC_ASSERT_STATE_TRANSITION(SKC_RASTER_BUILDER_STATE_READY, + SKC_RASTER_BUILDER_STATE_BUILDING, + raster_builder); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_raster_end(skc_raster_builder_t raster_builder, skc_raster_t * raster) +{ + SKC_ASSERT_STATE_TRANSITION(SKC_RASTER_BUILDER_STATE_BUILDING, + SKC_RASTER_BUILDER_STATE_READY, + raster_builder); + // get a raster id + raster_builder->end(raster_builder->impl,raster); + + // if cohort is full then launch + skc_bool const snap = skc_raster_builder_raster_ids_append(raster_builder,*raster); + + // checkpoint the current ring range + skc_raster_builder_checkpoint(raster_builder); + + // snapshot and force start because the cohort is full -- no need to wait + if (snap) + raster_builder->force(raster_builder->impl); + + // add guard bit + *raster |= SKC_TYPED_HANDLE_TYPE_IS_RASTER; // FIXME -- the guard bit can be buried + + return SKC_ERR_SUCCESS; +} + +// +// PATH-TO-RASTER OPS +// + +skc_err +skc_raster_add_filled(skc_raster_builder_t raster_builder, + skc_path_t path, + skc_transform_weakref_t * transform_weakref, + float const * transform, + skc_raster_clip_weakref_t * raster_clip_weakref, + float const * raster_clip) +{ + SKC_ASSERT_STATE_ASSERT(SKC_RASTER_BUILDER_STATE_BUILDING,raster_builder); + + // + // validate and retain the path handle before proceeding + // + skc_err err = raster_builder->add(raster_builder->impl,&path,1); + + if (err) + return err; + + // mask off the guard bits + path = SKC_TYPED_HANDLE_TO_HANDLE(path); + + // + // build the command... + // + union skc_cmd_fill cmd; + + // append path to ring + skc_bool snap = skc_raster_builder_path_ids_append(raster_builder,&cmd,path); + + // append transform + snap = skc_raster_builder_transforms_append(raster_builder,&cmd,transform_weakref,transform) || snap; + + // append raster clip + snap = skc_raster_builder_clips_append(raster_builder,&cmd,raster_clip_weakref,raster_clip) || snap; + + // append fill command + snap = skc_raster_builder_cmds_append(raster_builder,&cmd) || snap; + + // snapshot and lazily start + if (snap) + raster_builder->start(raster_builder->impl); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/raster_builder.h b/src/compute/skc/raster_builder.h new file mode 100644 index 0000000000..9996a2bfd7 --- /dev/null +++ b/src/compute/skc/raster_builder.h @@ -0,0 +1,79 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "assert_state.h" +#include "extent_ring.h" // note that these structs are *not* opaque + +// +// +// + +typedef enum skc_raster_builder_state_e { + + SKC_RASTER_BUILDER_STATE_READY, + SKC_RASTER_BUILDER_STATE_BUILDING + +} skc_raster_builder_state_e; + +// +// Construct and dispose of a raster builder and its opaque +// implementation. +// + +struct skc_raster_builder +{ + struct skc_context * context; + + struct skc_raster_builder_impl * impl; + + skc_err (* add )(struct skc_raster_builder_impl * const impl, skc_path_t const * paths, skc_uint count); + void (* end )(struct skc_raster_builder_impl * const impl, skc_raster_t * const raster); + void (* start )(struct skc_raster_builder_impl * const impl); + void (* force )(struct skc_raster_builder_impl * const impl); + void (* release)(struct skc_raster_builder_impl * const impl); + + struct { + skc_path_t * extent; + struct skc_extent_ring ring; + } path_ids; + + struct { + union skc_transform * extent; + struct skc_extent_ring ring; + } transforms; + + struct { + union skc_path_clip * extent; + struct skc_extent_ring ring; + } clips; + + struct { + union skc_cmd_fill * extent; + struct skc_extent_ring ring; + } fill_cmds; + + struct { + skc_raster_t * extent; + struct skc_extent_ring ring; + } raster_ids; + + skc_uint refcount; // FIXME -- split this into host and impl refcounts + + SKC_ASSERT_STATE_DECLARE(skc_raster_builder_state_e); +}; + +// +// +// diff --git a/src/compute/skc/raster_builder_cl_12.c b/src/compute/skc/raster_builder_cl_12.c new file mode 100644 index 0000000000..33992cbdfb --- /dev/null +++ b/src/compute/skc/raster_builder_cl_12.c @@ -0,0 +1,1349 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +// get rid of these +#include <stdio.h> +#include <stdlib.h> + +// +// +// + +#include "hs/cl/hs_cl_launcher.h" + +#include "common/cl/assert_cl.h" + +#include "context.h" +#include "grid.h" +#include "raster.h" +#include "extent_ring.h" +#include "raster_builder.h" + +#include "tile.h" + +#include "config_cl.h" +#include "runtime_cl_12.h" +#include "extent_cl_12.h" +#include "raster_builder_cl_12.h" + +// +// RASTERIZATION SUB-PIPELINE +// -------------------------- +// +// Phase 1: expand commands +// +// Phase 2: rasterize +// +// Phase 3: sort & segment || release paths +// +// Phase 4: prefix +// +// Phase 5: release rasters +// +// RASTER COHORT +// ============== +// +// BUILDER RASTERIZER POST PROCESSING +// <-----------------------------------------------> <------------> <---------------------------------------------------------------------> +// +// fill cmds transforms raster clips path release rasterize cmds cohort map raster release TTSB TTSK cohort atomics context atomics +// --------- ---------- ------------ ------------ -------------- ---------- -------------- ---- ---- -------------- --------------- +// 1,2 1,2 1,2 1,2 2 1-4 1,2,3,4 2-4 2-4 2-4 global +// +// +// NOTES: FINE-GRAINED SVM +// ----------------------- +// +// 1) In a fine-grained system we know the exact number of +// rasterize cmds per segment type before phase 1 +// +// 2) A raster that's "under construction" shouldn't be rasterized +// until it is complete. This implies that a raster is not part +// of a cohort until it is complete. The raster builder must +// handle raster promises being "forced" to completion -- this is +// likely the result of composition construction and subsequent +// rendering to a surface. +// +// 3) The raster cohort rasterizer state retains the fill cmd, +// transform, raster clip and path release "ring" extents. +// +// 4) The rasterize cmd extent sizes (line, quad, cubic, rational +// quad, rational cubic) are known ahead of time. +// +// 5) The raster cohort post processor is standalone and retains the +// raster_map, cohort atomics, TTSK_RYX extent, and raster +// references until complete. +// + +// +// Notes: +// +// - Could have a pipeline stage before expansion count the exact +// number of line/quad/cubic commands but the command buffers are +// relatively small (64-bit commands * # of path segments). +// + +// raster +// cohort atomics path_ids raster_ids transforms clips cmds_fill cmds_l/q/c ttsk_ryx +// +// +// BEGIN ^ +// | +// EXPAND | +// | +// RASTERIZE | +// | +// SORT || RELEASE PATHS | +// | +// PREFIX | +// | +// RELEASE RASTERS | +// | +// END v +// +// +// BEGIN +// +// EXPAND -- PRODUCES: one or more extents of rasterization commands +// +// RASTERIZE -- DEPENDENCY: requires size of command extents before launching +// -- PRODUCES: an extent of ttsk_ryx keys +// +// SORT || RELEASE PATHS -- DEPENDENCY: requires size of key extent before launching +// -- PRODUCES: sorted array of keys +// +// PREFIX -- DEPENDENCY: none -- can execute after SORT because grid size is number of rasters +// +// RELEASE RASTERS -- DEPENDENCY: none -- can execute after prefix +// +// END +// + +// ------------------------ +// +// DEPENDENCY is cleanly implemented with a host callback or device kernel launcher +// +// Can this hide resource acquisition? Yes. But there are two cases: +// +// 1. acqusition of resources occurs on the host thread and lack of +// resources drains the host command queue until resources are +// available (OpenCL 2.x) +// +// 2. the host commands lazily acquire resources (OpenCL 1.2) +// +// ------------------------ +// +// How to express? +// +// Each substage launches its successors. This supports both dependency models. +// +// If OpenCL 1.2 then the substage can't be launched until the prior +// stage's event is complete. So this requires registering a callback +// to invoke the substage. +// +// ------------------------ + +// +// BUILD +// + +struct skc_raster_builder_impl +{ + struct skc_raster_builder * raster_builder; + struct skc_runtime * runtime; + + skc_grid_t cohort; + + // these are all durable/perm extents + struct skc_extent_phrwg_thr1s path_ids; // read/write by host + struct skc_extent_phw1g_tdrNs transforms; // write once by host + read by device + struct skc_extent_phw1g_tdrNs clips; // write once by host + read by device + struct skc_extent_phw1g_tdrNs fill_cmds; // write once by host + read by device + struct skc_extent_phrwg_tdrNs raster_ids; // read/write by host + read by device + + struct { + cl_kernel fills_expand; + cl_kernel rasterize_all; + cl_kernel segment; + cl_kernel rasters_alloc; + cl_kernel prefix; + } kernels; +}; + +// +// RASTER COHORT +// +// This sub-pipeline snapshots the raster builder and then acquires +// and releases host and device resources as necessary (as late as +// possible). +// +// Note that the cohort extents are ephemeral and are only used by one +// or more stages of a the rasterization sub-pipeline. +// +// The pipeline implementation may vary between compute platforms. +// + +struct skc_raster_cohort +{ + struct skc_raster_builder_impl * impl; + + struct skc_extent_phrwg_thr1s_snap path_ids; // read/write by host + struct skc_extent_phw1g_tdrNs_snap transforms; // write once by host + read by device + struct skc_extent_phw1g_tdrNs_snap clips; // write once by host + read by device + struct skc_extent_phw1g_tdrNs_snap fill_cmds; // write once by host + read by device + struct skc_extent_phrwg_tdrNs_snap raster_ids; // read/write by host + read by device + + cl_command_queue cq; + + // sub-pipeline atomics + struct skc_extent_thr_tdrw atomics; + + // path primitives are expanded into line/quad/cubic/rational cmds + struct skc_extent_tdrw cmds; + + // rasterization output + struct skc_extent_tdrw keys; + // struct skc_extent_thrw_tdrw keys; + + // post-sort extent with metadata for each raster + struct skc_extent_tdrw metas; + // struct skc_extent_thrw_tdrw metas; + + // subbuf id + skc_subbuf_id_t id; + + // + // pipeline also uses the following global resources: + // + // - command queue from global factory + // - global block pool and its atomics + // - global path and raster host id map + // - temporary host and device allocations + // +}; + +// +// TTRK (64-BIT COMPARE) +// +// 0 63 +// | TTSB ID | X | Y | COHORT ID | +// +---------+------+------+-----------+ +// | 27 | 12 | 12 | 13 | +// +// +// TTRK (32-BIT COMPARE) +// +// 0 63 +// | TTSB ID | N/A | X | Y | COHORT ID | +// +---------+-----+------+------+-----------+ +// | 27 | 5 | 12 | 12 | 8 | +// + +// +// TTRK is sortable intermediate key format for TTSK +// +// We're going to use the 32-bit comparison version for now +// + +union skc_ttrk +{ + skc_ulong u64; + skc_uint2 u32v2; + + struct { + skc_uint block : SKC_TTXK_LO_BITS_ID; + skc_uint na0 : SKC_TTRK_LO_BITS_NA; + skc_uint x : SKC_TTXK_HI_BITS_X; + skc_uint y : SKC_TTXK_HI_BITS_Y; + skc_uint cohort : SKC_TTRK_HI_BITS_COHORT; + }; + + struct { + skc_uint na1; + skc_uint yx : SKC_TTXK_HI_BITS_YX; + skc_uint na2 : SKC_TTRK_HI_BITS_COHORT; + }; + + struct { + skc_uint na3; + skc_uint na4 : SKC_TTXK_HI_BITS_X; + skc_uint cohort_y : SKC_TTRK_HI_BITS_COHORT_Y; + }; +}; + +// +// +// + +static +void +skc_raster_builder_pfn_release(struct skc_raster_builder_impl * const impl) +{ + // decrement reference count + if (--impl->raster_builder->refcount != 0) + return; + + // + // otherwise, dispose of the the raster builder and its impl + // + struct skc_runtime * const runtime = impl->runtime; + + // free the raster builder + skc_runtime_host_perm_free(runtime,impl->raster_builder); + + // free durable/perm extents + skc_extent_phrwg_thr1s_free(runtime,&impl->path_ids); + skc_extent_phw1g_tdrNs_free(runtime,&impl->transforms); + skc_extent_phw1g_tdrNs_free(runtime,&impl->clips); + skc_extent_phw1g_tdrNs_free(runtime,&impl->fill_cmds); + skc_extent_phrwg_tdrNs_free(runtime,&impl->raster_ids); + + // release kernels + cl(ReleaseKernel(impl->kernels.fills_expand)); + cl(ReleaseKernel(impl->kernels.rasterize_all)); + +#if 0 + cl(ReleaseKernel(impl->kernels.rasterize_lines)); + cl(ReleaseKernel(impl->kernels.rasterize_quads)); + cl(ReleaseKernel(impl->kernels.rasterize_cubics)); +#endif + + cl(ReleaseKernel(impl->kernels.segment)); + cl(ReleaseKernel(impl->kernels.rasters_alloc)); + cl(ReleaseKernel(impl->kernels.prefix)); + + // free the impl + skc_runtime_host_perm_free(runtime,impl); +} + +// +// +// + +static +void +skc_raster_builder_rasters_release(struct skc_runtime * const runtime, + skc_raster_t const * const rasters, + skc_uint const size, + skc_uint const from, + skc_uint const to) +{ + if (from <= to) // no wrap + { + skc_raster_t const * rasters_from = rasters + from; + skc_uint count_from = to - from; + + skc_grid_deps_unmap(runtime->deps,rasters_from,count_from); + skc_runtime_raster_device_release(runtime,rasters_from,count_from); + } + else // from > to implies wrap + { + skc_raster_t const * rasters_lo = rasters + from; + skc_uint count_lo = size - from; + + skc_grid_deps_unmap(runtime->deps,rasters_lo,count_lo); + skc_runtime_raster_device_release(runtime,rasters_lo,count_lo); + + skc_grid_deps_unmap(runtime->deps,rasters,to); + skc_runtime_raster_device_release(runtime,rasters,to); + } +} + +static +void +skc_raster_builder_paths_release(struct skc_runtime * const runtime, + struct skc_extent_phrwg_thr1s_snap * const snap) +{ + // release lo + skc_runtime_path_device_release(runtime,snap->hr1.lo,snap->count.lo); + + // release hi + if (snap->count.hi) + skc_runtime_path_device_release(runtime,snap->hr1.hi,snap->count.hi); +} + +static +void +skc_raster_builder_cohort_grid_pfn_dispose(skc_grid_t const grid) +{ + // + // ALLOCATED RESOURCES + // + // path_ids - + // raster_ids a + // transforms - + // clips - + // fill_cmds - + // cq a + // cohort atomics a + // cmds - + // keys a + // meta a + // + + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + struct skc_raster_builder_impl * const impl = cohort->impl; + struct skc_runtime * const runtime = impl->runtime; + + // + // release paths -- FIXME -- Note that releasing paths can be + // performed after rasterization is complete + // + + // snap alloc the paths -- this host snap simply sets up pointers + skc_extent_phrwg_thr1s_snap_alloc(runtime,&impl->path_ids,&cohort->path_ids); + + // unmap and release raster ids + skc_raster_builder_paths_release(runtime,&cohort->path_ids); + + // release path ids + skc_extent_phrwg_thr1s_snap_free(runtime,&cohort->path_ids); + + // + // release rasters + // + skc_uint const size = cohort->raster_ids.snap->ring->size.pow2; + skc_uint const from = skc_extent_ring_snap_from(cohort->raster_ids.snap); + skc_uint const to = skc_extent_ring_snap_to(cohort->raster_ids.snap); + + // unmap and release raster ids + skc_raster_builder_rasters_release(runtime,impl->raster_ids.hrw,size,from,to); + + // release cohort's remaining allocated resources + skc_extent_phrwg_tdrNs_snap_free(runtime,&cohort->raster_ids); + skc_runtime_release_cq_in_order(runtime,cohort->cq); + skc_extent_thr_tdrw_free(runtime,&cohort->atomics); + skc_extent_tdrw_free(runtime,&cohort->keys); + skc_extent_tdrw_free(runtime,&cohort->metas); + // skc_extent_thrw_tdrw_free(runtime,&cohort->keys); + // skc_extent_thrw_tdrw_free(runtime,&cohort->metas); + skc_runtime_host_temp_free(runtime,cohort,cohort->id); + + // release the raster builder + skc_raster_builder_pfn_release(impl); + + // + // ALLOCATED RESOURCES + // + // path_ids - + // raster_ids - + // transforms - + // clips - + // fill_cmds - + // cq - + // cohort atomics - + // cmds - + // keys - + // meta - + // +} + +// +// +// + +static +void +skc_raster_cohort_prefix_release(skc_grid_t const grid) +{ + // FIXME -- note that pfn_dispose can be accomplished here + + // release the grid + skc_grid_complete(grid); +} + +static +void +skc_raster_cohort_prefix_cb(cl_event event, cl_int status, skc_grid_t const grid) +{ + SKC_CL_CB(status); + + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + struct skc_scheduler * const scheduler = cohort->impl->runtime->scheduler; + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(scheduler,skc_raster_cohort_prefix_release,grid); +} + +// +// +// + +#if 0 +static +int cmp64(const void * ptr_a, const void * ptr_b) +{ + skc_ulong const a = *(const skc_ulong *)ptr_a; + skc_ulong const b = *(const skc_ulong *)ptr_b; + + if (a < b) return -1; + if (a > b) return +1; + else return 0; +} +#endif + +// +// +// + +static +void +skc_raster_cohort_sort_prefix(skc_grid_t const grid) +{ + // + // ALLOCATED RESOURCES + // + // path_ids i + // raster_ids i + // transforms a + // clips a + // fill_cmds - + // cq a + // cohort atomics a + // cmds a + // keys a + // meta - + // + + // use the backpointers + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + struct skc_raster_builder_impl * const impl = cohort->impl; + struct skc_runtime * const runtime = impl->runtime; + + // release transforms + skc_extent_phw1g_tdrNs_snap_free(runtime,&cohort->transforms); + + // release clips + skc_extent_phw1g_tdrNs_snap_free(runtime,&cohort->clips); + + // release expanded cmds + skc_extent_tdrw_free(runtime,&cohort->cmds); + + // alloc the snapshost -- could be zero-sized + skc_extent_phrwg_tdrNs_snap_alloc(runtime, + &impl->raster_ids, + &cohort->raster_ids, + cohort->cq,NULL); + + // will never be zero + skc_uint const rasters = skc_extent_ring_snap_count(cohort->raster_ids.snap); + + // acquire fixed-size device-side extent + skc_extent_tdrw_alloc(runtime, + &cohort->metas, + sizeof(struct skc_raster_cohort_meta)); + + // skc_extent_thrw_tdrw_alloc(runtime, + // &cohort->metas, + // sizeof(struct skc_raster_cohort_meta)); + + // zero the metas + skc_extent_tdrw_zero(&cohort->metas,cohort->cq,NULL); + + // get the read-only host copy of the device atomics + struct skc_raster_cohort_atomic const * const atomics = cohort->atomics.hr; + + // + // SORT + // + if (atomics->keys > 0) + { +#ifndef NDEBUG + fprintf(stderr,"raster cohort sort: %u\n",atomics->keys); +#endif + + // + // + // + uint32_t keys_padded_in, keys_padded_out; + + hs_pad(atomics->keys,&keys_padded_in,&keys_padded_out); + + hs_sort(cohort->cq, + cohort->keys.drw, + cohort->keys.drw, + atomics->keys, + keys_padded_in, + keys_padded_out, + false); + + cl(SetKernelArg(impl->kernels.segment,0,SKC_CL_ARG(cohort->keys.drw))); + cl(SetKernelArg(impl->kernels.segment,1,SKC_CL_ARG(cohort->metas.drw))); + +#ifndef NDEBUG + fprintf(stderr,"post-sort\n"); +#endif + + // find start of each tile + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_SEGMENT_TTRK, + cohort->cq, + impl->kernels.segment, + atomics->keys, + 0,NULL,NULL); + +#ifndef NDEBUG + fprintf(stderr,"post-segment\n"); +#endif + + // + // DELETE ALL THIS WHEN READY + // + +#if 0 + // + // + // + cl(Finish(cohort->cq)); + + // map keys to host + union skc_ttrk * const keys = skc_extent_thrw_tdrw_map(&cohort->keys, + cohort->cq, + NULL); + // map meta to host + struct skc_raster_cohort_meta * const metas = skc_extent_thrw_tdrw_map(&cohort->metas, + cohort->cq, + NULL); + // block until done + cl(Finish(cohort->cq)); + + // sort keys + qsort(keys,atomics->keys,sizeof(*keys),cmp64); + + // mask to determine if rk id is a new block + skc_uint const subblock_mask = runtime->config->block.subblocks - 1; + + // + // some counters + // + union skc_raster_cohort_meta_in meta_in = { + .blocks = 0, + .offset = 0, + .pk = 0, + .rk = 0 + }; + + // get first key + union skc_ttrk curr = keys[0]; + + skc_uint ii=0, jj=0; + + // for all TTRK keys + while (true) + { + // increment ttrk count + meta_in.rk += 1; + + // was this a new block? + if ((curr.u32v2.lo & subblock_mask) == 0) + meta_in.blocks += 1; + + // break if we're out of keys + if (++ii >= atomics->keys) + break; + + // otherwise, process next key + union skc_ttrk const next = keys[ii]; + + // if new cohort then save curr meta and init next meta + if (next.cohort != curr.cohort) + { + fprintf(stderr,"[ %u, %u, %u, %u ]\n", + meta_in.blocks, + meta_in.offset, + meta_in.pk, + meta_in.rk); + + // store back to buffer + metas->inout[curr.cohort].in = meta_in; + + // update meta_in + meta_in.blocks = 0; + meta_in.offset = ii; + meta_in.pk = 0; + meta_in.rk = 0; + } + // otherwise, if same y but new x then increment TTPK count + else if ((next.y == curr.y) && (next.x != curr.x)) + { + meta_in.pk += 1; + +#if 0 + fprintf(stderr,"%3u : %3u : ( %3u, %3u ) -> ( %3u )\n", + jj++,curr.cohort,curr.y,curr.x,next.x); +#endif + } + +#if 0 + fprintf(stderr,"( %3u, %3u )\n",next.y,next.x); +#endif + + curr = next; + } + + fprintf(stderr,"[ %u, %u, %u, %u ]\n", + meta_in.blocks, + meta_in.offset, + meta_in.pk, + meta_in.rk); + + // store back to buffer + metas->inout[curr.cohort].in = meta_in; + + + // unmap + skc_extent_thrw_tdrw_unmap(&cohort->keys, + keys, + cohort->cq, + NULL); + + // unmap + skc_extent_thrw_tdrw_unmap(&cohort->metas, + metas, + cohort->cq, + NULL); +#endif + } + +#ifndef NDEBUG + fprintf(stderr,"rasters_alloc: %u\n",rasters); +#endif + + // + // RASTER ALLOC/INIT + // + cl(SetKernelArg(impl->kernels.rasters_alloc,0,SKC_CL_ARG(runtime->block_pool.atomics.drw))); + cl(SetKernelArg(impl->kernels.rasters_alloc,1,SKC_CL_ARG(runtime->block_pool.ids.drw))); + cl(SetKernelArg(impl->kernels.rasters_alloc,2,SKC_CL_ARG(runtime->block_pool.size->ring_mask))); + cl(SetKernelArg(impl->kernels.rasters_alloc,3,SKC_CL_ARG(runtime->handle_pool.map.drw))); + cl(SetKernelArg(impl->kernels.rasters_alloc,4,SKC_CL_ARG(cohort->metas.drw))); + cl(SetKernelArg(impl->kernels.rasters_alloc,5,SKC_CL_ARG(cohort->raster_ids.drN))); + cl(SetKernelArg(impl->kernels.rasters_alloc,6,SKC_CL_ARG(rasters))); + + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_RASTERS_ALLOC, + cohort->cq, + impl->kernels.rasters_alloc, + rasters, + 0,NULL,NULL); + +#ifndef NDEBUG + fprintf(stderr,"post-alloc\n"); +#endif + + // + // PREFIX + // + cl(SetKernelArg(impl->kernels.prefix,0,SKC_CL_ARG(runtime->block_pool.atomics.drw))); + cl(SetKernelArg(impl->kernels.prefix,1,SKC_CL_ARG(runtime->block_pool.ids.drw))); + cl(SetKernelArg(impl->kernels.prefix,2,SKC_CL_ARG(runtime->block_pool.blocks.drw))); + cl(SetKernelArg(impl->kernels.prefix,3,SKC_CL_ARG(runtime->block_pool.size->ring_mask))); + + cl(SetKernelArg(impl->kernels.prefix,4,SKC_CL_ARG(cohort->keys.drw))); + cl(SetKernelArg(impl->kernels.prefix,5,SKC_CL_ARG(runtime->handle_pool.map.drw))); + + cl(SetKernelArg(impl->kernels.prefix,6,SKC_CL_ARG(cohort->metas.drw))); + cl(SetKernelArg(impl->kernels.prefix,7,SKC_CL_ARG(rasters))); + + cl_event complete; + + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_PREFIX, + cohort->cq, + impl->kernels.prefix, + rasters, + 0,NULL, + &complete); + + cl(SetEventCallback(complete,CL_COMPLETE,skc_raster_cohort_prefix_cb,grid)); + cl(ReleaseEvent(complete)); + +#ifndef NDEBUG + fprintf(stderr,"post-prefix\n"); +#endif + + // flush command queue + cl(Flush(cohort->cq)); + + // + // ALLOCATED RESOURCES + // + // path_ids a + // raster_ids a + // transforms - + // clips - + // fill_cmds - + // cq a + // cohort atomics a + // cmds - + // keys a + // meta a + // +} + +static +void +skc_raster_cohort_rasterize_cb(cl_event event, cl_int status, skc_grid_t const grid) +{ + SKC_CL_CB(status); + + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(cohort->impl->runtime->scheduler,skc_raster_cohort_sort_prefix,grid); +} + +static +void +skc_raster_cohort_rasterize(skc_grid_t const grid) +{ + // + // ALLOCATED RESOURCES + // + // path_ids i + // raster_ids i + // transforms i + // clips i + // fill_cmds s + // cq a + // cohort atomics a + // cmds a + // cmds_quad a + // cmds_cubic a + // keys - + // meta - + + // use the backpointers + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + struct skc_raster_builder_impl * const impl = cohort->impl; + struct skc_runtime * const runtime = impl->runtime; + + // + // RELEASED RESOURCES + // + // cmds snap + // + + // release the cmds extent and snap since it's only used by the expand stage + skc_extent_phw1g_tdrNs_snap_free(runtime,&cohort->fill_cmds); + + // + // NEW ALLOCATED RESOURCES + // + // transforms snap + // clips snap + // ttrk keys + // + skc_extent_phw1g_tdrNs_snap_alloc(runtime, + &impl->transforms, + &cohort->transforms, + cohort->cq,NULL); + + skc_extent_phw1g_tdrNs_snap_alloc(runtime, + &impl->clips, + &cohort->clips, + cohort->cq,NULL); + + // acquire device-side extent + skc_extent_tdrw_alloc(runtime, + &cohort->keys, + sizeof(union skc_ttrk) * runtime->config->raster_cohort.rasterize.keys); + + // skc_extent_thrw_tdrw_alloc(runtime, + // &cohort->keys, + // sizeof(union skc_ttrk) * runtime->config->raster_cohort.rasterize.keys); + + // + // acquire out-of-order command queue + // + // and launch up to 3 kernels + // + // for each kernel: + // + // set runtime "global" kernel args: + // + // - block pool atomics + // - block pool extent + // + // set cohort "local" kernel args: + // + // - atomics + // - cmds + // + // enqueue barrier + // enqueue copy back of atomics on the command queue + // set callback on copy back event + // release command queue + // + struct skc_raster_cohort_atomic const * const atomics = cohort->atomics.hr; + + if (atomics->cmds > 0) + { + cl(SetKernelArg(impl->kernels.rasterize_all,0,SKC_CL_ARG(runtime->block_pool.atomics.drw))); + cl(SetKernelArg(impl->kernels.rasterize_all,1,SKC_CL_ARG(runtime->block_pool.blocks.drw))); + cl(SetKernelArg(impl->kernels.rasterize_all,2,SKC_CL_ARG(runtime->block_pool.ids.drw))); + cl(SetKernelArg(impl->kernels.rasterize_all,3,SKC_CL_ARG(runtime->block_pool.size->ring_mask))); + + cl(SetKernelArg(impl->kernels.rasterize_all,4,SKC_CL_ARG(cohort->atomics.drw))); + cl(SetKernelArg(impl->kernels.rasterize_all,5,SKC_CL_ARG(cohort->keys.drw))); + + cl(SetKernelArg(impl->kernels.rasterize_all,6,SKC_CL_ARG(cohort->transforms.drN))); + cl(SetKernelArg(impl->kernels.rasterize_all,7,SKC_CL_ARG(cohort->clips.drN))); + cl(SetKernelArg(impl->kernels.rasterize_all,8,SKC_CL_ARG(cohort->cmds.drw))); + cl(SetKernelArg(impl->kernels.rasterize_all,9,SKC_CL_ARG(atomics->cmds))); + + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_RASTERIZE_ALL, + cohort->cq, + impl->kernels.rasterize_all, + atomics->cmds, + 0,NULL,NULL); + } + + // + // copyback number of TTSK keys + // + cl_event complete; + + skc_extent_thr_tdrw_read(&cohort->atomics,cohort->cq,&complete); + + cl(SetEventCallback(complete,CL_COMPLETE,skc_raster_cohort_rasterize_cb,grid)); + cl(ReleaseEvent(complete)); + + // flush command queue + cl(Flush(cohort->cq)); + + // + // ALLOCATED RESOURCES + // + // path_ids i + // raster_ids i + // transforms a + // clips a + // fill_cmds - + // cq a + // cohort atomics a + // cmds a + // keys a + // meta - +} + +static +void +skc_raster_cohort_fills_expand_cb(cl_event event, cl_int status, skc_grid_t const grid) +{ + SKC_CL_CB(status); + + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(cohort->impl->runtime->scheduler,skc_raster_cohort_rasterize,grid); +} + +static +void +skc_raster_builder_cohort_grid_pfn_execute(skc_grid_t const grid) +{ + // + // ALLOCATED RESOURCES + // + // path_ids i + // raster_ids i + // transforms i + // clips i + // fill_cmds i + // cq - + // cohort atomics - + // cmds - + // keys - + // meta - + // + + // allocate the cohort + struct skc_raster_cohort * const cohort = skc_grid_get_data(grid); + + // get impl + struct skc_raster_builder_impl * const impl = cohort->impl; + struct skc_runtime * const runtime = impl->runtime; + + // acquire in-order cq + cohort->cq = skc_runtime_acquire_cq_in_order(runtime); + + // alloc the snapshot -- could be zero-sized + skc_extent_phw1g_tdrNs_snap_alloc(runtime, + &impl->fill_cmds, + &cohort->fill_cmds, + cohort->cq,NULL); + + // flush the cq to get the fill running + // cl(Flush(cohort->cq)); + + // create split atomics + skc_extent_thr_tdrw_alloc(runtime,&cohort->atomics,sizeof(struct skc_raster_cohort_atomic)); + + // zero the atomics + skc_extent_thr_tdrw_zero(&cohort->atomics,cohort->cq,NULL); + + // get config + struct skc_config const * const config = runtime->config; + + // acquire device-side extents + skc_extent_tdrw_alloc(runtime, + &cohort->cmds, + sizeof(union skc_cmd_rasterize) * config->raster_cohort.expand.cmds); + + // + // FILLS EXPAND + // + // need result of cmd counts before launching RASTERIZE grids + // + // - OpenCL 1.2: copy atomic counters back to host and launch RASTERIZE grids from host + // - OpenCL 2.x: have a kernel size and launch RASTERIZE grids from device + // - or launch a device-wide grid that feeds itself but that's unsatisfying + // + + // how many commands? could be zero + skc_uint const work_size = skc_extent_ring_snap_count(cohort->fill_cmds.snap); + + if (work_size > 0) + { + cl(SetKernelArg(impl->kernels.fills_expand,0,SKC_CL_ARG(impl->runtime->block_pool.blocks.drw))); + cl(SetKernelArg(impl->kernels.fills_expand,1,SKC_CL_ARG(cohort->atomics.drw))); + cl(SetKernelArg(impl->kernels.fills_expand,2,SKC_CL_ARG(runtime->handle_pool.map.drw))); + cl(SetKernelArg(impl->kernels.fills_expand,3,SKC_CL_ARG(cohort->fill_cmds.drN))); + cl(SetKernelArg(impl->kernels.fills_expand,4,SKC_CL_ARG(cohort->cmds.drw))); + + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_FILLS_EXPAND, + cohort->cq, + impl->kernels.fills_expand, + work_size, + 0,NULL,NULL); + } + + // + // copyback number of rasterization commands + // + cl_event complete; + + skc_extent_thr_tdrw_read(&cohort->atomics,cohort->cq,&complete); + + cl(SetEventCallback(complete,CL_COMPLETE,skc_raster_cohort_fills_expand_cb,grid)); + cl(ReleaseEvent(complete)); + + // flush command queue + cl(Flush(cohort->cq)); + + // + // ALLOCATED RESOURCES + // + // path_ids i + // raster_ids i + // transforms i + // clips i + // fill_cmds s + // cq a + // cohort atomics a + // cmds a + // keys - + // meta - + // +} + +// +// move grid into waiting state +// +// this entails allocating a cohort from the temporary extent +// + +static +void +skc_raster_builder_cohort_grid_pfn_waiting(skc_grid_t const grid) +{ + // get the impl + struct skc_raster_builder_impl * const impl = skc_grid_get_data(grid); + struct skc_runtime * const runtime = impl->runtime; + + // retain the raster builder + impl->raster_builder->refcount += 1; + + // allocate the ephemeral/temp cohort + skc_subbuf_id_t id; + + struct skc_raster_cohort * const cohort = + skc_runtime_host_temp_alloc(runtime, + SKC_MEM_FLAGS_READ_WRITE, + sizeof(*cohort), + &id, + NULL); + + // save the id and backpointer + cohort->id = id; + cohort->impl = impl; + + // set grid data -- replaces impl + skc_grid_set_data(grid,cohort); + + // + // ACQUIRE RESOURCES FOR THE COHORT + // + + struct skc_raster_builder * const raster_builder = impl->raster_builder; + + // immediately take snapshots of all rings -- these are very inexpensive operations + skc_extent_phrwg_thr1s_snap_init(runtime,&raster_builder->path_ids .ring,&cohort->path_ids); + skc_extent_phw1g_tdrNs_snap_init(runtime,&raster_builder->transforms.ring,&cohort->transforms); + skc_extent_phw1g_tdrNs_snap_init(runtime,&raster_builder->clips .ring,&cohort->clips); + skc_extent_phw1g_tdrNs_snap_init(runtime,&raster_builder->fill_cmds .ring,&cohort->fill_cmds); + skc_extent_phrwg_tdrNs_snap_init(runtime,&raster_builder->raster_ids.ring,&cohort->raster_ids); + + // + // ALLOCATED RESOURCES + // + // path_ids i + // raster_ids i + // transforms i + // clips i + // fill_cmds i + // cq - + // cohort atomics - + // cmds - + // keys - + // meta - + // +} + +// +// +// + +static +void +skc_raster_builder_cohort_create(struct skc_raster_builder_impl * const impl) +{ + // attach a grid + impl->cohort = SKC_GRID_DEPS_ATTACH(impl->runtime->deps, + &impl->cohort, + impl, + skc_raster_builder_cohort_grid_pfn_waiting, + skc_raster_builder_cohort_grid_pfn_execute, + skc_raster_builder_cohort_grid_pfn_dispose); +} + +// +// +// + +static +skc_err +skc_raster_builder_pfn_add(struct skc_raster_builder_impl * const impl, + skc_path_t const * paths, + skc_uint count) +{ + // validate and retain the path + skc_err err; + + err = skc_runtime_handle_device_validate_retain(impl->runtime, + SKC_TYPED_HANDLE_TYPE_IS_PATH, + paths, + count); + + if (err) + return err; + + skc_runtime_handle_device_retain(impl->runtime,paths,count); + + // make sure there is a grid + if (impl->cohort == NULL) { + skc_raster_builder_cohort_create(impl); + } + + // declare rasterization grid happens after path + while (count-- > 0) + skc_grid_happens_after_handle(impl->cohort,SKC_TYPED_HANDLE_TO_HANDLE(*paths++)); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +static +void +skc_raster_builder_pfn_end(struct skc_raster_builder_impl * const impl, skc_raster_t * const raster) +{ + // + // acquire host-managed path raster handle and bump reference count + // to 2 handles will be released (reduced to 1) once the rasters are + // completely rasterized + // + *raster = skc_runtime_handle_device_acquire(impl->runtime); + + // make sure there is a grid + if (impl->cohort == NULL) { + skc_raster_builder_cohort_create(impl); + } + + // map a handle to a grid + skc_grid_map(impl->cohort,*raster); +} + +// +// snapshot the ring and lazily start the grid +// +// FIXME -- might want to revisit this and settle on an even more +// opaque implementation. Some options: +// +// - never let the SKC API expose a forced grid start +// - make snapshots kick off a forced grid start +// - be lazy all the time everywhere +// + +static +void +skc_raster_builder_pfn_start(struct skc_raster_builder_impl * const impl) +{ + skc_grid_t const cohort = impl->cohort; + + if (cohort != NULL) { + skc_grid_start(cohort); + } +} + +// +// NOTE: THIS MIGHT BE REMOVED +// + +static +void +skc_raster_builder_pfn_force(struct skc_raster_builder_impl * const impl) +{ + skc_grid_t const cohort = impl->cohort; + + if (cohort != NULL) { + skc_grid_force(cohort); + } +} + +// +// +// + +skc_err +skc_raster_builder_cl_12_create(struct skc_context * const context, + struct skc_raster_builder * * const raster_builder) +{ + struct skc_runtime * const runtime = context->runtime; + + // allocate raster builder + (*raster_builder) = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(**raster_builder)); + + // refcount + (*raster_builder)->refcount = 1; + + // state + SKC_ASSERT_STATE_INIT((*raster_builder),SKC_RASTER_BUILDER_STATE_READY); + + // allocate runtime raster builder + struct skc_raster_builder_impl * const impl = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*impl)); + + // save the impl + (*raster_builder)->impl = impl; + + // intialize impl + impl->raster_builder = (*raster_builder); + impl->runtime = runtime; + impl->cohort = NULL; + + // get config + struct skc_config const * const config = runtime->config; + + skc_extent_phrwg_thr1s_alloc(runtime,&impl->path_ids ,sizeof(skc_path_t ) * config->raster_cohort.path_ids .elem_count); + skc_extent_phw1g_tdrNs_alloc(runtime,&impl->transforms,sizeof(union skc_transform) * config->raster_cohort.transforms.elem_count); + skc_extent_phw1g_tdrNs_alloc(runtime,&impl->clips ,sizeof(union skc_path_clip) * config->raster_cohort.clips .elem_count); + skc_extent_phw1g_tdrNs_alloc(runtime,&impl->fill_cmds ,sizeof(union skc_cmd_fill ) * config->raster_cohort.fill .elem_count); + skc_extent_phrwg_tdrNs_alloc(runtime,&impl->raster_ids,sizeof(skc_raster_t ) * config->raster_cohort.raster_ids.elem_count); + + // retain the context + //skc_context_retain(context); + + (*raster_builder)->context = context; + + (*raster_builder)->add = skc_raster_builder_pfn_add; + (*raster_builder)->end = skc_raster_builder_pfn_end; + (*raster_builder)->start = skc_raster_builder_pfn_start; + (*raster_builder)->force = skc_raster_builder_pfn_force; + (*raster_builder)->release = skc_raster_builder_pfn_release; + + // initialize raster builder with host-writable buffers + (*raster_builder)->path_ids .extent = impl->path_ids.hrw; + (*raster_builder)->transforms.extent = impl->transforms.hw1; + (*raster_builder)->clips .extent = impl->clips.hw1; + (*raster_builder)->fill_cmds .extent = impl->fill_cmds.hw1; + (*raster_builder)->raster_ids.extent = impl->raster_ids.hrw; + + // + // the rings perform bookkeeping on the extents + // + // the ring snapshotting and checkpointing are necessary because + // another part of the API can _force_ the raster cohort to flush + // its work-in-progress commands but only up to a checkpointed + // boundary + // + skc_extent_ring_init(&(*raster_builder)->path_ids.ring, + config->raster_cohort.path_ids.elem_count, + config->raster_cohort.path_ids.snap_count, + sizeof(skc_path_t)); + + skc_extent_ring_init(&(*raster_builder)->transforms.ring, + config->raster_cohort.transforms.elem_count, + config->raster_cohort.transforms.snap_count, + sizeof(union skc_transform)); + + skc_extent_ring_init(&(*raster_builder)->clips.ring, + config->raster_cohort.clips.elem_count, + config->raster_cohort.clips.snap_count, + sizeof(union skc_path_clip)); + + skc_extent_ring_init(&(*raster_builder)->fill_cmds.ring, + config->raster_cohort.fill.elem_count, + config->raster_cohort.fill.snap_count, + sizeof(union skc_cmd_fill)); + + skc_extent_ring_init(&(*raster_builder)->raster_ids.ring, + config->raster_cohort.raster_ids.elem_count, + config->raster_cohort.raster_ids.snap_count, + sizeof(skc_raster_t)); + + // + // acquire kernels + // + impl->kernels.fills_expand = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_FILLS_EXPAND); + impl->kernels.rasterize_all = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_RASTERIZE_ALL); + +#if 0 + impl->kernels.rasterize_lines = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_RASTERIZE_LINES); + impl->kernels.rasterize_quads = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_RASTERIZE_QUADS); + impl->kernels.rasterize_cubics = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_RASTERIZE_CUBICS); +#endif + + impl->kernels.segment = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_SEGMENT_TTRK); + impl->kernels.rasters_alloc = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_RASTERS_ALLOC); + impl->kernels.prefix = skc_device_acquire_kernel(runtime->device, SKC_DEVICE_KERNEL_ID_PREFIX); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/raster_builder_cl_12.h b/src/compute/skc/raster_builder_cl_12.h new file mode 100644 index 0000000000..f6e1751ef1 --- /dev/null +++ b/src/compute/skc/raster_builder_cl_12.h @@ -0,0 +1,165 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_RASTER_BUILDER_CL_12_ONCE +#define SKC_RASTER_BUILDER_CL_12_ONCE + +// +// +// + +#include "types.h" +#include "macros.h" +#include "common.h" + +// +// FIXME -- these magic numbers will be replaced with tile.h constants +// although they're probably universal across all devices +// +// FIXME -- NEED TO EVALUATE IF THIS DISTRIBUTION OF BITS IS GOING TO +// BE TOO SMALL -- plenty of room to jiggle these bits +// + +#define SKC_CMD_RASTERIZE_BITS_TRANSFORM 12 +#define SKC_CMD_RASTERIZE_BITS_CLIP 12 +#define SKC_CMD_RASTERIZE_BITS_COHORT 8 + +SKC_STATIC_ASSERT(SKC_CMD_RASTERIZE_BITS_TRANSFORM == SKC_CMD_FILL_BITS_TRANSFORM); +SKC_STATIC_ASSERT(SKC_CMD_RASTERIZE_BITS_CLIP == SKC_CMD_FILL_BITS_CLIP); +SKC_STATIC_ASSERT(SKC_CMD_RASTERIZE_BITS_COHORT == SKC_CMD_FILL_BITS_COHORT); + +// +// device-side rasterization cmd +// + +union skc_cmd_rasterize +{ + skc_ulong u64; + + skc_uint2 u32v2; + + struct { + // + // Unlike anywhere else in the pipeline, the nodeword index points + // "inside" of a path node (with word resolution). This means + // there is up to 16 GB of 32-bit word addressing in a unified + // block pool: + // + // "16GB ought to be enough for anyone" -- ASM 5/30/17 + // + skc_uint nodeword; +#if defined(__OPENCL_C_VERSION__) + skc_uint tcc; +#else + skc_uint transform : SKC_CMD_RASTERIZE_BITS_TRANSFORM; + skc_uint clip : SKC_CMD_RASTERIZE_BITS_CLIP; + skc_uint cohort : SKC_CMD_RASTERIZE_BITS_COHORT; +#endif + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_cmd_rasterize) == sizeof(skc_uint2)); + +// +// +// + +#define SKC_CMD_RASTERIZE_HI_OFFSET_COHORT (SKC_CMD_RASTERIZE_BITS_TRANSFORM + SKC_CMD_RASTERIZE_BITS_CLIP) +#define SKC_CMD_RASTERIZE_MASK_COHORT(c) ((c).u32v2.hi & SKC_BITS_TO_MASK_AT(SKC_CMD_RASTERIZE_BITS_COHORT,SKC_CMD_RASTERIZE_HI_OFFSET_COHORT)) + +#define SKC_CMD_RASTERIZE_GET_TRANSFORM(c) ((c).u32v2.hi & SKC_BITS_TO_MASK(SKC_CMD_RASTERIZE_BITS_TRANSFORM)) +#define SKC_CMD_RASTERIZE_GET_CLIP(c) SKC_BFE((c).tcc,SKC_CMD_RASTERIZE_BITS_CLIP,SKC_CMD_RASTERIZE_BITS_TRANSFORM) +#define SKC_CMD_RASTERIZE_GET_COHORT(c) ((c).u32v2.hi >> SKC_CMD_RASTERIZE_HI_OFFSET_COHORT) +// SKC_BFE((c).tcc,SKC_CMD_RASTERIZE_BITS_COHORT,SKC_CMD_RASTERIZE_HI_OFFSET_COHORT) + +// +// +// + +#define SKC_TTSK_SIZE_COHORT (1 << SKC_CMD_RASTERIZE_BITS_COHORT) + +// +// COHORT META DATA +// + +union skc_raster_cohort_meta_in +{ + skc_uint4 u32v4; + + struct { + skc_uint blocks; // # of rk blocks + skc_uint offset; // start of rk span + skc_uint pk; // # of pk keys + skc_uint rk; // # of rk keys + }; +}; + +union skc_raster_cohort_meta_out +{ + skc_uint4 u32v4; + + struct { + skc_uint blocks; // # of blocks in raster -- initially just rk blocks + skc_uint offset; // start of rk span + skc_uint nodes; // # of nodes in raster -- necessary for walking + skc_uint keys; // # of rk & pk keys -- initially just rk + }; +}; + +union skc_raster_cohort_meta_inout +{ + union skc_raster_cohort_meta_in in; + union skc_raster_cohort_meta_out out; +}; + +// +// followed by one word for the offset +// + +struct skc_raster_cohort_meta +{ + union skc_raster_cohort_meta_inout inout[SKC_TTSK_SIZE_COHORT]; + skc_uint reads[SKC_TTSK_SIZE_COHORT]; // starting ring reads -- [0] is raster head +}; + +#define SKC_RASTER_COHORT_META_OFFSET_READS (SKC_OFFSET_OF(struct skc_raster_cohort_meta,reads) / sizeof(skc_uint)) + +// +// COHORT ATOMICS +// + +struct skc_raster_cohort_atomic +{ + // rasterization input + skc_uint cmds; + + // rasterization output + skc_uint keys; + + // block pool base -- idea here is to perform one atomic allocation + // skc_uint bp_base; +}; + +#define SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS 0 +#define SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS 1 + +#define SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS_CALC (SKC_OFFSET_OF(struct skc_raster_cohort_atomic,cmds) / sizeof(skc_uint)) +#define SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS_CALC (SKC_OFFSET_OF(struct skc_raster_cohort_atomic,keys) / sizeof(skc_uint)) + +SKC_STATIC_ASSERT(SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS == SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS_CALC); // verify +SKC_STATIC_ASSERT(SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS == SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS_CALC); // verify + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/rasterize.cl b/src/compute/skc/rasterize.cl new file mode 100644 index 0000000000..c9462ecff5 --- /dev/null +++ b/src/compute/skc/rasterize.cl @@ -0,0 +1,3367 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "raster_builder_cl_12.h" +#include "block_pool_cl.h" + +#include "atomic_cl.h" +#include "common.h" +#include "tile.h" + +// #define SKC_ARCH_AVX2 +// #define SKC_RASTERIZE_SIMD_USES_SMEM + +#define PRINTF_ENABLE 0 +#define PRINTF_BLOCK_COUNT 0 + +// +// NOTE: +// +// ON SIMD DEVICES THE BIN COUNT MUST BE POW2 SO THAT WE CAN LOAD IT +// AS A VECTOR AND PERFORM A SWIZZLE/SHUFFLE +// +// NOTE: +// +// IGNORE FOR NOW ANY AVX2 CODE SNIPPETS. THEY WILL BE MOVED ASAP. +// +// + +#if 0 // SKC_ARCH_AVX2 + +// #define SKC_RASTERIZE_SUBGROUP_SIZE 1 +// #define SKC_RASTERIZE_VECTOR_SIZE_LOG2 3 +// #define SKC_RASTERIZE_WORKGROUP_COUNT_SUBGROUP 1 + +// #define SKC_TTXB_WORDS 8 + +// #define SKC_RASTERIZE_FLOAT float8 +// #define SKC_RASTERIZE_UINT uint8 +// #define SKC_RASTERIZE_INT int8 +// #define SKC_RASTERIZE_PREDICATE int8 + +// #define SKC_RASTERIZE_BIN_BLOCK uint16 +// #define SKC_RASTERIZE_BIN uint8 + +// #define SKC_RASTERIZE_POOL uint8 +// #define SKC_RASTERIZE_POOL_SCALE 6 + +// #define SKC_RASTERIZE_TILE_HASH_X_BITS 1 +// #define SKC_RASTERIZE_TILE_HASH_Y_BITS 2 + +// #define SKC_RASTERIZE_VECTOR_EXPAND() SKC_EXPAND_8() + +#endif + +// +// SIMT +// + +#define SKC_RASTERIZE_BLOCK_ID_V_SIZE SKC_RASTERIZE_SUBGROUP_SIZE +#define SKC_RASTERIZE_TTSK_V_SIZE SKC_RASTERIZE_SUBGROUP_SIZE +#define SKC_RASTERIZE_TTSK_V_MASK (SKC_RASTERIZE_TTSK_V_SIZE - 1) + +// +// +// + +#define SKC_RASTERIZE_VECTOR_SIZE (1 << SKC_RASTERIZE_VECTOR_SIZE_LOG2) +#define SKC_RASTERIZE_ELEMS_PER_SUBGROUP (SKC_RASTERIZE_SUBGROUP_SIZE * SKC_RASTERIZE_VECTOR_SIZE) + +// +// +// + +#define SKC_RASTERIZE_YX_INIT 0x7FFF7FFF // { +32767, +32767 } +#define SKC_RASTERIZE_YX_INVALID 0x80008000 // { -32768, -32768 } + +// +// +// + +#define SKC_RASTERIZE_TILE_HASH_X_MASK SKC_BITS_TO_MASK(SKC_RASTERIZE_TILE_HASH_X_BITS) +#define SKC_RASTERIZE_TILE_HASH_Y_MASK SKC_BITS_TO_MASK(SKC_RASTERIZE_TILE_HASH_Y_BITS) +#define SKC_RASTERIZE_TILE_HASH_BITS (SKC_RASTERIZE_TILE_HASH_X_BITS + SKC_RASTERIZE_TILE_HASH_Y_BITS) +#define SKC_RASTERIZE_TILE_HASH_BIN_COUNT (1 << SKC_RASTERIZE_TILE_HASH_BITS) +#define SKC_RASTERIZE_TILE_HASH_BIN_BITS (SKC_RASTERIZE_TILE_HASH_BITS + 1) // FIXME -- LOG2_RU(BIN_COUNT) +#define SKC_RASTERIZE_TILE_HASH_BIN_MASK SKC_BITS_TO_MASK(SKC_RASTERIZE_TILE_HASH_BIN_BITS) + +// +// Norbert Juffa notes: "GPU Pro Tip: Lerp Faster in C++" +// +// https://devblogs.nvidia.com/parallelforall/lerp-faster-cuda/ +// +// Lerp in two fma/mad ops: +// +// t * b + ((-t) * a + a) +// +// Note: OpenCL documents mix() as being implemented as: +// +// a + (b - a) * t +// +// But this may be a native instruction on some devices. For example, +// on GEN9 there is an LRP "linear interoplation" opcode but it +// doesn't appear to support half floats. +// +// Feel free to toggle this option and then benchmark and inspect the +// generated code. We really want the double FMA to be generated when +// there isn't support for a LERP/MIX operation. +// + +#if 1 +#define SKC_LERP(a,b,t) mad(t,b,mad(-(t),a,a)) +#else +#define SKC_LERP(a,b,t) mix(a,b,t) +#endif + +// +// There is no integer MAD in OpenCL with "don't care" overflow +// semantics. +// +// FIXME -- verify if the platform needs explicit MAD operations even +// if a "--fastmath" option is available at compile time. It might +// make sense to explicitly use MAD calls if the platform requires it. +// + +#if 1 +#define SKC_MAD_UINT(a,b,c) ((a) * (b) + (c)) +#else +#define SKC_MAD_UINT(a,b,c) mad_sat(a,b,c) +#endif + +// +// +// + +#define SKC_RASTERIZE_SEGMENT(id) (id * SKC_DEVICE_SUBBLOCK_WORDS + skc_subgroup_lane()) + +// +// +// + +union skc_bp_elem +{ + skc_uint u32; + skc_tagged_block_id_t tag_id; + skc_float coord; +}; + +// +// +// + +struct skc_subgroup_smem +{ + // + // SIMT subgroup scratchpad for max scan -- also shared with 'winner' member + // +#if ( SKC_RASTERIZE_SUBGROUP_SIZE > 1 ) || defined ( SKC_RASTERIZE_SIMD_USES_SMEM ) + struct { + union { + + skc_uint winner; + + struct { + skc_uint scratch[SKC_RASTERIZE_SUBGROUP_SIZE]; + } aN; + + struct { + SKC_RASTERIZE_UINT scratch[SKC_RASTERIZE_SUBGROUP_SIZE]; + } vN; + }; + } subgroup; +#endif + + // + // work-in-progress TTSB blocks and associated YX keys + // + union { + struct { + // FIXME -- some typedefs are valid here + skc_uint ttsb [SKC_RASTERIZE_TILE_HASH_BIN_COUNT][SKC_DEVICE_SUBBLOCK_WORDS]; + skc_uint yx [SKC_RASTERIZE_TILE_HASH_BIN_COUNT]; + skc_uint id [SKC_RASTERIZE_TILE_HASH_BIN_COUNT]; + skc_uint count[SKC_RASTERIZE_TILE_HASH_BIN_COUNT]; + } aN; +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + struct { + SKC_RASTERIZE_BIN_BLOCK ttsb[SKC_RASTERIZE_TILE_HASH_BIN_COUNT]; + SKC_RASTERIZE_BIN yx; + SKC_RASTERIZE_BIN id; + SKC_RASTERIZE_BIN count; + } vN; +#endif + } bin; +}; + +// +// +// + +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) +#define skc_subgroup_lane() 0 +#else +#define skc_subgroup_lane() get_sub_group_local_id() +#endif + +// +// replenish block ids +// +// note that you can't overrun the block id pool since it's a ring +// + +static +void +skc_blocks_replenish(skc_uint * const blocks_next, + skc_block_id_v_t * const blocks, + __global SKC_ATOMIC_UINT volatile * const bp_atomics, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids) +{ + // + // get a new vector of block ids -- this is kind of a narrow + // allocation but subblocks help stretch out the pool. + // + // FIXME -- there is now plenty of SMEM to allocate a LOT of block ids + // + skc_uint bp_idx = 0; + + if (skc_subgroup_lane() == 0) + { + bp_idx = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(bp_atomics+SKC_BP_ATOMIC_OFFSET_READS, + SKC_RASTERIZE_BLOCK_ID_V_SIZE); // ring_reads +#if 0 + printf("r+: %8u + %u\n",bp_idx,SKC_RASTERIZE_BLOCK_ID_V_SIZE); +#endif + } + + bp_idx = (sub_group_broadcast(bp_idx,0) + skc_subgroup_lane()) & bp_mask; + *blocks = bp_ids[bp_idx]; + *blocks_next = 0; +} + +// +// +// + +static +skc_block_id_t +skc_blocks_get_next(skc_uint * const blocks_next, + skc_block_id_v_t * const blocks, + __global SKC_ATOMIC_UINT volatile * const bp_atomics, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids) +{ + // replenish? + if (*blocks_next == SKC_RASTERIZE_BLOCK_ID_V_SIZE) + { + skc_blocks_replenish(blocks_next,blocks,bp_atomics,bp_mask,bp_ids); + } + +#if ( SKC_RASTERIZE_SUBGROUP_SIZE > 1 ) + // + // SIMT + // + skc_block_id_t id = sub_group_broadcast(*blocks,*blocks_next); + +#else + // + // SIMD + // + skc_block_id_t id = blocks->s0; + + skc_shuffle_down_1(*blocks); + +#endif + + *blocks_next += 1; + + return id; +} + +// +// subblock allocator +// + +#if SKC_DEVICE_BLOCK_WORDS_LOG2 > SKC_DEVICE_SUBBLOCK_WORDS_LOG2 + +static +skc_block_id_t +skc_subblocks_get_next(skc_block_id_t * const subblocks, + skc_uint * const blocks_next, + skc_block_id_v_t * const blocks, + __global SKC_ATOMIC_UINT volatile * const bp_atomics, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids) +{ + if ((*subblocks & SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK) == 0) + { + *subblocks = skc_blocks_get_next(blocks_next,blocks,bp_atomics,bp_mask,bp_ids); + } + + skc_block_id_t const sb_id = *subblocks; + + *subblocks += 1; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("= %u\n",sb_id); +#endif + + return sb_id; +} + + +#define SKC_SUBBLOCKS_BLOCKS_PROTO() skc_block_id_t * const subblocks, skc_block_id_t * const blocks +#define SKC_SUBBLOCKS_BLOCKS_ARGS() subblocks, blocks + +#else + +#define SKC_SUBBLOCKS_BLOCKS_PROTO() skc_block_id_t * const blocks +#define SKC_SUBBLOCKS_BLOCKS_ARGS() blocks + +#endif + +// +// +// + +static +skc_block_id_t +skc_ttsk_v_append(SKC_SUBBLOCKS_BLOCKS_PROTO(), + skc_uint * const blocks_next, + __global SKC_ATOMIC_UINT volatile * const bp_atomics, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const bp_ids, + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + skc_ttsk_v_t * const sk_v, + skc_uint * const sk_v_next, + __global skc_ttsk_s_t * const sk_extent, + skc_uint const new_yx) +{ +#if SKC_DEVICE_BLOCK_WORDS_LOG2 > SKC_DEVICE_SUBBLOCK_WORDS_LOG2 + skc_block_id_t const new_id = skc_subblocks_get_next(subblocks, + blocks_next, + blocks, + bp_atomics, + bp_mask, + bp_ids); +#else + skc_block_id_t const new_id = skc_blocks_get_next(blocks_next, + blocks, + bp_atomics, + bp_mask, // pow2 modulo mask for block pool ring + bp_ids); +#endif + + if (get_sub_group_local_id() == (*sk_v_next & SKC_RASTERIZE_TTSK_V_MASK)) + { + sk_v->lo = new_id; + sk_v->hi = (sk_v->hi & SKC_TTRK_HI_MASK_COHORT) | new_yx; +#if 0 + printf("@ ( %3u, %3u ) %u\n", + (new_yx >> 12) & 0xFFF, + (new_yx ) & 0xFFF, + new_id); +#endif + } + + *sk_v_next += 1; + + if (*sk_v_next == SKC_RASTERIZE_TTSK_V_SIZE) + { + *sk_v_next = 0; + + skc_uint sk_idx = 0; + + if (skc_subgroup_lane() == 0) + { + sk_idx = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE + (cohort_atomics+SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS,SKC_RASTERIZE_TTSK_V_SIZE); +#if 0 + printf("+ %u\n",sk_idx); +#endif + } + + sk_idx = sub_group_broadcast(sk_idx,0) + skc_subgroup_lane(); + +#if ( SKC_RASTERIZE_SUBGROUP_SIZE > SKC_RASTERIZE_TTSK_V_SIZE ) + if (skc_subgroup_lane() < SKC_RASTERIZE_TTSK_V_SIZE) +#endif + { + sk_extent[sk_idx] = *sk_v; +#if 0 + printf("> %u : %v2u\n",sk_idx,*sk_v); +#endif + } + } + + return new_id; +} + +// +// +// + +static +SKC_RASTERIZE_FLOAT +skc_subgroup_scan_inclusive_add_float(SKC_RASTERIZE_FLOAT const v) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + // Note that there isn't a built-in horizontal scan for vectors so + // we'll define some here for various widths. + // + // FIXME -- a scalar version might be faster so put in a + // compile-time switch to selection between implementations + // + +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + // 01 + // 0 + + // -- + // 01 + SKC_RASTERIZE_FLOAT const w = mad(v.s10,(SKC_RASTERIZE_FLOAT)(0,1),v); + return w; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + // 0123 + // 012 + + // ---- + // 0123 + // 01 + + // ---- + // 0123 + // + SKC_RASTERIZE_FLOAT const w = mad(v.s3012,(SKC_RASTERIZE_FLOAT)(0,1,1,1),v); + SKC_RASTERIZE_FLOAT const x = mad(w.s2301,(SKC_RASTERIZE_FLOAT)(0,0,1,1),w); + return x; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + // 01234567 + // 0123456 + + // -------- + // 01234567 + // 012345 + + // -------- + // 01234567 + // 0123 + + // -------- + // 01234567 + // + SKC_RASTERIZE_FLOAT const w = mad(v.s70123456,(SKC_RASTERIZE_FLOAT)(0,1,1,1,1,1,1,1),v); + SKC_RASTERIZE_FLOAT const x = mad(w.s67012345,(SKC_RASTERIZE_FLOAT)(0,0,1,1,1,1,1,1),w); + SKC_RASTERIZE_FLOAT const y = mad(x.s45670123,(SKC_RASTERIZE_FLOAT)(0,0,0,0,1,1,1,1),x); + return y; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + // 0123456789abcdef + // 0123456789abcde + + // ---------------- + // 0123456789abcdef + // 0123456789abcd + + // ---------------- + // 0123456789abcdef + // 0123456789ab + + // ---------------- + // 0123456789abcdef + // 01234567 + + // ---------------- + // 0123456789abcdef + // + SKC_RASTERIZE_FLOAT const w = mad(v.sf0123456789abcde,(SKC_RASTERIZE_FLOAT)(0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),v); + SKC_RASTERIZE_FLOAT const x = mad(w.sef0123456789abcd,(SKC_RASTERIZE_FLOAT)(0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1),w); + SKC_RASTERIZE_FLOAT const y = mad(x.scdef0123456789ab,(SKC_RASTERIZE_FLOAT)(0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1),x); + SKC_RASTERIZE_FLOAT const z = mad(y.s89abcdef01234567,(SKC_RASTERIZE_FLOAT)(0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1),y); + return z; + +#endif + +#else + // + // SIMT + // + + return sub_group_scan_inclusive_add(v); + +#endif +} + +// +// +// + +static +SKC_RASTERIZE_UINT +skc_subgroup_scan_inclusive_add_uint(SKC_RASTERIZE_UINT const v) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + // Note that there isn't a built-in horizontal scan for vectors so + // we'll define some here for various widths. + // + // FIXME -- a scalar version might be faster so put in a + // compile-time switch to selection between implementations + // + +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + // 01 + // 0 + + // -- + // 01 + SKC_RASTERIZE_UINT const w = SKC_MAD_UINT(v.s10,(SKC_RASTERIZE_UINT)(0,1),v); + return w; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + // 0123 + // 012 + + // ---- + // 0123 + // 01 + + // ---- + // 0123 + // + SKC_RASTERIZE_UINT const w = SKC_MAD_UINT(v.s3012,(SKC_RASTERIZE_UINT)(0,1,1,1),v); + SKC_RASTERIZE_UINT const x = SKC_MAD_UINT(w.s2301,(SKC_RASTERIZE_UINT)(0,0,1,1),w); + return x; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + // 01234567 + // 0123456 + + // -------- + // 01234567 + // 012345 + + // -------- + // 01234567 + // 0123 + + // -------- + // 01234567 + // + SKC_RASTERIZE_UINT const w = SKC_MAD_UINT(v.s70123456,(SKC_RASTERIZE_UINT)(0,1,1,1,1,1,1,1),v); + SKC_RASTERIZE_UINT const x = SKC_MAD_UINT(w.s67012345,(SKC_RASTERIZE_UINT)(0,0,1,1,1,1,1,1),w); + SKC_RASTERIZE_UINT const y = SKC_MAD_UINT(x.s45670123,(SKC_RASTERIZE_UINT)(0,0,0,0,1,1,1,1),x); + return y; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + // 0123456789abcdef + // 0123456789abcde + + // ---------------- + // 0123456789abcdef + // 0123456789abcd + + // ---------------- + // 0123456789abcdef + // 0123456789ab + + // ---------------- + // 0123456789abcdef + // 01234567 + + // ---------------- + // 0123456789abcdef + // + SKC_RASTERIZE_UINT const w = SKC_MAD_UINT(v.sf0123456789abcde,(SKC_RASTERIZE_UINT)(0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),v); + SKC_RASTERIZE_UINT const x = SKC_MAD_UINT(w.sef0123456789abcd,(SKC_RASTERIZE_UINT)(0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1),w); + SKC_RASTERIZE_UINT const y = SKC_MAD_UINT(x.scdef0123456789ab,(SKC_RASTERIZE_UINT)(0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1),x); + SKC_RASTERIZE_UINT const z = SKC_MAD_UINT(y.s89abcdef01234567,(SKC_RASTERIZE_UINT)(0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1),y); + return z; + +#endif + +#else + // + // SIMT + // + + return sub_group_scan_inclusive_add(v); + +#endif +} + +// +// +// + +static +SKC_RASTERIZE_UINT +skc_subgroup_scan_inclusive_max(SKC_RASTERIZE_UINT const v) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + // Note that there isn't a built-in horizontal scan for vectors so + // we'll define some here for various widths. + // + // FIXME -- a scalar version might be faster so put in a + // compile-time switch to selection between implementations + // + +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + // 01 + // 00 max + // -- + // 01 + SKC_RASTERIZE_UINT const w = max(v.s00,v); + return w; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + // 0123 + // 0012 + + // ---- + // 0123 + // 0101 + + // ---- + // 0123 + // + SKC_RASTERIZE_UINT const w = max(v.s0012,v); + SKC_RASTERIZE_UINT const x = max(w.s0101,w); + return x; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + // 01234567 + // 00123456 + + // -------- + // 01234567 + // 01012345 + + // -------- + // 01234567 + // 01230123 + + // -------- + // 01234567 + // + SKC_RASTERIZE_UINT const w = max(v.s00123456,v); + SKC_RASTERIZE_UINT const x = max(w.s01012345,w); + SKC_RASTERIZE_UINT const y = max(x.s01230123,x); + return y; + +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + // 0123456789abcdef + // 00123456789abcde + + // ---------------- + // 0123456789abcdef + // 010123456789abcd + + // ---------------- + // 0123456789abcdef + // 01230123456789ab + + // ---------------- + // 0123456789abcdef + // 0123456701234567 + + // ---------------- + // 0123456789abcdef + // + SKC_RASTERIZE_UINT const w = max(v.s00123456789abcde,v); + SKC_RASTERIZE_UINT const x = max(w.s010123456789abcd,w); + SKC_RASTERIZE_UINT const y = max(x.s01230123456789ab,x); + SKC_RASTERIZE_UINT const z = max(y.s0123456701234567,y); + return z; + +#endif + +#else + // + // SIMT + // + + return sub_group_scan_inclusive_max(v); + +#endif +} + +// +// +// + +static +float +skc_subgroup_last_float(SKC_RASTERIZE_FLOAT const v) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + return v.s1; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + return v.s3; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + return v.s7; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + return v.sf; +#endif + +#else + // + // SIMT + // + return sub_group_broadcast(v,SKC_RASTERIZE_SUBGROUP_SIZE-1); + +#endif +} + +// +// +// + +static +SKC_RASTERIZE_UINT +skc_subgroup_last_uint(SKC_RASTERIZE_UINT const v) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + return v.s1; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + return v.s3; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + return v.s7; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + return v.sf; +#endif + +#else + // + // SIMT + // + return sub_group_broadcast(v,SKC_RASTERIZE_SUBGROUP_SIZE-1); + +#endif +} + +// +// +// + +static +float +skc_subgroup_first(SKC_RASTERIZE_FLOAT const v) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; +#else + return v.s0; +#endif + +#else + // + // SIMT + // + return sub_group_broadcast(v,0); + +#endif +} + +// +// +// + +static +SKC_RASTERIZE_FLOAT +skc_subgroup_shuffle(SKC_RASTERIZE_FLOAT const v, + SKC_RASTERIZE_UINT const i) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return v; +#else + return shuffle(v,i); +#endif + +#else + // + // SIMT + // + return intel_sub_group_shuffle(v,i); + +#endif +} + +// +// +// + +static +SKC_RASTERIZE_FLOAT +skc_subgroup_shuffle_up_1(SKC_RASTERIZE_FLOAT const p, // previous + SKC_RASTERIZE_FLOAT const c) // current +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + // FIXME -- there are alternative formulations here: + // + // Option 1: + // + // select(c.rotate(+1),p.rotate(-1),(1,0,0,...)) + // + // Option 2: + // + // p is a scalar + // t = c.rotate(+1) + // t.s0 = p; + // + // Option 3: ... + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return p; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + return shuffle2(p,c,(uint2)(1,2)); +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + return shuffle2(p,c,(uint4)(3,4,5,6)); +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + return shuffle2(p,c,(uint8)(7,8,9,10,11,12,13,14)); +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + return shuffle2(p,c,(uint16)(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)); +#endif + +#else + // + // SIMT + // + return intel_sub_group_shuffle_up(p,c,1); + +#endif +} + +// +// +// + +static +bool +skc_is_lane_first() +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1) + // + // SIMD + // + return true; +#else + // + // SIMT + // + return get_sub_group_local_id() == 0; +#endif +} + +// +// +// + +static +SKC_RASTERIZE_FLOAT +skc_delta_offset() +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + return 1; +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 1 ) + return (SKC_RASTERIZE_FLOAT)( 1, 2 ); +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 2 ) + return (SKC_RASTERIZE_FLOAT)( 1, 2, 3, 4 ); +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 3 ) + return (SKC_RASTERIZE_FLOAT)( 1, 2, 3, 4, 5, 6, 7, 8 ); +#elif ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 4 ) + return (SKC_RASTERIZE_FLOAT)( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ); +#endif + +#else + // + // SIMT + // + return 1.0f + get_sub_group_local_id(); + +#endif + +} + +// +// +// + +static +int +skc_subgroup_any(SKC_RASTERIZE_PREDICATE const p) +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + return any(p); +#else + // + // SIMT + // + return sub_group_any(p); +#endif +} + +// +// +// + +#define SKC_PATH_NODEWORD_IS_LAST(n) (((n) & SKC_DEVICE_BLOCK_WORDS_MASK) == SKC_DEVICE_BLOCK_WORDS_MASK) + +void +skc_segment_next(__global union skc_bp_elem * const bp_elems, + skc_uint * const nodeword, + skc_block_id_t * const id) +{ + if ((++*id & SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK) == 0) + { + if (SKC_PATH_NODEWORD_IS_LAST(++*nodeword)) + { + *nodeword = SKC_TAGGED_BLOCK_ID_GET_ID(bp_elems[*nodeword].tag_id) * SKC_DEVICE_SUBBLOCK_WORDS; + } + + skc_tagged_block_id_t const tag_id = bp_elems[*nodeword].tag_id; + + *id = SKC_TAGGED_BLOCK_ID_GET_ID(tag_id); + } +} + +// +// +// + +static +SKC_RASTERIZE_FLOAT +skc_native_length(SKC_RASTERIZE_FLOAT const x, SKC_RASTERIZE_FLOAT const y) +{ + return native_sqrt(x * x + y * y); +} + +// +// Wang's Formula (1985) +// + +#define SKC_WANG_PIXEL_RESL 0.25f // <-- this can be tuned + +#define SKC_WANG_EPSILON (SKC_WANG_PIXEL_RESL * SKC_SUBPIXEL_RESL_X_F32) + +#define SKC_WANG_CUBIC ((3.0f * 2.0f) / (8.0f * SKC_WANG_EPSILON)) +#define SKC_WANG_QUADRATIC ((2.0f ) / (8.0f * SKC_WANG_EPSILON)) + +#define SKC_WANG_LENGTH(x,y) skc_native_length(x,y) +#define SKC_WANG_SQRT(x) native_sqrt(x) + +// +// +// + +static +SKC_RASTERIZE_FLOAT +skc_wangs_formula_cubic(SKC_RASTERIZE_FLOAT const t0x, SKC_RASTERIZE_FLOAT const t0y, + SKC_RASTERIZE_FLOAT const t1x, SKC_RASTERIZE_FLOAT const t1y, + SKC_RASTERIZE_FLOAT const t2x, SKC_RASTERIZE_FLOAT const t2y, + SKC_RASTERIZE_FLOAT const t3x, SKC_RASTERIZE_FLOAT const t3y) +{ + // + // Return the number of evenly spaced (in the parametric sense) line + // segments that are guaranteed to be within "epsilon" error of the + // curve. + // + // We're then going to take multiples of the reciprocal of this + // number so that the segmentation can be distributed across the + // subgroup. + // + // Note, this can probably be slightly optimized per architecture + // but it's probably far from being a hotspot since it's all + // straight-line unpredicated code. + // + // The result is an integer ranging from [1.0,#segments] + // + // Note that even if all of the control points are coincident, the + // max(1.0f) will categorize this as a line of 1 segment. + // + // This is what we want! We want to convert cubics to lines as + // easily as possible and *then* cull lines that are either + // horizontal or zero length. + // + return max(1.0f, + ceil(SKC_WANG_SQRT(SKC_WANG_CUBIC * + SKC_WANG_LENGTH(max(fabs(t2x - 2.0f * t1x + t0x), + fabs(t3x - 2.0f * t2x + t1x)), + max(fabs(t2y - 2.0f * t1y + t0y), + fabs(t3y - 2.0f * t2y + t1y)))))); +} + +static +SKC_RASTERIZE_FLOAT +skc_wangs_formula_quadratic(SKC_RASTERIZE_FLOAT const t0x, SKC_RASTERIZE_FLOAT const t0y, + SKC_RASTERIZE_FLOAT const t1x, SKC_RASTERIZE_FLOAT const t1y, + SKC_RASTERIZE_FLOAT const t2x, SKC_RASTERIZE_FLOAT const t2y) +{ + return max(1.0f, + ceil(SKC_WANG_SQRT(SKC_WANG_QUADRATIC * + SKC_WANG_LENGTH(fabs(t2x - 2.0f * t1x + t0x), + fabs(t2y - 2.0f * t1y + t0y))))); +} + +// +// rational curves +// + +static +SKC_RASTERIZE_FLOAT +skc_wangs_formula_cubic_rat() +{ + return 0.0f; +} + +static +SKC_RASTERIZE_FLOAT +skc_wangs_formula_quad_rat() +{ + return 0.0f; +} + +// +// flush any work-in-progress blocks and return unused block ids +// + +static +void +skc_finalize(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + skc_block_id_v_t * const blocks, + skc_uint const blocks_next, + skc_ttsk_v_t * const sk_v, + skc_uint const sk_v_next, + __global skc_ttsk_s_t * const sk_extent, + __local struct skc_subgroup_smem volatile * const smem) +{ + // + // flush non-empty bins + // + // FIXME -- accelerate this iteration/search with a subgroup operation + // + for (skc_uint ii=0; ii<SKC_RASTERIZE_TILE_HASH_BIN_COUNT; ii++) + { + if (smem->bin.aN.count[ii] > 0) + { + skc_block_id_v_t const id = smem->bin.aN.id[ii]; + skc_uint const idx = id * SKC_DEVICE_SUBBLOCK_WORDS + skc_subgroup_lane(); + skc_uint const tts = smem->bin.aN.ttsb[ii][skc_subgroup_lane()]; +#if 0 + printf("???????? : [ %10u = %10u : %08X ]\n",id,idx,tts); +#endif + bp_elems[idx].u32 = tts; + } + + // + // FIXME -- vectorize with vstoreN() + // + } + + // + // return remaining block ids back to the pool + // + skc_uint const blocks_rem = SKC_RASTERIZE_BLOCK_ID_V_SIZE - blocks_next; + + if (blocks_rem > 0) + { + skc_uint bp_idx = 0; + + if (skc_subgroup_lane() == 0) + { + bp_idx = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(bp_atomics+SKC_BP_ATOMIC_OFFSET_WRITES,blocks_rem); + +#if 0 + printf("r-: %8u + %u\n",bp_idx,blocks_rem); +#endif + } + + bp_idx = (sub_group_broadcast(bp_idx,0) + skc_subgroup_lane() - blocks_next) & bp_mask; + + if (skc_subgroup_lane() >= blocks_next) + { + bp_ids[bp_idx] = *blocks; + } + } + + // + // flush work-in-progress ryx keys + // + if (sk_v_next > 0) + { + skc_uint sk_idx = 0; + + if (skc_subgroup_lane() == 0) + { + sk_idx = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE + (cohort_atomics+SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS,sk_v_next); +#if 0 + printf("* %u\n",sk_idx); +#endif + } + + sk_idx = sub_group_broadcast(sk_idx,0) + skc_subgroup_lane(); + + if (skc_subgroup_lane() < sk_v_next) + { + sk_extent[sk_idx] = *sk_v; + } + } +} + +// +// If there are lanes that were unable to append to a bin because +// their hashes collided with a bin's current ryx key then those bins +// must be ejected. +// +// Note that we do not eject "full" bins because lazily waiting for a +// collision results in simpler code. +// + +static +void +skc_flush(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + skc_block_id_t * const subblocks, + skc_block_id_v_t * const blocks, + skc_uint * const blocks_next, + skc_ttsk_v_t * const sk_v, + skc_uint * const sk_v_next, + __global skc_ttsk_s_t * const sk_extent, + __local struct skc_subgroup_smem volatile * const smem, + SKC_RASTERIZE_UINT const hash, + SKC_RASTERIZE_UINT const yx, + SKC_RASTERIZE_PREDICATE is_collision) // pass by value +{ +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + + // + // FIXME -- this code is now stale with the changes to the + // subblock/block allocation strategy + // + + // + // get local TTSB ID queue count + // + skc_uint ttsb_id_count = smem->pool.count; // scalar + + // init hash bit mask + skc_uint component_mask = 0; + + for (int cc=0; cc<SKC_RASTERIZE_VECTOR_SIZE; cc++) + { + // if no collision continue + if (((int*)&is_collision)[cc] == 0) + continue; + + uint const winner = ((uint*)&hash)[cc]; + uint const component_bit = 1u << winner; + + // if already processed this hash then continue + if (component_mask & component_bit) + continue; + + // update component mask + component_mask |= component_bit; + + // + // new winner requires ejecting the old TTSB + // + if (smem->bin.aN.count[winner] > 0) + { + skc_uint const elem_idx = smem->bin.aN.id[winner] * SKC_DEVICE_SUBBLOCK_WORDS + skc_subgroup_lane(); + + bp_elems[elem_idx].u32 = smem->bin.aN.ttsb[winner][skc_subgroup_lane()]; + } + + // + // ensure there is at least one TTSK and TTSB ID + // + if (ttsb_id_count == SKC_RASTERIZE_POOL_SIZE) + { + // + // update remaining count + // + ttsb_id_count = 0; + + // + // flush accumulated ttsk_ryx keys + // + uint const idx = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE + (cohort_atomics+SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS,SKC_RASTERIZE_POOL_SIZE); // ttsk_ryx_count + +#if 0 + printf("# %u\n",idx); +#endif + + for (uint ii=0; ii<SKC_RASTERIZE_POOL_SIZE; ii+=SKC_RASTERIZE_SUBGROUP_SIZE) + { + ttsk_ryx[idx + ii] = skc_make_ttsk_ryx(smem,SKC_CMD_RASTERIZE_GET_COHORT(cmd),ii); + } + + // + // allocate more ttsb ids from pool + // + uint const id = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(bp_atomics+0,SKC_RASTERIZE_POOL_SIZE); // ring_reads + + for (uint ii=0; ii<SKC_RASTERIZE_POOL_SIZE; ii+=SKC_RASTERIZE_SUBGROUP_SIZE) + smem->pool.aN.id[ii] = bp_ids[id + ii]; + } + + // + // invalidate the winning block + // + + // + // update bin with winning yx, new ttsb id and zero count + // + // all lanes are loading/storing from/to the same index + // + smem->bin.vN.ttsb [winner] = ( SKC_TTS_INVALID ); + smem->bin.aN.id [winner] = smem->pool.aN.id[ttsb_id_count]; + smem->bin.aN.yx [winner] = smem->pool.aN.yx[ttsb_id_count] = ((uint*)&yx)[cc]; + smem->bin.aN.count[winner] = 0; + + // + // update count + // + ttsb_id_count += 1; + } + + // + // save count + // + smem->pool.count = ttsb_id_count; + +#else + // + // SIMT + // + + do { + // + // only one lane will win! + // + if (is_collision) + smem->subgroup.winner = hash; + + barrier(CLK_LOCAL_MEM_FENCE); + + // + // which bin is being ejected? + // + skc_uint const winner = smem->subgroup.winner; + + // + // which colliding hash is taking over the bin? + // + SKC_RASTERIZE_PREDICATE const is_winner = is_collision && (hash == winner); + + // + // all lanes with the same hash will try to store but only one + // lane will win + // + if (is_winner) + smem->subgroup.winner = yx; + + barrier(CLK_LOCAL_MEM_FENCE); + + // + // flush this block to the pool + // + if (smem->bin.aN.count[winner] > 0) + { + skc_block_id_v_t const id = smem->bin.aN.id[winner]; + skc_uint const idx = id * SKC_DEVICE_SUBBLOCK_WORDS + skc_subgroup_lane(); + skc_uint const tts = smem->bin.aN.ttsb[winner][skc_subgroup_lane()]; +#if 0 + printf("%08X : [ %10u = %10u : %08X ]\n",yx,id,idx,tts); +#endif + bp_elems[idx].u32 = tts; + } + + // + // append new ttsk + // + skc_uint const new_yx = smem->subgroup.winner; + skc_block_id_t const new_id = skc_ttsk_v_append(SKC_SUBBLOCKS_BLOCKS_ARGS(), + blocks_next, + bp_atomics, + bp_mask, // pow2 modulo mask for block pool ring + bp_ids, + cohort_atomics, + sk_v, + sk_v_next, + sk_extent, + new_yx); + +#if 0 + if (get_sub_group_local_id() == 0) { + printf(">>> %9u\n",new_id); + } +#endif + + // + // update bin with winning yx, new ttsb id and zero count + // + smem->bin.aN.ttsb [winner][skc_subgroup_lane()] = SKC_TTS_INVALID; + smem->bin.aN.yx [winner] = new_yx; + smem->bin.aN.id [winner] = new_id; + smem->bin.aN.count[winner] = 0; + + // + // remove all lanes matching this hash + // + is_collision = is_collision && !is_winner; + + // + // exit if nothing left to do + // + } while (sub_group_any(is_collision)); + +#endif +} + +// +// scatter scan max +// +static +SKC_RASTERIZE_UINT +skc_scatter_scan_max(__local struct skc_subgroup_smem volatile * const smem, + SKC_RASTERIZE_FLOAT const iss, + SKC_RASTERIZE_FLOAT const ess) +{ + // + // prefix sums determine which lanes we're going to work on next + // + SKC_RASTERIZE_PREDICATE const is_scratch_store = (iss > 0.0f) && (ess < (float)SKC_RASTERIZE_ELEMS_PER_SUBGROUP); + SKC_RASTERIZE_UINT const scratch_idx = SKC_CONVERT(SKC_RASTERIZE_UINT)(max(ess,0.0f)); + +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // +#ifdef SKC_RASTERIZE_SIMD_USES_SMEM + // + // SIMD APPROACH 1: SIMT'ISH + // + + // zero the volatile smem scratchpad using vector syntax + smem->subgroup.vN.scratch[0] = ( 0 ); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (is_scratch_store C) \ + smem->subgroup.aN.scratch[scratch_idx C] = I; + + SKC_RASTERIZE_VECTOR_EXPAND(); + + // propagate lanes to right using max scan + SKC_RASTERIZE_UINT const scratch = smem->subgroup.vN.scratch[0]; + SKC_RASTERIZE_UINT const source = skc_subgroup_scan_inclusive_max(scratch); + +#else + // + // SIMD APPROACH 2: SCALAR'ISH + // + + SKC_RASTERIZE_UINT source = ( 0 ); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (is_scratch_store C) \ + ((uint *)&source)[scratch_idx C] = I; + + SKC_RASTERIZE_VECTOR_EXPAND(); + + for (uint ii=1; ii<SKC_RASTERIZE_ELEMS_PER_SUBGROUP; ii++) + ((uint *)&source)[ii] = max(((uint *)&source)[ii-1],((uint *)&source)[ii]); +#endif + +#else + // + // SIMT + // + + // + // zero the volatile smem scratchpad using vector syntax + // + smem->subgroup.vN.scratch[skc_subgroup_lane()] = ( 0 ); + + // + // store source lane at starting lane + // + if (is_scratch_store) + smem->subgroup.aN.scratch[scratch_idx] = skc_subgroup_lane(); + + // + // propagate lanes to right using max scan + // + SKC_RASTERIZE_UINT const scratch = smem->subgroup.vN.scratch[skc_subgroup_lane()]; + SKC_RASTERIZE_UINT const source = skc_subgroup_scan_inclusive_max(scratch); +#endif + + return source; +} + +// +// sliver lines into subpixels +// + +static +void +skc_sliver(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + skc_block_id_t * const subblocks, + skc_block_id_v_t * const blocks, + skc_uint * const blocks_next, + skc_ttsk_v_t * const sk_v, + skc_uint * const sk_v_next, + __global skc_ttsk_s_t * const sk_extent, + __local struct skc_subgroup_smem volatile * const smem, + SKC_RASTERIZE_FLOAT const l0x, + SKC_RASTERIZE_FLOAT const l0y, + SKC_RASTERIZE_FLOAT const l1x, + SKC_RASTERIZE_FLOAT const l1y) +{ + // + // Y-SLIVERING + // ----------- + // + // immediately sliver all multi-pixel lines in into 1-pixel high + // lines + // + // note this implicitly squelches horizontal lines + // + // there is another test for horizontal lines after x-slivering + // is complete + // + + // + // will we need to flip the sign of y_delta ? + // + SKC_RASTERIZE_PREDICATE const y_lt = (l0y <= l1y); + SKC_RASTERIZE_UINT const dy_xor = y_lt ? 0 : 0x80000000; + + // + // save 1/dy + // + SKC_RASTERIZE_FLOAT const y_denom = native_recip(l1y - l0y); + + // + // how many non-horizontal subpixel y-axis slivers are there? + // + SKC_RASTERIZE_FLOAT const y_min = floor(fmin(l0y,l1y) * SKC_SUBPIXEL_Y_SCALE_DOWN); + SKC_RASTERIZE_FLOAT const y_max = ceil (fmax(l0y,l1y) * SKC_SUBPIXEL_Y_SCALE_DOWN); + SKC_RASTERIZE_FLOAT const y_base = y_lt ? y_min : y_max; + SKC_RASTERIZE_FLOAT y_segs = y_max - y_min; + + // + // inclusive subgroup scan of y_segs + // + SKC_RASTERIZE_FLOAT y_iss = skc_subgroup_scan_inclusive_add_float(y_segs); + SKC_RASTERIZE_FLOAT y_ess = y_iss - y_segs; + float y_rem = skc_subgroup_last_float(y_iss); + + // + // if this is a horizontal line then tweak y_iss so "is_scratch_store" always fails + // + if (y_segs == 0.0f) + y_iss = 0.0f; + +#if 0 + printf("{ { %5.0f, %5.0f }, { %5.0f, %5.0f } (* %5.0f / %5.0f / %5.0f / %5.0f *) }, \n",a0x,a0y,a1x,a1y,y_segs,y_iss,y_ess,y_rem); +#endif + + // + // these values don't matter on first iteration + // + SKC_RASTERIZE_FLOAT n1x_prev = 0; + SKC_RASTERIZE_FLOAT n1y_prev = 0; + + // + // loop until done + // + while (y_rem > 0.0f) + { + // + // distribute work across lanes + // + SKC_RASTERIZE_UINT const y_source = skc_scatter_scan_max(smem,y_iss,y_ess); + + // + // get line at y_source line + // + SKC_RASTERIZE_FLOAT const m0x = skc_subgroup_shuffle(l0x,y_source); + SKC_RASTERIZE_FLOAT const m0y = skc_subgroup_shuffle(l0y,y_source); + SKC_RASTERIZE_FLOAT const m1x = skc_subgroup_shuffle(l1x,y_source); + SKC_RASTERIZE_FLOAT const m1y = skc_subgroup_shuffle(l1y,y_source); + + // + // every lane will create a 1 pixel tall line "sliver" + // + // FIXME -- this gets expanded on SIMD + // + // if numerator == 1 then this is the first lane + // if numerator == s then this is the last lane + // + SKC_RASTERIZE_FLOAT const y_delta = skc_delta_offset() - skc_subgroup_shuffle(y_ess,y_source); + SKC_RASTERIZE_FLOAT const y_count = skc_subgroup_shuffle(y_segs,y_source); + + SKC_RASTERIZE_PREDICATE const is_y_first = (y_delta == 1.0f); + SKC_RASTERIZE_PREDICATE const is_y_last = (y_delta >= y_count); + + // toggle y_delta sign + SKC_RASTERIZE_FLOAT const y_offset = as_float((as_uint(y_delta) ^ intel_sub_group_shuffle(dy_xor,y_source))); + + // + // calculate "right" line segment endpoint + // + SKC_RASTERIZE_FLOAT n1y = (y_offset + skc_subgroup_shuffle(y_base,y_source)) * SKC_SUBPIXEL_Y_SCALE_UP; + SKC_RASTERIZE_FLOAT const n_t = (n1y - m0y) * skc_subgroup_shuffle(y_denom,y_source); + SKC_RASTERIZE_FLOAT n1x = round(SKC_LERP(m0x,m1x,n_t)); + + // + // override c1 if this is last point + // + n1y = select(n1y,m1y,is_y_last); + n1x = select(n1x,m1x,is_y_last); + + // + // shuffle up "left" line segment endpoint + // + // NOTE: Intel's shuffle_up is unique with its elegant + // "previous" argument so don't get used to it + // + SKC_RASTERIZE_FLOAT n0y = skc_subgroup_shuffle_up_1(n1y_prev,n1y); + SKC_RASTERIZE_FLOAT n0x = skc_subgroup_shuffle_up_1(n1x_prev,n1x); + + // + // override shuffle up if this is the first line segment + // + n0y = select(n0y,m0y,is_y_first); + n0x = select(n0x,m0x,is_y_first); + + // + // save previous right endpoint + // + n1x_prev = n1x; + n1y_prev = n1y; + + // + // decrement by subgroup size + // + y_iss -= (float)SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + y_ess -= (float)SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + y_rem -= (float)SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + +#if 0 + // + // debug + // + if (n0y != n1y) { + printf("{ { %5.0f, %5.0f }, { %5.0f, %5.0f } },\n",n0x,n0y,n1x,n1y); + } +#endif + + // + // X-SLIVERING + // ----------- + // + // now sliver 1-pixel high lines into at either vertical or + // 1-pixel wide lines + // + // save original direction and work with increasing x + // + SKC_RASTERIZE_PREDICATE const x_lt = (n0x <= n1x); + SKC_RASTERIZE_UINT const dx_xor = x_lt ? 0 : 0x80000000; + + // + // save 1/dy + // + SKC_RASTERIZE_FLOAT const x_denom = native_recip(n1x - n0x); + + // + // how many non-horizontal subpixel y-axis slivers are there? + // + SKC_RASTERIZE_FLOAT const x_min = floor(fmin(n0x,n1x) * SKC_SUBPIXEL_X_SCALE_DOWN); + SKC_RASTERIZE_FLOAT const x_max = ceil (fmax(n0x,n1x) * SKC_SUBPIXEL_X_SCALE_DOWN); + SKC_RASTERIZE_FLOAT const x_base = x_lt ? x_min : x_max; + SKC_RASTERIZE_FLOAT const x_segs = fmax(x_max - x_min,1.0f); + + // + // inclusive subgroup scan of y_segs + // + SKC_RASTERIZE_FLOAT x_iss = skc_subgroup_scan_inclusive_add_float(x_segs); + SKC_RASTERIZE_FLOAT x_ess = x_iss - x_segs; + float x_rem = skc_subgroup_last_float(x_iss); + + // + // if this is a horizontal line then tweak x_iss so "is_scratch_store" always fails + // + //if (x_segs == 0.0f) + // x_iss = 0.0f; + + // + // these values don't matter on first iteration + // + SKC_RASTERIZE_FLOAT p1x_prev = 0; + SKC_RASTERIZE_FLOAT p1y_prev = 0; + + // + // loop until done + // + while (x_rem > 0) + { + // + // distribute work across lanes + // + SKC_RASTERIZE_UINT const x_source = skc_scatter_scan_max(smem,x_iss,x_ess); + + // + // get line at y_source line + // + SKC_RASTERIZE_FLOAT const o0x = skc_subgroup_shuffle(n0x,x_source); + SKC_RASTERIZE_FLOAT const o0y = skc_subgroup_shuffle(n0y,x_source); + SKC_RASTERIZE_FLOAT const o1x = skc_subgroup_shuffle(n1x,x_source); + SKC_RASTERIZE_FLOAT const o1y = skc_subgroup_shuffle(n1y,x_source); + + // + // every lane will create a 1 pixel tall line "sliver" + // + // FIXME -- this gets expanded on SIMD + // + // if numerator == 1 then this is the first lane + // if numerator == s then this is the last lane + // + SKC_RASTERIZE_FLOAT const x_delta = skc_delta_offset() - skc_subgroup_shuffle(x_ess,x_source); + SKC_RASTERIZE_FLOAT const x_count = skc_subgroup_shuffle(x_segs,x_source); + + SKC_RASTERIZE_PREDICATE const is_x_first = (x_delta == 1.0f); + SKC_RASTERIZE_PREDICATE const is_x_last = (x_delta >= x_count); + + // toggle x_delta sign + SKC_RASTERIZE_FLOAT const x_offset = as_float((as_uint(x_delta) ^ intel_sub_group_shuffle(dx_xor,x_source))); + + // + // calculate "right" line segment endpoint + // + SKC_RASTERIZE_FLOAT p1x = (x_offset + skc_subgroup_shuffle(x_base,x_source)) * SKC_SUBPIXEL_X_SCALE_UP; + SKC_RASTERIZE_FLOAT const p_t = (p1x - o0x) * skc_subgroup_shuffle(x_denom,x_source); + SKC_RASTERIZE_FLOAT p1y = round(SKC_LERP(o0y,o1y,p_t)); + + // + // override c1 if this is last point + // + p1x = select(p1x,o1x,is_x_last); + p1y = select(p1y,o1y,is_x_last); + + // + // shuffle up "left" line segment endpoint + // + // NOTE: Intel's shuffle_up is unique with its elegant + // "previous" argument so don't get used to it + // + SKC_RASTERIZE_FLOAT p0x = skc_subgroup_shuffle_up_1(p1x_prev,p1x); + SKC_RASTERIZE_FLOAT p0y = skc_subgroup_shuffle_up_1(p1y_prev,p1y); + + // + // override shuffle up if this is the first line segment + // + p0x = select(p0x,o0x,is_x_first); + p0y = select(p0y,o0y,is_x_first); + + // + // save previous right endpoint + // + p1x_prev = p1x; + p1y_prev = p1y; + + // + // decrement by subgroup size + // + x_iss -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + x_ess -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + x_rem -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + + // + // only non-horizontal subpixel lines are valid + // + SKC_RASTERIZE_PREDICATE is_active = (p0y != p1y); + + // + // if no lanes are active then continue + // + // FIXME -- THIS SIMPLE SUB_GROUP_ANY TEST SIGNIFICANTLY + // IMPACTS PERFORMANCE (+12% ?) + // + // IT SHOULDN'T !!! + // +#if 0 + if (!skc_subgroup_any(is_active)) + continue; +#endif + + // + // Option 1: use SLM for explicitly managed coalesced stores + // + // 1. which tile does this line belong? + // 2. hash tile coordinates + // 3. lookup hash + // 4. if tile matches then SLM append keys + // 5. if tile doesn't match + // a. flush + // b. create new TTSK_RYX + // c. obtain TTSB block from pool + // d. goto 3. + // + + // + // Option 2: rely on L1/L2/L3 to mitigate non-coalesced stores + // + // 1. which tile does this line belong? + // 2. hash tile coordinates + // 3. lookup hash + // 4. if tile matches then GMEM append keys + // 5. if tile doesn't match + // a. flush (and invalidate empty elems) + // b. create new TTSK_RYX + // c. obtain TTSB block from pool + // d. goto 3. + // + + // + // The virtual rasterization surface is very large and + // signed: +/- ~64K-256K, depending on the architecture. + // + // Rasters must be clipped to the virtual surface and, + // optionally, clipped even further on a per raster + // basis. + // + + // + // Clip to the per-raster clip + // + + /* + + CLIP HERE + + */ + + // + // Hash the tile coordinates + // + // This table lists nominal values for each architecture. + // We want to choose values that are naturally fit the + // "width" of the architecture. + // + // SIMD RANGE BITS MAX RANGE MAX BINS HASH BITS + // ---- ------- ---- --------- -------- --------- + // 4 [0, 4] 3 [0, 7] 10 mod(10) <-- SSE42, ? + // 8 [0, 8] 4 [0, 15] 8 3 <-- GEN*,AVX* + // 16 [0, 16] 5 [0, 31] 6 mod(6) <-- GEN*,? + // 32 [0, 32] 6 [0, 63] 5 mod(5) <-- CUDA,PowerVR,Adreno,GEN* + // 64 [0, 64] 7 [0,127] 4 2 <-- AMD Radeon + // + // NOTE: When possible, bias the hash toward using more y + // bits because of: + // + // 1. the 90 degree counter-clockwise rotation that we put + // in place to offset the render-time clockwise + // rotation + // + // 2. the likely presence of left-to-right or + // right-to-left glyphs. + // + // For power-of-two bins, the hash is easy. + // + // For non-power-of-two, we may want to either implement a + // fast mod (compiler should do this for us... hahahaha) or + // drop down to the next power-of-two. + // + + // + // FIXME -- this snarl is not good -- can probably reduce + // some of the sign casting but some is there to vectorize a + // scalar + // + SKC_RASTERIZE_INT const z0y = SKC_CONVERT(SKC_RASTERIZE_INT)(p0y); + SKC_RASTERIZE_INT const z1y = SKC_CONVERT(SKC_RASTERIZE_INT)(p1y); + + SKC_RASTERIZE_INT const z0x = SKC_CONVERT(SKC_RASTERIZE_INT)(p0x); + SKC_RASTERIZE_INT const z1x = SKC_CONVERT(SKC_RASTERIZE_INT)(p1x); + + SKC_RASTERIZE_INT const min_y = min(z0y,z1y); + SKC_RASTERIZE_INT const max_y = max(z0y,z1y); + + SKC_RASTERIZE_INT const tile_y = min_y >> SKC_SUBTILE_RESL_Y_LOG2; + + SKC_RASTERIZE_UINT const ty = SKC_AS(SKC_RASTERIZE_UINT)(min_y) & SKC_SUBTILE_MASK_Y; + SKC_RASTERIZE_INT dy = SKC_AS(SKC_RASTERIZE_INT)(z1y - z0y); + + // + // map [+1,+32] to [ 0,+31] + // map [-1,-32] to [-1,-32] + // + SKC_RASTERIZE_INT dys = (dy + (~dy >> 31)) << 26; + + SKC_RASTERIZE_INT const min_x = min(z0x,z1x); + SKC_RASTERIZE_INT const max_x = max(z0x,z1x); + SKC_RASTERIZE_INT const tile_x = min_x >> SKC_SUBTILE_RESL_X_LOG2; + + SKC_RASTERIZE_UINT const tx = SKC_AS(SKC_RASTERIZE_UINT)(min_x) & SKC_SUBTILE_MASK_X; + SKC_RASTERIZE_UINT const sx = SKC_AS(SKC_RASTERIZE_UINT)(max_x - min_x); + + SKC_RASTERIZE_UINT const tts = dys | (ty << 16) | (sx << 10) | tx; + + SKC_RASTERIZE_UINT const hash = (((SKC_AS(SKC_RASTERIZE_UINT)(tile_y) & SKC_RASTERIZE_TILE_HASH_Y_MASK) << SKC_RASTERIZE_TILE_HASH_X_BITS) | + (SKC_AS(SKC_RASTERIZE_UINT)(tile_x) & SKC_RASTERIZE_TILE_HASH_X_MASK)); + + SKC_RASTERIZE_UINT const yx = (((SKC_AS(SKC_RASTERIZE_UINT)(tile_y) & 0xFFF) << 12) | (SKC_AS(SKC_RASTERIZE_UINT)(tile_x) & 0xFFF)); + +#if 0 + printf("(%3u, %3u)\n",tile_y,tile_x); +#endif + +#if 0 + if (is_active) + printf("( %3u, %3u ) : [ %3u, %3u, %3d, %3d, %3u ]\n",tile_y,tile_x,ty,tx,dy,((int)dys)>>26,sx); +#endif + + // + // debug + // +#if 0 // PRINTF_ENABLE + +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (is_active C) \ + printf("{ { %5d, %5d }, { %5d, %5d } (* %2u *) },\n",z0x C,z0y C,z1x C,z1y C,hash C); + + SKC_RASTERIZE_VECTOR_EXPAND(); +#else + if (is_active) + printf("{ { %5d, %5d }, { %5d, %5d } } (* %2u *),\n",z0x,z0y,z1x,z1y,hash); +#endif + +#endif + // + // flush all active lanes + // + while (true) + { + // + // either gather load or vector load+shuffle the yx keys + // +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + SKC_RASTERIZE_BIN const yx_bin = smem->bin.vN.yx; + SKC_RASTERIZE_UINT const yx_cur = shuffle(yx_bin,hash); +#else + SKC_RASTERIZE_UINT const yx_cur = smem->bin.aN.yx[hash]; +#endif + + // + // does yx for lane match yx for hash? + // + SKC_RASTERIZE_UINT const active_yx = is_active ? yx : SKC_RASTERIZE_YX_INVALID; + SKC_RASTERIZE_PREDICATE const is_match = (yx_cur == active_yx); + + // + // OpenCL spec: "When casting a bool to a vector integer + // data type, the vector components will be set to -1 + // (i.e. all bits set) if the vector bool value is true + // and 0 otherwise. + // +#if ( SKC_RASTERIZE_VECTOR_SIZE_LOG2 == 0 ) + SKC_RASTERIZE_UINT const h_match = (SKC_RASTERIZE_UINT)is_match; +#else + SKC_RASTERIZE_UINT const h_match = abs(is_match); // {-1,0} -> {+1,0} +#endif + // + // how many new elements for each matching hash bin? + // + SKC_RASTERIZE_UINT const h_shl = hash * SKC_RASTERIZE_TILE_HASH_BIN_BITS; + SKC_RASTERIZE_UINT const h = h_match << h_shl; + + // + // prefix sum all of the bins in parallel + // + SKC_RASTERIZE_UINT const h_iss = skc_subgroup_scan_inclusive_add_uint(h); + SKC_RASTERIZE_UINT const h_total = skc_subgroup_last_uint(h_iss); + + // + // current bin counts + // +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + SKC_RASTERIZE_BIN const count_bin = smem->bin.vN.count; + SKC_RASTERIZE_UINT const count_cur = shuffle(count_bin,hash); +#else + SKC_RASTERIZE_UINT const count_cur = smem->bin.aN.count[hash]; +#endif + + // + // calculate where each cache-hit and in-bounds tts should be stored + // + SKC_RASTERIZE_UINT const ttsb_index = (h_iss >> h_shl & SKC_RASTERIZE_TILE_HASH_BIN_MASK) + count_cur - 1; + SKC_RASTERIZE_UINT const count_new = (h_total >> h_shl & SKC_RASTERIZE_TILE_HASH_BIN_MASK) + count_cur; + + // + // which lanes can append to a matching bin? + // + SKC_RASTERIZE_PREDICATE const is_append = is_match && (ttsb_index < SKC_DEVICE_SUBBLOCK_WORDS); + + // + // scatter append tts elements to bin blocks + // +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1) + // + // SIMD + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (is_append C) \ + { \ + smem->bin.aN.ttsb [hash C][ttsb_index C] = tts C; \ + smem->bin.aN.count[hash C] = count_new C; \ + } + + SKC_RASTERIZE_VECTOR_EXPAND(); +#else + // + // SIMT + // + if (is_append) + { + smem->bin.aN.ttsb [hash][ttsb_index] = tts; + smem->bin.aN.count[hash] = count_new; // it's ok if this is > SKC_DEVICE_SUBBLOCK_WORDS + } +#endif + // + // try to keep predicate updates SIMD-friendly and + // outside of predicated code paths -- this is not + // always how we would normally do things on SIMT but + // either approach is acceptable + // + + // + // mask off lanes/components that successfully appended + // + is_active = is_active && !is_append; + + // + // are there any active lanes left? + // + if (!skc_subgroup_any(is_active)) + break; + + // + // There are active lanes that couldn't be appended to a + // bin because their hashes collided with the bin's + // current ryx key then those bins must be ejected. + // + // Note that we do not eject "full" bins because lazily + // waiting for a collision results in simpler code. + // + skc_flush(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + subblocks, + blocks, + blocks_next, + sk_v, + sk_v_next, + sk_extent, + smem, + hash, + yx, + is_active); + } + } + } +} + +// +// INITIALIZE SMEM +// +// Note that SIMD/SIMT have nearly the same syntax. +// +static +void +skc_smem_init(__local struct skc_subgroup_smem volatile * const smem) +{ + // + // initialize smem bins + // +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + smem->bin.vN.yx = ( SKC_RASTERIZE_YX_INIT ); + smem->bin.vN.count = ( 0 ); +#else + // + // SIMT + // + int idx = skc_subgroup_lane(); + +#if ( SKC_RASTERIZE_TILE_HASH_BIN_COUNT < SKC_RASTERIZE_ELEMS_PER_SUBGROUP ) + if (idx < SKC_RASTERIZE_TILE_HASH_BIN_COUNT) +#elif ( SKC_RASTERIZE_TILE_HASH_BIN_COUNT > SKC_RASTERIZE_ELEMS_PER_SUBGROUP ) + for (; idx<SKC_RASTERIZE_TILE_HASH_BIN_COUNT; idx+=SKC_RASTERIZE_SUBGROUP_SIZE) +#endif + { + smem->bin.aN.yx [idx] = ( SKC_RASTERIZE_YX_INIT ); + smem->bin.aN.count[idx] = ( 0 ); + } +#endif +} + +// +// RASTERIZE CUBIC KERNEL +// + +static +void +skc_rasterize_cubics(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __local struct skc_subgroup_smem volatile * const smem, + + skc_uint * const nodeword, + skc_block_id_t * const id, + + union skc_transform const * const tv, + union skc_path_clip const * const cv, + skc_uint const cohort) +{ + // + // the initial segment idx and segments-per-block constant determine + // how many block ids will need to be loaded + // + SKC_RASTERIZE_FLOAT const c0x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c0y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c1x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c1y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c2x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c2y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c3x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c3y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + // + // apply transform + // + // note that we only care if the end points are rounded to subpixel precision + // + // FIXME -- transformation is currently affine-only support perspective later + // + // the affine transformation requires 8 FMA + 2 ROUND operations + // + SKC_RASTERIZE_FLOAT const b0x = round(c0x * tv->sx + c0y * tv->shx + tv->tx); + SKC_RASTERIZE_FLOAT const b0y = round(c0x * tv->shy + c0y * tv->sy + tv->ty); + + SKC_RASTERIZE_FLOAT const t1x = c1x * tv->sx + c1y * tv->shx + tv->tx; + SKC_RASTERIZE_FLOAT const t1y = c1x * tv->shy + c1y * tv->sy + tv->ty; + + SKC_RASTERIZE_FLOAT const t2x = c2x * tv->sx + c2y * tv->shx + tv->tx; + SKC_RASTERIZE_FLOAT const t2y = c2x * tv->shy + c2y * tv->sy + tv->ty; + + SKC_RASTERIZE_FLOAT const t3x = round(c3x * tv->sx + c3y * tv->shx + tv->tx); + SKC_RASTERIZE_FLOAT const t3y = round(c3x * tv->shy + c3y * tv->sy + tv->ty); + + // + // + // +#if PRINTF_ENABLE + +#if ( SKC_RASTERIZE_SUBGROUP_SIZE == 1 ) + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + printf("{ { %.02f, %.02f }, { %.02f, %.02f }," \ + " { %.02f, %.02f }, { %.02f, %.02f } },\n", \ + b0x C,b0y C,t1x C,t1y C, \ + t2x C,t2y C,t3x C,t3y C); + + SKC_RASTERIZE_VECTOR_EXPAND(); + +#else + + printf("{ { %.02f, %.02f }, { %.02f, %.02f }, { %.02f, %.02f }, { %.02f, %.02f } },\n", + b0x,b0y,t1x,t1y,t2x,t2y,t3x,t3y); + +#endif + +#endif + + // + // OLD APPROACH + // ------------ + // + // The Spinel CUDA rasterizer was significantly more complex and + // performed a few different tasks that are probably best kept + // separate. + // + // The Spinel rasterizer Bezier held 4-element x and y coordinates + // in adjacent lanes. This simplified intermingling of single lane + // 4-coordinate line segments with two-lane cubic Beziers. + // + // After transformation of the input segments, the Spinel rasterizer + // would test cubics for flatness and, if flat, collapse the + // adjacent lanes into a single line lane and an empty lane. + // + // Any lines would then be appended to a line queue. + // + // Any cubics would then be subdivided. + // + // The reclassification process would be repeated. + // + // NEW APPROACH + // ------------ + // + // Assume we're only working with cubics in this kernel. + // + // Optimization: if the line segment is a special case -- a cusp, + // has 1+ inflections, or a loop -- it might be beneficial to + // subdivide the control cage 1+ times in order to separate the + // flatter segments the high-velocity region(s). + // + // This means we want to split using [a,b] formulation to _directly_ + // subdivide producing a new control cage. + // + // Wang's Formula is still useful even if we subdivide once or twice + // as it's so cheap that it might give some useful hints about where + // the high-velocity sections of curve reside. + // + // But it seems like using Wang's and directly flattening to line + // segments without any subdivision is good enough for the limited + // set of test cases that I've tried. + // + // So... use Wang's Formula to estimate how many line segment are + // required to properly flatten the cubics. + // + // Then use inclusive/exclusive scans to put all the lanes to work: + // + // 1. segmenting cubics to line segments + // + // 2. slivering line segments into 1-pixel high line segments + // + // 3. slivering 1-pixel high line segments into 1-pixel wide line + // segments + // + // MORE BACKGROUND ON NEW APPROACH + // ------------------------------- + // + // Two options for handling line segments: + // + // 1. append the line segments onto an SLM array until enough + // work has been accrued (Spinel does this) + // + // 2. immediately sliver the potentially multi-pixel line + // segments into subpixel lines + // + // The advantage of (1) is that it guarantees the slivering + // process will, on average, always be emitting a full subgroup + // of subpixel lines. + // + // The advantage of (2) is that it reduces code complexity and + // leaves more room for SLM tile bins. The difference between Spinel + // and Skia Compute is that Wang's Formula guarantees there will be + // a full subgroup of multi-pixel lines unless this is the final + // iteration of the warp of multi-pixel lines. + // + // Note that wider GPU architectures might benefit from (1) and + // other work accumulation strategies because it will minimize + // partial warp workloads in the final iteration of each stage. It + // also minimizes the sunk cost of the uniform control logic steps. + // + // So let's implement (2) for now... + // + + // + // And... begin! + // + // Estimate how many line segments are in quad/cubic curve. + // + // Wang's Formula will return zero if the control points are + // collinear but we bump it up to 1.0f. + // + SKC_RASTERIZE_FLOAT const s_segs = skc_wangs_formula_cubic(b0x,b0y,t1x,t1y,t2x,t2y,t3x,t3y); + + // + // if there are free registers then precalculate the reciprocal for + // each estimated segments since it will never change + // + SKC_RASTERIZE_FLOAT const s_denom = native_recip(s_segs); + + + // + // inclusive add scan of estimated line segments + // exclusive add scan of estimated line segments + // total number of estimated line segments + // + SKC_RASTERIZE_FLOAT s_iss = skc_subgroup_scan_inclusive_add_float(s_segs); + SKC_RASTERIZE_FLOAT s_ess = s_iss - s_segs; + float s_rem = skc_subgroup_last_float(s_iss); // scalar + + // + // Precompute cubic polynomial coefficients from transformed control + // cage so we can shuffle them in on each iteration of the outer + // loop and then evaluate the polynomial in Horner form. + // + // | 1 0 0 0 | | c0 | + // | | | | + // | -3 3 0 0 | | c1 | + // B(t) = [ 1 t^1 t^2 t^3 ] | | | | + // | 3 -6 3 0 | | c2 | + // | | | | + // | -1 3 -3 1 | | c3 | + // + // + SKC_RASTERIZE_FLOAT const b1x = mad(-3.0f,b0x,3.0f*t1x); // 2 - 1 MAD + MUL + SKC_RASTERIZE_FLOAT const b1y = mad(-3.0f,b0y,3.0f*t1y); // 2 - 1 MAD + MUL + + SKC_RASTERIZE_FLOAT const b2x = mad(3.0f,b0x,mad(-6.0f,t1x,3.0f*t2x)); // 3 - 2 MAD + MUL + SKC_RASTERIZE_FLOAT const b2y = mad(3.0f,b0y,mad(-6.0f,t1y,3.0f*t2y)); // 3 - 2 MAD + MUL + + SKC_RASTERIZE_FLOAT const b3x = mad(3.0f,t1x,mad(-3.0f,t2x,t3x)) - b0x; // 3 - 2 MAD + SUB + SKC_RASTERIZE_FLOAT const b3y = mad(3.0f,t1y,mad(-3.0f,t2y,t3y)) - b0y; // 3 - 2 MAD + SUB + + // + // these values don't matter on the first iteration + // + SKC_RASTERIZE_FLOAT l1x_prev = 0; + SKC_RASTERIZE_FLOAT l1y_prev = 0; + + // + // allocate and init in-register TTSK keys + // + skc_uint sk_v_next = 0; + skc_ttsk_v_t sk_v; + + sk_v.hi = cohort; + + // + // initialize smem + // + skc_smem_init(smem); + + // + // initialize blocks / subblocks + // + skc_block_id_v_t blocks; + skc_uint blocks_next = SKC_RASTERIZE_BLOCK_ID_V_SIZE; + +#if SKC_DEVICE_BLOCK_WORDS_LOG2 > SKC_DEVICE_SUBBLOCK_WORDS_LOG2 + skc_block_id_t subblocks = 0; +#endif + + // + // loop until done + // + while (s_rem > 0) + { + // + // distribute work across lanes + // + SKC_RASTERIZE_UINT const s_source = skc_scatter_scan_max(smem,s_iss,s_ess); + + // + // every lane has a fraction to work off of + // + // FIXME -- this gets expanded on SIMD + // + // if delta == 1 then this is the first lane + // if count == s_segs then this is the last lane + // + SKC_RASTERIZE_FLOAT const s_delta = skc_delta_offset() - skc_subgroup_shuffle(s_ess,s_source); + SKC_RASTERIZE_FLOAT const s_count = skc_subgroup_shuffle(s_segs,s_source); + + SKC_RASTERIZE_PREDICATE const is_s_first = (s_delta == 1.0f); + SKC_RASTERIZE_PREDICATE const is_s_last = (s_delta >= s_count); + + // + // init parametric t + // + SKC_RASTERIZE_FLOAT s_t = s_delta * skc_subgroup_shuffle(s_denom,s_source); // faster than native_recip(s_count)? + + // + // if last then override to a hard 1.0f + // + s_t = is_s_last ? 1.0f : s_t; + + // + // decrement by subgroup size + // + s_iss -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + s_ess -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + s_rem -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + + // + // now every lane knows what to do and the following lines will + // pump out up to SUBGROUP_SIZE line segments + // + // obtain the src vertices through shared or via a shuffle + // + + // + // shuffle in the polynomial coefficients their source lane + // + SKC_RASTERIZE_FLOAT const s0x = skc_subgroup_shuffle(b0x,s_source); + SKC_RASTERIZE_FLOAT const s0y = skc_subgroup_shuffle(b0y,s_source); + + SKC_RASTERIZE_FLOAT const s1x = skc_subgroup_shuffle(b1x,s_source); + SKC_RASTERIZE_FLOAT const s1y = skc_subgroup_shuffle(b1y,s_source); + + SKC_RASTERIZE_FLOAT const s2x = skc_subgroup_shuffle(b2x,s_source); + SKC_RASTERIZE_FLOAT const s2y = skc_subgroup_shuffle(b2y,s_source); + + SKC_RASTERIZE_FLOAT const s3x = skc_subgroup_shuffle(b3x,s_source); + SKC_RASTERIZE_FLOAT const s3y = skc_subgroup_shuffle(b3y,s_source); + + // + // calculate "right" line segment endpoint using Horner form + // + SKC_RASTERIZE_FLOAT l1x = round(mad(mad(mad(s3x,s_t,s2x),s_t,s1x),s_t,s0x)); // 3 MAD + ROUND + SKC_RASTERIZE_FLOAT l1y = round(mad(mad(mad(s3y,s_t,s2y),s_t,s1y),s_t,s0y)); // 3 MAD + ROUND + + // + // shuffle up "left" line segment endpoint + // + // NOTE: Intel's shuffle_up is unique with its elegant + // "previous" argument so don't get used to it + // + SKC_RASTERIZE_FLOAT l0x = skc_subgroup_shuffle_up_1(l1x_prev,l1x); + SKC_RASTERIZE_FLOAT l0y = skc_subgroup_shuffle_up_1(l1y_prev,l1y); + + // + // save previous right endpoint + // + l1x_prev = l1x; + l1y_prev = l1y; + + // + // override shuffle up if this is the first line segment + // + l0x = select(l0x,s0x,is_s_first); + l0y = select(l0y,s0y,is_s_first); + + // + // sliver lines + // + skc_sliver(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + &subblocks, + &blocks, + &blocks_next, + &sk_v, + &sk_v_next, + sk_extent, + smem, + l0x,l0y,l1x,l1y); + } + + // + // - flush work-in-progress blocks + // - return unused block ids + // + skc_finalize(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + &blocks, + blocks_next, + &sk_v, + sk_v_next, + sk_extent, + smem); +} + +// +// RASTERIZE QUAD KERNEL +// + +static +void +skc_rasterize_quads(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __local struct skc_subgroup_smem volatile * const smem, + + skc_uint * const nodeword, + skc_block_id_t * const id, + + union skc_transform const * const tv, + union skc_path_clip const * const cv, + skc_uint const cohort) +{ + // + // the initial segment idx and segments-per-block constant determine + // how many block ids will need to be loaded + // + SKC_RASTERIZE_FLOAT const c0x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c0y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c1x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c1y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c2x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c2y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + // + // apply transform + // + // note that we only care if the end points are rounded to subpixel precision + // + // FIXME -- transformation is currently affine-only support perspective later + // + // the affine transformation requires 8 FMA + 2 ROUND operations + // + SKC_RASTERIZE_FLOAT const b0x = round(c0x * tv->sx + c0y * tv->shx + tv->tx); + SKC_RASTERIZE_FLOAT const b0y = round(c0x * tv->shy + c0y * tv->sy + tv->ty); + + SKC_RASTERIZE_FLOAT const t1x = c1x * tv->sx + c1y * tv->shx + tv->tx; + SKC_RASTERIZE_FLOAT const t1y = c1x * tv->shy + c1y * tv->sy + tv->ty; + + SKC_RASTERIZE_FLOAT const t2x = round(c2x * tv->sx + c2y * tv->shx + tv->tx); + SKC_RASTERIZE_FLOAT const t2y = round(c2x * tv->shy + c2y * tv->sy + tv->ty); + + // + // Estimate how many line segments are in quad/cubic curve. + // + // Wang's Formula will return zero if the control points are + // collinear but we bump it up to 1.0f. + // + SKC_RASTERIZE_FLOAT const s_segs = skc_wangs_formula_quadratic(b0x,b0y,t1x,t1y,t2x,t2y); + + // + // if there are free registers then precalculate the reciprocal for + // each estimated segments since it will never change + // + SKC_RASTERIZE_FLOAT const s_denom = native_recip(s_segs); + + + // + // inclusive add scan of estimated line segments + // exclusive add scan of estimated line segments + // total number of estimated line segments + // + SKC_RASTERIZE_FLOAT s_iss = skc_subgroup_scan_inclusive_add_float(s_segs); + SKC_RASTERIZE_FLOAT s_ess = s_iss - s_segs; + float s_rem = skc_subgroup_last_float(s_iss); // scalar + + // + // Precompute quadratic polynomial coefficients from control cage so + // we can shuffle them in on each iteration of the outer loop and + // then evaluate the polynomial in Horner form. + // + + // | 1 0 0 | | c0 | + // | | | | + // B(t) = [ 1 t^1 t^2 ] | -2 2 0 | | c1 | + // | | | | + // | 1 -2 1 | | c2 | + // + // + SKC_RASTERIZE_FLOAT const b1x = mad(-2.0f,b0x,2.0f*t1x); // 2 - 1 MAD + MUL + SKC_RASTERIZE_FLOAT const b1y = mad(-2.0f,b0y,2.0f*t1y); // 2 - 1 MAD + MUL + + SKC_RASTERIZE_FLOAT const b2x = mad(-2.0f,t1x,b0x+t2x); // 2 - 1 MAD + ADD + SKC_RASTERIZE_FLOAT const b2y = mad(-2.0f,t1y,b0y+t2y); // 2 - 1 MAD + ADD + + // + // these values don't matter on the first iteration + // + SKC_RASTERIZE_FLOAT l1x_prev = 0; + SKC_RASTERIZE_FLOAT l1y_prev = 0; + + // + // allocate and init in-register TTSK keys + // + skc_uint sk_v_next = 0; + skc_ttsk_v_t sk_v; + + sk_v.hi = cohort; + + // + // initialize smem + // + skc_smem_init(smem); + + // + // initialize blocks / subblocks + // + skc_block_id_v_t blocks; + skc_uint blocks_next = SKC_RASTERIZE_BLOCK_ID_V_SIZE; + +#if SKC_DEVICE_BLOCK_WORDS_LOG2 > SKC_DEVICE_SUBBLOCK_WORDS_LOG2 + skc_block_id_t subblocks = 0; +#endif + + // + // loop until done + // + while (s_rem > 0) + { + // + // distribute work across lanes + // + SKC_RASTERIZE_UINT const s_source = skc_scatter_scan_max(smem,s_iss,s_ess); + + // + // every lane has a fraction to work off of + // + // FIXME -- this gets expanded on SIMD + // + // if delta == 1 then this is the first lane + // if count == s_segs then this is the last lane + // + SKC_RASTERIZE_FLOAT const s_delta = skc_delta_offset() - skc_subgroup_shuffle(s_ess,s_source); + SKC_RASTERIZE_FLOAT const s_count = skc_subgroup_shuffle(s_segs,s_source); + + SKC_RASTERIZE_PREDICATE const is_s_first = (s_delta == 1.0f); + SKC_RASTERIZE_PREDICATE const is_s_last = (s_delta >= s_count); + + // + // init parametric t + // + SKC_RASTERIZE_FLOAT s_t = s_delta * skc_subgroup_shuffle(s_denom,s_source); // faster than native_recip(s_count)? + + // + // if last then override to a hard 1.0f + // + s_t = is_s_last ? 1.0f : s_t; + + // + // decrement by subgroup size + // + s_iss -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + s_ess -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + s_rem -= SKC_RASTERIZE_ELEMS_PER_SUBGROUP; + + // + // now every lane knows what to do and the following lines will + // pump out up to SUBGROUP_SIZE line segments + // + // obtain the src vertices through shared or via a shuffle + // + + // + // shuffle in the polynomial coefficients their source lane + // + SKC_RASTERIZE_FLOAT const s0x = skc_subgroup_shuffle(b0x,s_source); + SKC_RASTERIZE_FLOAT const s0y = skc_subgroup_shuffle(b0y,s_source); + + SKC_RASTERIZE_FLOAT const s1x = skc_subgroup_shuffle(b1x,s_source); + SKC_RASTERIZE_FLOAT const s1y = skc_subgroup_shuffle(b1y,s_source); + + SKC_RASTERIZE_FLOAT const s2x = skc_subgroup_shuffle(b2x,s_source); + SKC_RASTERIZE_FLOAT const s2y = skc_subgroup_shuffle(b2y,s_source); + + // + // calculate "right" line segment endpoint using Horner form + // + SKC_RASTERIZE_FLOAT l1x = round(mad(mad(s2x,s_t,s1x),s_t,s0x)); // 2 MAD + ROUND + SKC_RASTERIZE_FLOAT l1y = round(mad(mad(s2y,s_t,s1y),s_t,s0y)); // 2 MAD + ROUND + + // + // shuffle up "left" line segment endpoint + // + // NOTE: Intel's shuffle_up is unique with its elegant + // "previous" argument so don't get used to it + // + SKC_RASTERIZE_FLOAT l0x = skc_subgroup_shuffle_up_1(l1x_prev,l1x); + SKC_RASTERIZE_FLOAT l0y = skc_subgroup_shuffle_up_1(l1y_prev,l1y); + + // + // save previous right endpoint + // + l1x_prev = l1x; + l1y_prev = l1y; + + // + // override shuffle up if this is the first line segment + // + l0x = select(l0x,s0x,is_s_first); + l0y = select(l0y,s0y,is_s_first); + + // + // sliver lines + // + skc_sliver(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + &subblocks, + &blocks, + &blocks_next, + &sk_v, + &sk_v_next, + sk_extent, + smem, + l0x,l0y,l1x,l1y); + } + + // + // - flush work-in-progress blocks + // - return unused block ids + // + skc_finalize(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + &blocks, + blocks_next, + &sk_v, + sk_v_next, + sk_extent, + smem); +} + +// +// RASTERIZE LINE KERNEL +// + +static +void +skc_rasterize_lines(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __local struct skc_subgroup_smem volatile * const smem, + + skc_uint * const nodeword, + skc_block_id_t * const id, + + union skc_transform const * const tv, + union skc_path_clip const * const cv, + skc_uint const cohort) +{ + // + // the initial segment idx and segments-per-block constant determine + // how many block ids will need to be loaded + // + SKC_RASTERIZE_FLOAT const c0x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c0y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c1x = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + + skc_segment_next(bp_elems,nodeword,id); + + SKC_RASTERIZE_FLOAT const c1y = bp_elems[SKC_RASTERIZE_SEGMENT(*id)].coord; + +#if 0 + // printf("%5u : { { %5.0f, %5.0f }, { %5.0f, %5.0f } },\n",(skc_uint)get_global_id(0),c0x,c0y,c1x,c1y); + printf("{ { %5.0f, %5.0f }, { %5.0f, %5.0f } },\n",c0x,c0y,c1x,c1y); +#endif + + // + // apply transform + // + // note that we only care if the end points are rounded to subpixel precision + // + // FIXME -- transformation is currently affine-only + // FIXME -- support perspective later + // + // the affine transformation requires 8 FMA + 4 ROUND operations + // + SKC_RASTERIZE_FLOAT const l0x = round(c0x * tv->sx + c0y * tv->shx + tv->tx); + SKC_RASTERIZE_FLOAT const l0y = round(c0x * tv->shy + c0y * tv->sy + tv->ty); + + SKC_RASTERIZE_FLOAT const l1x = round(c1x * tv->sx + c1y * tv->shx + tv->tx); + SKC_RASTERIZE_FLOAT const l1y = round(c1x * tv->shy + c1y * tv->sy + tv->ty); + +#if 0 + printf("{ { %5.0f, %5.0f }, { %5.0f, %5.0f } },\n",l0x,l0y,l1x,l1y); +#endif + + // + // allocate and init in-register TTSK keys + // + skc_uint sk_v_next = 0; + skc_ttsk_v_t sk_v; + + sk_v.hi = cohort; + + // + // initialize smem + // + skc_smem_init(smem); + + // + // initialize blocks / subblocks + // + skc_block_id_v_t blocks; + skc_uint blocks_next = SKC_RASTERIZE_BLOCK_ID_V_SIZE; + +#if SKC_DEVICE_BLOCK_WORDS_LOG2 > SKC_DEVICE_SUBBLOCK_WORDS_LOG2 + skc_block_id_t subblocks = 0; +#endif + + // + // sliver lines + // + skc_sliver(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + &subblocks, + &blocks, + &blocks_next, + &sk_v, + &sk_v_next, + sk_extent, + smem, + l0x,l0y,l1x,l1y); + + // + // - flush work-in-progress blocks + // - return unused block ids + // + skc_finalize(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + &blocks, + blocks_next, + &sk_v, + sk_v_next, + sk_extent, + smem); +} + +// +// +// + +__kernel +SKC_RASTERIZE_KERNEL_ATTRIBS +void +skc_kernel_rasterize_all(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __global float8 const * const transforms, // FIXME -- __constant + __global float4 const * const clips, // FIXME -- __constant + __global union skc_cmd_rasterize const * const cmds, // FIXME -- __constant + skc_uint const count) +{ + // + // declare shared memory block + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + __local struct skc_subgroup_smem volatile smem[1]; +#else + __local struct skc_subgroup_smem volatile smem_wg[SKC_RASTERIZE_WORKGROUP_SUBGROUPS]; + __local struct skc_subgroup_smem volatile * const smem = smem_wg + get_sub_group_id(); +#endif + + // + // this is a subgroup/warp-centric kernel + // + // which subgroup in the grid is this? + // + // TAKE NOTE: the Intel GEN compiler appears to be recognizing + // get_group_id(0) as a uniform but the alternative calculation used + // when there are multiple subgroups per workgroup is not + // cooperating and driving spillage elsewhere. + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + uint const cmd_idx = get_group_id(0); +#else + uint const cmd_idx = get_group_id(0) * SKC_RASTERIZE_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + +#if 0 + if (get_sub_group_local_id() == 0) + printf("+cmd_idx = %u\n",cmd_idx); +#endif + + // + // if worksgroups are multi-subgroup then there may be excess + // subgroups in the final workgroup + // + if (cmd_idx >= count) + return; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("-cmd_idx = %u\n",cmd_idx); +#endif + + // + // load a single command for this subgroup + // + union skc_cmd_rasterize const cmd = cmds[cmd_idx]; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("[ %u ]< %u, %u, %u, %u >\n", + cmd_idx, + cmd.nodeword, + SKC_CMD_RASTERIZE_GET_TRANSFORM(cmd), + SKC_CMD_RASTERIZE_GET_CLIP(cmd), + SKC_CMD_RASTERIZE_GET_COHORT(cmd)); +#endif + + // + // get first block node command word and its subblock + // + skc_uint nodeword = cmd.nodeword; // nodeword has word-addressing + skc_tagged_block_id_t tag_id = bp_elems[nodeword].tag_id; + skc_block_id_tag tag = SKC_TAGGED_BLOCK_ID_GET_TAG(tag_id); + skc_block_id_t id = SKC_TAGGED_BLOCK_ID_GET_ID(tag_id); + + // + // load transform -- uniform across subgroup + // + // v8: { sx shx tx shy sy ty w0 w1 } + // + // NOTE THAT WE'RE SCALING UP THE TRANSFORM BY: + // + // [ SKC_SUBPIXEL_RESL_X_F32, SKC_SUBPIXEL_RESL_Y_F32, 1.0f ] + // + // Coordinates are scaled to subpixel resolution. All that matters + // is that continuity is maintained between end path element + // endpoints. + // + // It's the responsibility of the host to ensure that the transforms + // are properly scaled either via intitializing a transform stack + // with the subpixel resolution scaled identity or scaling the + // transform before its loaded by a rasterization grid. + // + // FIXME -- horizontal load might be better than this broadcast load + // + union skc_transform const tv = { .f32v8 = transforms[SKC_CMD_RASTERIZE_GET_TRANSFORM(cmd)] }; // uniform load + union skc_path_clip const cv = { .f32v4 = clips [SKC_CMD_RASTERIZE_GET_CLIP(cmd) ] }; // uniform load + skc_uint const cohort = SKC_CMD_RASTERIZE_MASK_COHORT(cmd); // shifted + + switch (tag) + { + case SKC_BLOCK_ID_TAG_PATH_LINE: + skc_rasterize_lines(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + sk_extent, + smem, + &nodeword,&id, + &tv,&cv,cohort); + break; + + case SKC_BLOCK_ID_TAG_PATH_QUAD: + skc_rasterize_quads(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + sk_extent, + smem, + &nodeword,&id, + &tv,&cv,cohort); + break; + + case SKC_BLOCK_ID_TAG_PATH_CUBIC: + skc_rasterize_cubics(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + sk_extent, + smem, + &nodeword,&id, + &tv,&cv,cohort); + break; + + case SKC_BLOCK_ID_TAG_PATH_RAT_QUAD: + break; + case SKC_BLOCK_ID_TAG_PATH_RAT_CUBIC: + break; + + default: + break; + } +} + +// +// +// + +__kernel +SKC_RASTERIZE_KERNEL_ATTRIBS +void +skc_kernel_rasterize_lines(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __global float8 const * const transforms, // FIXME -- __constant + __global float4 const * const clips, // FIXME -- __constant + __global union skc_cmd_rasterize const * const cmds, // FIXME -- __constant + skc_uint const count) +{ + // + // declare shared memory block + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + __local struct skc_subgroup_smem volatile smem[1]; +#else + __local struct skc_subgroup_smem volatile smem_wg[SKC_RASTERIZE_WORKGROUP_SUBGROUPS]; + __local struct skc_subgroup_smem volatile * const smem = smem_wg + get_sub_group_id(); +#endif + + // + // this is a subgroup/warp-centric kernel + // + // which subgroup in the grid is this? + // + // TAKE NOTE: the Intel GEN compiler appears to be recognizing + // get_group_id(0) as a uniform but the alternative calculation used + // when there are multiple subgroups per workgroup is not + // cooperating and driving spillage elsewhere. + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + uint const cmd_idx = get_group_id(0); +#else + uint const cmd_idx = get_group_id(0) * SKC_RASTERIZE_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + + // + // if worksgroups are multi-subgroup then there may be excess + // subgroups in the final workgroup + // + if (cmd_idx >= count) + return; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("cmd_idx = %u\n",cmd_idx); +#endif + + // + // load a single command for this subgroup + // + union skc_cmd_rasterize const cmd = cmds[cmd_idx]; + + // + // get first block node command word and its subblock + // + skc_uint nodeword = cmd.nodeword; // nodeword has word-addressing + skc_tagged_block_id_t tag_id = bp_elems[nodeword].tag_id; + skc_block_id_t id = SKC_TAGGED_BLOCK_ID_GET_ID(tag_id); + + // + // load transform -- uniform across subgroup + // + // v8: { sx shx tx shy sy ty w0 w1 } + // + // NOTE THAT WE'RE SCALING UP THE TRANSFORM BY: + // + // [ SKC_SUBPIXEL_RESL_X_F32, SKC_SUBPIXEL_RESL_Y_F32, 1.0f ] + // + // Coordinates are scaled to subpixel resolution. All that matters + // is that continuity is maintained between end path element + // endpoints. + // + // It's the responsibility of the host to ensure that the transforms + // are properly scaled either via intitializing a transform stack + // with the subpixel resolution scaled identity or scaling the + // transform before its loaded by a rasterization grid. + // + // FIXME -- horizontal load might be better than this broadcast load + // + union skc_transform const tv = { .f32v8 = transforms[SKC_CMD_RASTERIZE_GET_TRANSFORM(cmd)] }; // uniform load + union skc_path_clip const cv = { .f32v4 = clips [SKC_CMD_RASTERIZE_GET_CLIP(cmd) ] }; // uniform load + skc_uint const cohort = SKC_CMD_RASTERIZE_MASK_COHORT(cmd); // shifted + + skc_rasterize_lines(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + sk_extent, + smem, + &nodeword,&id, + &tv,&cv,cohort); +} + +// +// +// + +// +// +// + +__kernel +SKC_RASTERIZE_KERNEL_ATTRIBS +void +skc_kernel_rasterize_quads(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __global float8 const * const transforms, // FIXME -- __constant + __global float4 const * const clips, // FIXME -- __constant + __global union skc_cmd_rasterize const * const cmds, // FIXME -- __constant + skc_uint const count) +{ + // + // declare shared memory block + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + __local struct skc_subgroup_smem volatile smem[1]; +#else + __local struct skc_subgroup_smem volatile smem_wg[SKC_RASTERIZE_WORKGROUP_SUBGROUPS]; + __local struct skc_subgroup_smem volatile * const smem = smem_wg + get_sub_group_id(); +#endif + + // + // this is a subgroup/warp-centric kernel + // + // which subgroup in the grid is this? + // + // TAKE NOTE: the Intel GEN compiler appears to be recognizing + // get_group_id(0) as a uniform but the alternative calculation used + // when there are multiple subgroups per workgroup is not + // cooperating and driving spillage elsewhere. + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + uint const cmd_idx = get_group_id(0); +#else + uint const cmd_idx = get_group_id(0) * SKC_RASTERIZE_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + + // + // if worksgroups are multi-subgroup then there may be excess + // subgroups in the final workgroup + // + if (cmd_idx >= count) + return; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("cmd_idx = %u\n",cmd_idx); +#endif + + // + // load a single command for this subgroup + // + union skc_cmd_rasterize const cmd = cmds[cmd_idx]; + + // + // get first block node command word and its subblock + // + skc_uint nodeword = cmd.nodeword; // nodeword has word-addressing + skc_tagged_block_id_t tag_id = bp_elems[nodeword].tag_id; + skc_block_id_t id = SKC_TAGGED_BLOCK_ID_GET_ID(tag_id); + + // + // load transform -- uniform across subgroup + // + // v8: { sx shx tx shy sy ty w0 w1 } + // + // NOTE THAT WE'RE SCALING UP THE TRANSFORM BY: + // + // [ SKC_SUBPIXEL_RESL_X_F32, SKC_SUBPIXEL_RESL_Y_F32, 1.0f ] + // + // Coordinates are scaled to subpixel resolution. All that matters + // is that continuity is maintained between end path element + // endpoints. + // + // It's the responsibility of the host to ensure that the transforms + // are properly scaled either via intitializing a transform stack + // with the subpixel resolution scaled identity or scaling the + // transform before its loaded by a rasterization grid. + // + // FIXME -- horizontal load might be better than this broadcast load + // + union skc_transform const tv = { .f32v8 = transforms[SKC_CMD_RASTERIZE_GET_TRANSFORM(cmd)] }; // uniform load + union skc_path_clip const cv = { .f32v4 = clips [SKC_CMD_RASTERIZE_GET_CLIP(cmd) ] }; // uniform load + skc_uint const cohort = SKC_CMD_RASTERIZE_MASK_COHORT(cmd); // shifted + + skc_rasterize_quads(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + sk_extent, + smem, + &nodeword,&id, + &tv,&cv,cohort); +} + +// +// +// + +__kernel +SKC_RASTERIZE_KERNEL_ATTRIBS +void +skc_kernel_rasterize_cubics(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __global float8 const * const transforms, // FIXME -- __constant + __global float4 const * const clips, // FIXME -- __constant + __global union skc_cmd_rasterize const * const cmds, // FIXME -- __constant + skc_uint const count) +{ + // + // declare shared memory block + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + __local struct skc_subgroup_smem volatile smem[1]; +#else + __local struct skc_subgroup_smem volatile smem_wg[SKC_RASTERIZE_WORKGROUP_SUBGROUPS]; + __local struct skc_subgroup_smem volatile * const smem = smem_wg + get_sub_group_id(); +#endif + + // + // this is a subgroup/warp-centric kernel + // + // which subgroup in the grid is this? + // + // TAKE NOTE: the Intel GEN compiler appears to be recognizing + // get_group_id(0) as a uniform but the alternative calculation used + // when there are multiple subgroups per workgroup is not + // cooperating and driving spillage elsewhere. + // +#if ( SKC_RASTERIZE_WORKGROUP_SUBGROUPS == 1 ) + uint const cmd_idx = get_group_id(0); +#else + uint const cmd_idx = get_group_id(0) * SKC_RASTERIZE_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + + // + // if worksgroups are multi-subgroup then there may be excess + // subgroups in the final workgroup + // + if (cmd_idx >= count) + return; + +#if 0 + if (get_sub_group_local_id() == 0) + printf("cmd_idx = %u\n",cmd_idx); +#endif + + // + // load a single command for this subgroup + // + union skc_cmd_rasterize const cmd = cmds[cmd_idx]; + + // + // get first block node command word and its subblock + // + skc_uint nodeword = cmd.nodeword; // nodeword has word-addressing + skc_tagged_block_id_t tag_id = bp_elems[nodeword].tag_id; + skc_block_id_t id = SKC_TAGGED_BLOCK_ID_GET_ID(tag_id); + + // + // load transform -- uniform across subgroup + // + // v8: { sx shx tx shy sy ty w0 w1 } + // + // NOTE THAT WE'RE SCALING UP THE TRANSFORM BY: + // + // [ SKC_SUBPIXEL_RESL_X_F32, SKC_SUBPIXEL_RESL_Y_F32, 1.0f ] + // + // Coordinates are scaled to subpixel resolution. All that matters + // is that continuity is maintained between end path element + // endpoints. + // + // It's the responsibility of the host to ensure that the transforms + // are properly scaled either via intitializing a transform stack + // with the subpixel resolution scaled identity or scaling the + // transform before its loaded by a rasterization grid. + // + // FIXME -- horizontal load might be better than this broadcast load + // + union skc_transform const tv = { .f32v8 = transforms[SKC_CMD_RASTERIZE_GET_TRANSFORM(cmd)] }; // uniform load + union skc_path_clip const cv = { .f32v4 = clips [SKC_CMD_RASTERIZE_GET_CLIP(cmd) ] }; // uniform load + skc_uint const cohort = SKC_CMD_RASTERIZE_MASK_COHORT(cmd); // shifted + + skc_rasterize_cubics(bp_atomics, + bp_elems, + bp_ids, + bp_mask, + cohort_atomics, + sk_extent, + smem, + &nodeword,&id, + &tv,&cv,cohort); +} + +// +// +// + +__kernel +SKC_RASTERIZE_KERNEL_ATTRIBS +void +skc_kernel_rasterize_rat_quads(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __global float8 const * const transforms, // FIXME -- __constant + __global float4 const * const clips, // FIXME -- __constant + __global union skc_cmd_rasterize const * const cmds, // FIXME -- __constant + skc_uint const count) +{ + ; +} + +// +// +// + +__kernel +SKC_RASTERIZE_KERNEL_ATTRIBS +void +skc_kernel_rasterize_rat_cubics(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global union skc_bp_elem * const bp_elems, + __global uint * const bp_ids, + skc_uint const bp_mask, + + __global SKC_ATOMIC_UINT volatile * const cohort_atomics, + __global skc_ttsk_s_t * const sk_extent, + + __global float8 const * const transforms, // FIXME -- __constant + __global float4 const * const clips, // FIXME -- __constant + __global union skc_cmd_rasterize const * const cmds, // FIXME -- __constant + skc_uint const count) +{ + ; +} + +// +// +// diff --git a/src/compute/skc/rasters_alloc.cl b/src/compute/skc/rasters_alloc.cl new file mode 100644 index 0000000000..f8f76a7b39 --- /dev/null +++ b/src/compute/skc/rasters_alloc.cl @@ -0,0 +1,144 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "raster_builder_cl_12.h" +#include "block_pool_cl.h" +#include "atomic_cl.h" +#include "raster.h" +#include "tile.h" + +// +// There is a fixed-size meta table per raster cohort that we use to +// peform a mostly coalesced sizing and allocation of blocks. +// +// This code is simple and fast. +// + +__kernel +SKC_RASTERS_ALLOC_KERNEL_ATTRIBS +void +skc_kernel_rasters_alloc(__global SKC_ATOMIC_UINT volatile * const bp_atomics, + __global skc_block_id_t const * const bp_ids, + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t * const map, + __global skc_uint * const metas, + __global skc_uint const * const raster_ids, // FIXME -- CONSTANT + skc_uint const count) +{ + // access to the meta extent is linear + skc_uint const gid = get_global_id(0); + skc_bool const is_active = gid < count; + + // + // init with defaults for all lanes + // + union skc_raster_cohort_meta_inout meta = { .in.u32v4 = { 0, 0, 0, 0 } }; + skc_uint raster_id = SKC_UINT_MAX; + skc_uint extra_blocks = 0; + + if (is_active) + { + // load meta_in + meta.in.u32v4 = vload4(gid,metas); + + // load raster_id as early as possible + raster_id = raster_ids[gid]; + +#if 0 + printf("%3u + %5u, %5u, %5u, %5u\n", + gid, + meta.in.blocks, + meta.in.offset, + meta.in.pk, + meta.in.rk); +#endif + + // how many blocks will the ttpb blocks consume? + extra_blocks = ((meta.in.pk * SKC_TILE_RATIO + SKC_DEVICE_SUBBLOCKS_PER_BLOCK - SKC_TILE_RATIO) / + SKC_DEVICE_SUBBLOCKS_PER_BLOCK); + + // total keys + meta.out.keys += meta.in.pk; + + // how many blocks do we need to store the keys in the head and trailing nodes? + skc_uint const hn = ((SKC_RASTER_HEAD_DWORDS + meta.out.keys + SKC_RASTER_NODE_DWORDS - 2) / + (SKC_RASTER_NODE_DWORDS - 1)); + // increment blocks + extra_blocks += hn; + + // how many nodes trail the head? + meta.out.nodes = hn - 1; + + // update blocks + meta.out.blocks += extra_blocks; + +#if 0 + printf("%3u - %5u, %5u, %5u, %5u\n", + gid, + meta.out.blocks, + meta.out.offset, + meta.out.nodes, + meta.out.keys); +#endif + } + + // + // allocate blocks from block pool + // + // first perform a prefix sum on the subgroup to reduce atomic + // operation traffic + // + // note this idiom can be implemented with vectors, subgroups or + // workgroups + // + + skc_uint const prefix = SKC_RASTERS_ALLOC_INCLUSIVE_ADD(extra_blocks); + skc_uint reads = 0; + + // last lane performs the block pool allocation with an atomic increment + if (SKC_RASTERS_ALLOC_LOCAL_ID() == SKC_RASTERS_ALLOC_GROUP_SIZE - 1) { + reads = SKC_ATOMIC_ADD_GLOBAL_RELAXED_DEVICE(bp_atomics+SKC_BP_ATOMIC_OFFSET_READS,prefix); // ring_reads + } + + // broadcast block pool base to all lanes + reads = SKC_RASTERS_ALLOC_BROADCAST(reads,SKC_RASTERS_ALLOC_GROUP_SIZE - 1); + + // update base for each lane + reads += prefix - extra_blocks; + + // + // store meta header + // + if (is_active) + { + // store headers back to meta extent + vstore4(meta.out.u32v4,gid,metas); + + // store reads + metas[SKC_RASTER_COHORT_META_OFFSET_READS + gid] = reads; + + // get block_id of each raster head + skc_block_id_t const block_id = bp_ids[reads & bp_mask]; + + // update map + map[raster_id] = block_id; + +#if 0 + printf("alloc: %u / %u\n",raster_id,block_id); +#endif + } +} + +// +// +// diff --git a/src/compute/skc/rasters_reclaim.cl b/src/compute/skc/rasters_reclaim.cl new file mode 100644 index 0000000000..f0abdb0381 --- /dev/null +++ b/src/compute/skc/rasters_reclaim.cl @@ -0,0 +1,442 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "block_pool_cl.h" +#include "atomic_cl.h" +#include "block.h" +#include "raster.h" +#include "common.h" +#include "tile.h" + +// +// +// + +#define SKC_RASTERS_RECLAIM_SUBGROUP_SIZE_MASK (SKC_RASTERS_RECLAIM_SUBGROUP_SIZE - 1) + +#define SKC_RASTERS_RECLAIM_SUBGROUP_WORDS (SKC_RASTERS_RECLAIM_SUBGROUP_SIZE * SKC_RASTERS_RECLAIM_LOCAL_ELEMS) + +#define SKC_RASTERS_RECLAIM_X (SKC_DEVICE_BLOCK_DWORDS / SKC_RASTERS_RECLAIM_SUBGROUP_WORDS) + +// +// +// + +#if ( SKC_RASTERS_RECLAIM_X == 1 ) +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_1() +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST 0 + +#elif ( SKC_RASTERS_RECLAIM_X == 2 ) +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_2() +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST 1 + +#elif ( SKC_RASTERS_RECLAIM_X == 4 ) +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_4() +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST 3 + +#elif ( SKC_RASTERS_RECLAIM_X == 8 ) +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_8() +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST 7 + +#elif ( SKC_RASTERS_RECLAIM_X == 16) +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND() SKC_EXPAND_16() +#define SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST 15 + +#else +#error "MISSING SKC_RASTERS_RECLAIM_X" +#endif + +#if ( SKC_PREFIX_SUBGROUP_SIZE == SKC_RASTERS_RECLAIM_SUBGROUP_SIZE ) + +#define SKC_RASTERS_RECLAIM_STRIDE_H(L) (L) +#define SKC_RASTERS_RECLAIM_STRIDE_V_LO(I) (I * 2 * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) +#define SKC_RASTERS_RECLAIM_STRIDE_V_HI(I) (SKC_RASTERS_RECLAIM_STRIDE_V_LO(I) + SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) + +#elif ( SKC_PREFIX_SUBGROUP_SIZE > SKC_RASTERS_RECLAIM_SUBGROUP_SIZE ) // same as above when ratio equals 1 + +#define SKC_RASTERS_RECLAIM_SUBGROUP_RATIO (SKC_PREFIX_SUBGROUP_SIZE / SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) +#define SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_MASK (SKC_RASTERS_RECLAIM_SUBGROUP_RATIO - 1) +#define SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_SCALE(I) ((I / SKC_RASTERS_RECLAIM_SUBGROUP_RATIO) * 2 * SKC_RASTERS_RECLAIM_SUBGROUP_RATIO + \ + (I & SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_MASK)) + +#define SKC_RASTERS_RECLAIM_STRIDE_H(L) (L) +#define SKC_RASTERS_RECLAIM_STRIDE_V_LO(I) (SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_SCALE(I) * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) +#define SKC_RASTERS_RECLAIM_STRIDE_V_HI(I) (SKC_RASTERS_RECLAIM_STRIDE_V_LO(I) + SKC_RASTERS_RECLAIM_SUBGROUP_RATIO * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) + +#elif ( SKC_PREFIX_SUBGROUP_SIZE < SKC_RASTERS_RECLAIM_SUBGROUP_SIZE ) // same as above when ratio equals 1 + +#define SKC_RASTERS_RECLAIM_SUBGROUP_RATIO (SKC_RASTERS_RECLAIM_SUBGROUP_SIZE / SKC_PREFIX_SUBGROUP_SIZE) +#define SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_MASK (SKC_RASTERS_RECLAIM_SUBGROUP_SIZE / SKC_RASTERS_RECLAIM_SUBGROUP_RATIO - 1) // equal to prefix subgroup mask + +#define SKC_RASTERS_RECLAIM_STRIDE_H(L) (((L) & ~SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_MASK) * 2 + ((L) & SKC_RASTERS_RECLAIM_SUBGROUP_RATIO_MASK)) +#define SKC_RASTERS_RECLAIM_STRIDE_V_LO(I) (I * 2 * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) +#define SKC_RASTERS_RECLAIM_STRIDE_V_HI(I) (SKC_RASTERS_RECLAIM_STRIDE_V_LO(I) + SKC_RASTERS_RECLAIM_SUBGROUP_SIZE / SKC_RASTERS_RECLAIM_SUBGROUP_RATIO) + +#endif + +// +// FIXME -- slate these for replacement +// + +#define SKC_BROADCAST(E,S,I) \ + sub_group_broadcast(E,S - I * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) + +#define SKC_BROADCAST_LAST_HELPER(E,I) \ + sub_group_broadcast(E,SKC_RASTERS_RECLAIM_SUBGROUP_SIZE - 1) + +#define SKC_BROADCAST_LAST(E,I) \ + SKC_BROADCAST_LAST_HELPER(E,I) + +// +// COMPILE-TIME PREDICATES +// + +#define SKC_RASTERS_RECLAIM_ELEM_GTE(X,I) \ + SKC_GTE_MACRO(X,(I+1) * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) + +#define SKC_RASTERS_RECLAIM_ELEM_IN_RANGE(X,I) \ + (skc_bool)SKC_GTE_MACRO(X, I * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) && \ + (skc_bool)SKC_LT_MACRO(X,(I+1) * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE) + +#define SKC_RASTERS_RECLAIM_ENTIRELY_HEADER(I) \ + SKC_RASTERS_RECLAIM_ELEM_GTE(SKC_RASTER_HEAD_DWORDS,I) + +#define SKC_RASTERS_RECLAIM_PARTIALLY_HEADER(I) \ + SKC_RASTERS_RECLAIM_ELEM_IN_RANGE(SKC_RASTER_HEAD_DWORDS,I) + +// +// RUN-TIME PREDICATES +// + +#define SKC_RASTERS_RECLAIM_IS_HEADER(I) \ + (get_sub_group_local_id() + I * SKC_RASTERS_RECLAIM_SUBGROUP_SIZE < SKC_RASTER_HEAD_DWORDS) + +// +// FIXME -- THIS BITFIELD SCAN APPROACH CAN BE PARAMETERIZED FOR ALL +// POSSIBLE PRACTICAL POWER-OF-TWO SUBGROUP AND SUBBLOCKS-PER-BLOCK +// COMBOS (NOT NECESSARILY POW2) +// +// FOR WIDER SUBGROUPS WITH BIG BLOCKS, WE WILL WANT TO USE A VECTOR +// UINT TYPE INSTEAD OF A ULONG. +// + +#define SKC_RASTERS_RECLAIM_PACKED_COUNT_BITS SKC_RASTERS_RECLAIM_SUBGROUP_SIZE_LOG2 +#define SKC_RASTERS_RECLAIM_PACKED_COUNT_DECLARE skc_uint + +// +// +// + +#define SKC_RASTERS_RECLAIM_PACKED_COUNT_MASK SKC_BITS_TO_MASK(SKC_RASTERS_RECLAIM_PACKED_COUNT_BITS) + +#define SKC_RASTERS_RECLAIM_PACKED_COUNT_IS_BLOCK(E,I) \ + (((E) & SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK) \ + ? 0 : (1u << SKC_RASTERS_RECLAIM_PACKED_COUNT_BITS * I)) + +#define SKC_RASTERS_RECLAIM_PACKED_COUNT_SCAN_EXCLUSIVE_ADD(S,C) \ + S = sub_group_scan_exclusive_add(C) + +#define SKC_RASTERS_RECLAIM_PACKED_COUNT_GET(C,I) \ + (((C) >> (SKC_RASTERS_RECLAIM_PACKED_COUNT_BITS * I)) & SKC_RASTERS_RECLAIM_PACKED_COUNT_MASK) + +// +// +// + +struct skc_reclaim +{ + skc_raster_h aN[SKC_RECLAIM_ARRAY_SIZE]; +}; + +__kernel +SKC_RASTERS_RECLAIM_KERNEL_ATTRIBS +void +skc_kernel_rasters_reclaim(__global skc_block_id_t * const bp_ids, // block pool ids ring + __global skc_uint * const bp_elems, // block pool blocks + __global skc_uint volatile * const bp_atomics, // read/write atomics + skc_uint const bp_mask, // pow2 modulo mask for block pool ring + __global skc_block_id_t const * const map, // raster host-to-device map + struct skc_reclaim const reclaim) // array of host raster ids +{ +#if (__OPENCL_VERSION__ < 200) + skc_uint const reclaim_stride = get_num_sub_groups(); +#else + skc_uint const reclaim_stride = get_enqueued_num_sub_groups(); // 2.0 supports non-uniform workgroups +#endif + skc_uint reclaim_idx = get_group_id(0) * reclaim_stride + get_sub_group_id(); + +#if 0 + // + // NOTE -- FOR NOW, THIS KERNEL ALWAYS LAUNCHES FIXED SIZE GRIDS BUT + // WE MIGHT WANT TO HAVE THE GRID LIMIT ITSELF TO A FRACTIONAL + // MULTIPROCESSOR IN ORDER TO MINIMIZE THE IMPACT OF A LARGE + // RECLAMATION JOB ON THE REST OF THE PIPELINE. + // + for (; reclaim_idx < SKC_RECLAIM_ARRAY_SIZE; reclaim_idx+=reclaim_stride) +#endif + { + // get host raster id + skc_raster_h const raster = reclaim.aN[reclaim_idx]; + + // get block id of raster header + skc_block_id_t id = map[raster]; + + // + // load all of the head block ttxk.lo keys into registers + // + // FIXME -- this pattern lends itself to using the higher + // performance Intel GEN block load instructions + // + skc_uint const head_id = id * SKC_DEVICE_SUBBLOCK_WORDS + SKC_RASTERS_RECLAIM_STRIDE_H(get_sub_group_local_id()); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + skc_uint h##I = bp_elems[head_id + SKC_RASTERS_RECLAIM_STRIDE_V_LO(I)]; + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // + // pick out count.nodes and count.prims from the header + // + // load raster header counts -- we only need the blocks and + // nodes words the keys are doublewords. + // + // FIXME -- this can be made portable with compile-time macro expansion + // + skc_uint count_blocks = sub_group_broadcast(h0,0); // SKC_RASTER_HEAD_OFFSET_COUNTS_NODES + skc_uint count_nodes = sub_group_broadcast(h0,1); // SKC_RASTER_HEAD_OFFSET_COUNTS_KEYS + +#if 0 + if (get_sub_group_local_id() == 0) { + printf("reclaim rasters: %u / %u / %5u / %5u\n",raster,id,count_blocks,count_nodes); + } +#endif + // + // acquire a span in the block pool ids ring for reclaimed ids + // + skc_uint bp_ids_base = 0; + + if (get_sub_group_local_id() == 0) { + bp_ids_base = SKC_ATOMIC_ADD_GLOBAL_RELAXED_SUBGROUP(bp_atomics+SKC_BP_ATOMIC_OFFSET_WRITES,count_blocks); + } + + bp_ids_base = sub_group_broadcast(bp_ids_base,0); + + // + // mask off everything but the block id + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_RASTERS_RECLAIM_ENTIRELY_HEADER(I)) { \ + h##I = h##I & SKC_TTXK_LO_MASK_ID; \ + } + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // + // swap current id with next + // + if (get_sub_group_local_id() == SKC_RASTERS_RECLAIM_SUBGROUP_SIZE - 1) + { + skc_block_id_t const next = SKC_CONCAT(h,SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST); + + SKC_CONCAT(h,SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST) = id; + + id = next; +#if 0 + printf("rasters next = %u\n",id); +#endif + } + +#if 0 +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + printf("%08X %u\n",h##I,h##I); + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); +#endif + +#if 0 +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_RASTERS_RECLAIM_ENTIRELY_HEADER(I)) { \ + printf("%08X\n",h##I); \ + } + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); +#endif + + // + // - we'll skip subgroups that are entirely header + // + // - but we need to mark any header elements that partially fill + // a subgroup as subblocks + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_RASTERS_RECLAIM_ENTIRELY_HEADER(I)) { \ + if (SKC_RASTERS_RECLAIM_PARTIALLY_HEADER(I)) { \ + if (SKC_RASTERS_RECLAIM_IS_HEADER(I)) { \ + h##I = SKC_UINT_MAX; \ + } \ + } \ + } + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + { + // + // count reclaimable blocks in each lane + // + SKC_RASTERS_RECLAIM_PACKED_COUNT_DECLARE packed_count = ( 0 ); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_RASTERS_RECLAIM_ENTIRELY_HEADER(I)) { \ + packed_count |= SKC_RASTERS_RECLAIM_PACKED_COUNT_IS_BLOCK(h##I,I); \ + } + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // + // scan to find index of each block + // + SKC_RASTERS_RECLAIM_PACKED_COUNT_DECLARE packed_index = ( 0 ); + + SKC_RASTERS_RECLAIM_PACKED_COUNT_SCAN_EXCLUSIVE_ADD(packed_index,packed_count); + + // + // store blocks back to ring + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + if (!SKC_RASTERS_RECLAIM_ENTIRELY_HEADER(I)) { \ + skc_uint const index = SKC_RASTERS_RECLAIM_PACKED_COUNT_GET(packed_index,I); \ + skc_uint const count = SKC_RASTERS_RECLAIM_PACKED_COUNT_GET(packed_count,I); \ + skc_uint const bp_ids_idx = (bp_ids_base + index) & bp_mask; \ + if (count > 0) { \ + bp_ids[bp_ids_idx] = h##I; \ + } \ + skc_uint const total = index + count; \ + bp_ids_base += sub_group_broadcast(total,SKC_RASTERS_RECLAIM_SUBGROUP_SIZE-1); \ + } + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + } + + // printf("R %7u ! %u\n",bp_ids_idx,h##I); + + // + // we're done if it was just the header + // + if (count_nodes == 0) + return; + + // + // otherwise, walk the nodes + // + do { + // id of next block is in last lane + id = sub_group_broadcast(id,SKC_RASTERS_RECLAIM_SUBGROUP_SIZE-1); + + // + // load all of the node block ttxk.lo keys into registers + // + // FIXME -- this pattern lends itself to using the higher + // performance Intel GEN block load instructions + // + skc_uint const node_id = id * SKC_DEVICE_SUBBLOCK_WORDS + SKC_RASTERS_RECLAIM_STRIDE_H(get_sub_group_local_id()); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + skc_uint n##I = bp_elems[node_id + SKC_RASTERS_RECLAIM_STRIDE_V_LO(I)]; + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // + // mask off everything but the block id + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + n##I = n##I & SKC_TTXK_LO_MASK_ID; + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // + // swap current id with next + // + if (get_sub_group_local_id() == SKC_RASTERS_RECLAIM_SUBGROUP_SIZE - 1) + { + skc_block_id_t const next = SKC_CONCAT(n,SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST); + + SKC_CONCAT(n,SKC_RASTERS_RECLAIM_BLOCK_EXPAND_I_LAST) = id; + + id = next; +#if 0 + printf("rasters next = %u\n",id); +#endif + } + +#if 0 +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + printf("%08X %u\n",n##I,n##I); + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); +#endif + + // + // count reclaimable blocks in each lane + // + SKC_RASTERS_RECLAIM_PACKED_COUNT_DECLARE packed_count = ( 0 ); + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) \ + packed_count |= SKC_RASTERS_RECLAIM_PACKED_COUNT_IS_BLOCK(n##I,I); + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // + // scan to find index of each block + // + SKC_RASTERS_RECLAIM_PACKED_COUNT_DECLARE packed_index = ( 0 ); + + SKC_RASTERS_RECLAIM_PACKED_COUNT_SCAN_EXCLUSIVE_ADD(packed_index,packed_count); + + // + // store blocks back to ring + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,R) { \ + skc_uint const index = SKC_RASTERS_RECLAIM_PACKED_COUNT_GET(packed_index,I); \ + skc_uint const count = SKC_RASTERS_RECLAIM_PACKED_COUNT_GET(packed_count,I); \ + skc_uint const bp_ids_idx = (bp_ids_base + index) & bp_mask; \ + if (count > 0) { \ + bp_ids[bp_ids_idx] = n##I; \ + } \ + skc_uint const total = index + count; \ + bp_ids_base += sub_group_broadcast(total,SKC_RASTERS_RECLAIM_SUBGROUP_SIZE-1); \ + } + + SKC_RASTERS_RECLAIM_BLOCK_EXPAND(); + + // printf("R %7u ! %u\n",bp_ids_idx,n##I); + + // any more nodes? + } while (--count_nodes > 0); + } +} + +// +// +// diff --git a/src/compute/skc/render.cl b/src/compute/skc/render.cl new file mode 100644 index 0000000000..ba2fd7bbfd --- /dev/null +++ b/src/compute/skc/render.cl @@ -0,0 +1,2165 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "device_cl_12_gen9.h" +#include "block.h" +#include "tile.h" +#include "atomic_cl.h" +#include "styling_types.h" + +// +// +// + +#define SKC_RENDER_SUBGROUP_MASK (SKC_RENDER_SUBGROUP_SIZE - 1) + +// +// +// + +#if ( SKC_RENDER_SCANLINE_VECTOR_SIZE == 1 ) +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND() SKC_EXPAND_1() +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND_I_LAST 0 + +#elif ( SKC_RENDER_SCANLINE_VECTOR_SIZE == 2 ) +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND() SKC_EXPAND_2() +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND_I_LAST 1 + +#elif ( SKC_RENDER_SCANLINE_VECTOR_SIZE == 4 ) +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND() SKC_EXPAND_4() +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND_I_LAST 3 + +#elif ( SKC_RENDER_SCANLINE_VECTOR_SIZE == 8 ) +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND() SKC_EXPAND_8() +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND_I_LAST 7 + +#elif ( SKC_RENDER_SCANLINE_VECTOR_SIZE == 16) +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND() SKC_EXPAND_16() +#define SKC_RENDER_SCANLINE_VECTOR_EXPAND_I_LAST 15 +#endif + +// +// tile state flag bits +// + +typedef enum skc_tile_flags_e { + + // FLUSH + SKC_TILE_FLAGS_FLUSH_FINALIZE = 0x00000001, + SKC_TILE_FLAGS_FLUSH_UNWIND = 0x00000002, + SKC_TILE_FLAGS_FLUSH_COMPLETE = 0x00000004, + + // OPACITY + SKC_TILE_FLAGS_SCATTER_SKIP = 0x00000008, + + // + // Note: testing for opacity and skipping scattering is on its way + // to becoming a much more programmable option because sometimes we + // may be compositing/blending from back-to-front and/or be using + // group blend rules that ignore opacity. + // + // The point is that all of these decisions should be encoded in + // styling commands and, as much as possible, removed from the final + // group/layer styling traversal render loop. + // + +} skc_tile_flags_e; + +// +// COVER -- assumes availability of either fp16 or fp32 +// + +union skc_tile_cover +{ + struct { + SKC_RENDER_TILE_COVER c[SKC_TILE_WIDTH]; + } aN; + +#ifdef SKC_RENDER_TILE_COVER_VECTOR + struct { + SKC_RENDER_TILE_COVER_VECTOR c[SKC_RENDER_TILE_COVER_VECTOR_COUNT]; + } vN; +#endif +}; + +// +// COLOR -- assumes availability of either fp16 or fp32 +// + +union skc_tile_color +{ + union { + struct { + SKC_RENDER_TILE_COLOR r; + SKC_RENDER_TILE_COLOR g; + SKC_RENDER_TILE_COLOR b; + SKC_RENDER_TILE_COLOR a; + } rgba[SKC_TILE_WIDTH]; + } aN; + +#ifdef SKC_RENDER_TILE_COLOR_INTERLEAVED + union { + SKC_RENDER_TILE_COLOR_INTERLEAVED rgba[SKC_TILE_WIDTH]; + } iN; +#endif + +#ifdef SKC_RENDER_TILE_COLOR_VECTOR + union { + SKC_RENDER_TILE_COLOR_VECTOR rgba[SKC_RENDER_TILE_COLOR_VECTOR_COUNT]; + } vN; +#endif + + struct { + union { + struct { + SKC_RENDER_TILE_COLOR r; + SKC_RENDER_TILE_COLOR g; + }; + SKC_RENDER_GRADIENT_FLOAT distance; + }; + union { + struct { + SKC_RENDER_TILE_COLOR b; + SKC_RENDER_TILE_COLOR a; + }; + SKC_RENDER_GRADIENT_FLOAT stoplerp; + }; + } grad[SKC_TILE_WIDTH]; +}; + +// +// SHARED MEMORY STATE +// + +#define SKC_RENDER_TILE_SMEM_WORDS ((SKC_TILE_WIDTH + 1) * SKC_TILE_HEIGHT) + +#define SKC_RENDER_WIDE_AA_BYTES (SKC_RENDER_TILE_SMEM_WORDS * sizeof(int) / SKC_RENDER_SUBGROUP_SIZE) +#define SKC_RENDER_WIDE_AA_WIDTH (SKC_RENDER_WIDE_AA_BYTES / sizeof(SKC_RENDER_WIDE_AA)) + +// +// +// + +union skc_subgroup_smem +{ + // + // The tiles are stored in column-major / height-major order + // + // The final column is a guard column that is OK to write to but + // will never be read. It simplifies the TTSB scatter but could be + // predicated if SMEM is really at a premium. + // +#if ( SKC_RENDER_SUBGROUP_SIZE > 1 ) + struct { + SKC_ATOMIC_UINT area[SKC_RENDER_TILE_SMEM_WORDS]; // area[w][h] + } atomic; +#endif + + struct { + int area[SKC_RENDER_TILE_SMEM_WORDS]; // area[w][h] + } aN; + + struct { // assumption is that height = subgroup + SKC_RENDER_AREA_V area[SKC_TILE_WIDTH + 1][SKC_RENDER_SUBGROUP_SIZE]; + } vN; + + struct { // assumption is that height = subgroup + SKC_RENDER_WIDE_AA area[SKC_RENDER_WIDE_AA_WIDTH][SKC_RENDER_SUBGROUP_SIZE]; + } wide; + + union skc_styling_cmd cmds[(SKC_TILE_WIDTH + 1) * SKC_TILE_HEIGHT]; + + half gc [(SKC_TILE_WIDTH + 1) * SKC_TILE_HEIGHT * 2]; + +#if 0 + // + // SPILL TO GMEM + // +#if (SKC_REGS_COLOR_S > 0) || (SKC_REGS_COVER_S > 0) + struct { + +#if (SKC_REGS_COLOR_S > 0) + union skc_color_r color[SKC_REGS_COLOR_S][SKC_TILE_HEIGHT][SKC_TILE_WIDTH]; +#endif + +#if (SKC_REGS_COVER_S > 0) + union float cover[SKC_REGS_COVER_S][SKC_TILE_HEIGHT][SKC_TILE_WIDTH]; +#endif + + } regs; +#endif + // + // + // +#endif +}; + +// +// +// + +#if ( SKC_RENDER_SUBGROUP_SIZE == 1 ) + +#define skc_subgroup_lane() 0 + +#else + +#define skc_subgroup_lane() get_sub_group_local_id() + +#endif + +// +// +// + +typedef skc_uint skc_ttsk_lo_t; +typedef skc_uint skc_ttsk_hi_t; + +typedef skc_uint skc_ttpk_lo_t; +typedef skc_uint skc_ttpk_hi_t; + +typedef skc_uint skc_ttxk_lo_t; +typedef skc_uint skc_ttxk_hi_t; + +typedef skc_uint skc_ttck_lo_t; +typedef skc_uint skc_ttck_hi_t; + +typedef skc_uint2 skc_ttck_t; + +typedef skc_int skc_ttxb_t; + +// +// TTCK (32-BIT COMPARE) v1: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 18 | 7 | 7 | +// +// +// TTCK (32-BIT COMPARE) v2: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 15 | 9 | 8 | +// +// +// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 27 | 1 | 1 | 18 | 9 | 8 | +// + +static +skc_uint +skc_ttck_lo_get_ttxb_id(skc_ttck_lo_t const a) +{ + return a & SKC_TTCK_LO_MASK_ID; +} + +static +skc_layer_id +skc_ttck_get_layer(skc_ttck_t const a) +{ + // + // FIXME -- a union with a ulong and a shift down and mask is + // probably faster on some architectures + // + skc_uint const lo = (a.lo >> SKC_TTCK_LO_BITS_ID_PREFIX_ESCAPE); + skc_uint const hi = (a.hi & SKC_TTCK_HI_MASK_LAYER) << SKC_TTCK_LO_BITS_LAYER; + + return lo | hi; +} + +static +skc_uint +skc_ttck_hi_get_x(skc_ttck_hi_t const a) +{ + return SKC_BFE(a,SKC_TTCK_HI_BITS_X,SKC_TTCK_HI_OFFSET_X); +} + +static +skc_uint +skc_ttck_hi_get_y(skc_ttck_hi_t const a) +{ + return a >> SKC_TTCK_HI_OFFSET_Y; +} + +static +skc_bool +skc_ttck_equal_yxl(skc_ttck_t const a, skc_ttck_t const b) +{ + skc_uint const lo = (a.lo ^ b.lo) & SKC_BITS_TO_MASK_AT(SKC_TTCK_LO_BITS_LAYER,SKC_TTCK_LO_BITS_ID_PREFIX_ESCAPE); + skc_uint const hi = (a.hi ^ b.hi); + + return (lo | hi) == 0; +} + +static +skc_bool +skc_ttck_hi_equal_yx(skc_ttck_hi_t const a, skc_ttck_hi_t const b) +{ + return ((a ^ b) & SKC_TTCK_HI_MASK_YX) == 0; +} + +static +skc_bool +skc_ttck_lo_is_prefix(skc_ttck_lo_t const a) +{ + return (a & SKC_TTCK_LO_MASK_PREFIX) != 0; +} + +// +// TILE TRACE SUBPIXEL +// +// The subpixels are encoded with either absolute tile coordinates +// (32-bits) or packed in delta-encoded form form. +// +// For 32-bit subpixel packing of a 32x32 tile: +// +// A tile X is encoded as: +// +// TX : 10 : unsigned min(x0,x1) tile subpixel coordinate. +// +// SX : 6 : unsigned subpixel span from min to max x with range +// [0,32]. The original direction is not captured. Would +// be nice to capture dx but not necessary right now but +// could be in the future. <--- SPARE VALUES AVAILABLE +// +// A tile Y is encoded as: +// +// TY : 10 : unsigned min(y0,y1) tile subpixel coordinate. +// +// DY : 6 : signed subpixel delta y1-y0. The range of delta is +// [-32,32] but horizontal lines are not encoded so [1,32] +// is mapped to [0,31]. The resulting range [-32,31] fits +// in 6 bits. +// +// TTS: +// +// 0 31 +// | TX | SX | TY | DY | +// +-----+------+-----+------+ +// | 10 | 6 | 10 | 6 | +// + +static +SKC_RENDER_TTS_V_BITFIELD +skc_tts_get_ty_pixel_v(SKC_RENDER_TTS_V const a) +{ + // + // extract the whole pixel y coordinate + // + return SKC_BFE(a, + SKC_TTS_BITS_TY - SKC_SUBPIXEL_RESL_Y_LOG2, + SKC_TTS_OFFSET_TY + SKC_SUBPIXEL_RESL_Y_LOG2); +} + +static +SKC_RENDER_TTS_V_BITFIELD +skc_tts_get_xy_idx_v(SKC_RENDER_TTS_V const a) +{ + // + // get the linear array tile index of the pixel + // + return (((a & SKC_TTS_MASK_TX_PIXEL) + +#if (SKC_SUBPIXEL_RESL_X_LOG2 > SKC_TILE_HEIGHT_LOG2) + >> (SKC_SUBPIXEL_RESL_X_LOG2 - SKC_TILE_HEIGHT_LOG2) +#elif (SKC_SUBPIXEL_RESL_X_LOG2 < SKC_TILE_HEIGHT_LOG2) + << (SKC_TILE_HEIGHT_LOG2 - SKC_SUBPIXEL_RESL_X_LOG2) +#endif + + ) | skc_tts_get_ty_pixel_v(a)); +} + +#if 0 +static +skc_ttx_v_s32_t +skc_tts_get_dy_v(SKC_RENDER_TTS_V const a) +{ + skc_ttx_v_s32_t const dy = SKC_AS(skc_ttx_v_s32_t)a >> SKC_TTS_OFFSET_DY; + + return (dy + SKC_AS(skc_ttx_v_s32_t)(~a >> 31)); +} +#else +static +SKC_RENDER_TTS_V_BITFIELD +skc_tts_get_dy_v(SKC_RENDER_TTS_V const a) +{ + SKC_RENDER_TTS_V_BITFIELD const dy = a >> SKC_TTS_OFFSET_DY; + + return dy - (~a >> 31); +} +#endif + +static +SKC_RENDER_TTS_V_BITFIELD +skc_tts_get_tx_subpixel_v(SKC_RENDER_TTS_V const a) +{ + return a & SKC_BITS_TO_MASK(SKC_SUBPIXEL_RESL_X_LOG2); +} + +static +SKC_RENDER_TTS_V_BITFIELD +skc_tts_get_sx_v(SKC_RENDER_TTS_V const a) +{ + return SKC_BFE(a,SKC_TTS_BITS_SX,SKC_TTS_OFFSET_SX); +} + +// +// +// + +static +void +skc_tile_aa_zero(__local union skc_subgroup_smem * SKC_RESTRICT const smem) +{ + // + // SIMD / CPU + // + // & + // + // SIMT / GPU + // + // Note that atomic_init() is likely implemented as a simple + // assignment so there is no identifiable performance difference on + // current targets. + // + // If such an architecture appears in the future then we'll probably + // still want to implement this zero'ing operation as below but + // follow with an appropriate fence that occurs before any scatter + // operations. + // + // The baroque expansion below improves performance on Intel GEN by, + // presumably, achieving the 64-byte per clock SLM write as well as + // minimizing the overall number of SEND() block initializations and + // launches. + // + // Intel GENx has a documented 64 byte per cycle SLM write limit. + // So having each lane in an 8 lane subgroup zero-write 8 bytes is + // probably a safe bet (Later: benchmarking backs this up!). + // + // Note there is no reason at this time to unroll this loop. + // + for (uint ii=0; ii<SKC_RENDER_WIDE_AA_WIDTH; ii++) + smem->wide.area[ii][skc_subgroup_lane()] = ( 0 ); +} + +// +// Note this is going to be vectorizable on most architectures. +// +// The return of the key translation feature might complicate things. +// + +static +void +skc_scatter_ttpb(__global skc_ttxb_t const * SKC_RESTRICT const ttxb_extent, + __local union skc_subgroup_smem * SKC_RESTRICT const smem, + skc_block_id_t const pb_id) +{ + skc_uint const offset = pb_id * (SKC_DEVICE_SUBBLOCK_WORDS / SKC_TILE_RATIO) + skc_subgroup_lane(); + +#if ( SKC_TILE_RATIO == 1 ) + + SKC_RENDER_TTP_V const ttp_v = ttxb_extent[offset]; + +#elif ( SKC_TILE_RATIO == 2 ) + + SKC_RENDER_TTP_V const ttp_v = vload2(offset,ttxb_extent); + +#else + +#error("tile ratio greater than 2 not supported") + +#endif + + // + // Note there is no need to use an atomic for this operation on the + // current group of target platforms... but this may change if + // atomic ops truly go through a different path. + // + // As noted above, this direct increment is probably faster and can + // always be followed by a fence. + // + // Furthermore, note that the key sorting orders all ttck keys + // before ttpk keys. + // + + // + // FIXME -- if the SMEM store is wider than bank word count then we + // might want to odd-even interleave the TTP values if the target + // device can't handle 64-bit stores + // + + // + // skipping per-key translation for now + // + smem->vN.area[0][skc_subgroup_lane()] += ttp_v << (SKC_SUBPIXEL_RESL_X_LOG2 + 1); +} + +// +// Note that skc_scatter_ttsb is *not* vectorizable unless the +// architecture supports a "scatter-add" capability. All relevant +// GPUs support atomic add on shared/local memory and thus support +// scatter-add. +// + +static +void +skc_scatter_ttsb(__global skc_ttxb_t const * SKC_RESTRICT const ttxb_extent, + __local union skc_subgroup_smem * SKC_RESTRICT const smem, + skc_block_id_t const sb_id) +{ + skc_uint const offset = sb_id * SKC_DEVICE_SUBBLOCK_WORDS + skc_subgroup_lane(); + + SKC_RENDER_TTS_V const tts_v = ttxb_extent[offset]; + + // + // Skipping per-key translation for now + // + + // Index into tile + // + // The tiles are stored in column-major / height-major order + // + // The final column is a guard column that is OK to write to but + // will never be read. It simplifies the TTSB scatter but could be + // predicated if SMEM is really at a premium. + // + + SKC_RENDER_TTS_V_BITFIELD const xy_idx = skc_tts_get_xy_idx_v(tts_v); + +#if 0 + if (tts_v != SKC_TTS_INVALID) + printf("(%08X) = %u\n",tts_v,xy_idx); +#endif + + // + // adjust subpixel range to max y + // + // range is stored as [-32,31] and when read [0,31] is mapped to + // [1,32] because a dy of 0 is not possible. + // + // more succinctly: if dy >= 0 then ++dy + // + SKC_RENDER_TTS_V_BITFIELD const dy = skc_tts_get_dy_v(tts_v); + + // + // FIXME -- benchmark performance of setting dy to 0 if ttsv.vN is invalid? + // + + // this "min(x0) * 2 + dx" is equivalent to "x0 + x1" + SKC_RENDER_TTS_V_BITFIELD const widths = skc_tts_get_tx_subpixel_v(tts_v) * 2 + skc_tts_get_sx_v(tts_v); + + // Calculate left and right coverage contribution trapezoids + SKC_RENDER_TTS_V_BITFIELD const left = dy * widths; + SKC_RENDER_TTS_V_BITFIELD const right = (dy << (SKC_SUBPIXEL_RESL_X_LOG2 + 1)) - left; + + // + // Accumulate altitudes and areas + // + // Optimization: if the device supports an CPU/SIMD vector-add or + // GPU/SIMT scatter-add atomic int2 add operation then placing the + // ALT and AREA values side-by-side would halve the number of + // additions. + // +#if ( SKC_RENDER_SUBGROUP_SIZE == 1 ) + // + // CPU/SIMD + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (tts_v C != SKC_TTS_INVALID) { \ + smem->aN.area[SKC_TILE_HEIGHT + xy_idx C] += left C; \ + smem->aN.area[ xy_idx C] += right C; \ + } + +#else + // + // GPU/SIMT -- IMPLIES SUPPORT FOR ATOMIC SCATTER-ADD + // +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) \ + if (tts_v C != SKC_TTS_INVALID) { \ + SKC_ATOMIC_ADD_LOCAL_RELAXED_SUBGROUP(smem->atomic.area + \ + SKC_TILE_HEIGHT + xy_idx C, \ + left C); \ + SKC_ATOMIC_ADD_LOCAL_RELAXED_SUBGROUP(smem->atomic.area + xy_idx C, \ + right C); \ + } +#endif + + SKC_RENDER_TTSB_EXPAND(); +} + +// +// Note that 2048.0 can be represented exactly with fp16... fortuitous! +// + +#define SKC_RENDER_FILL_MAX_AREA (2u * SKC_SUBPIXEL_RESL_X * SKC_SUBPIXEL_RESL_Y) +#define SKC_RENDER_FILL_MAX_AREA_2 (2u * SKC_RENDER_FILL_MAX_AREA) +#define SKC_RENDER_FILL_EVEN_ODD_MASK (SKC_RENDER_FILL_MAX_AREA_2 - 1) +#define SKC_RENDER_FILL_MAX_AREA_RCP_F32 (SKC_RENDER_TILE_COVER)(1.0f / SKC_RENDER_FILL_MAX_AREA) + +// +// +// + +static +void +skc_tile_cover_nonzero(__local union skc_subgroup_smem * SKC_RESTRICT const smem, + union skc_tile_cover * SKC_RESTRICT const cover, + union skc_tile_color * SKC_RESTRICT const color) +{ + SKC_RENDER_ACC_COVER_INT area = 0; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) // doesn't help on AVX2 + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + area += smem->vN.area[ii][skc_subgroup_lane()]; + SKC_RENDER_ACC_COVER_UINT const trapabs = abs(area); + SKC_RENDER_TILE_COVER const nonzero = SKC_CONVERT(SKC_RENDER_TILE_COVER)(min(trapabs,SKC_RENDER_FILL_MAX_AREA)); + + cover->aN.c[ii] = nonzero * (SKC_RENDER_TILE_COVER)(SKC_RENDER_FILL_MAX_AREA_RCP_F32); + } +} + +static +void +skc_tile_cover_evenodd(__local union skc_subgroup_smem * SKC_RESTRICT const smem, + union skc_tile_cover * SKC_RESTRICT const cover, + union skc_tile_color * SKC_RESTRICT const color) +{ + SKC_RENDER_ACC_COVER_INT area = 0; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) // doesn't help on AVX2 + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + area += smem->vN.area[ii][skc_subgroup_lane()]; + SKC_RENDER_ACC_COVER_UINT const trapabs = abs(area); + SKC_RENDER_ACC_COVER_UINT const reflect = abs(SKC_AS(SKC_RENDER_ACC_COVER_INT)((trapabs & SKC_RENDER_FILL_EVEN_ODD_MASK) - SKC_RENDER_FILL_MAX_AREA)); + + cover->aN.c[ii] = SKC_CONVERT(SKC_RENDER_TILE_COVER)(SKC_RENDER_FILL_MAX_AREA - reflect) * (SKC_RENDER_TILE_COVER)SKC_RENDER_FILL_MAX_AREA_RCP_F32; + } +} + +// +// +// + +static +void +skc_tile_color_fill_solid(__global union skc_styling_cmd const * SKC_RESTRICT const commands, + uint * SKC_RESTRICT const cmd_next, + union skc_tile_color * SKC_RESTRICT const color) +{ + // + // rgba = solid fill + // + __global half const * const rgba_ptr = commands[*cmd_next].f16a2 + 0; + + *cmd_next += 2; + +#if !defined( SKC_RENDER_TILE_COLOR_VECTOR ) + + SKC_RENDER_TILE_COLOR_PAIR const rg = SKC_RENDER_TILE_COLOR_PAIR_LOAD(0,rgba_ptr); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH-1))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].r = rg.lo; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH-1))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].g = rg.hi; + + SKC_RENDER_TILE_COLOR_PAIR const ba = SKC_RENDER_TILE_COLOR_PAIR_LOAD(1,rgba_ptr); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH-1))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].b = ba.lo; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH-1))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].a = ba.hi; + +#else + + SKC_RENDER_TILE_COLOR_PAIR const rg = SKC_RENDER_TILE_COLOR_PAIR_LOAD(0,rgba_ptr); + SKC_RENDER_TILE_COLOR const r = rg.lo; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].even.even = SKC_AS(SKC_RENDER_TILE_COLOR_VECTOR_COMPONENT)(r); + + SKC_RENDER_TILE_COLOR const g = rg.hi; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].odd.even = SKC_AS(SKC_RENDER_TILE_COLOR_VECTOR_COMPONENT)(g); + + SKC_RENDER_TILE_COLOR_PAIR const ba = SKC_RENDER_TILE_COLOR_PAIR_LOAD(1,rgba_ptr); + SKC_RENDER_TILE_COLOR const b = ba.lo; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].even.odd = SKC_AS(SKC_RENDER_TILE_COLOR_VECTOR_COMPONENT)(b); + + SKC_RENDER_TILE_COLOR const a = ba.hi; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].odd.odd = SKC_AS(SKC_RENDER_TILE_COLOR_VECTOR_COMPONENT)(a); + +#endif +} + +// +// Norbert Juffa notes: "GPU Pro Tip: Lerp Faster in C++" +// +// https://devblogs.nvidia.com/parallelforall/lerp-faster-cuda/ +// +// Lerp in two fma/mad ops: +// +// t * b + ((-t) * a + a) +// +// Note: OpenCL documents mix() as being implemented as: +// +// a + (b - a) * t +// +// But this may be a native instruction on some devices. For example, +// on GEN9 there is an LRP "linear interoplation" function but it +// doesn't appear to support half floats. +// + +#if 1 +#define SKC_LERP(a,b,t) mad(t,b,mad(-(t),a,a)) +#else +#define SKC_LERP(a,b,t) mix(a,b,t) +#endif + +// +// CPUs have a mock local address space so copying the gradient header +// is probably not useful. Just read directly from global. +// + +#ifndef SKC_RENDER_GRADIENT_IS_GLOBAL +#define SKC_RENDER_GRADIENT_SPACE __local +#else +#define SKC_RENDER_GRADIENT_SPACE __global +#endif + +// +// gradient is non-vertical +// +// removed the vertical (actually, horizontal) special case +// + +static +void +skc_tile_color_fill_gradient_linear_nonvertical(__local union skc_subgroup_smem * SKC_RESTRICT const smem, + __global union skc_styling_cmd const * SKC_RESTRICT const commands, + uint * SKC_RESTRICT const cmd_next, + union skc_tile_color * SKC_RESTRICT const color, + skc_ttck_hi_t const ttck_hi) +{ + // + // Where is this tile? + // + // Note that the gradient is being sampled from pixel centers. + // + SKC_RENDER_GRADIENT_FLOAT const y = +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) I##.5f P + (SKC_RENDER_GRADIENT_FLOAT)( SKC_RENDER_SCANLINE_VECTOR_EXPAND() ) + + (skc_ttck_hi_get_y(ttck_hi) * SKC_TILE_HEIGHT + (skc_subgroup_lane() * SKC_RENDER_SCANLINE_VECTOR_SIZE)); + + float const x = 0.5f + (skc_ttck_hi_get_x(ttck_hi) * SKC_TILE_WIDTH); + + // + // Get starting numerator and denominator + // + // Note: if gh[0].dx is exactly 0.0f then this is a vertical + // gradient and can be handled by a special opcode. + // + // Note: the mad() ordering is slightly different than the original + // CUDA implementation. + // + union skc_gradient_vector const gv = { vload4(0,&commands[*cmd_next].f32) }; + + *cmd_next += 4; + + float const gv_x_dot = mad(x,gv.dx,gv.p0); + SKC_RENDER_GRADIENT_FLOAT const gv_numer = mad(y,gv.dy,gv_x_dot); + + // + // Where are columns along gradient vector? + // + // TODO: Note that the gv_denom isn't multiplied through. + // + // Please doublecheck this... but I recall that in certain cases + // this wipes out some precision and results in minor but noticeable + // gradient artifacts. + // + // All arguments are scalars except gv_numer so a simpler + // evaluation might save some flops. + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->grad[ii].distance = mad(gv.dx,(float)ii,gv_numer) * gv.denom; + + // + // is gradient non-repeating, repeating or reflecting? + // + switch (commands[(*cmd_next)++].u32) + { + case SKC_STYLING_GRADIENT_TYPE_LINEAR_NON_REPEATING: + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->grad[ii].distance = clamp(color->grad[ii].distance,0.0f,1.0f); + break; + + case SKC_STYLING_GRADIENT_TYPE_LINEAR_REPEATING: + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->grad[ii].distance -= floor(color->grad[ii].distance); + break; + + default: // PXL_STYLING_GRADIENT_TYPE_LINEAR_REFLECTING + // + // OPTIMIZATION: Can this be done in fewer than ~4 ops? + // + // Note: OpenCL "rint()" is round-to-nearest-even integer! + // + // Note: the floor() "round to -inf" op is implemented in the + // GEN op 'FRC' so probably don't use trunc() when floor will + // suffice. + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + SKC_RENDER_GRADIENT_FLOAT dist_abs = fabs(color->grad[ii].distance); + color->grad[ii].distance = fabs(dist_abs - rint(dist_abs)); + } + } + + // + // initialize "stoplerp" for all columns + // + uint const slope_count = commands[(*cmd_next)++].u32; + uint const gd_n_v1 = commands[(*cmd_next)++].u32; // REMOVE ME + + { + float const slope = commands[(*cmd_next)++].f32; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->grad[ii].stoplerp = color->grad[ii].distance * slope; + } + + // + // compute stoplerp for remaining stops + // + for (int jj=1; jj<slope_count; jj++) + { + float const floor = (float)jj; + float const slope = commands[(*cmd_next)++].f32; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->grad[ii].stoplerp = mad(min(0, color->grad[ii].stoplerp - floor),slope,color->grad[ii].stoplerp); + } + + // + // copy gradient colors to local memory + // + uint const gd_n = slope_count + 1; + +#ifndef SKC_RENDER_GRADIENT_IS_GLOBAL + // + // copy entire gradient descriptor to local memory + // + for (uint ii=skc_subgroup_lane(); ii<gd_n*4; ii+=SKC_RENDER_SUBGROUP_SIZE) + smem->cmds[ii].u32 = commands[*cmd_next + ii].u32; + + __local half const * const SKC_RESTRICT gc = smem->gc + 0; +#else + // + // prefetch entire gradient header + // + // no noticeable impact on performance + // + // prefetch(&commands[*cmd_next].u32,gh_words); + // + __global half const * const SKC_RESTRICT gc = commands[*cmd_next].f16a2 + 0; +#endif + + // + // adjust cmd_next so that V1 structure is consumed -- FIXME + // + *cmd_next += SKC_GRADIENT_CMD_WORDS_V2_ADJUST(gd_n_v1,gd_n); + + // + // lerp between color pair stops + // + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + // + // Finally, we have the gradient stop index and the color stop + // pair lerp fraction + // + // Note that if these are vector values then a gather operation + // must occur -- there may be platforms (AVX-512?) that can + // perform an explicit gather on a vector type but it's not + // really expressible in OpenCL except implicitly with a + // workgroup of work items. + // + // *********************** + // + // FIXME -- USE HERB'S SINGLE FMA LERP + // + // *********************** + // + SKC_RENDER_GRADIENT_STOP const gc_stop = SKC_CONVERT(SKC_RENDER_GRADIENT_STOP)(color->grad[ii].stoplerp); + SKC_RENDER_GRADIENT_FRAC const gc_frac = SKC_CONVERT(SKC_RENDER_GRADIENT_FRAC)(color->grad[ii].stoplerp - floor(color->grad[ii].stoplerp)); + + { + SKC_RENDER_TILE_COLOR lo, hi; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_TILE_COLOR_PAIR const cc = SKC_RENDER_TILE_COLOR_PAIR_LOAD(gc_stop C + 0,gc); \ + lo C = cc.lo; \ + hi C = cc.hi; \ + } + + SKC_RENDER_SCANLINE_VECTOR_EXPAND(); + + color->aN.rgba[ii].r = SKC_LERP(lo,hi,gc_frac); + } + + // + // + // + { + SKC_RENDER_TILE_COLOR lo, hi; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_TILE_COLOR_PAIR const cc = SKC_RENDER_TILE_COLOR_PAIR_LOAD(gc_stop C + gd_n,gc); \ + lo C = cc.lo; \ + hi C = cc.hi; \ + } + + SKC_RENDER_SCANLINE_VECTOR_EXPAND(); + + color->aN.rgba[ii].g = SKC_LERP(lo,hi,gc_frac); + } + + // + // + // + { + SKC_RENDER_TILE_COLOR lo, hi; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_TILE_COLOR_PAIR const cc = SKC_RENDER_TILE_COLOR_PAIR_LOAD(gc_stop C + gd_n*2,gc); \ + lo C = cc.lo; \ + hi C = cc.hi; \ + } + + SKC_RENDER_SCANLINE_VECTOR_EXPAND(); + + color->aN.rgba[ii].b = SKC_LERP(lo,hi,gc_frac); + } + + // + // + // + { + SKC_RENDER_TILE_COLOR lo, hi; + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_TILE_COLOR_PAIR const cc = SKC_RENDER_TILE_COLOR_PAIR_LOAD(gc_stop C + gd_n*3,gc); \ + lo C = cc.lo; \ + hi C = cc.hi; \ + } + + SKC_RENDER_SCANLINE_VECTOR_EXPAND(); + + color->aN.rgba[ii].a = SKC_LERP(lo,hi,gc_frac); + } + } +} + +// +// +// + +static +void +skc_tile_blend_over(union skc_tile_color * SKC_RESTRICT const color_acc, + union skc_tile_cover const * SKC_RESTRICT const cover_wip, + union skc_tile_color const * SKC_RESTRICT const color_wip) +{ + // + // fralunco = cover.wip * acc.a + // + // acc.r = fralunco * wip.r + acc.r + // acc.g = fralunco * wip.g + acc.g + // acc.b = fralunco * wip.b + acc.b + // acc.a = -fralunco * wip.a + acc.a + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + SKC_RENDER_TILE_COVER const fralunco = cover_wip->aN.c[ii] * color_acc->aN.rgba[ii].a; + + color_acc->aN.rgba[ii].r = mad(+fralunco,color_wip->aN.rgba[ii].r,color_acc->aN.rgba[ii].r); + color_acc->aN.rgba[ii].g = mad(+fralunco,color_wip->aN.rgba[ii].g,color_acc->aN.rgba[ii].g); + color_acc->aN.rgba[ii].b = mad(+fralunco,color_wip->aN.rgba[ii].b,color_acc->aN.rgba[ii].b); + color_acc->aN.rgba[ii].a = mad(-fralunco,color_wip->aN.rgba[ii].a,color_acc->aN.rgba[ii].a); + } +} + +// +// +// + +static +void +skc_tile_blend_plus(union skc_tile_color * SKC_RESTRICT const color_acc, + union skc_tile_cover const * SKC_RESTRICT const cover_wip, + union skc_tile_color const * SKC_RESTRICT const color_wip) +{ + // + // cover_min = min(cover.wip,a.acc) + // + // r.acc = cover_min * r.wip + r.acc + // g.acc = cover_min * g.wip + g.acc + // b.acc = cover_min * b.wip + b.acc + // a.acc = -cover_min * a.wip + a.acc + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + SKC_RENDER_TILE_COVER const cover_min = fmin(cover_wip->aN.c[ii],color_acc->aN.rgba[ii].a); + + color_acc->aN.rgba[ii].r = mad(+cover_min,color_wip->aN.rgba[ii].r,color_acc->aN.rgba[ii].r); + color_acc->aN.rgba[ii].g = mad(+cover_min,color_wip->aN.rgba[ii].g,color_acc->aN.rgba[ii].g); + color_acc->aN.rgba[ii].b = mad(+cover_min,color_wip->aN.rgba[ii].b,color_acc->aN.rgba[ii].b); + color_acc->aN.rgba[ii].a = mad(-cover_min,color_wip->aN.rgba[ii].a,color_acc->aN.rgba[ii].a); + } +} + +// +// +// + +static +void +skc_tile_blend_multiply(union skc_tile_color * SKC_RESTRICT const color_acc, + union skc_tile_cover const * SKC_RESTRICT const cover_wip, + union skc_tile_color const * SKC_RESTRICT const color_wip) +{ + // + // r.acc = (cover.wip * r.wip) * r.acc + // g.acc = (cover.wip * g.wip) * g.acc + // b.acc = (cover.wip * b.wip) * b.acc + // a.acc = (cover.wip * a.wip) * (1.0 - a.acc) <-- a.acc is already (1.0 - alpha) + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + color_acc->aN.rgba[ii].r *= cover_wip->aN.c[ii] * color_wip->aN.rgba[ii].r; + color_acc->aN.rgba[ii].g *= cover_wip->aN.c[ii] * color_wip->aN.rgba[ii].g; + color_acc->aN.rgba[ii].b *= cover_wip->aN.c[ii] * color_wip->aN.rgba[ii].b; + color_acc->aN.rgba[ii].a *= cover_wip->aN.c[ii] * color_wip->aN.rgba[ii].a; + } +} + +// +// +// + +static +void +skc_tile_blend_knockout(union skc_tile_cover * SKC_RESTRICT const cover_acc, + union skc_tile_color * SKC_RESTRICT const color_acc, + union skc_tile_cover const * SKC_RESTRICT const cover_wip, + union skc_tile_color const * SKC_RESTRICT const color_wip) +{ + // + // cover.wip.contrib = (1.0 - cover.acc) * cover.wip + // cover.acc = cover.acc + cover.wip.contrib + // + // r.acc = cover.wip.contrib * r.wip + r.acc + // g.acc = cover.wip.contrib * g.wip + g.acc + // b.acc = cover.wip.contrib * b.wip + b.acc + // a.acc = -cover.wip.contrib * a.wip * a.acc + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + SKC_RENDER_TILE_COVER const contrib = (1 - cover_acc->aN.c[ii]) * cover_wip->aN.c[ii]; + + cover_acc->aN.c[ii] += contrib; + + color_acc->aN.rgba[ii].r = mad(+contrib,color_wip->aN.rgba[ii].r,color_acc->aN.rgba[ii].r); + color_acc->aN.rgba[ii].g = mad(+contrib,color_wip->aN.rgba[ii].g,color_acc->aN.rgba[ii].g); + color_acc->aN.rgba[ii].b = mad(+contrib,color_wip->aN.rgba[ii].b,color_acc->aN.rgba[ii].b); + color_acc->aN.rgba[ii].a = mad(-contrib,color_wip->aN.rgba[ii].a,color_acc->aN.rgba[ii].a); + } +} + +// +// +// + +static +void +skc_tile_cover_msk_copy_wip(union skc_tile_cover * SKC_RESTRICT const cover_msk, + union skc_tile_cover const * SKC_RESTRICT const cover_wip) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover_msk->aN.c[ii] = cover_wip->aN.c[ii]; + +#else + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover_msk->vN.c[ii] = cover_wip->vN.c[ii]; + +#endif +} + +// +// +// + +static +void +skc_tile_cover_msk_copy_acc(union skc_tile_cover * SKC_RESTRICT const cover_msk, + union skc_tile_cover const * SKC_RESTRICT const cover_acc) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover_msk->aN.c[ii] = cover_acc->aN.c[ii]; + +#else + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNTN))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover_msk->vN.c[ii] = cover_acc->vN.c[ii]; + +#endif +} + +// +// +// + +static +void +skc_tile_cover_accumulate(union skc_tile_cover * SKC_RESTRICT const cover_acc, + union skc_tile_cover const * SKC_RESTRICT const cover_wip) +{ + // + // cover.wip.contrib = (1.0 - cover.acc) * cover.wip + // cover.acc = cover.acc + cover.wip.contrib + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover_acc->aN.c[ii] = mad(1 - cover_acc->aN.c[ii],cover_wip->aN.c[ii],cover_acc->aN.c[ii]); +} + +// +// +// + +static +void +skc_tile_cover_wip_mask(union skc_tile_cover * SKC_RESTRICT const cover_wip, + union skc_tile_cover const * SKC_RESTRICT const cover_msk) +{ + // + // cover.wip *= cover.msk + // + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover_wip->aN.c[ii] *= cover_msk->aN.c[ii]; +} + +// +// +// + +static +void +skc_tile_cover_wip_zero(union skc_tile_cover * SKC_RESTRICT const cover) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) // || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover->aN.c[ii] = 0; + +#else + // + // GEN9 compiler underperforms on this + // + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover->vN.c[ii] = 0; + +#endif +} + +static +void +skc_tile_cover_acc_zero(union skc_tile_cover * SKC_RESTRICT const cover) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) // || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover->aN.c[ii] = 0; + +#else + // + // GEN9 compiler underperforms on this + // + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover->vN.c[ii] = 0; + +#endif +} + +static +void +skc_tile_cover_msk_zero(union skc_tile_cover * SKC_RESTRICT const cover) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover->aN.c[ii] = 0; + +#else + // + // GEN9 compiler underperforms on this + // + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover->vN.c[ii] = 0; + +#endif +} + +// +// +// + +static +void +skc_tile_cover_msk_one(union skc_tile_cover * SKC_RESTRICT const cover) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover->aN.c[ii] = 1; + +#else + // + // GEN9 compiler underperforms on this + // + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover->vN.c[ii] = SKC_RENDER_TILE_COVER_VECTOR_ONE; + +#endif +} + +// +// +// + +static +void +skc_tile_cover_msk_invert(union skc_tile_cover * SKC_RESTRICT const cover) +{ +#if !defined( SKC_RENDER_TILE_COVER_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + cover->aN.c[ii] = 1 - cover->aN.c[ii]; + +#else + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COVER_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COVER_VECTOR_COUNT; ii++) + cover->vN.c[ii] = 1 - cover->vN.c[ii]; + +#endif +} + +// +// +// + +static +void +skc_tile_color_wip_zero(union skc_tile_color * SKC_RESTRICT const color) +{ +#if !defined( SKC_RENDER_TILE_COLOR_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + color->aN.rgba[ii].r = 0; + color->aN.rgba[ii].g = 0; + color->aN.rgba[ii].b = 0; + color->aN.rgba[ii].a = 1; + } + +#else + // + // DISABLED ON GEN9 -- probably a compiler bug + // + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].even.even = 0; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].odd.even = 0; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].even.odd = 0; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].odd.odd = 1; +#endif +} + +static +void +skc_tile_color_acc_zero(union skc_tile_color * SKC_RESTRICT const color) +{ +#if !defined( SKC_RENDER_TILE_COLOR_VECTOR ) || defined( SKC_ARCH_GEN9 ) + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + color->aN.rgba[ii].r = 0; + color->aN.rgba[ii].g = 0; + color->aN.rgba[ii].b = 0; + color->aN.rgba[ii].a = 1; + } + +#else + // + // DISABLED ON GEN9 -- probably a compiler bug + // + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].even.even = 0; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].odd.even = 0; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].even.odd = 0; + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + color->vN.rgba[ii].odd.odd = 1; +#endif +} + +// +// +// + +static +bool +skc_tile_color_test_opacity(union skc_tile_color const * SKC_RESTRICT const color) +{ + // + // returns true if tile is opaque + // + // various hacks to test for complete tile opacity + // + // note that front-to-back currently has alpha at 0.0f -- this can + // be harmonized to use a traditional alpha if we want to support + // rendering in either direction + // + // hack -- ADD/MAX/OR all alphas together and test for non-zero + // + SKC_RENDER_TILE_COLOR t = color->aN.rgba[0].a; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH-1))) + for (uint ii=1; ii<SKC_TILE_WIDTH; ii++) + t += color->aN.rgba[ii].a; + +#if ( SKC_RENDER_SUBGROUP_SIZE == 1 ) + // + // SIMD + // + return !any(t != ( 0 )); + +#elif ( SKC_RENDER_SCANLINE_VECTOR_SIZE == 1 ) + // + // SIMT - scalar per lane + // + return !sub_group_any(t != 0); + +#else + // + // SIMT - vector per lane + // + return !sub_group_any(any(t != ( 0 ))); + +#endif + + // + // TODO: The alternative vector-per-lane implementation below is + // *not* believed to be performant because the terse vector-wide + // test is just hiding a series of comparisons and is likely worse + // than the blind ADD/MAX/OR'ing of all alphas followed by a single + // test. + // +#if 0 + // + // SIMT - vector per lane + // + + // __attribute__((opencl_unroll_hint(SKC_RENDER_TILE_COLOR_VECTOR_COUNT-1))) + for (uint ii=0; ii<SKC_RENDER_TILE_COLOR_VECTOR_COUNT; ii++) + { + if (sub_group_any(any(color->vN.ba[ii].a != ( 0 )))) + return false; + } + + return true; +#endif +} + +// +// +// + +static +void +skc_tile_background_over(__global union skc_styling_cmd const * SKC_RESTRICT const commands, + uint * SKC_RESTRICT const cmd_next, + union skc_tile_color * SKC_RESTRICT const color) +{ + // + // acc.r = acc.a * r + acc.r + // acc.g = acc.a * g + acc.g + // acc.b = acc.a * b + acc.b + // + __global half const * const rgba_ptr = commands[*cmd_next].f16a2 + 0; + + *cmd_next += 2; + + SKC_RENDER_TILE_COLOR_PAIR const rg = SKC_RENDER_TILE_COLOR_PAIR_LOAD(0,rgba_ptr); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].r = mad(color->aN.rgba[ii].a,rg.lo,color->aN.rgba[ii].r); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].g = mad(color->aN.rgba[ii].a,rg.hi,color->aN.rgba[ii].g); + + SKC_RENDER_TILE_COLOR_PAIR const ba = SKC_RENDER_TILE_COLOR_PAIR_LOAD(1,rgba_ptr); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + color->aN.rgba[ii].b = mad(color->aN.rgba[ii].a,ba.lo,color->aN.rgba[ii].b); +} + +// +// +// + +// #define SKC_SURFACE_IS_BUFFER +#ifdef SKC_SURFACE_IS_BUFFER + +static +void +skc_surface_composite_u8_rgba(__global SKC_RENDER_SURFACE_U8_RGBA * SKC_RESTRICT const surface, + skc_uint const surface_pitch, + union skc_tile_color const * SKC_RESTRICT const color, + skc_ttck_hi_t const ttck_hi) +{ + // + // NEW MAJOR OPTIMIZATION: + // + // Rotating and rasterizing the original world transform by -90 + // degrees and then rendering the scene scene by +90 degrees enables + // all the final surface composite to be perfomed in perfectly + // coalesced wide transactions. + // + // For this reason, linear access to the framebuffer is preferred. + // + // vvvvvvvvvvvv OLD NOTE BELOW vvvvvvvvvvvvv + // + // NOTE THIS IS TRANSPOSED BY 90 DEGREES + // + // INTEL HAS A "BLOCK STORE" FEATURE THAT SOLVES THIS AND TEXTURE + // CACHES ARE ALSO PROBABLY SOMEWHAT FORGIVING. + // + // IT'S EASY TO TRANSPOSE THIS IN SMEM BEFORE STORING BUT IN THIS + // CPU EXAMPLE WE CAN PROBABLY DO WELL BY JUST WRITING OUT SCALARS + // + // FIXME -- NEED TO HARMONIZE BYTE AND COMPONENT COLOR CHANNEL + // ORDERING SO THAT COLOR CHANNELS MATCH 0xAARRGGBBAA ORDER + // + uint const pitch = surface_pitch / SKC_RENDER_SCANLINE_VECTOR_SIZE; + uint const x = skc_ttck_hi_get_x(ttck_hi); + uint const y = skc_ttck_hi_get_y(ttck_hi) ; + uint const base = x * SKC_TILE_WIDTH * pitch + y * (SKC_TILE_HEIGHT / SKC_RENDER_SCANLINE_VECTOR_SIZE) + skc_subgroup_lane(); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { + SKC_RENDER_SURFACE_U8_RGBA rgba = ( 0xFF000000 ); + + rgba |= SKC_CONVERT(SKC_RENDER_SURFACE_U8_RGBA)(color->aN.rgba[ii].r * 255); + rgba |= SKC_CONVERT(SKC_RENDER_SURFACE_U8_RGBA)(color->aN.rgba[ii].g * 255) << 8; + rgba |= SKC_CONVERT(SKC_RENDER_SURFACE_U8_RGBA)(color->aN.rgba[ii].b * 255) << 16; + + surface[base + ii * pitch] = rgba; + + // printf("%08v2X\n",rgba); + } +} + +#else + +static +void +skc_surface_composite_u8_rgba(__write_only image2d_t surface, + union skc_tile_color const * SKC_RESTRICT const color, + skc_ttck_hi_t const ttck_hi) +{ + // + // NEW MAJOR OPTIMIZATION: + // + // Rotating and rasterizing the original world transform by -90 + // degrees and then rendering the scene scene by +90 degrees enables + // all the final surface composite to be perfomed in perfectly + // coalesced wide transactions. + // + // For this reason, linear access to the framebuffer is preferred. + // + // vvvvvvvvvvvv OLD NOTE BELOW vvvvvvvvvvvvv + // + // NOTE THIS IS TRANSPOSED BY 90 DEGREES + // + // INTEL HAS A "BLOCK STORE" FEATURE THAT SOLVES THIS AND TEXTURE + // CACHES ARE ALSO PROBABLY SOMEWHAT FORGIVING. + // + // IT'S EASY TO TRANSPOSE THIS IN SMEM BEFORE STORING BUT IN THIS + // CPU EXAMPLE WE CAN PROBABLY DO WELL BY JUST WRITING OUT SCALARS + // + // FIXME -- NEED TO HARMONIZE BYTE AND COMPONENT COLOR CHANNEL + // ORDERING SO THAT COLOR CHANNELS MATCH 0xAARRGGBBAA ORDER + // + +#if 1 + int x = skc_ttck_hi_get_x(ttck_hi) * SKC_TILE_WIDTH; + int y = skc_ttck_hi_get_y(ttck_hi) * SKC_TILE_HEIGHT + (skc_subgroup_lane() * SKC_RENDER_SCANLINE_VECTOR_SIZE); + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { +#ifdef SKC_RENDER_TILE_COLOR_INTERLEAVED + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_SURFACE_WRITE(surface, \ + (int2)(x,y+I), \ + color->iN.rgba[ii] A); \ + } + +#else + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_SURFACE_COLOR const rgba = \ + (SKC_RENDER_SURFACE_COLOR) \ + (color->aN.rgba[ii].r C, \ + color->aN.rgba[ii].g C, \ + color->aN.rgba[ii].b C, \ + 1.0); \ + SKC_RENDER_SURFACE_WRITE(surface,(int2)(x,y+I),rgba); \ + } + +#endif + + SKC_RENDER_SCANLINE_VECTOR_EXPAND(); + + x += 1; + } +#else + int x = skc_ttck_hi_get_y(ttck_hi) * SKC_TILE_HEIGHT + (skc_subgroup_lane() * SKC_RENDER_SCANLINE_VECTOR_SIZE); + int y = skc_ttck_hi_get_x(ttck_hi) * SKC_TILE_WIDTH; + + // __attribute__((opencl_unroll_hint(SKC_TILE_WIDTH))) + for (uint ii=0; ii<SKC_TILE_WIDTH; ii++) + { +#ifdef SKC_RENDER_TILE_COLOR_INTERLEAVED + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_SURFACE_WRITE(surface, \ + (int2)(x+I,y+ii), \ + color->iN.rgba[ii] A); \ + } + +#else + +#undef SKC_EXPAND_X +#define SKC_EXPAND_X(I,S,C,P,A) { \ + SKC_RENDER_SURFACE_COLOR const rgba = \ + (SKC_RENDER_SURFACE_COLOR) \ + (color->aN.rgba[ii].r C, \ + color->aN.rgba[ii].g C, \ + color->aN.rgba[ii].b C, \ + 1.0); \ + SKC_RENDER_SURFACE_WRITE(surface,(int2)(x+I,y+ii),rgba); \ + } + +#endif + + SKC_RENDER_SCANLINE_VECTOR_EXPAND(); + } + +#endif +} + +#endif + +// +// +// +static +uint const +skc_ttck_lane(uint const ttck_idx) +{ + return ttck_idx & SKC_RENDER_SUBGROUP_MASK; +} + +// +// RENDER KERNEL +// + +__kernel +SKC_RENDER_KERNEL_ATTRIBS +void +skc_kernel_render(__global union skc_layer_node const * SKC_RESTRICT const layers, + __global struct skc_group_node const * SKC_RESTRICT const groups, + __global union skc_styling_cmd const * SKC_RESTRICT const commands, // FIXME -- rename + + __global skc_ttck_t const * SKC_RESTRICT const ttck_keys, // rename: keys + skc_uint const ttck_count, // rename: key_count + + __global uint const * SKC_RESTRICT const ttck_offsets, // rename: offsets + skc_uint const tile_count, // rename: offset_count + + __global skc_ttxb_t const * SKC_RESTRICT const ttxb_extent, +#ifdef SKC_SURFACE_IS_BUFFER + __global void * SKC_RESTRICT const surface, +#else + __write_only image2d_t surface, +#endif +#ifdef SKC_SURFACE_IS_BUFFER + skc_uint const surface_pitch, +#endif + uint4 const tile_clip) // rename: clip +{ + // + // Each subgroup is responsible for a tile. No extra subgroups are + // launched. + // + // FIXME -- might be better implemented as a "grid stride loop" if + // Intel GEN really has a local memory "quantum" of 4KB which means + // we would need to launch 4 subgroups per workgroup. + // + // Confirmed: GEN8 has 4KB SLM workgroup min while GEN9 is 1KB. + // + + // + // declare tile cover and color registers + // + // this used to be a neat unified struct but the Intel GEN compiler + // wasn't cooperating and spilling to private memory even though all + // registers were indexed by constants + // + union skc_tile_color color_wip; + union skc_tile_color color_acc; + + union skc_tile_cover cover_wip; + union skc_tile_cover cover_acc; + union skc_tile_cover cover_msk; + + // + // which subgroup in the grid is this? + // + // TAKE NOTE: the Intel GEN compiler is recognizing get_group_id(0) + // as a uniform but the alternative calculation used when there are + // multiple subgroups per workgroup is not cooperating and + // driving spillage elsewhere. + // +#if ( SKC_RENDER_WORKGROUP_SUBGROUPS == 1 ) + skc_uint const ttck_offset_idx = get_group_id(0); +#else + skc_uint const ttck_offset_idx = get_group_id(0) * SKC_RENDER_WORKGROUP_SUBGROUPS + get_sub_group_id(); +#endif + + // + // load the starting ttck for this offset and get a bound on the max + // number of keys that might be loaded + // + // these are uniform across all subgroup lanes + // + skc_uint ttck_idx = ttck_offsets[ttck_offset_idx]; + + // + // FIXME -- SIMD/CPU version should probaby load a 256-bit (4-wide) + // vector of ttck keys + // +#ifndef SKC_TARGET_ARCH_COALESCED_LOAD_TTCK + + skc_ttck_t ttck = ttck_keys[ttck_idx]; + +#else + + uint const ttck_base = ttck_idx & ~SKC_RENDER_SUBGROUP_MASK; + uint const ttck_lane = ttck_idx & SKC_RENDER_SUBGROUP_MASK; + skc_ttck_t ttck_s = ttck_keys[min(ttck_base+max(get_sub_group_local_id(),ttck_lane),ttck_count-1)] + +#endif + + // + // set up style group/layer state + // + struct skc_styling_group { + union skc_group_range range; + skc_uint depth; + skc_uint id; + } group; + + group.range.lo = 0; + group.range.hi = SKC_UINT_MAX; + group.depth = 0; + group.id = SKC_UINT_MAX; + + // + // start with clear tile opacity, knockout and flag bits + // + // uint color_acc_opacity = 0; // per lane bit mask -- assumes a PIXEL_TILE_HEIGHT <= 32 + // uint cover_acc_knockout = 0; // per lane bit mask -- assumes a PIXEL_TILE_HEIGHT <= 32 + // + skc_uint flags = 0; + + // + // declare and initialize accumulators + // +#if ( SKC_RENDER_WORKGROUP_SUBGROUPS == 1 ) + __local union skc_subgroup_smem smem[1]; +#else + __local union skc_subgroup_smem smem_wg[SKC_RENDER_WORKGROUP_SUBGROUPS]; + __local union skc_subgroup_smem * SKC_RESTRICT const smem = smem_wg + get_sub_group_id(); +#endif + +#ifdef SKC_TARGET_ARCH_COALESCED_LOAD_TTCK + // + // select the initial ttck key + // + skc_ttck_t ttck; +#if 0 + ttck = sub_group_broadcast(ttck_s,ttck_lane); // SHOULD WORK BUT .4454 COMPILER IS BROKEN +#else + ttck.lo = sub_group_broadcast(ttck_s.lo,ttck_lane); // EXPLICIT WORKAROUND + ttck.hi = sub_group_broadcast(ttck_s.hi,ttck_lane); +#endif + +#endif + + // + // save the first key so we know what tile we're in + // + skc_ttck_t ttck0 = ttck; + + // + // evaluate the coarse clip as late as possible + // + skc_uint const ttck_hi_x = skc_ttck_hi_get_x(ttck0.hi); + + if ((ttck_hi_x < tile_clip.lo.x) || (ttck_hi_x >= tile_clip.hi.x)) + return; + + skc_uint const ttck_hi_y = skc_ttck_hi_get_y(ttck0.hi); + + if ((ttck_hi_y < tile_clip.lo.y) || (ttck_hi_y >= tile_clip.hi.y)) + return; + +#if 0 + printf("< %u, %u >\n",ttck_hi_x,ttck_hi_y); +#endif + + // + // load -> scatter -> flush + // + while (true) + { + // if scattering is disabled then just run through ttck keys + bool const is_scatter_enabled = (flags & SKC_TILE_FLAGS_SCATTER_SKIP) == 0; + + // need to clear accumulators before a scatter loop + if (is_scatter_enabled) + { + skc_tile_aa_zero(smem); + } + + do { + // skip scattering? + if (is_scatter_enabled) + { + skc_block_id_t const xb_id = skc_ttck_lo_get_ttxb_id(ttck.lo); + + if (skc_ttck_lo_is_prefix(ttck.lo)) { + skc_scatter_ttpb(ttxb_extent,smem,xb_id); + } else { + skc_scatter_ttsb(ttxb_extent,smem,xb_id); + } + } + + // + // any ttck keys left? + // + if (++ttck_idx >= ttck_count) + { + flags |= SKC_TILE_FLAGS_FLUSH_FINALIZE; + break; + } + + // + // process next ttck key + // +#ifndef SKC_TARGET_ARCH_COALESCED_LOAD_TTCK + // + // SIMD -- read next key + // + ttck = ttck_keys[ttck_idx]; +#else + // + // SIMT -- refresh the ttck_s? + // + uint const ttck_lane_next = ttck_idx & SKC_RENDER_SUBGROUP_MASK; + + if (ttck_lane_next == 0) + ttck_s = ttck_keys[min(ttck_idx+get_sub_group_local_id(),ttck_count-1)]; + + // + // broadcast next key to entire subgroup + // +#if 0 + ttck = sub_group_broadcast(ttck_s,ttck_lane_next); // SHOULD WORK BUT .4454 COMPILER IS BROKEN +#else + ttck.lo = sub_group_broadcast(ttck_s.lo,ttck_lane_next); // EXPLICIT WORKAROUND + ttck.hi = sub_group_broadcast(ttck_s.hi,ttck_lane_next); +#endif +#endif + // continue scattering if on same YXL layer + } while (skc_ttck_equal_yxl(ttck0,ttck)); + + // finalize if no longer on same YX tile + if (!skc_ttck_hi_equal_yx(ttck0.hi,ttck.hi)) + { + // otherwise, unwind the tile styling and exit + flags |= SKC_TILE_FLAGS_FLUSH_FINALIZE; + } + + // + // given: new layer id from ttxk key + // + // load [layer id]{ group id, depth } + // + // if within current group's layer range + // + // if at same depth + // + // load and execute cover>[mask>]color>blend commands + // + // else if not at same depth then move deeper + // + // for all groups in group trail from cur depth to new depth + // enter group, saving and initializing regs as necessary + // increment depth and update layer range + // load and execute cover>[mask>]color>blend commands + // + // else not within layer range + // + // exit current group, restoring regs as necessary + // decrement depth and update layer range + // + // + skc_layer_id const layer_id_new = skc_ttck_get_layer(ttck0); // FIXME -- this was ttck_hi + union skc_layer_node const layer_node_new = layers[layer_id_new]; + + // clear flag that controls group/layer traversal + flags &= ~SKC_TILE_FLAGS_FLUSH_COMPLETE; + + do { + bool const unwind = (flags & SKC_TILE_FLAGS_FLUSH_UNWIND) != 0; + + // + // is layer a child of the current parent group? + // + uint cmd_next = 0; + + if (!unwind && (layer_node_new.parent == group.id)) + { + // execute this layer's cmds + cmd_next = layer_node_new.cmds; + + // if this is final then configure so groups get unwound, otherwise we're done + flags |= ((flags & SKC_TILE_FLAGS_FLUSH_FINALIZE) ? SKC_TILE_FLAGS_FLUSH_UNWIND : SKC_TILE_FLAGS_FLUSH_COMPLETE); + } + else if (!unwind && (layer_id_new >= group.range.lo && layer_id_new <= group.range.hi)) + { + // + // is layer in a child group? + // + union skc_group_parents const gp = groups[layer_node_new.parent].parents; + uint const gn = gp.depth - ++group.depth; + + if (gn == 0) + group.id = layer_node_new.parent; + else + group.id = commands[gp.base + gn - 1].parent; + + // update group layer range + group.range = groups[group.id].range; + + // enter current group + cmd_next = groups[group.id].cmds.enter; + } + else // otherwise, exit this group + { + // enter current group + cmd_next = groups[group.id].cmds.leave; + + // decrement group depth + if (--group.depth == 0) + { + flags |= SKC_TILE_FLAGS_FLUSH_COMPLETE; + } + else + { + // get path_base of current group + uint const gnpb = groups[group.id].parents.base; + + // get parent of current group + group.id = commands[gnpb].parent; + + // update group layer range + group.range = groups[group.id].range; + } + } + + // + // execute cmds + // + while (true) + { + union skc_styling_cmd const cmd = commands[cmd_next++]; + + switch (cmd.u32 & SKC_STYLING_OPCODE_MASK_OPCODE) + { + case SKC_STYLING_OPCODE_NOOP: + break; + + case SKC_STYLING_OPCODE_COVER_NONZERO: + skc_tile_cover_nonzero(smem,&cover_wip,&color_wip); + break; + + case SKC_STYLING_OPCODE_COVER_EVENODD: + skc_tile_cover_evenodd(smem,&cover_wip,&color_wip); + break; + + case SKC_STYLING_OPCODE_COVER_ACCUMULATE: + skc_tile_cover_accumulate(&cover_acc,&cover_wip); + break; + + case SKC_STYLING_OPCODE_COVER_MASK: + skc_tile_cover_wip_mask(&cover_wip,&cover_msk); + break; + + case SKC_STYLING_OPCODE_COVER_WIP_ZERO: + skc_tile_cover_wip_zero(&cover_wip); + break; + + case SKC_STYLING_OPCODE_COVER_ACC_ZERO: + skc_tile_cover_acc_zero(&cover_acc); + break; + + case SKC_STYLING_OPCODE_COVER_MASK_ZERO: + skc_tile_cover_msk_zero(&cover_msk); + break; + + case SKC_STYLING_OPCODE_COVER_MASK_ONE: + skc_tile_cover_msk_one(&cover_msk); + break; + + case SKC_STYLING_OPCODE_COVER_MASK_INVERT: + skc_tile_cover_msk_invert(&cover_msk); + break; + + case SKC_STYLING_OPCODE_COLOR_FILL_SOLID: + skc_tile_color_fill_solid(commands,&cmd_next,&color_wip); + break; + + case SKC_STYLING_OPCODE_COLOR_FILL_GRADIENT_LINEAR: + // + // FIXME -- gradients shouldn't be executing so much + // conditional driven code at runtime since we *know* + // the gradient style on the host can just create a + // new styling command to exploit this. + // + // FIXME -- it might be time to try using the GPU's + // sampler on a linear array of half4 vectors -- it + // might outperform the explicit load/lerp routines. + // + // FIXME -- optimizing for vertical gradients (uhhh, + // they're actually horizontal due to the -90 degree + // view transform) is nice but is it worthwhile to + // have this in the kernel? Easy to add it back... + // +#if defined( SKC_ARCH_GEN9 ) + // disable gradients due to exessive spillage -- fix later + cmd_next += SKC_GRADIENT_CMD_WORDS_V1(commands[cmd_next+6].u32); +#else + skc_tile_color_fill_gradient_linear_nonvertical(smem,commands,&cmd_next,&color_wip,ttck0.hi); +#endif + break; + + case SKC_STYLING_OPCODE_COLOR_WIP_ZERO: + skc_tile_color_wip_zero(&color_wip); + break; + + case SKC_STYLING_OPCODE_COLOR_ACC_ZERO: + skc_tile_color_acc_zero(&color_acc); + break; + + case SKC_STYLING_OPCODE_BLEND_OVER: + skc_tile_blend_over(&color_acc,&cover_wip,&color_wip); + break; + + case SKC_STYLING_OPCODE_BLEND_PLUS: + skc_tile_blend_plus(&color_acc,&cover_wip,&color_wip); + break; + + case SKC_STYLING_OPCODE_BLEND_MULTIPLY: + skc_tile_blend_multiply(&color_acc,&cover_wip,&color_wip); + break; + + case SKC_STYLING_OPCODE_BLEND_KNOCKOUT: + skc_tile_blend_knockout(&cover_acc,&color_acc,&cover_wip,&color_wip); + break; + + case SKC_STYLING_OPCODE_COVER_WIP_MOVE_TO_MASK: + // skc_tile_cover_msk_copy_wip(&cover_msk,&cover_wip); + break; + + case SKC_STYLING_OPCODE_COVER_ACC_MOVE_TO_MASK: + // skc_tile_cover_msk_copy_acc(&cover_msk,&cover_acc); + break; + + case SKC_STYLING_OPCODE_BACKGROUND_OVER: + skc_tile_background_over(commands,&cmd_next,&color_acc); + break; + + case SKC_STYLING_OPCODE_SURFACE_COMPOSITE: +#ifdef SKC_SURFACE_IS_BUFFER + skc_surface_composite_u8_rgba(surface,surface_pitch,&color_acc,ttck0.hi); +#else + skc_surface_composite_u8_rgba(surface, &color_acc,ttck0.hi); +#endif + break; + + case SKC_STYLING_OPCODE_COLOR_ACC_TEST_OPACITY: + if (skc_tile_color_test_opacity(&color_acc)) + flags |= SKC_TILE_FLAGS_SCATTER_SKIP; + break; + + default: + return; // this is an illegal opcode -- trap and die! + } + + // + // if sign bit is set then this was final command + // + if (cmd.s32 < 0) + break; + } + + // continue as long as tile flush isn't complete + } while ((flags & SKC_TILE_FLAGS_FLUSH_COMPLETE) == 0); + + // return if was the final flush + if (flags & SKC_TILE_FLAGS_FLUSH_FINALIZE) + return; + + // update wip ttck_hi + ttck0 = ttck; + } +} + +// +// +// diff --git a/src/compute/skc/runtime.h b/src/compute/skc/runtime.h new file mode 100644 index 0000000000..6050f9bcc1 --- /dev/null +++ b/src/compute/skc/runtime.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "allocator_host.h" + +// +// HOST MEMORY ALLOCATION +// + +void * +skc_runtime_host_perm_alloc(struct skc_runtime * const runtime, + skc_mem_flags_e const flags, + size_t const size); + +void +skc_runtime_host_perm_free(struct skc_runtime * const runtime, + void * const mem); + +void * +skc_runtime_host_temp_alloc(struct skc_runtime * const runtime, + skc_mem_flags_e const flags, + size_t const size, + skc_subbuf_id_t * const subbuf_id, + size_t * const subbuf_size); + +void +skc_runtime_host_temp_free(struct skc_runtime * const runtime, + void * const mem, + skc_subbuf_id_t const subbuf_id); + + +// +// +// diff --git a/src/compute/skc/runtime_cl.c b/src/compute/skc/runtime_cl.c new file mode 100644 index 0000000000..a745ed013e --- /dev/null +++ b/src/compute/skc/runtime_cl.c @@ -0,0 +1,362 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <assert.h> + +// +// +// + +#include "runtime_cl.h" +#include "common/cl/assert_cl.h" + +// +// +// + +static is_verbose = true; + +// +// FIXME -- all variable length device queries need to start querying +// the parameter's return size before getting its value +// +// FIXME -- this is now handled by the common/cl/find.* routine +// + +union skc_cl_device_version { + struct { + cl_uchar opencl_space[7]; // "OpenCL_" + cl_uchar major; + cl_uchar dot; + cl_uchar minor; +#if 1 // Intel NEO requires at least 16 bytes + cl_uchar space; + cl_uchar vendor[32]; +#endif + }; + struct { + cl_uchar aN[]; + }; +}; + +typedef cl_bitfield cl_diagnostic_verbose_level_intel; + +#define CL_CONTEXT_SHOW_DIAGNOSTICS_INTEL 0x4106 +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_BAD_INTEL 0x2 +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_GOOD_INTEL 0x1 +#define CL_CONTEXT_DIAGNOSTICS_LEVEL_NEUTRAL_INTEL 0x4 + +static +void +CL_CALLBACK +skc_context_callback(char const * error, void const * info, size_t size, void * user) +{ + if (info != NULL ) + { + fprintf(stderr,"%s\n",error); + } +} + +// +// +// + +skc_err +skc_runtime_cl_create(struct skc_runtime_cl * const runtime_cl, + char const * const target_platform_substring, + char const * const target_device_substring, + cl_context_properties context_properties[]) +{ + skc_err err = SKC_ERR_SUCCESS; + + // + // search available devices for a match + // +#define PLATFORM_IDS_MAX 16 +#define DEVICE_IDS_MAX 16 +#define PLATFORM_NAME_SIZE_MAX 64 +#define DEVICE_NAME_SIZE_MAX 64 +#define DRIVER_VERSION_SIZE_MAX 64 + + cl_int cl_err; + + cl_platform_id platform_ids[PLATFORM_IDS_MAX]; + cl_device_id device_ids [PLATFORM_IDS_MAX][DEVICE_IDS_MAX]; + + cl_uint platform_count; + cl_uint device_count[PLATFORM_IDS_MAX]; + + cl_uint platform_idx = UINT32_MAX, device_idx = UINT32_MAX; + + bool match = false; // find _first_ match + + // + // get number of platforms + // + cl(GetPlatformIDs(PLATFORM_IDS_MAX,platform_ids,&platform_count)); + + // + // search platforms + // + for (cl_uint ii=0; ii<platform_count; ii++) + { + char platform_name[PLATFORM_NAME_SIZE_MAX]; + + cl(GetPlatformInfo(platform_ids[ii], + CL_PLATFORM_NAME, + sizeof(platform_name), + platform_name, + NULL)); + + if (!match && (strstr(platform_name,target_platform_substring) != NULL)) + { + platform_idx = ii; + } + + if (is_verbose) { + fprintf(stdout,"%2u: %s\n",ii,platform_name); + } + + cl_err = clGetDeviceIDs(platform_ids[ii], + CL_DEVICE_TYPE_ALL, + DEVICE_IDS_MAX, + device_ids[ii], + device_count+ii); + + if (cl_err != CL_DEVICE_NOT_FOUND) + cl_ok(cl_err); + + for (cl_uint jj=0; jj<device_count[ii]; jj++) + { + char device_name[DEVICE_NAME_SIZE_MAX]; + union skc_cl_device_version device_version; + cl_uint device_align_bits; + char driver_version[DRIVER_VERSION_SIZE_MAX]; + + cl(GetDeviceInfo(device_ids[ii][jj], + CL_DEVICE_NAME, + sizeof(device_name), + device_name, + NULL)); + + // FIXME -- some of these variable length parameters should + // use the "size the param before reading" idiom + cl(GetDeviceInfo(device_ids[ii][jj], + CL_DEVICE_VERSION, + sizeof(device_version), + device_version.aN, + NULL)); + + cl(GetDeviceInfo(device_ids[ii][jj], + CL_DEVICE_MEM_BASE_ADDR_ALIGN, + sizeof(device_align_bits), + &device_align_bits, + NULL)); + + cl_uint const base_align = device_align_bits / 8; // bytes + + cl(GetDeviceInfo(device_ids[ii][jj], + CL_DRIVER_VERSION, + sizeof(driver_version), + driver_version, + NULL)); + + if (!match && (platform_idx == ii) && (strstr(device_name,target_device_substring) != NULL)) + { + match = true; + device_idx = jj; + + runtime_cl->version.major = device_version.major - 48; + runtime_cl->version.minor = device_version.minor - 48; + runtime_cl->base_align = base_align; + + if (is_verbose) { + fprintf(stdout," >>>"); + } + } + else if (is_verbose) + { + fprintf(stdout," "); + } + + if (is_verbose) { + fprintf(stdout, + " %1u: %s [ %s ] [ %s ] [ %u ]\n", + jj, + device_name, + device_version.aN, + driver_version, + base_align); + } + } + } + + if (is_verbose) { + fprintf(stdout,"\n"); + } + + // + // get target platform and device + // + if (platform_idx >= platform_count) + { + fprintf(stderr,"no match for target platform substring %s\n",target_platform_substring); + exit(EXIT_FAILURE); + } + if (device_idx >= device_count[platform_idx]) + { + fprintf(stderr,"no match for target device substring %s\n",target_device_substring); + exit(EXIT_FAILURE); + } + + runtime_cl->platform_id = platform_ids[platform_idx]; + runtime_cl->device_id = device_ids [platform_idx][device_idx]; + + // + // create context + // + +#if 0 + cl_context_properties context_properties[] = + { + CL_CONTEXT_PLATFORM,(cl_context_properties)runtime_cl->platform_id, + 0 + }; +#else + context_properties[1] = (cl_context_properties)runtime_cl->platform_id; +#endif + + runtime_cl->context = clCreateContext(context_properties, + 1, + &runtime_cl->device_id, + skc_context_callback, + NULL, + &cl_err); + cl_ok(cl_err); + + // + // get device name, driver version, and unified memory flag + // + if (is_verbose) + { + char device_name[DEVICE_NAME_SIZE_MAX]; + char driver_version[DRIVER_VERSION_SIZE_MAX]; + cl_bool device_is_unified; + cl_device_svm_capabilities svm_caps; + size_t printf_buffer_size; + + cl(GetDeviceInfo(runtime_cl->device_id, + CL_DEVICE_NAME, + sizeof(device_name), + device_name, + NULL)); + + cl(GetDeviceInfo(runtime_cl->device_id, + CL_DRIVER_VERSION, + sizeof(driver_version), + driver_version, + NULL)); + + cl(GetDeviceInfo(runtime_cl->device_id, + CL_DEVICE_HOST_UNIFIED_MEMORY, + sizeof(device_is_unified), + &device_is_unified, + NULL)); + + cl(GetDeviceInfo(runtime_cl->device_id, + CL_DEVICE_SVM_CAPABILITIES, + sizeof(svm_caps), + &svm_caps, + 0)); + + cl(GetDeviceInfo(runtime_cl->device_id, + CL_DEVICE_PRINTF_BUFFER_SIZE, + sizeof(printf_buffer_size), + &printf_buffer_size, + NULL)); + + fprintf(stderr, + "CL_DEVICE_SVM_COARSE_GRAIN_BUFFER %c\n" + "CL_DEVICE_SVM_FINE_GRAIN_BUFFER %c\n" + "CL_DEVICE_SVM_FINE_GRAIN_SYSTEM %c\n" + "CL_DEVICE_SVM_ATOMICS %c\n" + "CL_DEVICE_PRINTF_BUFFER_SIZE %zu\n\n", + svm_caps & CL_DEVICE_SVM_COARSE_GRAIN_BUFFER ? '*' : '-', + svm_caps & CL_DEVICE_SVM_FINE_GRAIN_BUFFER ? '*' : '-', + svm_caps & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM ? '*' : '-', + svm_caps & CL_DEVICE_SVM_ATOMICS ? '*' : '-', + printf_buffer_size); + } + + return err; +} + +// +// +// + +skc_err +skc_runtime_cl_dispose(struct skc_runtime_cl * const runtime_cl) +{ + // FIXME + printf("%s incomplete!\n",__func__); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +cl_command_queue +skc_runtime_cl_create_cq(struct skc_runtime_cl * const runtime_cl, skc_cq_type_e const type) +{ + cl_command_queue cq; + + if (runtime_cl->version.major < 2) + { + // + // <= OpenCL 1.2 + // + cl_int cl_err; + + cq = clCreateCommandQueue(runtime_cl->context, + runtime_cl->device_id, + (cl_command_queue_properties)type, + &cl_err); cl_ok(cl_err); + } + else + { + // + // >= OpenCL 2.0 + // + cl_int cl_err; + cl_queue_properties const queue_properties[] = { + CL_QUEUE_PROPERTIES,(cl_queue_properties)type,0 + }; + + cq = clCreateCommandQueueWithProperties(runtime_cl->context, + runtime_cl->device_id, + queue_properties, + &cl_err); cl_ok(cl_err); + } + + return cq; +} + +// +// +// + diff --git a/src/compute/skc/runtime_cl.h b/src/compute/skc/runtime_cl.h new file mode 100644 index 0000000000..9e58ca0cc7 --- /dev/null +++ b/src/compute/skc/runtime_cl.h @@ -0,0 +1,79 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// squelch OpenCL 1.2 deprecation warning +// + +#ifndef CL_USE_DEPRECATED_OPENCL_1_2_APIS +#define CL_USE_DEPRECATED_OPENCL_1_2_APIS +#endif + +#include <CL/opencl.h> + +// +// +// + +#include "skc.h" + +// +// Minimal OpenCL state needed by the runtime to get started +// + +struct skc_runtime_cl +{ + cl_platform_id platform_id; + cl_device_id device_id; + cl_context context; + + struct { + cl_uint major; + cl_uint minor; + } version; // sometimes we need to know this at runtime + + cl_uint base_align; // base address alignment for subbuffer origins +}; + +// +// +// + +typedef enum skc_cq_type_e { + SKC_CQ_TYPE_IN_ORDER = 0, + SKC_CQ_TYPE_OUT_OF_ORDER = CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, + SKC_CQ_TYPE_IN_ORDER_PROFILING = (SKC_CQ_TYPE_IN_ORDER | CL_QUEUE_PROFILING_ENABLE), + SKC_CQ_TYPE_OUT_OF_ORDER_PROFILING = (SKC_CQ_TYPE_OUT_OF_ORDER | CL_QUEUE_PROFILING_ENABLE), +} skc_cq_type_e; + +// +// safely creates a generic OpenCL target in very few lines +// + +skc_err +skc_runtime_cl_create(struct skc_runtime_cl * const runtime_cl, + char const * const target_platform_substring, + char const * const target_device_substring, + cl_context_properties context_properties[]); + +skc_err +skc_runtime_cl_dispose(struct skc_runtime_cl * const runtime_cl); + +// +// create a command queue with the non-deprecated function +// + +cl_command_queue +skc_runtime_cl_create_cq(struct skc_runtime_cl * const runtime_cl, skc_cq_type_e const type); + +// +// +// + diff --git a/src/compute/skc/runtime_cl_12.c b/src/compute/skc/runtime_cl_12.c new file mode 100644 index 0000000000..fca13edbbd --- /dev/null +++ b/src/compute/skc/runtime_cl_12.c @@ -0,0 +1,314 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +// +// +// + +#include "context.h" +#include "block.h" +#include "grid.h" +#include "common/cl/assert_cl.h" +#include "config_cl.h" +#include "runtime_cl.h" +#include "runtime_cl_12.h" +#include "export_cl_12.h" + +// +// +// + +static +void +skc_block_pool_create(struct skc_runtime * const runtime, cl_command_queue cq) +{ + // save size + runtime->block_pool.size = &runtime->config->block_pool; + + // create block extent + skc_extent_pdrw_alloc(runtime, + &runtime->block_pool.blocks, + runtime->block_pool.size->pool_size * + runtime->config->block.bytes); + + // allocate block pool ids + skc_extent_pdrw_alloc(runtime, + &runtime->block_pool.ids, + runtime->block_pool.size->ring_pow2 * sizeof(skc_uint)); + + // allocate block pool atomics + skc_extent_phr_pdrw_alloc(runtime, + &runtime->block_pool.atomics, + sizeof(union skc_block_pool_atomic)); + + // acquire pool id and atomic initialization kernels + cl_kernel k0 = skc_device_acquire_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_IDS); + cl_kernel k1 = skc_device_acquire_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_ATOMICS); + + // init ids + cl(SetKernelArg(k0,0,sizeof(runtime->block_pool.ids.drw),&runtime->block_pool.ids.drw)); + cl(SetKernelArg(k0,1,SKC_CL_ARG(runtime->block_pool.size->pool_size))); + + // the kernel grid is shaped by the target device -- always 2 for atomics + skc_device_enqueue_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_IDS, + cq,k0,runtime->block_pool.size->pool_size, + 0,NULL,NULL); + + // init atomics + cl(SetKernelArg(k1,0,sizeof(runtime->block_pool.atomics.drw),&runtime->block_pool.atomics.drw)); + cl(SetKernelArg(k1,1,SKC_CL_ARG(runtime->block_pool.size->pool_size))); + + // the kernel grid is shaped by the target device + skc_device_enqueue_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_BLOCK_POOL_INIT_ATOMICS, + cq,k1,2, + 0,NULL,NULL); + + // kickstart kernel execution + cl(Flush(cq)); + + // release kernels + cl(ReleaseKernel(k0)); + cl(ReleaseKernel(k1)); +} + +static +void +skc_block_pool_dispose(struct skc_runtime * const runtime) +{ + skc_extent_phr_pdrw_free(runtime,&runtime->block_pool.atomics); + skc_extent_pdrw_free (runtime,&runtime->block_pool.ids); + skc_extent_pdrw_free (runtime,&runtime->block_pool.blocks); +} + +// +// +// + +static +bool +skc_runtime_yield(struct skc_runtime * const runtime) +{ + return skc_scheduler_yield(runtime->scheduler); +} + +static +void +skc_runtime_wait(struct skc_runtime * const runtime) +{ + skc_scheduler_wait(runtime->scheduler); +} + +// +// +// + +skc_err +skc_runtime_cl_12_create(struct skc_context * const context, + char const * const target_platform_substring, + char const * const target_device_substring, + cl_context_properties context_properties[]) +{ + // allocate the runtime + struct skc_runtime * const runtime = malloc(sizeof(*runtime)); + + // acquire OpenCL ids and context for target device + skc_err err = skc_runtime_cl_create(&runtime->cl, + target_platform_substring, + target_device_substring, + context_properties); + + // create device + skc_device_create(runtime); + + // create the host and device allocators + skc_allocator_host_create(runtime); + skc_allocator_device_create(runtime); + + // how many slots in the scheduler? + runtime->scheduler = skc_scheduler_create(runtime,runtime->config->scheduler.size); + + // allocate deps structure + runtime->deps = skc_grid_deps_create(runtime, + runtime->scheduler, + runtime->config->block_pool.pool_size); + + // initialize cq pool + skc_cq_pool_create(runtime, + &runtime->cq_pool, + runtime->config->cq_pool.type, + runtime->config->cq_pool.size); + + // acquire in-order cq + cl_command_queue cq = skc_runtime_acquire_cq_in_order(runtime); + + // initialize block pool + skc_block_pool_create(runtime,cq); + + // intialize handle pool + skc_handle_pool_create(runtime, + &runtime->handle_pool, + runtime->config->handle_pool.size, + runtime->config->handle_pool.width, + runtime->config->handle_pool.recs); + + // + // initialize pfns + // + // FIXME -- at this point we will have identified which device we've + // targeted and will load a DLL (or select from a built-in library) + // that contains all the pfns. + // + context->runtime = runtime; + + context->yield = skc_runtime_yield; + context->wait = skc_runtime_wait; + + context->path_builder = skc_path_builder_cl_12_create; + context->path_retain = skc_runtime_path_host_retain; + context->path_release = skc_runtime_path_host_release; + context->path_flush = skc_runtime_path_host_flush; + + context->raster_builder = skc_raster_builder_cl_12_create; + context->raster_retain = skc_runtime_raster_host_retain; + context->raster_release = skc_runtime_raster_host_release; + context->raster_flush = skc_runtime_raster_host_flush; + + context->composition = skc_composition_cl_12_create; + context->styling = skc_styling_cl_12_create; + + context->surface = skc_surface_cl_12_create; + + // block on pool creation + cl(Finish(cq)); + + // dispose of in-order cq + skc_runtime_release_cq_in_order(runtime,cq); + + return err; +}; + +// +// +// + +skc_err +skc_runtime_cl_12_dispose(struct skc_context * const context) +{ + // + // FIXME -- incomplete + // + fprintf(stderr,"%s incomplete!\n",__func__); + + struct skc_runtime * runtime = context->runtime; + + skc_allocator_device_dispose(runtime); + skc_allocator_host_dispose(runtime); + + skc_scheduler_dispose(context->runtime,context->runtime->scheduler); + + skc_grid_deps_dispose(context->runtime->deps); + + skc_cq_pool_dispose(runtime,&runtime->cq_pool); + + skc_block_pool_dispose(context->runtime); + + // skc_handle_pool_dispose(context->runtime); + + return SKC_ERR_SUCCESS; +} + +// +// TEMPORARY BENCHMARK +// + +#if 1 + +#include <windows.h> + +#define SKC_FRAMES_MASK 0x7F +#define SKC_FRAMES (SKC_FRAMES_MASK + 1) + +void +skc_runtime_cl_12_debug(struct skc_context * const context) +{ +#ifdef NDEBUG + static skc_uint frames=0; + static LARGE_INTEGER StartingTime={0}, EndingTime; + + if ((frames++ & SKC_FRAMES_MASK) != SKC_FRAMES_MASK) + return; + + QueryPerformanceCounter(&EndingTime); + + LARGE_INTEGER ElapsedMicroseconds, Frequency; + + ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart; + + QueryPerformanceFrequency(&Frequency); + + double const msecs_total = 1000.0 * ElapsedMicroseconds.QuadPart / Frequency.QuadPart; + double const msecs_frame = msecs_total / SKC_FRAMES; + + printf("Frames / Total / Per : %u / %.3f / %.3f\n", + SKC_FRAMES,msecs_total,msecs_frame); +#endif + + struct skc_runtime * const runtime = context->runtime; + + // acquire out-of-order cq + cl_command_queue cq = skc_runtime_acquire_cq_in_order(runtime); + + // copy atomics to host + skc_extent_phr_pdrw_read(&runtime->block_pool.atomics,cq,NULL); + + // block until complete + cl(Finish(cq)); + + // dispose of out-of-order cq + skc_runtime_release_cq_in_order(runtime,cq); + + union skc_block_pool_atomic const * const bp_atomic = runtime->block_pool.atomics.hr; + + skc_uint const available = bp_atomic->writes - bp_atomic->reads; + skc_uint const inuse = runtime->config->block_pool.pool_size - available; + + fprintf(stderr,"w/r/f/a: %9u - %9u = %9u : %6.2f MB\n", + bp_atomic->writes, + bp_atomic->reads, + available, + (inuse * runtime->config->block.bytes) / (1024.0*1024.0)); + + if (available >= (1<<27)) + { + fprintf(stderr,"block pool corrupted!\n"); + exit(-1); + } + + // + // + // +#ifdef NDEBUG + QueryPerformanceCounter(&StartingTime); +#endif +} + +#endif + +// +// +// + diff --git a/src/compute/skc/runtime_cl_12.h b/src/compute/skc/runtime_cl_12.h new file mode 100644 index 0000000000..7e7ffcb284 --- /dev/null +++ b/src/compute/skc/runtime_cl_12.h @@ -0,0 +1,177 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "runtime.h" +#include "runtime_cl.h" +#include "cq_pool_cl.h" +#include "handle_pool_cl_12.h" +#include "block_pool_cl_12.h" +#include "allocator_device_cl.h" + +// +// FIXME -- two parts: +// +// 1. directly access the structures in the runtime sub-struct implementations +// 2. possibly wall off the non-platform-specific structs into a sub structure +// + +struct skc_runtime +{ + // + // state visible to device + // + struct skc_runtime_cl cl; + + struct { + struct skc_allocator_host host; + struct skc_allocator_device device; + } allocator; + + struct skc_cq_pool cq_pool; + + struct skc_block_pool block_pool; + + struct skc_handle_pool handle_pool; + + // + // state that is slightly opaque (for now) + // + struct skc_scheduler * scheduler; + + struct skc_grid_deps * deps; + + struct skc_config const * config; // FIXME: config will be determined by device with some opportunities to resize + + struct skc_device * device; // opaque bundle of kernels +}; + +// +// Creation and disposal intitializes context and may rely on other +// context resources like the scheduler +// + +skc_err +skc_runtime_cl_12_create(struct skc_context * const context, + char const * const target_platform_substring, + char const * const target_device_substring, + cl_context_properties context_properties[]); + +skc_err +skc_runtime_cl_12_dispose(struct skc_context * const context); + +// +// HOST HANDLE RETAIN/RELEASE/FLUSH +// + +skc_err +skc_runtime_path_host_retain(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count); + +skc_err +skc_runtime_raster_host_retain(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count); + + +skc_err +skc_runtime_path_host_release(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count); + +skc_err +skc_runtime_raster_host_release(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count); + + +skc_err +skc_runtime_path_host_flush(struct skc_runtime * const runtime, + skc_path_t const * paths, + uint32_t count); + +skc_err +skc_runtime_raster_host_flush(struct skc_runtime * const runtime, + skc_raster_t const * rasters, + uint32_t count); + +// +// DEVICE/PIPELINE HANDLE ACQUIRE/RETAIN/RELEASE +// +// The retain operations pre-validate handles +// + +skc_handle_t +skc_runtime_handle_device_acquire(struct skc_runtime * const runtime); + +skc_err +skc_runtime_handle_device_validate_retain(struct skc_runtime * const runtime, + skc_typed_handle_type_e const handle_type, + skc_typed_handle_t const * typed_handles, + uint32_t count); + +void +skc_runtime_handle_device_retain(struct skc_runtime * const runtime, + skc_handle_t const * handles, + uint32_t count); + +void +skc_runtime_path_device_release(struct skc_runtime * const runtime, + skc_handle_t const * handles, + uint32_t count); + +void +skc_runtime_raster_device_release(struct skc_runtime * const runtime, + skc_handle_t const * handles, + uint32_t count); + +// +// We only use in-order command queues in the pipeline +// + +cl_command_queue +skc_runtime_acquire_cq_in_order(struct skc_runtime * const runtime); + +void +skc_runtime_release_cq_in_order(struct skc_runtime * const runtime, + cl_command_queue cq); + +// +// DEVICE MEMORY ALLOCATION +// + +cl_mem +skc_runtime_device_perm_alloc(struct skc_runtime * const runtime, + cl_mem_flags const flags, + size_t const size); + +void +skc_runtime_device_perm_free(struct skc_runtime * const runtime, + cl_mem const mem); + +cl_mem +skc_runtime_device_temp_alloc(struct skc_runtime * const runtime, + cl_mem_flags const flags, + size_t const size, + skc_subbuf_id_t * const subbuf_id, + size_t * const subbuf_size); + +void +skc_runtime_device_temp_free(struct skc_runtime * const runtime, + cl_mem const mem, + skc_subbuf_id_t const subbuf_id); + +// +// +// diff --git a/src/compute/skc/scheduler.cpp b/src/compute/skc/scheduler.cpp new file mode 100644 index 0000000000..1099deb1ca --- /dev/null +++ b/src/compute/skc/scheduler.cpp @@ -0,0 +1,505 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// There is either no or limited support for C11 atomics in the C +// compilers we're targeting so, for now, implement this in C++11 +// + +// +// FIXME -- get rid of the extent and have supplicants bring their own +// task structure with a known base structure +// + +extern "C" { + +#include "scheduler.h" +#include "runtime_cl_12.h" // FIXME -- all allocations are extent structures + +} + +// +// SUPER-IMPORTANT: +// +// THIS LOW-LEVEL SCHEDULER ASSUMES THERE ARE A MAXIMUM NUMBER OF +// PIPELINE GRIDS ACTIVE AT ANY TIME +// +// THIS IS A SAFE INVARIANT BECAUSE WE CONTROL THE VARIOUS POOL SIZE +// KNOBS AT CONTEXT CONFIGURATION TIME +// +// TRANSLATION: DO NOT LARD UP THIS IMPLEMENTATION WITH WELL-INTENDED +// BUT ENTIRELY UNNECESSARY LOGIC +// + +#include <mutex> +#include <condition_variable> + +// +// GRID STATES +// + +typedef enum skc_scheduler_command_state { + + SKC_SCHEDULER_COMMAND_STATE_READY, + SKC_SCHEDULER_COMMAND_STATE_WAITING, + SKC_SCHEDULER_COMMAND_STATE_EXECUTING, + SKC_SCHEDULER_COMMAND_STATE_COMPLETED, + + SKC_SCHEDULER_COMMAND_STATE_COUNT + +} skc_scheduler_command_state; + +// +// +// + +struct skc_scheduler_command +{ + void * data; + skc_scheduler_command_pfn pfn; + skc_scheduler_command_state state; + char const * name; +}; + +#if 0 +struct skc_scheduler_command +{ + union { + struct scheduler * scheduler; + struct skc_scheduler_command * next; + }; + skc_scheduler_command_pfn pfn; +}; +#endif + +// +// +// + +struct skc_scheduler +{ + // + // FIXME -- consider adding a backpointer to the runtime or other + // critical state + // + + struct skc_scheduler_command * extent; + + struct { + std::mutex mutex; + + skc_ushort * indices; + skc_uint rem; + } available; + + struct { + std::mutex mutex; + std::condition_variable condvar; + + skc_ushort * indices; + skc_uint size; + skc_uint head; + skc_uint tail; + } waiting; +}; + +// +// +// + +#if 1 +#define SKC_SCHEDULER_EXECUTE(sc) \ + sc->pfn(sc->data) +#else +#define SKC_SCHEDULER_EXECUTE(sc) \ + fprintf(stderr,"EXECUTE+ %s\n",sc->name); \ + sc->pfn(sc->data); \ + fprintf(stderr,"EXECUTE- %s\n",sc->name); +#endif + +// +// +// + +struct skc_scheduler * +skc_scheduler_create(struct skc_runtime * const runtime, skc_uint const size) +{ + // allocate scheduler + struct skc_scheduler * scheduler = (struct skc_scheduler*) + skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*scheduler)); + + // execute various std:atomic constructors + new (scheduler) skc_scheduler(); + + // initialize members + scheduler->extent = (struct skc_scheduler_command*) + skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,(sizeof(*scheduler->extent) * size)); + + scheduler->available.indices = (skc_ushort*) + skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*scheduler->available.indices) * size); + + scheduler->available.rem = size; + + scheduler->waiting.indices = (skc_ushort*) + skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*scheduler->available.indices) * (size + 1)); + + scheduler->waiting.size = size + 1; // the ring has an extra slot + scheduler->waiting.head = 0; + scheduler->waiting.tail = 0; + + for (skc_uint ii=0; ii<size; ii++) + scheduler->available.indices[ii] = ii; + + return scheduler; +} + +void +skc_scheduler_dispose(struct skc_runtime * const runtime, + struct skc_scheduler * const scheduler) +{ + // free members + skc_runtime_host_perm_free(runtime,scheduler->waiting.indices); + skc_runtime_host_perm_free(runtime,scheduler->available.indices); + skc_runtime_host_perm_free(runtime,scheduler->extent); + + // execute various std:atomic destructors + scheduler->~skc_scheduler(); + + // free struct + skc_runtime_host_perm_free(runtime,scheduler); +} + +// +// +// + +static +skc_scheduler_command_t +skc_scheduler_acquire(struct skc_scheduler * const scheduler, + skc_scheduler_command_pfn pfn, + void * data, + char const * name) +{ + skc_scheduler_command_t command = SKC_SCHEDULER_COMMAND_INVALID; + + { + // mutex lock + std::lock_guard<std::mutex> lock(scheduler->available.mutex); + + // get first available index + if (scheduler->available.rem > 0) + command = scheduler->available.indices[--scheduler->available.rem]; + + // mutex unlock + } + + if (command != SKC_SCHEDULER_COMMAND_INVALID) + { + // initialize command + struct skc_scheduler_command * const sc = scheduler->extent + command; + + sc->pfn = pfn; + sc->data = data; + sc->name = name; + sc->state = SKC_SCHEDULER_COMMAND_STATE_READY; + } + + // return command handle + return command; +} + +// +// +// + +static +void +skc_scheduler_release(struct skc_scheduler * const scheduler, + skc_scheduler_command_t const command) +{ + // mutex lock + std::lock_guard<std::mutex> lock(scheduler->available.mutex); + + // get first available index + scheduler->available.indices[scheduler->available.rem++] = command; + + // mutex unlock +} + +// +// +// + +static +void +skc_scheduler_append(struct skc_scheduler * const scheduler, + skc_scheduler_command_t const command) +{ + scheduler->extent[command].state = SKC_SCHEDULER_COMMAND_STATE_WAITING; + + { + // mutex unique lock (locks on construction) + std::unique_lock<std::mutex> lock(scheduler->waiting.mutex); + + // note that we guarantee there is always room to store the command + + // append index to ring + scheduler->waiting.indices[scheduler->waiting.tail] = command; + + // update last + if (++scheduler->waiting.tail == scheduler->waiting.size) + scheduler->waiting.tail = 0; + + // mutex unlock + } + + // signal condvar + scheduler->waiting.condvar.notify_one(); +} + +// +// +// + +skc_scheduler_command_t +skc_scheduler_schedule(struct skc_scheduler * const scheduler, + skc_scheduler_command_pfn const pfn, + void * data, + char const * const name) +{ + while (true) + { + skc_scheduler_command_t const command = skc_scheduler_acquire(scheduler,pfn,data,name); + + if (command != SKC_SCHEDULER_COMMAND_INVALID) + { + skc_scheduler_append(scheduler,command); + + return command; + } + else + { + skc_scheduler_wait(scheduler); + } + } +} + +// +// try to pop but don't wait +// + +static +void +skc_scheduler_pop(struct skc_scheduler * const scheduler, + skc_scheduler_command_t * const command) +{ + *command = SKC_SCHEDULER_COMMAND_INVALID; + + // mutex lock + std::unique_lock<std::mutex> lock(scheduler->waiting.mutex); + + if (scheduler->waiting.head != scheduler->waiting.tail) + { + // get index at first + *command = scheduler->waiting.indices[scheduler->waiting.head]; + + // update first + if (++scheduler->waiting.head == scheduler->waiting.size) + scheduler->waiting.head = 0; + } + + // mutex unlock +} + +static +void +skc_scheduler_pop_wait(struct skc_scheduler * const scheduler, + skc_scheduler_command_t * const command) +{ + // mutex unique lock -- locks on construction + std::unique_lock<std::mutex> lock(scheduler->waiting.mutex); + + // wait for command + scheduler->waiting.condvar.wait(lock,[scheduler] { + return scheduler->waiting.head != scheduler->waiting.tail; + }); + + // get index at first + *command = scheduler->waiting.indices[scheduler->waiting.head]; + + // update first + if (++scheduler->waiting.head == scheduler->waiting.size) + scheduler->waiting.head = 0; + + // mutex unlock +} + +// +// +// + +static +void +skc_scheduler_command_execute(struct skc_scheduler_command * const sc) +{ + sc->state = SKC_SCHEDULER_COMMAND_STATE_EXECUTING; + + SKC_SCHEDULER_EXECUTE(sc); + + sc->state = SKC_SCHEDULER_COMMAND_STATE_COMPLETED; +} + +static +void +skc_scheduler_execute(struct skc_scheduler * const scheduler, + skc_scheduler_command_t const command) + +{ + // execute + skc_scheduler_command_execute(scheduler->extent + command); + + // release + skc_scheduler_release(scheduler,command); +} + +// +// drain the scheduler +// + +skc_bool +skc_scheduler_yield(struct skc_scheduler * const scheduler) // wait for 0 or more completed grids +{ + // fprintf(stderr,"YIELD+\n"); + + while (true) + { + skc_scheduler_command_t command; + + skc_scheduler_pop(scheduler,&command); + + if (command == SKC_SCHEDULER_COMMAND_INVALID) { + // fprintf(stderr,"YIELD!\n"); + return false; + } + + // otherwise execute the completion record + skc_scheduler_execute(scheduler,command); + } + + // fprintf(stderr,"YIELD-\n"); + + return true; +} + +// +// wait for at least one grid to complete +// + +void +skc_scheduler_wait(struct skc_scheduler * const scheduler) +{ + // fprintf(stderr,"WAIT+\n"); + + skc_scheduler_command_t command; + + // wait for a completion record + skc_scheduler_pop_wait(scheduler,&command); + + // execute the completion record + skc_scheduler_execute(scheduler,command); + + // process remaining + skc_scheduler_yield(scheduler); + + // fprintf(stderr,"WAIT-\n"); +} + +// +// wait for one grid to complete +// + +void +skc_scheduler_wait_one(struct skc_scheduler * const scheduler) +{ + // fprintf(stderr,"WAIT1+\n"); + + skc_scheduler_command_t command; + + // wait for a completion record + skc_scheduler_pop_wait(scheduler,&command); + + // execute the completion record + skc_scheduler_execute(scheduler,command); + + // fprintf(stderr,"WAIT1-\n"); +} + +// +// +// + +#if 0 + +// +// wait for a specific grid to complete +// +// true : success +// false : command wasn't started +// +// FIXME -- get rid of this idiom +// + +skc_bool +skc_scheduler_wait_for(struct skc_scheduler * const scheduler, + skc_scheduler_command_t const command) +{ + struct skc_scheduler_command * const sc = scheduler->extent + command; + + // command not started + if (sc->state == SKC_SCHEDULER_COMMAND_STATE_READY) + return false; // SKC_ERR_COMMAND_NOT_STARTED; + + // command is already complete + if (sc->state == SKC_SCHEDULER_COMMAND_STATE_COMPLETED) + return true; // SKC_ERR_SUCCESS; + + // force wip grids to start + // skc_grid_force(grid_wait_for); + + // otherwise, wait! + while (true) + { + skc_scheduler_command_t next; + + // wait for a completion record + skc_scheduler_pop_wait(scheduler,&next); + + // execute the completion record + skc_scheduler_execute(scheduler,next); + + // return if this was a match + if (next == command) + return true; // SKC_ERR_SUCCESS; + } +} + +// +// +// + +void +skc_thread_sleep(skc_ulong const msecs) +{ + std::this_thread::sleep_for(std::chrono::milliseconds(msecs)); +} + +#endif + +// +// +// diff --git a/src/compute/skc/scheduler.h b/src/compute/skc/scheduler.h new file mode 100644 index 0000000000..334cb0f69c --- /dev/null +++ b/src/compute/skc/scheduler.h @@ -0,0 +1,115 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// FIXME -- make the scheduler even more lightweight than it is. Move +// to an idiom where the scheduled task brings its own state instead +// of relying on an internal table. This will make it possible to +// reliably report the task's lifecycle and terminating state. +// + +#include "types.h" + +// +// +// + +#define SKC_SCHEDULER_SCHEDULE(s,c,d) skc_scheduler_schedule(s,c,d,#c) + +#ifndef NDEBUG + +#include <stdio.h> + +#define SKC_SCHEDULER_WAIT_WHILE(s,p) \ + while (p) { \ + fprintf(stderr,"WAITING ON: " #p "\n"); \ + skc_scheduler_wait(s); \ + } +#else +#define SKC_SCHEDULER_WAIT_WHILE(s,p) \ + while (p) { \ + skc_scheduler_wait(s); \ + } +#endif + +// +// +// + +#ifndef NDEBUG +#define SKC_CL_CB(s) fprintf(stderr,"CB+ %s = %d\n",__func__,s) +#else +#include <stdio.h> +#define SKC_CL_CB(s) +#endif + +// +// +// + +#define SKC_SCHEDULER_COMMAND_INVALID SKC_UINT_MAX + +typedef skc_uint skc_scheduler_command_t; + +typedef void (* skc_scheduler_command_pfn)(void * data); + +// +// +// + +struct skc_scheduler * +skc_scheduler_create(struct skc_runtime * const runtime, skc_uint const size); + +void +skc_scheduler_dispose(struct skc_runtime * const runtime, + struct skc_scheduler * const scheduler); + + +// +// +// + +skc_scheduler_command_t +skc_scheduler_schedule(struct skc_scheduler * const scheduler, + skc_scheduler_command_pfn const pfn, + void * data, + char const * const name); + +// +// +// + +skc_bool +skc_scheduler_yield(struct skc_scheduler * const scheduler); + +void +skc_scheduler_wait(struct skc_scheduler * const scheduler); + +void +skc_scheduler_wait_one(struct skc_scheduler * const scheduler); + +// +// FIXME -- get rid of these +// + +#if 0 + +skc_bool +skc_scheduler_wait_for(struct skc_scheduler * const scheduler, + skc_scheduler_command_t const command); + +void +skc_thread_sleep(skc_ulong const msecs); + +#endif + +// +// +// diff --git a/src/compute/skc/segment_ttck.cl b/src/compute/skc/segment_ttck.cl new file mode 100644 index 0000000000..6ac068bee6 --- /dev/null +++ b/src/compute/skc/segment_ttck.cl @@ -0,0 +1,131 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// NOTE THAT THE SEGMENT TTCK KERNEL IS ENTIRELY DEPENDENT ON THE +// LAYOUT OF THE TTCK KEY. IF THE TTCK KEY IS ALTERED THEN THIS +// KERNEL WILL NEED TO BE UPDATED +// + +#include <hs/cl/gen9/hs_cl_macros.h> + +#include "atomic_cl.h" +#include "tile.h" + +// +// +// + +#define HS_KEYS_PER_SLAB (HS_KEYS_PER_LANE * HS_LANES_PER_WARP) +#define HS_LANE_MASK (HS_LANES_PER_WARP - 1) + +// +// +// + +#define SKC_YX_NEQ(row,prev) \ + (((as_uint2(r##row).hi ^ as_uint2(r##prev).hi) & SKC_TTCK_HI_MASK_YX) != 0) + +// +// +// + +__kernel +__attribute__((intel_reqd_sub_group_size(HS_LANES_PER_WARP))) +void +skc_kernel_segment_ttck(__global HS_KEY_TYPE * SKC_RESTRICT const vout, + __global uint * SKC_RESTRICT const indices, + __global SKC_ATOMIC_UINT volatile * SKC_RESTRICT const atomics) +{ + uint const global_id = get_global_id(0); + uint const gmem_base = (global_id >> HS_LANES_PER_WARP_LOG2) * HS_KEYS_PER_SLAB; + uint const gmem_idx = gmem_base + (global_id & HS_LANE_MASK); + uint const lane_idx = gmem_base + (global_id & HS_LANE_MASK) * HS_KEYS_PER_LANE; + + // + // LOAD ALL THE ROWS + // +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + HS_KEY_TYPE const r##row = (vout + gmem_idx)[prev * HS_LANES_PER_WARP]; + + HS_SLAB_ROWS(); + + // + // LOAD LAST REGISTER FROM COLUMN TO LEFT + // + uint diffs = 0; + uint2 r0 = r1; + + if (gmem_base > 0) { + // if this is the first key in any slab but the first then it + // broadcast loads the last key in previous slab + r0.hi = as_uint2(vout[gmem_base - 1]).hi; + } else if (get_sub_group_local_id() == 0) { + // if this is the first lane in the first slab + diffs = 1; + } + + // now shuffle in the last key from the column to the left + r0.hi = intel_sub_group_shuffle_up(r0.hi,as_uint2(HS_REG_LAST(r)).hi,1); + + // + // FIND ALL DIFFERENCES IN SLAB + // + uint valid = 0; + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + valid |= ((r##row != SKC_ULONG_MAX) << prev); + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + diffs |= (SKC_YX_NEQ(row,prev) << prev); + + HS_SLAB_ROWS(); + + // + // SUM UP THE DIFFERENCES + // + uint const valid_diffs = valid & diffs; + uint const count = popcount(valid_diffs); + uint const inclusive = sub_group_scan_inclusive_add(count); + uint const exclusive = inclusive - count; + + // + // RESERVE SPACE IN THE INDICES ARRAY + // + uint next = 0; + + if (get_sub_group_local_id() == HS_LANES_PER_WARP-1) + next = atomic_add(atomics+1,inclusive); // FIXME -- need a symbolic offset + + // distribute base across subgroup + next = exclusive + sub_group_broadcast(next,HS_LANES_PER_WARP-1); + + // + // STORE THE INDICES + // +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (valid_diffs & (1 << prev)) \ + indices[next++] = lane_idx + prev; + + HS_SLAB_ROWS(); + + // + // TRANSPOSE THE SLAB AND STORE IT + // + HS_TRANSPOSE_SLAB(); +} + +// +// +// diff --git a/src/compute/skc/segment_ttrk.cl b/src/compute/skc/segment_ttrk.cl new file mode 100644 index 0000000000..28a9557ad7 --- /dev/null +++ b/src/compute/skc/segment_ttrk.cl @@ -0,0 +1,396 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// NOTE THAT THE SEGMENT TTRK KERNEL IS ENTIRELY DEPENDENT ON THE +// LAYOUT OF THE TTRK KEY. IF THE TTRK KEY IS ALTERED THEN THIS +// KERNEL WILL NEED TO BE UPDATED +// + +#include <hs/cl/gen9/hs_cl_macros.h> + +#include "tile.h" +#include "raster_builder_cl_12.h" // need meta_in structure +#include "device_cl_12_gen9.h" + +// +// +// + +#define HS_KEYS_PER_SLAB (HS_KEYS_PER_LANE * HS_LANES_PER_WARP) +#define HS_LANE_MASK (HS_LANES_PER_WARP - 1) + +// +// THE BEST TYPE TO ZERO SMEM +// + +#define SKC_ZERO_TYPE ulong +#define SKC_ZERO_WORDS 2 + +// +// THE ORDER OF COMPONENTS IS: +// +// 0: blocks +// 1: offset +// 2: pk +// 3: rk +// + +#if (HS_KEYS_PER_SLAB < 256) + +#define SKC_META_TYPE uint +#define SKC_META_WORDS 1 + +#define SKC_COMPONENT_TYPE uchar + +#else + +#define SKC_META_TYPE uint2 +#define SKC_META_WORDS 2 + +#define SKC_COMPONENT_TYPE ushort + +#endif + +// +// +// + +#if ( SKC_TTRK_HI_BITS_COHORT <= 8) +#define SKC_COHORT_TYPE uchar +#else +#define SKC_COHORT_TYPE ushort +#endif + +// +// +// + +#define SKC_COHORT_ID(row) \ + as_uint2(r##row).hi >> SKC_TTRK_HI_OFFSET_COHORT + +// +// FIXME -- THIS WILL BREAK IF EITHER THE YX BITS OR OFFSET ARE CHANGED +// + +#define SKC_IS_BLOCK(row) \ + ((as_uint2(r##row).lo & SKC_DEVICE_SUBBLOCKS_PER_BLOCK_MASK) == 0) + +#define SKC_YX(row,prev) \ + (as_uint2(r##row).hi ^ as_uint2(r##prev).hi) + +#define SKC_IS_PK(row,prev) \ + ((uint)(SKC_YX(row,prev) - 1) < SKC_TTRK_HI_MASK_X) + +// +// COHORT SIZE IS ALWAYS A POWER-OF-TWO +// SUBGROUP SIZE IS ALWAYS A POWER-OF-TWO +// +// COHORT SIZE >= SUBGROUP SIZE +// + +#define SKC_COHORT_SIZE (1<<SKC_TTRK_HI_BITS_COHORT) + +#define SKC_ZERO_RATIO (SKC_ZERO_WORDS / SKC_META_WORDS) +#define SKC_META_ZERO_COUNT (SKC_COHORT_SIZE * sizeof(SKC_META_TYPE) / sizeof(SKC_ZERO_TYPE)) +#define SKC_META_ZERO_REM (SKC_META_ZERO_COUNT & SKC_BITS_TO_MASK(HS_LANES_PER_WARP_LOG2)) + +#define SKC_META_COMPONENTS 4 +#define SKC_META_COMPONENT_COUNT (SKC_COHORT_SIZE * sizeof(SKC_META_TYPE) / sizeof(SKC_COMPONENT_TYPE)) + +// +// +// + +__kernel +__attribute__((intel_reqd_sub_group_size(HS_LANES_PER_WARP))) +void +skc_kernel_segment_ttrk(__global HS_KEY_TYPE * SKC_RESTRICT const vout, + __global uint * SKC_RESTRICT const metas) +{ + __local union + { + SKC_META_TYPE volatile m[SKC_COHORT_SIZE]; + SKC_ZERO_TYPE z[SKC_META_ZERO_COUNT]; + SKC_COMPONENT_TYPE c[SKC_META_COMPONENT_COUNT]; + } shared; + + uint const global_id = get_global_id(0); + uint const gmem_base = (global_id >> HS_LANES_PER_WARP_LOG2) * HS_KEYS_PER_SLAB; + uint const gmem_idx = gmem_base + (global_id & HS_LANE_MASK); + uint const gmem_off = (global_id & HS_LANE_MASK) * HS_KEYS_PER_LANE; + + // + // LOAD ALL THE ROWS + // +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + HS_KEY_TYPE const r##row = (vout + gmem_idx)[prev * HS_LANES_PER_WARP]; + + HS_SLAB_ROWS(); + + // + // LOAD LAST REGISTER FROM COLUMN TO LEFT + // + uint diffs = 0; + uint2 r0 = 0; + + if (gmem_base > 0) { + // if this is the first key in any slab but the first then it + // broadcast loads the last key in previous slab + r0.hi = as_uint2(vout[gmem_base - 1]).hi; + } else { + // otherwise broadcast the first key in the first slab + r0.hi = sub_group_broadcast(as_uint2(r1).hi,0); + // and mark it as an implicit diff + if (get_sub_group_local_id() == 0) + diffs = 1; + } + + // now shuffle in the last key from the column to the left + r0.hi = intel_sub_group_shuffle_up(r0.hi,as_uint2(HS_REG_LAST(r)).hi,1); + + // shift away y/x + SKC_COHORT_TYPE const c0 = r0.hi >> SKC_TTRK_HI_OFFSET_COHORT; + + // + // EXTRACT ALL COHORT IDS EARLY... + // +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + SKC_COHORT_TYPE c##row = SKC_COHORT_ID(row); + + HS_SLAB_ROWS(); + + // + // DEBUG + // +#if 0 + if (gmem_base == HS_KEYS_PER_SLAB * 7) + { + if (get_sub_group_local_id() == 0) + printf("\n%llX ",as_ulong(r0)); + else + printf("%llX ",as_ulong(r0)); +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (get_sub_group_local_id() == 0) \ + printf("\n%llX ",r##row); \ + else \ + printf("%llX ",r##row); + + HS_SLAB_ROWS(); + } +#endif + + // + // CAPTURE ALL CONDITIONS WE CARE ABOUT + // + // Diffs must be captured before cohorts + // + uint valid = 0; + uint blocks = 0; + uint pks = 0; + SKC_COHORT_TYPE c_max = 0; + + // + // FIXME -- IT'S UNCLEAR IF SHIFTING THE CONDITION CODE VS. AN + // EXPLICIT PREDICATE WILL GENERATE THE SAME CODE + // +#if 0 + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + diffs |= ((c##row != c##prev) << prev); + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + blocks |= (SKC_IS_BLOCK(row) << prev); + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + pks |= SKC_IS_PK(row,prev) << prev); + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + valid |= ((r##row != SKC_ULONG_MAX) << prev); + + HS_SLAB_ROWS(); + +#else + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (c##row != c##prev) \ + diffs |= 1<<prev; + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (SKC_IS_BLOCK(row)) \ + blocks |= 1<<prev; + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (SKC_IS_PK(row,prev)) \ + pks |= 1<<prev; + + HS_SLAB_ROWS(); + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (r##row != SKC_ULONG_MAX) { \ + valid |= 1<<prev; \ + c_max = max(c_max,c##row); \ + } + + HS_SLAB_ROWS(); + +#endif + + // + // TRANSPOSE THE SLAB AND STORE IT + // + HS_TRANSPOSE_SLAB(); + + // the min cohort is the first key in the slab + uint const c_min = sub_group_broadcast(c1,0); + + // the max cohort is the max across all lanes + c_max = sub_group_reduce_max(c_max); + +#if 0 // REMOVE ME LATER + if (get_sub_group_local_id() == 0) + printf("%3u : ( %3u , %3u )\n", + get_global_id(0)>>HS_LANES_PER_WARP_LOG2,c_min,c_max); +#endif + + // + // ZERO SMEM + // + // zero only the meta info for the cohort ids found in this slab + // +#if (SKC_ZERO_WORDS >= SKC_META_WORDS) + uint zz = ((c_min / SKC_ZERO_RATIO) & ~HS_LANE_MASK) + get_sub_group_local_id(); + uint const zz_max = (c_max + SKC_ZERO_RATIO - 1) / SKC_ZERO_RATIO; + + for (; zz<=zz_max; zz+=HS_LANES_PER_WARP) + shared.z[zz] = 0; +#else + // ERROR -- it's highly unlikely that the zero type is smaller than + // the meta type +#error("Unsupported right now...") +#endif + + // + // ACCUMULATE AND STORE META INFO + // + uint const valid_blocks = valid & blocks; + uint const valid_pks = valid & pks & ~diffs; + SKC_META_TYPE meta = ( 0 ); + +#define SKC_META_LOCAL_ADD(meta) \ + atomic_add(shared.m+HS_REG_LAST(c),meta); + +#define SKC_META_LOCAL_STORE(meta,prev) \ + shared.m[c##prev] = meta; + + // note this is purposefully off by +1 +#define SKC_META_RESET(meta,curr) \ + meta = ((gmem_off + curr) << 8); + +#if 0 + + // FIXME -- this can be tweaked to shift directly +#define SKC_META_ADD(meta,prev,blocks,pks,rks) \ + meta += ((((blocks >> prev) & 1) ) | \ + (((pks >> prev) & 1) << 16) | \ + (((rks >> prev) & 1) << 24)); + +#else + +#define SKC_META_ADD(meta,prev,blocks,pks,rks) \ + if (blocks & (1<<prev)) \ + meta += 1; \ + if (pks & (1<<prev)) \ + meta += 1<<16; \ + if (rks & (1<<prev)) \ + meta += 1<<24; + +#endif + +#undef HS_SLAB_ROW +#define HS_SLAB_ROW(row,prev) \ + if (diffs & (1<<prev)) { \ + SKC_META_LOCAL_STORE(meta,prev); \ + SKC_META_RESET(meta,row); \ + } \ + SKC_META_ADD(meta,prev, \ + valid_blocks, \ + valid_pks, \ + valid); + + HS_SLAB_ROWS(); + + // + // ATOMICALLY ADD THE CARRIED OUT METAS + // +#if 0 // BUG + if ((valid & (1<<(HS_KEYS_PER_LANE-1))) && (meta != 0)) + SKC_META_LOCAL_ADD(meta); +#else + if (meta != 0) + SKC_META_LOCAL_ADD(meta); +#endif + + // + // NOW ATOMICALLY ADD ALL METAS TO THE GLOBAL META TABLE + // + + // convert the slab offset to an extent offset + bool const is_offset = (get_sub_group_local_id() & 3) == 1; + uint const adjust = is_offset ? gmem_base - 1 : 0; + + // + // only process the meta components found in this slab + // + uint const cc_min = c_min * SKC_META_COMPONENTS; + uint const cc_max = c_max * SKC_META_COMPONENTS + SKC_META_COMPONENTS - 1; + uint cc = (cc_min & ~HS_LANE_MASK) + get_sub_group_local_id(); + + if ((cc >= cc_min) && (cc <= cc_max)) + { + uint const c = shared.c[cc]; + + if (c != 0) + atomic_add(metas+cc,c+adjust); + } + + cc += HS_LANES_PER_WARP; + + for (; cc<=cc_max; cc+=HS_LANES_PER_WARP) + { + uint const c = shared.c[cc]; + + if (c != 0) + atomic_add(metas+cc,c+adjust); + } +} + +// +// +// diff --git a/src/compute/skc/skc.h b/src/compute/skc/skc.h new file mode 100644 index 0000000000..e46b6a9d25 --- /dev/null +++ b/src/compute/skc/skc.h @@ -0,0 +1,497 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_SKC +#define SKC_ONCE_SKC + +// +// FIXME -- get rid of these here +// + +#include <stdint.h> +#include <stdbool.h> + +// +// +// + +#include "skc_styling.h" // FIXME -- skc_styling +// #include "skc_err.h" + +// +// FIXME -- move errors to an skc prefixed include +// + +typedef enum skc_err { + + SKC_ERR_SUCCESS = 0, + + SKC_ERR_API_BASE = 10000, + + SKC_ERR_NOT_IMPLEMENTED = SKC_ERR_API_BASE, + + SKC_ERR_POOL_EMPTY, + + SKC_ERR_CONDVAR_WAIT, + + SKC_ERR_LAYER_ID_INVALID, + SKC_ERR_LAYER_NOT_EMPTY, + + SKC_ERR_TRANSFORM_WEAKREF_INVALID, + SKC_ERR_STROKE_STYLE_WEAKREF_INVALID, + + SKC_ERR_COMMAND_NOT_READY, + SKC_ERR_COMMAND_NOT_COMPLETED, + SKC_ERR_COMMAND_NOT_STARTED, + + SKC_ERR_COMMAND_NOT_READY_OR_COMPLETED, + + SKC_ERR_COMPOSITION_SEALED, + SKC_ERR_STYLING_SEALED, + + SKC_ERR_HANDLE_INVALID, + SKC_ERR_HANDLE_OVERFLOW, + + SKC_ERR_COUNT + +} skc_err; + +// +// SPINEL TYPES +// + +typedef struct skc_context * skc_context_t; +typedef struct skc_path_builder * skc_path_builder_t; +typedef struct skc_raster_builder * skc_raster_builder_t; + +typedef struct skc_composition * skc_composition_t; +typedef struct skc_styling * skc_styling_t; + +typedef struct skc_surface * skc_surface_t; + +#if 0 +typedef struct skc_interop * skc_interop_t; +typedef uint32_t skc_interop_surface_t; +#endif + +typedef uint32_t skc_path_t; +typedef uint32_t skc_raster_t; + +typedef uint32_t skc_layer_id; +typedef uint32_t skc_group_id; + +typedef uint32_t skc_styling_cmd_t; + +typedef uint64_t skc_weakref_t; +typedef skc_weakref_t skc_transform_weakref_t; +typedef skc_weakref_t skc_raster_clip_weakref_t; + +// +// FIXME -- bury all of this +// + +#define SKC_STYLING_CMDS(...) _countof(__VA_ARGS__),__VA_ARGS__ +#define SKC_GROUP_IDS(...) _countof(__VA_ARGS__),__VA_ARGS__ + +// +// +// + +#define SKC_PATH_INVALID UINT32_MAX +#define SKC_RASTER_INVALID UINT32_MAX +#define SKC_WEAKREF_INVALID UINT64_MAX + +// +// TRANSFORM LAYOUT: { sx shx tx shy sy ty w0 w1 } +// + +extern float const * const skc_transform_identity_ptr; // { 1, 0, 0, 0, 1, 0, 0, 0 } + +// +// RASTER CLIP LAYOUT: { x0, y0, x1, y1 } +// + +extern float const * const skc_raster_clip_default_ptr; + +// +// CONTEXT +// + +skc_err +skc_context_create(skc_context_t * context, + char const * target_platform_substring, + char const * target_device_substring, + intptr_t context_properties[]); + +skc_err +skc_context_retain(skc_context_t context); + +skc_err +skc_context_release(skc_context_t context); + +skc_err +skc_context_reset(skc_context_t context); + +// +// COORDINATED EXTERNAL OPERATIONS +// + +/* + Examples include: + + - Transforming an intermediate layer with a blur, sharpen, rotation or scaling kernel. + - Subpixel antialiasing using neighboring pixel color and coverage data. + - Performing a blit from one region to another region on a surface. + - Blitting from one surface to another. + - Loading and processing from one region and storing to another region. + - Rendezvousing with an external pipeline. +*/ + +// +// +// + +bool +skc_context_yield(skc_context_t context); + +void +skc_context_wait(skc_context_t context); + +// +// PATH BUILDER +// + +skc_err +skc_path_builder_create(skc_context_t context, skc_path_builder_t * path_builder); + +skc_err +skc_path_builder_retain(skc_path_builder_t path_builder); + +skc_err +skc_path_builder_release(skc_path_builder_t path_builder); + +// +// PATH OPS +// + +skc_err +skc_path_begin(skc_path_builder_t path_builder); + +skc_err +skc_path_end(skc_path_builder_t path_builder, skc_path_t * path); + +skc_err +skc_path_retain(skc_context_t context, skc_path_t const * paths, uint32_t count); + +skc_err +skc_path_release(skc_context_t context, skc_path_t const * paths, uint32_t count); + +skc_err +skc_path_flush(skc_context_t context, skc_path_t const * paths, uint32_t count); + +// +// PATH SEGMENT OPS +// + +// +// FIXME -- we need a bulk/vectorized path segment operation +// + +skc_err +skc_path_move_to(skc_path_builder_t path_builder, + float x0, float y0); + +skc_err +skc_path_close(skc_path_builder_t path_builder); + +skc_err +skc_path_line_to(skc_path_builder_t path_builder, + float x1, float y1); + +skc_err +skc_path_cubic_to(skc_path_builder_t path_builder, + float x1, float y1, + float x2, float y2, + float x3, float y3); + +skc_err +skc_path_cubic_smooth_to(skc_path_builder_t path_builder, + float x2, float y2, + float x3, float y3); + +skc_err +skc_path_quad_to(skc_path_builder_t path_builder, + float x1, float y1, + float x2, float y2); + +skc_err +skc_path_quad_smooth_to(skc_path_builder_t path_builder, + float x2, float y2); + +skc_err +skc_path_ellipse(skc_path_builder_t path_builder, + float cx, float cy, + float rx, float ry); + +// +// RASTER BUILDER +// + +skc_err +skc_raster_builder_create(skc_context_t context, skc_raster_builder_t * raster_builder); + +skc_err +skc_raster_builder_retain(skc_raster_builder_t raster_builder); + +skc_err +skc_raster_builder_release(skc_raster_builder_t raster_builder); + +// +// RASTER OPS +// + +skc_err +skc_raster_begin(skc_raster_builder_t raster_builder); + +skc_err +skc_raster_end(skc_raster_builder_t raster_builder, skc_raster_t * raster); + +skc_err +skc_raster_retain(skc_context_t context, skc_raster_t const * rasters, uint32_t count); + +skc_err +skc_raster_release(skc_context_t context, skc_raster_t const * rasters, uint32_t count); + +skc_err +skc_raster_flush(skc_context_t context, skc_raster_t const * rasters, uint32_t count); + +// +// PATH-TO-RASTER OPS +// + +// +// FIXME -- do we need a bulk/vectorized "add filled" function? +// + +skc_err +skc_raster_add_filled(skc_raster_builder_t raster_builder, + skc_path_t path, + skc_transform_weakref_t * transform_weakref, + float const * transform, + skc_raster_clip_weakref_t * raster_clip_weakref, + float const * raster_clip); + +// +// COMPOSITION STATE +// + +skc_err +skc_composition_create(skc_context_t context, skc_composition_t * composition); + +skc_err +skc_composition_retain(skc_composition_t composition); + +skc_err +skc_composition_release(skc_composition_t composition); + +skc_err +skc_composition_place(skc_composition_t composition, + skc_raster_t const * rasters, + skc_layer_id const * layer_ids, + float const * txs, + float const * tys, + uint32_t count); // NOTE: A PER-PLACE CLIP IS POSSIBLE + +skc_err +skc_composition_seal(skc_composition_t composition); + +skc_err +skc_composition_unseal(skc_composition_t composition, bool reset); + +skc_err +skc_composition_get_bounds(skc_composition_t composition, int32_t bounds[4]); + +#if 0 +// let's switch to a per place bounds using weakrefs -- clip 0 will be largest clip +skc_err +skc_composition_set_clip(skc_composition_t composition, int32_t const clip[4]); +#endif + +// +// TODO: COMPOSITION "SET ALGEBRA" OPERATIONS +// +// Produce a new composition from the union or intersection of two +// existing compositions +// + +// +// TODO: COMPOSITION "HIT DETECTION" +// +// Report which layers and tiles are intersected by one or more +// device-space (x,y) points +// + +// +// STYLING STATE +// + +skc_err +skc_styling_create(skc_context_t context, + skc_styling_t * styling, + uint32_t layers_count, + uint32_t groups_count, + uint32_t extras_count); + +skc_err +skc_styling_retain(skc_styling_t styling); + +skc_err +skc_styling_release(skc_styling_t styling); + +skc_err +skc_styling_seal(skc_styling_t styling); + +skc_err +skc_styling_unseal(skc_styling_t styling); // FIXME + +skc_err +skc_styling_reset(skc_styling_t styling); // FIXME -- make unseal reset + +// +// STYLING GROUPS AND LAYERS +// + +skc_err +skc_styling_group_alloc(skc_styling_t styling, + skc_group_id * group_id); + +skc_err +skc_styling_group_enter(skc_styling_t styling, + skc_group_id group_id, + uint32_t n, + skc_styling_cmd_t const * cmds); + +skc_err +skc_styling_group_leave(skc_styling_t styling, + skc_group_id group_id, + uint32_t n, + skc_styling_cmd_t const * cmds); + +skc_err +skc_styling_group_parents(skc_styling_t styling, + skc_group_id group_id, + uint32_t depth, + skc_group_id const * parents); + +skc_err +skc_styling_group_range_lo(skc_styling_t styling, + skc_group_id group_id, + skc_layer_id layer_lo); + +skc_err +skc_styling_group_range_hi(skc_styling_t styling, + skc_group_id group_id, + skc_layer_id layer_hi); + +skc_err +skc_styling_group_layer(skc_styling_t styling, + skc_group_id group_id, + skc_layer_id layer_id, + uint32_t n, + skc_styling_cmd_t const * cmds); + +// +// STYLING ENCODERS -- FIXME -- WILL EVENTUALLY BE OPAQUE +// + +void +skc_styling_layer_fill_rgba_encoder(skc_styling_cmd_t * cmds, float const rgba[4]); + +void +skc_styling_background_over_encoder(skc_styling_cmd_t * cmds, float const rgba[4]); + +void +skc_styling_layer_fill_gradient_encoder(skc_styling_cmd_t * cmds, + float x0, + float y0, + float x1, + float y1, + skc_styling_gradient_type_e type, + uint32_t n, + float const stops[], + float const colors[]); + +// +// SURFACE +// + +// +// FIXME - surface create needs to be able to specify different +// surface targets here that are a function of the surface type and +// rendering model: CL/global, GL/buffer, simple SRCOVER model, +// complex group-based PDF rendering model, etc. +// + +skc_err +skc_surface_create(skc_context_t context, skc_surface_t * surface); + +skc_err +skc_surface_retain(skc_surface_t surface); + +skc_err +skc_surface_release(skc_surface_t surface); + +// skc_interop_surface_t +// skc_surface_interop_surface_get(skc_surface_t surface); + +// +// NO NO NO -- SKC will always be a client of some other platform so +// handle things like blits and clears there unless it's something +// unique like an SKC tile-based clear/blit. +// +// (temporarily implement these for testing porpoises) +// + +skc_err +skc_surface_clear(skc_surface_t surface, + float const rgba[4], + uint32_t const rect[4], + void * fb); + +skc_err +skc_surface_blit(skc_surface_t surface, + uint32_t const rect[4], + int32_t const txty[2]); + +// +// SURFACE RENDER +// + +typedef void (*skc_surface_render_pfn_notify)(skc_surface_t surface, + skc_styling_t styling, + skc_composition_t composition, + void * data); +skc_err +skc_surface_render(skc_surface_t surface, + uint32_t const clip[4], + skc_styling_t styling, + skc_composition_t composition, + skc_surface_render_pfn_notify notify, + void * data, + void * fb); // FIXME FIXME + +// +// +// + +#endif + +// +// +// + diff --git a/src/compute/skc/skc_styling.h b/src/compute/skc/skc_styling.h new file mode 100644 index 0000000000..73cc4fc516 --- /dev/null +++ b/src/compute/skc/skc_styling.h @@ -0,0 +1,90 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_SKC_STYLING +#define SKC_ONCE_SKC_STYLING + +// +// STYLING COMMANDS +// +// FIXME -- THESE ARE PLATFORM "CAPABILITIES" AND PRESENCE OF ANY +// EXOTIC NON-CORE COMMANDS SHOULD BE DETERMINED AT RUNTIME +// + +typedef enum skc_styling_opcode_e { + + SKC_STYLING_OPCODE_NOOP, + + SKC_STYLING_OPCODE_COVER_NONZERO, + SKC_STYLING_OPCODE_COVER_EVENODD, + SKC_STYLING_OPCODE_COVER_ACCUMULATE, + SKC_STYLING_OPCODE_COVER_MASK, + + SKC_STYLING_OPCODE_COVER_WIP_ZERO, + SKC_STYLING_OPCODE_COVER_ACC_ZERO, + SKC_STYLING_OPCODE_COVER_MASK_ZERO, + SKC_STYLING_OPCODE_COVER_MASK_ONE, + SKC_STYLING_OPCODE_COVER_MASK_INVERT, + + SKC_STYLING_OPCODE_COLOR_FILL_SOLID, + SKC_STYLING_OPCODE_COLOR_FILL_GRADIENT_LINEAR, + + SKC_STYLING_OPCODE_COLOR_WIP_ZERO, + SKC_STYLING_OPCODE_COLOR_ACC_ZERO, + + SKC_STYLING_OPCODE_BLEND_OVER, + SKC_STYLING_OPCODE_BLEND_PLUS, + SKC_STYLING_OPCODE_BLEND_MULTIPLY, + SKC_STYLING_OPCODE_BLEND_KNOCKOUT, + + SKC_STYLING_OPCODE_COVER_WIP_MOVE_TO_MASK, + SKC_STYLING_OPCODE_COVER_ACC_MOVE_TO_MASK, + + SKC_STYLING_OPCODE_BACKGROUND_OVER, + + SKC_STYLING_OPCODE_SURFACE_COMPOSITE, + + SKC_STYLING_OPCODE_COLOR_ACC_TEST_OPACITY, + + // + // + // + + SKC_STYLING_OPCODE_COUNT, + + // + // + // + + SKC_STYLING_OPCODE_IS_FINAL = 0x80000000 + +} skc_styling_opcode_e; + +// +// +// + +typedef enum skc_styling_gradient_type_e { + + SKC_STYLING_GRADIENT_TYPE_LINEAR_NON_REPEATING, + SKC_STYLING_GRADIENT_TYPE_LINEAR_REPEATING, + SKC_STYLING_GRADIENT_TYPE_LINEAR_REFLECTING, + + SKC_STYLING_GRADIENT_TYPE_COUNT + +} skc_styling_gradient_type_e; + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/styling.c b/src/compute/skc/styling.c new file mode 100644 index 0000000000..5653e203a7 --- /dev/null +++ b/src/compute/skc/styling.c @@ -0,0 +1,398 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#include <memory.h> + +#include "styling.h" +#include "styling_types.h" +#include "skc.h" + +// +// FIXME -- x86'isms are temporary +// + +#include <immintrin.h> + +// +// +// + +skc_err +skc_styling_retain(skc_styling_t styling) +{ + styling->ref_count += 1; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_release(skc_styling_t styling) +{ + // + // blocks and waits if grid is active + // + styling->release(styling->impl); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_seal(skc_styling_t styling) +{ + // + // no-op if sealed + // + styling->seal(styling->impl); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_unseal(skc_styling_t styling) +{ + // + // no-op if unsealed + // blocks and waits if sealed and grid is active + // + styling->unseal(styling->impl,false); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_reset(skc_styling_t styling) +{ + styling->unseal(styling->impl,true); + + styling->layers.count = 0; + styling->groups.count = 0; + styling->extras.count = 0; + + return SKC_ERR_SUCCESS; +} + +// +// FIXME -- various robustifications can be made to this builder but +// we don't want to make this heavyweight too soon +// +// - out of range layer_id is an error +// - extras[] overflow is an error +// + +skc_err +skc_styling_group_alloc(skc_styling_t styling, + skc_group_id * group_id) +{ + styling->unseal(styling->impl,true); + + *group_id = styling->groups.count++; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_group_enter(skc_styling_t styling, + skc_group_id group_id, + uint32_t n, + skc_styling_cmd_t const * cmds) +{ + styling->unseal(styling->impl,true); + + styling->groups.extent[group_id].cmds.enter = styling->extras.count; + + memcpy(styling->extras.extent + styling->extras.count,cmds,n * sizeof(*cmds)); + + styling->extras.count += n; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_group_leave(skc_styling_t styling, + skc_group_id group_id, + uint32_t n, + skc_styling_cmd_t const * cmds) +{ + styling->unseal(styling->impl,true); + + styling->groups.extent[group_id].cmds.leave = styling->extras.count; + + memcpy(styling->extras.extent + styling->extras.count,cmds,n * sizeof(*cmds)); + + styling->extras.count += n; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_group_parents(skc_styling_t styling, + skc_group_id group_id, + uint32_t depth, + skc_group_id const * parents) +{ + styling->unseal(styling->impl,true); + + styling->groups.extent[group_id].parents = (union skc_group_parents) + { + .depth = depth, + .base = styling->extras.count + }; + + memcpy(styling->extras.extent + styling->extras.count,parents,depth * sizeof(*parents)); + + styling->extras.count += depth; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_group_range_lo(skc_styling_t styling, + skc_group_id group_id, + skc_layer_id layer_lo) +{ + styling->unseal(styling->impl,true); + + styling->groups.extent[group_id].range.lo = layer_lo; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_group_range_hi(skc_styling_t styling, + skc_group_id group_id, + skc_layer_id layer_hi) +{ + styling->unseal(styling->impl,true); + + styling->groups.extent[group_id].range.hi = layer_hi; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_styling_group_layer(skc_styling_t styling, + skc_group_id group_id, + skc_layer_id layer_id, + uint32_t n, + skc_styling_cmd_t const * cmds) +{ + styling->unseal(styling->impl,true); + + styling->layers.extent[layer_id] = (union skc_layer_node) + { + .cmds = styling->extras.count, + .parent = group_id + }; + + memcpy(styling->extras.extent + styling->extras.count,cmds,n * sizeof(*cmds)); + + styling->extras.count += n; + + return SKC_ERR_SUCCESS; +} + +// +// FIXME -- get rid of these x86'isms ASAP -- let compiler figure it +// out with a vector type +// + +static +__m128i +skc_convert_colors_4(float const * const colors) +{ + __m128i c; + + c = _mm_cvtps_ph(*(__m128*)colors,0); + + return c; +} + +static +__m128i +skc_convert_colors_8(float const * const colors) +{ + __m128i c; + + c = _mm256_cvtps_ph(*(__m256*)colors,0); + + return c; +} + +// +// +// + +static +void +skc_styling_layer_cmd_rgba_encoder(skc_styling_cmd_t * const cmds, + skc_styling_opcode_e const opcode, + float const rgba[4]) +{ + __m128i const c = skc_convert_colors_4(rgba); + + cmds[0] = opcode; + cmds[1] = c.m128i_u32[0]; + cmds[2] = c.m128i_u32[1]; +} + +void +skc_styling_background_over_encoder(skc_styling_cmd_t * cmds, float const rgba[4]) +{ + skc_styling_layer_cmd_rgba_encoder(cmds,SKC_STYLING_OPCODE_BACKGROUND_OVER,rgba); +} + +void +skc_styling_layer_fill_rgba_encoder(skc_styling_cmd_t * cmds, float const rgba[4]) +{ + // encode a solid fill + skc_styling_layer_cmd_rgba_encoder(cmds,SKC_STYLING_OPCODE_COLOR_FILL_SOLID,rgba); +} + +// +// +// + +void +skc_styling_layer_fill_gradient_encoder(skc_styling_cmd_t * cmds, + float x0, + float y0, + float x1, + float y1, + skc_styling_gradient_type_e type, + uint32_t n, + float const stops[], + float const colors[]) +{ + union skc_styling_cmd * const cmds_u = (union skc_styling_cmd *)cmds; + + // + // encode a gradient fill + // + cmds_u[0].opcode = SKC_STYLING_OPCODE_COLOR_FILL_GRADIENT_LINEAR; + + float const dx = x1 - x0; + float const dy = y1 - y0; + float const c1 = x0 * dx + y0 * dy; + float const c2 = x1 * dx + y1 * dy; + + cmds_u[1].f32 = dx; // dx + cmds_u[2].f32 = -c1; // p0 + cmds_u[3].f32 = dy; // dy + cmds_u[4].f32 = 1.0f / (c2 - c1); // denom + + // + // store type + // + cmds_u[5].gradient_type = type; + + // + // Write out slopes + // + // Note: make sure that that the first and last stop pairs don't + // have a span of zero. Why? Because it's meaningless and the + // zero-span stops can simply be dropped. + // + // And obviously the stops need to monotonically increasing. + // + // These validations can be perfomed elsewhere. + // + // After a pile of simple algebra the slope necessary to map a stop + // percentage on [0,1] to an INDEX.LERP real number from [0.0,N.0] + // is simply: + // + // delta_stop_prev + // slope_curr = --------------- - 1 + // delta_stop_curr + // + // Each delta stop equal to zero reduces the stop count by 1. + // + // Note that color pairs are what's stored so this simplified + // representation works for both linear gradients with non-zero + // delta stops and linear gradients that double-up the stops in + // order to produce "stripes". + // + float ds_prev = stops[1] - stops[0]; + union skc_styling_cmd * const slopes = cmds_u + 8; + + slopes[0].f32 = 1.0f / ds_prev; + + uint32_t ds_count = 1; + + for (uint32_t ii=1; ii<n-1; ii++) + { + float const ds_curr = stops[ii+1] - stops[ii]; + + if (ds_curr > 0.0f) + { + slopes[ds_count++].f32 = ds_prev / ds_curr - 1.0f; + ds_prev = ds_curr; + } + } + + // + // save a potentially compressed delta slope count + // + cmds_u[6].u32 = ds_count; + cmds_u[7].u32 = n; // REMOVE ME -------------------------------------------- REMOVE + + // + // FIXME -- encode color pair as a single color diff as noted by HERB @ CHAP <------------- FIXME + // + + // + // write out color pairs while skipping delta stops equal to zero + // + uint32_t const color_count = ds_count + 1; + + union skc_styling_cmd * color_r = cmds_u + 8 + ds_count; + union skc_styling_cmd * color_g = color_r + color_count; + union skc_styling_cmd * color_b = color_r + color_count * 2; + union skc_styling_cmd * color_a = color_r + color_count * 3; + + for (uint32_t ii=0; ii<n-1; ii++) + { + if (stops[ii+1] > stops[ii]) + { + __m128i const c = skc_convert_colors_8(colors+ii*4); + + color_r->u16v2.lo = c.m128i_u16[0]; + color_r->u16v2.hi = c.m128i_u16[4]; + color_g->u16v2.lo = c.m128i_u16[1]; + color_g->u16v2.hi = c.m128i_u16[5]; + color_b->u16v2.lo = c.m128i_u16[2]; + color_b->u16v2.hi = c.m128i_u16[6]; + color_a->u16v2.lo = c.m128i_u16[3]; + color_a->u16v2.hi = c.m128i_u16[7]; + + ++color_r; + ++color_g; + ++color_b; + ++color_a; + } + } + + float laststop[8]; // sentinel to lerp against same color + + for (int ii=0; ii<4; ii++) + laststop[ii+4] = laststop[ii] = colors[(n-1)*4+ii]; + + __m128i const c = skc_convert_colors_8(laststop); + + color_r->u16v2.lo = c.m128i_u16[0]; + color_r->u16v2.hi = c.m128i_u16[4]; + color_g->u16v2.lo = c.m128i_u16[1]; + color_g->u16v2.hi = c.m128i_u16[5]; + color_b->u16v2.lo = c.m128i_u16[2]; + color_b->u16v2.hi = c.m128i_u16[6]; + color_a->u16v2.lo = c.m128i_u16[3]; + color_a->u16v2.hi = c.m128i_u16[7]; +} + +// +// +// diff --git a/src/compute/skc/styling.h b/src/compute/skc/styling.h new file mode 100644 index 0000000000..7f20c1e489 --- /dev/null +++ b/src/compute/skc/styling.h @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "types.h" + +// +// STYLING +// + +struct skc_styling +{ + struct skc_context * context; + + struct skc_styling_impl * impl; + + void (* seal )(struct skc_styling_impl * const impl); + void (* unseal )(struct skc_styling_impl * const impl, skc_bool const block); + void (* release)(struct skc_styling_impl * const impl); + + skc_int ref_count; + + struct { + union skc_layer_node * extent; + skc_uint size; + skc_uint count; + } layers; + + struct { + struct skc_group_node * extent; + skc_uint size; + skc_uint count; + } groups; + + struct { + union skc_styling_cmd * extent; + skc_uint size; + skc_uint count; + } extras; +}; + +// +// +// + diff --git a/src/compute/skc/styling_cl_12.c b/src/compute/skc/styling_cl_12.c new file mode 100644 index 0000000000..6c84fe6f70 --- /dev/null +++ b/src/compute/skc/styling_cl_12.c @@ -0,0 +1,339 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// NOTES: +// +// - this particular object only needs a command queue for a short +// time so consider acquiring/releasing the command queue on demand +// but only if command queues are cached and expensive to keep +// + +#include "common/cl/assert_cl.h" + +#include "styling_cl_12.h" +#include "extent_cl_12.h" +#include "runtime_cl_12.h" + +#include "context.h" +#include "styling_types.h" + +// +// +// + +static +void +skc_styling_unmap_complete(skc_grid_t const grid) +{ + struct skc_styling_impl * const impl = skc_grid_get_data(grid); + + impl->state = SKC_STYLING_STATE_SEALED; + + skc_grid_complete(grid); +} + +static +void +skc_styling_unmap_cb(cl_event event, cl_int status, skc_grid_t const grid) +{ + SKC_CL_CB(status); + + struct skc_styling_impl * const impl = skc_grid_get_data(grid); + struct skc_scheduler * const scheduler = impl->runtime->scheduler; + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(scheduler,skc_styling_unmap_complete,grid); +} + +static +void +skc_styling_grid_pfn_execute(skc_grid_t const grid) +{ + struct skc_styling_impl * const impl = skc_grid_get_data(grid); + struct skc_styling * const styling = impl->styling; + + // + // unmap all extents + // + cl_event complete; + + skc_extent_phwN_pdrN_unmap(&impl->layers,styling->layers.extent,impl->cq,NULL); + skc_extent_phwN_pdrN_unmap(&impl->groups,styling->groups.extent,impl->cq,NULL); + skc_extent_phwN_pdrN_unmap(&impl->extras,styling->extras.extent,impl->cq,&complete); + + // set the event + cl(SetEventCallback(complete,CL_COMPLETE,skc_styling_unmap_cb,grid)); + cl(ReleaseEvent(complete)); + + // flush command queue + cl(Flush(impl->cq)); +} + +// +// +// + +static +void +skc_styling_pfn_seal(struct skc_styling_impl * const impl) +{ + // return if sealing or sealed + if (impl->state >= SKC_STYLING_STATE_SEALING) + return; + + struct skc_runtime * const runtime = impl->runtime; + struct skc_scheduler * const scheduler = runtime->scheduler; + + // + // otherwise, wait for UNSEALING > UNSEALED transition + // + if (impl->state == SKC_STYLING_STATE_UNSEALING) + { + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_STYLING_STATE_UNSEALED); + } + + // + // we're unsealed so we need to seal and start the grid + // + impl->state = SKC_STYLING_STATE_SEALING; + impl->grid = SKC_GRID_DEPS_ATTACH(runtime->deps, + NULL, + impl, + NULL, // no waiting + skc_styling_grid_pfn_execute, + NULL); // no dispose + + // no need to force -- styling has no dependencies + skc_grid_start(impl->grid); +} + +// +// +// + +void +skc_styling_unseal_complete(struct skc_styling_impl * const impl) +{ + struct skc_runtime * const runtime = impl->runtime; + + // we're now unsealed + impl->state = SKC_STYLING_STATE_UNSEALED; +} + +static +void +skc_styling_unseal_cb(cl_event event, cl_int status, struct skc_styling_impl * const impl) +{ + SKC_CL_CB(status); + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(impl->runtime->scheduler,skc_styling_unseal_complete,impl); +} + +static +void +skc_styling_pfn_unseal(struct skc_styling_impl * const impl, skc_bool const block) +{ + // return if already unsealed + if (impl->state == SKC_STYLING_STATE_UNSEALED) + return; + + // + // otherwise, we're going to need to pump the scheduler + // + struct skc_runtime * const runtime = impl->runtime; + struct skc_scheduler * const scheduler = runtime->scheduler; + + // + // wait for UNSEALING > UNSEALED transition + // + if (impl->state == SKC_STYLING_STATE_UNSEALING) + { + if (block) { + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_STYLING_STATE_UNSEALED); + } + return; + } + + // + // otherwise, wait for SEALING > SEALED transition ... + // + if (impl->state == SKC_STYLING_STATE_SEALING) + { + // wait if sealing + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_STYLING_STATE_SEALED); + } + + // wait for rendering locks to be released + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->lock_count > 0); + + // ... and then unseal the styling object + impl->state = SKC_STYLING_STATE_UNSEALING; + + // defensively NULL the grid reference + impl->grid = NULL; // defensive + + // set styling pointers with mapped extents + cl_event complete; + + struct skc_styling * const styling = impl->styling; + + styling->layers.extent = skc_extent_phwN_pdrN_map(&impl->layers,impl->cq,NULL); + styling->groups.extent = skc_extent_phwN_pdrN_map(&impl->groups,impl->cq,NULL); + styling->extras.extent = skc_extent_phwN_pdrN_map(&impl->extras,impl->cq,&complete); + + cl(SetEventCallback(complete,CL_COMPLETE,skc_styling_unseal_cb,impl)); + cl(ReleaseEvent(complete)); + + // flush it + cl(Flush(impl->cq)); + + // wait until unsealed... + if (block) { + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_STYLING_STATE_UNSEALED); + } +} + +// +// +// + +static +void +skc_styling_pfn_release(struct skc_styling_impl * const impl) +{ + if (--impl->styling->ref_count != 0) + return; + + // + // otherwise, unmap all resources by sealing and delete + // + skc_styling_pfn_seal(impl); + + struct skc_runtime * const runtime = impl->runtime; + struct skc_scheduler * const scheduler = runtime->scheduler; + + // wait until sealed + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->state != SKC_STYLING_STATE_SEALED); + + // wait for locks to drain + SKC_SCHEDULER_WAIT_WHILE(scheduler,impl->lock_count > 0) + + // + // styling is now disposable + // + + // free styling host + skc_runtime_host_perm_free(runtime,impl->styling); + + // release the cq + skc_runtime_release_cq_in_order(runtime,impl->cq); + + // free extents + skc_extent_phwN_pdrN_free(runtime,&impl->layers); + skc_extent_phwN_pdrN_free(runtime,&impl->groups); + skc_extent_phwN_pdrN_free(runtime,&impl->extras); + + // free styling impl + skc_runtime_host_perm_free(runtime,impl); +} + +// +// +// + +void +skc_styling_retain_and_lock(struct skc_styling * const styling) +{ + skc_styling_retain(styling); + + styling->impl->lock_count += 1; +} + +void +skc_styling_unlock_and_release(struct skc_styling * const styling) +{ + styling->impl->lock_count -= 1; + + skc_styling_pfn_release(styling->impl); +} + +// +// +// + +skc_err +skc_styling_cl_12_create(struct skc_context * const context, + struct skc_styling * * const styling, + skc_uint const layers_count, + skc_uint const groups_count, + skc_uint const extras_count) +{ + // retain the context + // skc_context_retain(context); + + // allocate the impl + struct skc_runtime * const runtime = context->runtime; + struct skc_styling_impl * const impl = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*impl)); + + // allocate styling + (*styling) = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(**styling)); + (*styling)->context = context; + (*styling)->impl = impl; + + // intialize impl + impl->styling = (*styling); + impl->runtime = runtime; + + SKC_ASSERT_STATE_INIT(impl,SKC_STYLING_STATE_SEALED); + + impl->lock_count = 0; + + impl->cq = skc_runtime_acquire_cq_in_order(runtime); + + // + // The styling object is unique in that the API lets the user + // specify resource limits + // + // The styling object is a simple container that can have wildly + // varying resource requirements (but still relatively modest). + // + // Additionally, an advanced SKC programmer may want to create many + // styling and composition objects as they're relatively cheap. + // + skc_extent_phwN_pdrN_alloc(runtime,&impl->layers,sizeof(*(*styling)->layers.extent) * layers_count); + skc_extent_phwN_pdrN_alloc(runtime,&impl->groups,sizeof(*(*styling)->groups.extent) * groups_count); + skc_extent_phwN_pdrN_alloc(runtime,&impl->extras,sizeof(*(*styling)->extras.extent) * extras_count); + + // initialize styling + (*styling)->layers.size = layers_count; + (*styling)->groups.size = groups_count; + (*styling)->extras.size = extras_count; + + (*styling)->layers.count = 0; + (*styling)->groups.count = 0; + (*styling)->extras.count = 0; + + // save pfns + (*styling)->seal = skc_styling_pfn_seal; + (*styling)->unseal = skc_styling_pfn_unseal; + (*styling)->release = skc_styling_pfn_release; + + // set ref count + (*styling)->ref_count = 1; + + // map the extents by unsealing + skc_styling_pfn_unseal(impl,false); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/styling_cl_12.h b/src/compute/skc/styling_cl_12.h new file mode 100644 index 0000000000..a319568ee5 --- /dev/null +++ b/src/compute/skc/styling_cl_12.h @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include <CL/opencl.h> + +#include "styling.h" +#include "grid.h" +#include "extent_cl_12.h" +#include "assert_state.h" + +// +// styling states +// + +typedef enum skc_styling_state_e { + + SKC_STYLING_STATE_UNSEALING, + SKC_STYLING_STATE_UNSEALED, + SKC_STYLING_STATE_SEALING, + SKC_STYLING_STATE_SEALED + +} skc_styling_state_e; + +// +// IMPL +// + +struct skc_styling_impl +{ + struct skc_styling * styling; + struct skc_runtime * runtime; + + SKC_ASSERT_STATE_DECLARE(skc_styling_state_e); + + skc_int lock_count; // # of wip renders + + skc_grid_t grid; + + // in-order command queue + cl_command_queue cq; + + // + // only 3 extents + // + struct skc_extent_phwN_pdrN layers; + struct skc_extent_phwN_pdrN groups; + struct skc_extent_phwN_pdrN extras; +}; + +// +// ONLY VISIBLE WITHIN THIS RUNTIME +// + +void +skc_styling_retain_and_lock(struct skc_styling * const styling); + +void +skc_styling_unlock_and_release(struct skc_styling * const styling); + +// +// +// diff --git a/src/compute/skc/styling_types.h b/src/compute/skc/styling_types.h new file mode 100644 index 0000000000..07d9a10ca3 --- /dev/null +++ b/src/compute/skc/styling_types.h @@ -0,0 +1,250 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_STYLING_TYPES +#define SKC_ONCE_STYLING_TYPES + +// +// +// + +#include "types.h" +#include "macros.h" +#include "skc_styling.h" + +// +// +// + +typedef skc_uint skc_layer_id; +typedef skc_uint skc_group_id; + +// +// +// + +union skc_styling_cmd +{ + skc_uint u32; + skc_int s32; + skc_float f32; + skc_half f16a2[2]; + skc_ushort2 u16v2; + skc_styling_opcode_e opcode; + skc_styling_gradient_type_e gradient_type; + skc_group_id parent; + +#if 0 +#if !defined(__OPENCL_C_VERSION__) + struct { + skc_uint opcode : 31; + skc_uint final : 1; + }; +#endif +#endif +}; + +#define SKC_STYLING_OPCODE_MASK_OPCODE SKC_BITS_TO_MASK(31) +#define SKC_STYLING_OPCODE_MASK_IS_FINAL SKC_BITS_TO_MASK_AT(1,31) + +SKC_STATIC_ASSERT(sizeof(union skc_styling_cmd) == sizeof(skc_uint)); + +// +// +// + +union skc_layer_node +{ + skc_uint2 u32v2; + + struct { + skc_uint cmds; // starting index of sequence of command words + skc_group_id parent; // index of parent group + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_layer_node) == sizeof(skc_uint2)); + +// +// +// + +union skc_group_parents +{ + skc_uint2 u32v2; + + struct { + skc_uint depth; // zero-based depth of this group + skc_uint base; // index to sequence of group ids leading back to root + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_group_parents) == sizeof(skc_uint2)); + +// +// inclusive layer range [lo,hi] +// + +union skc_group_range +{ + skc_uint2 u32v2; + + struct { + skc_uint lo; // first layer + skc_uint hi; // last layer + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_group_range) == sizeof(skc_uint2)); + +// +// +// + +struct skc_group_node +{ + union skc_group_parents parents; // path of parent groups leading back to root + + union skc_group_range range; // range of layers enclosed by this group + + struct { + skc_uint enter; // starting index of sequence of command words + skc_uint leave; // starting index of sequence of command words + } cmds; +}; + +SKC_STATIC_ASSERT(sizeof(struct skc_group_node) == sizeof(skc_uint2) * 3); // 6 words + +// +// +// + +union skc_gradient_slope +{ + skc_float slope; + skc_half color_pair[2]; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_gradient_slope) == sizeof(skc_float)); + +// +// +// + +union skc_gradient_vector +{ + skc_float4 f32v4; + + struct { + skc_float dx; + skc_float p0; + skc_float dy; + skc_float denom; + }; + + union skc_gradient_slope slopes[4]; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_gradient_vector) == sizeof(skc_float4)); + +// +// FIXME -- will eventually need to know if this gradient is +// perspective transformed and if so additional values will need to be +// encoded +// +// VERSION 1 +// ============================================================= +// +// LINEAR GRADIENT HEADER FOR N STOPS +// +// +----------+----------+------------+----------+-------------+ +// | HEADER | INFO | LUTS | FLOORS | COLORS | +// +----------+----------+------------+----------+-------------+ +// | uintv4 | u32v2[1] | f32v2[N-1] | f32[N-2] | ushort2[4N] | +// +----------+----------+------------+----------+-------------+ +// +// COLOR PAIR WORD EXPANSION TOTAL +// +------------+---------------------------------+--------+-------------------------+ +// | ushort2 | 4 + 2 + 2*(N-1) + N - 2 + 4*N | 7N + 2 | = 7(N-1+1)+2 = 7(N-1)+9 | +// +------------+---------------------------------+--------+-------------------------+ +// +// COLOR LAYOUT: +// +// R[0]R[1], R[1]R[2], ... R[N-1]R[N-1] +// G[0]G[1], G[1]G[2], ... G[N-1]G[N-1] +// B[0]B[1], B[1]B[2], ... B[N-1]B[N-1] +// A[0]A[1], A[1]A[2], ... A[N-1]A[N-1] +// +// +// MINIMUM WORDS: N=2 --> 16 +// +// +// VERSION 2 +// ============================================================= +// +// LINEAR GRADIENT DESCRIPTOR FOR N STOPS +// +// +--------------- REMOVE ME LATER +// v +// +--------+------+-------+---+----------+-----------+ +// | VECTOR | TYPE | COUNT | N | SLOPES | COLORS | +// +--------+------+-------+---+----------+-----------+ +// | f32v4 | 1 | 1 | 1 | f32[N-1] | f16v2[4N] | +// +--------+------+-------+---+----------+-----------+ +// +// COLOR PAIR WORD EXPANSION TOTAL +// +------------+--------------------------------+--------+ +// | f16v2 | 4 + 1 + 1 + 1 + [N-1] + [4*N] | 5N + 6 | +// +------------+--------------------------------+--------+ +// +// COLOR LAYOUT: +// +// R[0]R[1], R[1]R[2], ... R[N-1]R[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION +// G[0]G[1], G[1]G[2], ... G[N-1]G[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION +// B[0]B[1], B[1]B[2], ... B[N-1]B[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION +// A[0]A[1], A[1]A[2], ... A[N-1]A[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION +// +// +// MINIMUM WORDS: N=2 --> 16 +// +// +// VERSION 3+ +// ============================================================= +// +// FIXME -- will probably want to try using the sampler/texture +// hardware to interpolate colors. +// +// This will require that the colors are laid out in sampler-friendly +// order: +// +// RGBA[0]RGBA[1], RGBA[1]RGBA[2], ..., RGBA[N-1]RGBA[N-1] +// +// + +#if 0 +#define SKC_GRADIENT_HEADER_WORDS_LUTS_OFFSET 4 +#define SKC_GRADIENT_HEADER_WORDS_TOTAL(n_minus_1) (7 * (n_minus_1) + 9) +#define SKC_GRADIENT_HEADER_WORDS_MIN SKC_GRADIENT_HEADER_WORDS_TOTAL(1) +#define SKC_GRADIENT_CMD_WORDS_V1(n) (1 + SKC_GRADIENT_HEADER_WORDS_TOTAL(n-1)) +#endif + +#define SKC_GRADIENT_CMD_WORDS_V1(n) (7 * (n) + 2) +#define SKC_GRADIENT_CMD_WORDS_V2(n) (5 * (n) + 6) +#define SKC_GRADIENT_CMD_WORDS_V2_ADJUST(v1,v2) (SKC_GRADIENT_CMD_WORDS_V1(v1) - ((v2) + 6)) + +// +// +// + +#endif + +// +// +// + + diff --git a/src/compute/skc/suballocator.c b/src/compute/skc/suballocator.c new file mode 100644 index 0000000000..382e818c27 --- /dev/null +++ b/src/compute/skc/suballocator.c @@ -0,0 +1,381 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include <assert.h> +#include <memory.h> + +#include "runtime_cl_12.h" +#include "scheduler.h" + +// +// +// + +#ifndef NDEBUG + +#include <stdio.h> + +#define SKC_SUBALLOCATOR_DEBUG_ALLOC(suballocator,subbuf_id,ss) \ + fprintf(stderr, \ + "suballocator %s : [ %4u ] : alloc( %9u ) @ %4u = %u\n", \ + suballocator->name, \ + suballocator->rem.avail, \ + (skc_uint)ss, \ + subbuf_id, \ + (skc_uint)suballocator->total); + +#define SKC_SUBALLOCATOR_DEBUG_FREE(suballocator,subbuf_id,ss) \ + fprintf(stderr, \ + "suballocator %s : [ %4u ] : free ( %9u ) @ %4u = %u\n", \ + suballocator->name, \ + suballocator->rem.avail, \ + (skc_uint)ss, \ + subbuf_id, \ + (skc_uint)suballocator->total); + +#else + +#define SKC_SUBALLOCATOR_DEBUG_ALLOC(suballocator,subbuf_id,ss) +#define SKC_SUBALLOCATOR_DEBUG_FREE(suballocator,subbuf_id,ss) + +#endif + +// +// +// + +void +skc_suballocator_create(struct skc_runtime * const runtime, + struct skc_suballocator * const suballocator, + char const * const name, + skc_uint const subbufs, + size_t const align, + size_t const size) +{ + size_t const subbufs_size = sizeof(*suballocator->subbufs) * subbufs; + + // allocate array of subbuf records + suballocator->subbufs = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,subbufs_size); + + // zero subbufs + memset(suballocator->subbufs,0,subbufs_size); + + // initialize starting subbuf + suballocator->subbufs[0].size = (skc_subbuf_size_t)size; + + // allocate array of ids + suballocator->ids = skc_runtime_host_perm_alloc(runtime, + SKC_MEM_FLAGS_READ_WRITE, + sizeof(*suballocator->ids) * subbufs); + for (skc_uint ii=0; ii<subbufs; ii++) + suballocator->ids[ii] = ii; + + suballocator->rem.avail = 1; + suballocator->rem.spare = subbufs - 1; + + suballocator->align = (skc_uint)align; + suballocator->count = subbufs; + + suballocator->size = (skc_subbuf_size_t)size; + suballocator->total = 0; + + suballocator->name = name; +} + +void +skc_suballocator_dispose(struct skc_runtime * const runtime, + struct skc_suballocator * const suballocator) +{ + skc_runtime_host_perm_free(runtime,suballocator->ids); + skc_runtime_host_perm_free(runtime,suballocator->subbufs); +} + + +// +// Sets id and returns origin +// + +size_t +skc_suballocator_subbuf_alloc(struct skc_suballocator * const suballocator, + struct skc_scheduler * const scheduler, + size_t const size, + skc_subbuf_id_t * const subbuf_id, + size_t * const subbuf_size) +{ + // + // Note that we can't deadlock here because everything allocated is + // expected to be freed within msecs. Worst case, we wait for a + // availability of resources while a fully utilized GPU is making + // forward progress on kernels. + // + // This behavior should guide the sizing of the suballocator's + // number of subbuffers and extent. + // + // We want to allocate a large enough extent and enough subbuffer + // records so that the CPU/GPU is never starved. + // + + // round up the size + skc_subbuf_size_t const size_ru = (skc_subbuf_size_t)SKC_ROUND_UP_POW2(size,suballocator->align); + + // save it + if (subbuf_size != NULL) + *subbuf_size = size_ru; + + // + // We precheck to see there is at least one region of memory + // available but do not check to see if there is a spare. Instead, + // we simply keep looking for an exact fit. + // + skc_subbuf_id_t * const ids = suballocator->ids; + + while (true) + { + skc_uint avail_rem = suballocator->rem.avail; + skc_uint spare_rem = suballocator->rem.spare; + + for (skc_uint avail_idx=0; avail_idx<avail_rem; avail_idx++) + { + skc_subbuf_id_t const avail_id = ids[avail_idx]; + struct skc_subbuf * const avail = suballocator->subbufs + avail_id; + + assert(avail->inuse == 0); + + if (avail->size == size_ru) // size matches exactly + { + suballocator->total += size_ru; + + // return this id + *subbuf_id = avail_id; + + SKC_SUBALLOCATOR_DEBUG_ALLOC(suballocator,avail_id,size_ru); + + // mark the subbuffer as in use + avail->inuse += 1; + + assert(avail->inuse == 1); + + // update rem avail count + suballocator->rem.avail = --avail_rem; + + // replace now inuse id with last avail id + if ((avail_rem > 0) && (avail_idx != avail_rem)) + { + skc_subbuf_id_t const last_id = ids[avail_rem]; + struct skc_subbuf * const last = suballocator->subbufs + last_id; + + ids[avail_idx] = last_id; // move id + last->idx = avail_idx; // update idx[] + } + + assert(suballocator->rem.avail > 0); + + // return origin + return avail->origin; + } + else if ((avail->size > size_ru) && (spare_rem > 0)) // requested is less than available so split it + { + suballocator->total += size_ru; + + skc_uint spare_idx = suballocator->count - spare_rem; + skc_subbuf_id_t const spare_id = ids[spare_idx]; + struct skc_subbuf * const spare = suballocator->subbufs + spare_id; + + assert(spare->inuse == 0); + + // simple -- we're popping the top-of-stack of spares + suballocator->rem.spare -= 1; + + // return id + *subbuf_id = spare_id; + + SKC_SUBALLOCATOR_DEBUG_ALLOC(suballocator,spare_id,size_ru); + + // get prev + struct skc_subbuf * const prev = avail->prev; + + if (prev != NULL) + prev->next = spare; + + // init spare + spare->prev = prev; + spare->next = avail; + spare->size = size_ru; + spare->origin = avail->origin; + spare->idx = SKC_UINT_MAX; // defensive + spare->inuse += 1; + + // update curr + avail->prev = spare; + avail->size -= size_ru; + avail->origin += size_ru; + + assert(suballocator->rem.avail > 0); + + return spare->origin; + } + } + + // uh oh... couldn't find enough memory + skc_scheduler_wait(scheduler); + } +} + +// +// FIXME -- simplify this with a merge-with-prev() primitive +// + +void +skc_suballocator_subbuf_free(struct skc_suballocator * const suballocator, + skc_subbuf_id_t subbuf_id) +{ + // get subbuf for id + struct skc_subbuf * const subbuf = suballocator->subbufs + subbuf_id; + + assert(subbuf->inuse == 1); + + suballocator->total -= subbuf->size; + + SKC_SUBALLOCATOR_DEBUG_FREE(suballocator,subbuf_id,subbuf->size); + + // + // try to merge subbuf with left and maybe right and then dispose + // + struct skc_subbuf * prev; + struct skc_subbuf * next; + + if (((prev = subbuf->prev) != NULL) && !prev->inuse) + { + next = subbuf->next; + + if ((next != NULL) && !next->inuse) + { + subbuf->inuse -= 1; + + assert(next->inuse == 0); + + // increment size + prev->size += (subbuf->size + next->size); + + struct skc_subbuf * const nextnext = next->next; + + // update next link + prev->next = nextnext; + + // update prev link + if (nextnext != NULL) + nextnext->prev = prev; + + // + // both subbuf and next are now spare which means we need to + // move final available subbuffer into next's old position + // unless they're the same + // + skc_uint const last_idx = --suballocator->rem.avail; + skc_uint const next_idx = next->idx; + + assert(suballocator->rem.avail > 0); + + if (last_idx != next_idx) + { + skc_subbuf_id_t const last_id = suballocator->ids[last_idx]; + struct skc_subbuf * const last = suballocator->subbufs + last_id; + + suballocator->ids[next_idx] = last_id; + last->idx = next_idx; + } + + skc_subbuf_id_t const next_id = (skc_subbuf_id_t)(next - suballocator->subbufs); + + skc_uint const spare_rem = suballocator->rem.spare + 2; + skc_uint const spare_idx = suballocator->count - spare_rem; + + suballocator->rem.spare = spare_rem; + suballocator->ids[spare_idx + 0] = subbuf_id; + suballocator->ids[spare_idx + 1] = next_id; + } + else + { + prev->size += subbuf->size; + prev->next = next; + + if (next != NULL) + next->prev = prev; + + subbuf->inuse -= 1; + + assert(subbuf->inuse == 0); + assert(suballocator->rem.avail > 0); + + suballocator->ids[suballocator->count - ++suballocator->rem.spare] = subbuf_id; + } + } + // + // try to merge with right + // + else if (((next = subbuf->next) != NULL) && !next->inuse) + { + subbuf->inuse -= 1; + + assert(subbuf->inuse == 0); + assert(suballocator->rem.avail > 0); + + next->prev = prev; + next->origin = subbuf->origin; + next->size += subbuf->size; + + if (prev != NULL) + prev->next = next; + + // subbuf is now spare + suballocator->ids[suballocator->count - ++suballocator->rem.spare] = subbuf_id; + } + else // couldn't merge with a neighbor + { + skc_uint avail_idx = suballocator->rem.avail++; + + // subbuf is now available + subbuf->idx = avail_idx; + subbuf->inuse -= 1; + + assert(subbuf->inuse == 0); + assert(suballocator->rem.avail > 0); + + suballocator->ids[avail_idx] = subbuf_id; + } +} + +// +// +// + +#if 0 + +// +// At some point there might be a reason to sort the available +// subbuffers into some useful order -- presumably to binary search +// for the closest match or to chip away at the largest available +// subbuffer +// + +static +void +skc_suballocator_optimize(struct skc_suballocator * const suballocator) +{ + ; +} + +#endif + +// +// +// diff --git a/src/compute/skc/suballocator.h b/src/compute/skc/suballocator.h new file mode 100644 index 0000000000..7c3a6e863c --- /dev/null +++ b/src/compute/skc/suballocator.h @@ -0,0 +1,117 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// This is a suballocator for a large extent typically less than 4 GB. +// +// The SKC pipeline will use this for ephemeral host and device memory +// allocations. The lifetime of an allocation is typically +// milliseconds or less and is associated with either a single kernel +// or a sub-pipeline. +// +// Because of this, a relatively small number of allocations (10's) +// will be outstanding at any time so the implementation can +// reasonably be very simplistic and optimize for this case. +// +// Also, if either memory or subbuffer nodes aren't available the +// suballocator will block and pump the pipeline's scheduler until it +// can proceed. +// +// Note that this implementation is single-threaded and the +// suballocator's state may have been altered after pumping the +// scheduler. +// + +#include "types.h" + +// +// It's practical for the subbuf_id to be either 16 bits or maybe even +// 8 bits if the number of outstanding subbufs is in the thousands (16 +// bits) or under 256 (8 bits). +// + +typedef skc_ushort skc_subbuf_id_t; +typedef skc_uint skc_subbuf_size_t; // <4GB +// typedef size_t skc_subbuf_size_t; // >4GB + +// +// +// + +struct skc_subbuf +{ + struct skc_subbuf * prev; + struct skc_subbuf * next; + + skc_subbuf_size_t size; + skc_subbuf_size_t origin; + + skc_uint idx; // ids[] index of subbuf in available state + skc_uint inuse; +}; + +// +// +// + +struct skc_suballocator +{ + struct skc_subbuf * subbufs; + + skc_subbuf_id_t * ids; // [<-AVAIL-><-empty-><-SPARE->] + + struct { + skc_uint avail; + skc_uint spare; + } rem; // inuse = count - (avail + spare) + + skc_uint align; // required pow2 alignment + skc_uint count; // number of subbufs + + skc_subbuf_size_t size; // size of memory extent + skc_subbuf_size_t total; + + char const * name; +}; + +// +// +// + +void +skc_suballocator_create(struct skc_runtime * const runtime, + struct skc_suballocator * const suballocator, + char const * const name, + skc_uint const subbufs, + size_t const align, + size_t const size); + +void +skc_suballocator_dispose(struct skc_runtime * const runtime, + struct skc_suballocator * const suballocator); + +// +// +// + +size_t +skc_suballocator_subbuf_alloc(struct skc_suballocator * const suballocator, + struct skc_scheduler * const scheduler, + size_t const size, + skc_subbuf_id_t * const subbuf_id, + size_t * const subbuf_size); + +void +skc_suballocator_subbuf_free(struct skc_suballocator * const suballocator, + skc_subbuf_id_t subbuf_id); + +// +// +// diff --git a/src/compute/skc/subblock.h b/src/compute/skc/subblock.h new file mode 100644 index 0000000000..7249e85e3a --- /dev/null +++ b/src/compute/skc/subblock.h @@ -0,0 +1,42 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_SUBBLOCK +#define SKC_ONCE_SUBBLOCK + +// +// +// + +#include "block.h" + +// +// +// + +#if 0 + +#define SKC_BLOCK_ID_BITS_BLOCK (SKC_BLOCK_ID_BITS_ID - SKC_BLOCK_ID_BITS_SUBLOCK) +#define SKC_BLOCK_ID_BITS_SUBLOCK (SKC_DEVICE_BLOCK_WORDS_LOG2 - SKC_DEVICE_SUBBLOCK_WORDS_LOG2) + +#define SKC_BLOCK_ID_MASK_SUBBLOCK SKC_BITS_TO_MASK_AT(SKC_BLOCK_ID_BITS_SUBLOCK,SKC_BLOCK_ID_BITS_TAG) + +#define SKC_BLOCK_ID_GET_BLOCK(b) ((b) >> (SKC_BLOCK_ID_BITS_SUBLOCK + SKC_BLOCK_ID_BITS_TAG)) +#define SKC_BLOCK_ID_GET_SUBBLOCK(b) (((b) & SKC_BLOCK_ID_MASK_SUBBLOCK) >> SKC_BLOCK_ID_BITS_TAG) + +#endif + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/surface.c b/src/compute/skc/surface.c new file mode 100644 index 0000000000..61bfac3ee6 --- /dev/null +++ b/src/compute/skc/surface.c @@ -0,0 +1,94 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "surface.h" +#include "composition.h" +#include "styling.h" + +// +// +// + +skc_err +skc_surface_retain(skc_surface_t surface) +{ + surface->ref_count += 1; + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_surface_release(skc_surface_t surface) +{ + surface->release(surface->impl); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_surface_clear(skc_surface_t surface, + float const rgba[4], + uint32_t const rect[4], + void * fb) +{ + surface->clear(surface->impl,rgba,rect,fb); + + return SKC_ERR_SUCCESS; +} + +skc_err +skc_surface_blit(skc_surface_t surface, + uint32_t const rect[4], + int32_t const txty[2]) +{ + surface->blit(surface->impl,rect,txty); + + return SKC_ERR_SUCCESS; +} + +// +// +// + +skc_err +skc_surface_render(skc_surface_t surface, + uint32_t const clip[4], + skc_styling_t styling, + skc_composition_t composition, + skc_surface_render_pfn_notify notify, + void * data, + void * fb) +{ + skc_err err; + + // seal styling -- no dependencies so this will start immediately + if ((err = skc_styling_seal(styling)) != SKC_ERR_SUCCESS) + return err; + + // seal composition -- force started + if ((err = skc_composition_seal(composition)) != SKC_ERR_SUCCESS) + return err; + + // + // FIXME -- at some point, we will want non-overlapping clips to be + // rendered simultaneously. There is plenty of compute for nominal + // size render tasks so it might not make much a performance + // improvement. + // + surface->render(surface->impl,clip,styling,composition,notify,data,fb); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/surface.h b/src/compute/skc/surface.h new file mode 100644 index 0000000000..7f9dda85c4 --- /dev/null +++ b/src/compute/skc/surface.h @@ -0,0 +1,56 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "assert_state.h" + +// +// SURFACE +// + +struct skc_surface +{ + struct skc_context * context; + struct skc_surface_impl * impl; + + skc_int ref_count; + + // + // FIXME -- this list of pfn's isn't complete + // + void (* release)(struct skc_surface_impl * const impl); + void (* render )(struct skc_surface_impl * const impl, + uint32_t const clip[4], + skc_styling_t styling, + skc_composition_t composition, + skc_surface_render_pfn_notify notify, + void * data, + void * fb); + // + // FIXME -- these will probably be removed + // + void (* clear )(struct skc_surface_impl * const impl, + float const rgba[4], + skc_uint const rect[4], + void * fb); + + void (* blit )(struct skc_surface_impl * const impl, + skc_uint const rect[4], + skc_int const txty[2]); + +}; + +// +// +// diff --git a/src/compute/skc/surface_cl_12.h b/src/compute/skc/surface_cl_12.h new file mode 100644 index 0000000000..43ea5428a5 --- /dev/null +++ b/src/compute/skc/surface_cl_12.h @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_SURFACE_CL_12_ONCE +#define SKC_SURFACE_CL_12_ONCE + +// +// Unlike other object platform implementations, the surface object +// implementation needs to access the opaque platform-specfic outputs +// of the composition and styling objects. +// +// Composition : { keys, offsets, key_count, offset_count } +// Styling : { layers, groups, commands } +// +// With the OpenCL platform we'll handle this by simply exposing the +// argument value (void*) and its size (size_t). +// +// TODO: It might make sense in the future to support more complex +// rendering jobs that simultaneously involve multiple surfaces, +// compositions and stylings. +// + +#endif + +// +// +// diff --git a/src/compute/skc/surface_cl_12_buffer.c b/src/compute/skc/surface_cl_12_buffer.c new file mode 100644 index 0000000000..cc7cba5225 --- /dev/null +++ b/src/compute/skc/surface_cl_12_buffer.c @@ -0,0 +1,453 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#include "common/cl/assert_cl.h" + +#include "extent_cl_12.h" +#include "runtime_cl_12.h" +#include "styling_cl_12.h" +#include "composition_cl_12.h" + +#include "context.h" +#include "surface.h" + +// +// +// + +#include <stdio.h> + +// +// BUILD +// + +struct skc_surface_impl +{ + struct skc_surface * surface; + struct skc_runtime * runtime; + + // framebuffer + // struct skc_extent_pdrw fb; + // struct skc_extent_phrN_pdwN fb; + + // for now, a single in-order command queue + cl_command_queue cq; + + struct { + cl_kernel render; + } kernels; +}; + +// +// we might want concurrent access to the same surface as long as +// the clips don't overlap. +// +// this would require acquiring a cq on demand when it is determined +// that the clipped render won't overlap +// +// { tile clip , cq } pair +// +// skc_uint4 clip; +// cl_command_queue cq +// + +struct skc_surface_render +{ + skc_uint clip[4]; + + struct skc_surface_impl * impl; + struct skc_styling * styling; + struct skc_composition * composition; + + skc_surface_render_pfn_notify notify; + void * data; + + cl_mem fb; + + skc_grid_t grid; + + skc_subbuf_id_t id; +}; + +// +// +// + +static +void +skc_surface_pfn_clear(struct skc_surface_impl * const impl, + float const rgba[4], + skc_uint const rect[4], + void * fb) +{ + size_t const origin[3] = { rect[0], rect[1], 0 }; + size_t const region[3] = { rect[2], rect[3], 1 }; + + cl(EnqueueFillImage(impl->cq, + (cl_mem)fb, + rgba, + origin, + region, + 0,NULL,NULL)); +} + +// +// +// + +static +void +skc_surface_pfn_blit(struct skc_surface_impl * const impl, + skc_uint const rect[4], + skc_int const txty[2]) +{ + ; +} + +// +// +// + +#if 0 // #ifndef NDEBUG +#define SKC_SURFACE_DEBUG +#endif + +#ifdef SKC_SURFACE_DEBUG + +#define SKC_SURFACE_WIDTH 4096 +#define SKC_SURFACE_HEIGHT 4096 + +static +void +skc_surface_debug(struct skc_surface_impl * const impl) +{ + // + // MAP + // + cl_uchar4 * const rgba = skc_extent_phrN_pdwN_map(&impl->fb, + impl->cq, + NULL); + cl(Finish(impl->cq)); + + // + // WRITE + // + FILE* file; + + errno_t ferr = fopen_s(&file,"surface.ppm","wb"); + + fprintf(file,"P6\n%u %u\n255\n",SKC_SURFACE_WIDTH,SKC_SURFACE_HEIGHT); + + for (skc_uint ii=0; ii<SKC_SURFACE_HEIGHT*SKC_SURFACE_WIDTH; ii++) + fwrite(rgba + ii,sizeof(skc_uchar),3,file); // R,G,B + + ferr = fclose(file); + + // + // UNMAP + // + skc_extent_phrN_pdwN_unmap(&impl->fb,rgba,impl->cq,NULL); + + cl(Flush(impl->cq)); +} + +#endif + +// +// +// + +void +skc_surface_render_complete(struct skc_surface_render * const render) +{ +#ifdef SKC_SURFACE_DEBUG + // write fb out + skc_surface_debug(render->impl); +#endif + + // notify + if (render->notify != NULL) { + render->notify(render->impl->surface, + render->styling, + render->composition, + render->data); + } + + // unlock and release the styling and composition + skc_styling_unlock_and_release(render->styling); + skc_composition_unlock_and_release(render->composition); + + // grid is now complete + skc_grid_complete(render->grid); +} + +static +void +skc_surface_render_cb(cl_event event, cl_int status, struct skc_surface_render * const render) +{ + SKC_CL_CB(status); + + // as quickly as possible, enqueue next stage in pipeline to context command scheduler + SKC_SCHEDULER_SCHEDULE(render->impl->runtime->scheduler, + skc_surface_render_complete, + render); +} + +// +// +// + +static +void +skc_surface_grid_pfn_execute(skc_grid_t const grid) +{ + struct skc_surface_render * const render = skc_grid_get_data(grid); + struct skc_surface_impl * const impl = render->impl; + struct skc_runtime * const runtime = impl->runtime; + + // get the composition args + struct skc_composition_impl * const ci = render->composition->impl; + struct skc_place_atomics * const atomics = ci->atomics.hr; + + if (atomics->offsets > 0) + { + // acquire the rbo + cl(EnqueueAcquireGLObjects(impl->cq,1,&render->fb,0,NULL,NULL)); + + // get the styling args + struct skc_styling_impl * const si = render->styling->impl; + + cl(SetKernelArg(impl->kernels.render,0,SKC_CL_ARG(si->layers.drN))); + cl(SetKernelArg(impl->kernels.render,1,SKC_CL_ARG(si->groups.drN))); + cl(SetKernelArg(impl->kernels.render,2,SKC_CL_ARG(si->extras.drN))); + + cl(SetKernelArg(impl->kernels.render,3,SKC_CL_ARG(ci->keys.drw))); + cl(SetKernelArg(impl->kernels.render,4,SKC_CL_ARG(atomics->keys))); + cl(SetKernelArg(impl->kernels.render,5,SKC_CL_ARG(ci->offsets.drw))); + cl(SetKernelArg(impl->kernels.render,6,SKC_CL_ARG(atomics->offsets))); + + // block pool + cl(SetKernelArg(impl->kernels.render,7,SKC_CL_ARG(impl->runtime->block_pool.blocks.drw))); + + // surface + cl(SetKernelArg(impl->kernels.render,8,SKC_CL_ARG(render->fb))); + +#if 1 + // tile clip + cl(SetKernelArg(impl->kernels.render,9,sizeof(skc_uint4),render->clip)); +#else + // surface pitch (height) + skc_uint const surface_pitch = SKC_SURFACE_HEIGHT; + cl(SetKernelArg(impl->kernels.render,9,SKC_CL_ARG(surface_pitch))); + // tile clip + cl(SetKernelArg(impl->kernels.render,10,sizeof(skc_uint4),render->clip)); +#endif + + // launch render kernel + skc_device_enqueue_kernel(runtime->device, + SKC_DEVICE_KERNEL_ID_RENDER, + impl->cq, + impl->kernels.render, + atomics->offsets, + 0,NULL,NULL); + + + cl_event complete; + + // give the rbo back + cl(EnqueueReleaseGLObjects(impl->cq,1,&render->fb,0,NULL,&complete)); + + // notify anyone listening... + cl(SetEventCallback(complete,CL_COMPLETE,skc_surface_render_cb,render)); + cl(ReleaseEvent(complete)); + + // flush it + cl(Flush(impl->cq)); + } + else + { + skc_surface_render_complete(render); + } +} + +// +// +// + +static +void +skc_surface_pfn_release(struct skc_surface_impl * const impl) +{ + if (--impl->surface->ref_count != 0) + return; + + // + // otherwise, release all resources + // + + // drain the command queue + cl(Finish(impl->cq)); + + struct skc_runtime * const runtime = impl->runtime; + + // release the kernel + cl(ReleaseKernel(impl->kernels.render)); + + // free surface host + skc_runtime_host_perm_free(runtime,impl->surface); + + // release the cq + skc_runtime_release_cq_in_order(runtime,impl->cq); + + // release fb + // skc_extent_phrN_pdwN_free(runtime,&impl->fb); + + // free surface impl + skc_runtime_host_perm_free(runtime,impl); +} + +// +// +// + +static +void +skc_surface_grid_pfn_dispose(skc_grid_t const grid) +{ + struct skc_surface_render * const render = skc_grid_get_data(grid); + struct skc_surface_impl * const impl = render->impl; + struct skc_runtime * const runtime = impl->runtime; + + // free the render object + skc_runtime_host_temp_free(runtime,render,render->id); + + // release the surface + skc_surface_pfn_release(impl); +} + +// +// +// + +static +void +skc_surface_pfn_render(struct skc_surface_impl * const impl, + uint32_t const clip[4], + skc_styling_t styling, + skc_composition_t composition, + skc_surface_render_pfn_notify notify, + void * data, + void * fb) +{ + // retain surface + skc_surface_retain(impl->surface); + + // + // FIXME -- we used to seal the styling and composition objects if + // they weren't already. Either test that they're sealed or seal + // them here. + // + + // retain and lock the styling and composition + skc_styling_retain_and_lock(styling); + skc_composition_retain_and_lock(composition); + + // + // allocate a render instance + // + skc_subbuf_id_t id; + struct skc_surface_render * const render = skc_runtime_host_temp_alloc(impl->runtime, + SKC_MEM_FLAGS_READ_WRITE, + sizeof(*render),&id,NULL); + render->id = id; + + render->clip[0] = clip[0]; + render->clip[1] = clip[1]; + render->clip[2] = clip[2]; + render->clip[3] = clip[3]; + + render->impl = impl; + render->styling = styling; + render->composition = composition; + + render->notify = notify; + render->data = data; + + render->fb = fb; + + render->grid = SKC_GRID_DEPS_ATTACH(impl->runtime->deps, + NULL, // invalidation not necessary + render, + NULL, // no waiting + skc_surface_grid_pfn_execute, + skc_surface_grid_pfn_dispose); + + // declare happens-after relationships + skc_grid_happens_after_grid(render->grid,styling->impl->grid); + skc_grid_happens_after_grid(render->grid,composition->impl->grids.sort); + + // wait for styling and composition + skc_grid_start(render->grid); +} + +// +// +// + +skc_err +skc_surface_cl_12_create(struct skc_context * const context, + struct skc_surface * * const surface) +{ + struct skc_runtime * const runtime = context->runtime; + + // allocate surface + (*surface) = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(**surface)); + + // allocate impl + struct skc_surface_impl * const impl = skc_runtime_host_perm_alloc(runtime,SKC_MEM_FLAGS_READ_WRITE,sizeof(*impl)); + + // initialize surface + // SKC_ASSERT_STATE_INIT((*impl),SKC_SURFACE_STATE_READY); + + (*surface)->context = context; + (*surface)->impl = impl; + (*surface)->ref_count = 1; + + (*surface)->release = skc_surface_pfn_release; + (*surface)->clear = skc_surface_pfn_clear; + (*surface)->blit = skc_surface_pfn_blit; + (*surface)->render = skc_surface_pfn_render; + + // intialize impl + impl->surface = *surface; + impl->runtime = runtime; + +#if 0 + // FIXME -- 4K x 4K -- temporarily fixed size + size_t const fb_size = sizeof(skc_uchar4) * SKC_SURFACE_WIDTH * SKC_SURFACE_HEIGHT; + + // create framebuffer + skc_extent_phrN_pdwN_alloc(runtime,&impl->fb,fb_size); +#endif + + // acquire a command queue + impl->cq = skc_runtime_acquire_cq_in_order(runtime); + + // acquire kernel + impl->kernels.render = skc_device_acquire_kernel(runtime->device,SKC_DEVICE_KERNEL_ID_RENDER); + + return SKC_ERR_SUCCESS; +} + +// +// +// diff --git a/src/compute/skc/tile.h b/src/compute/skc/tile.h new file mode 100644 index 0000000000..d6d3c7f2f1 --- /dev/null +++ b/src/compute/skc/tile.h @@ -0,0 +1,496 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_TILE +#define SKC_ONCE_TILE + +// +// +// + +#include "macros.h" + +// +// Hard requirements: +// +// - A TTXB "block pool" extent that is at least 1GB. +// +// - A virtual surface of at least 8K x 8K +// +// - A physical surface of __don't really care__ because it's +// advantageous to tile the physical surface since it's likely +// to shrink the post-place TTCK sorting step. +// +// +// EXTENT TTXB BITS +// SIZE (MB) +------------------------------------+ +// | 22 23 24 25 26 27 | +// +----+------------------------------------+ +// | 8 | 128 256 512 1024 2048 4096 | +// TTXB | 16 | 256 512 1024 2048 4096 8192 | +// WORDS | 32 | 512 1024 2048 4096 8192 16384 | +// | 64 | 1024 2048 4096 8192 16384 32768 | +// +----+------------------------------------+ +// +// +// SURF X/Y BITS +// TILE +------------------------------------------------------+ +// | 5 6 7 8 9 10 11 12 13 | +// +----+------------------------------------------------------+ +// | 3 | 256 512 1024 2048 4096 8192 16384 32768 65536 | +// TILE | 4 | 512 1024 2048 4096 8192 16384 32768 65536 128K | +// SIDE | 5 | 1024 2048 4096 8192 16384 32768 65536 128K 256K | +// BITS | 6 | 2048 4096 8192 16384 32768 65536 128K 256K 512K | +// | 7 | 4096 8192 16384 32768 65536 128K 256K 512K 1024K | +// +----+------------------------------------------------------+ +// TILES^2 | 1024 4096 16384 65536 256K 1M 4M 16M 64M | +// +------------------------------------------------------+ +// +// The following values should be pretty future-proof across all GPUs: +// +// - The minimum addressable subblock size is 16 words (64 bytes) to +// ensure there is enough space for a path or raster header and +// its payload. +// +// - Blocks are power-of-2 multiples of subblocks. Larger blocks can +// reduce allocation activity (fewer atomic adds). +// +// - 27 bits of TTXB_ID space implies a max of 4GB-32GB of +// rasterized paths depending on the size of the TTXB block. +// This could enable interesting use cases. +// +// - A virtual rasterization surface that's from +/-16K to +/-128K +// depending on the size of the TTXB block. +// +// - Keys that (optionally) only require a 32-bit high word +// comparison. +// +// - Support for a minimum of 256K layers. This can be practically +// raised to 1m or 2m layers. +// + +// +// TTRK (64-bit COMPARE) +// +// 0 63 +// | TTSB ID | X | Y | RASTER COHORT ID | +// +---------+------+------+------------------+ +// | 27 | 12 | 12 | 13 | +// +// +// TTRK (32-BIT COMPARE) +// +// 0 63 +// | TTSB ID | N/A | X | Y | RASTER COHORT ID | +// +---------+-----+------+------+------------------+ +// | 27 | 5 | 12 | 12 | 8 | +// +// +// TTSK v2: +// +// 0 63 +// | TTSB ID | IS_PREFIX | N/A | X | Y | +// +---------+-----------+------+----+----+ +// | 27 | 1 (=0) | 12 | 12 | 12 | +// +// +// TTPK v2: +// +// 0 63 +// | TTPB ID | IS_PREFIX | SPAN | X | Y | +// +---------+-----------+------+-----+-----+ +// | 27 | 1 (=1) | 12 | 12 | 12 | +// +// +// TTCK (32-BIT COMPARE) v1: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 18 | 7 | 7 | +// +// +// TTCK (32-BIT COMPARE) v2: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 15 | 9 | 8 | +// +// +// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 27 | 1 | 1 | 18 | 9 | 8 | +// + +// +// +// + +#define SKC_SUBPIXEL_RESL_X_LOG2 5 +#define SKC_SUBPIXEL_RESL_Y_LOG2 5 + +// +// FIXME -- COMMON -- HOIST ELSEWHERE +// + +#define SKC_TILE_WIDTH (1 << SKC_TILE_WIDTH_LOG2) +#define SKC_TILE_HEIGHT (1 << SKC_TILE_HEIGHT_LOG2) + +#define SKC_SUBPIXEL_RESL_X (1 << SKC_SUBPIXEL_RESL_X_LOG2) +#define SKC_SUBPIXEL_RESL_Y (1 << SKC_SUBPIXEL_RESL_Y_LOG2) + +// +// PLATFORM SURFACE TILE SIZE +// + +#define SKC_TILE_WIDTH_MASK SKC_BITS_TO_MASK(SKC_TILE_WIDTH_LOG2) +#define SKC_TILE_HEIGHT_MASK SKC_BITS_TO_MASK(SKC_TILE_HEIGHT_LOG2) + +// +// TILE SUBPIXEL RESOLUTION +// + +#define SKC_SUBPIXEL_RESL_X (1 << SKC_SUBPIXEL_RESL_X_LOG2) +#define SKC_SUBPIXEL_RESL_Y (1 << SKC_SUBPIXEL_RESL_Y_LOG2) + +#define SKC_SUBPIXEL_MASK_X SKC_BITS_TO_MASK(SKC_SUBPIXEL_RESL_X_LOG2) +#define SKC_SUBPIXEL_MASK_Y SKC_BITS_TO_MASK(SKC_SUBPIXEL_RESL_Y_LOG2) + +#define SKC_SUBPIXEL_RESL_X_F32 ((float)(SKC_SUBPIXEL_RESL_X)) +#define SKC_SUBPIXEL_RESL_Y_F32 ((float)(SKC_SUBPIXEL_RESL_Y)) + +#define SKC_SUBPIXEL_X_SCALE_UP SKC_SUBPIXEL_RESL_X_F32 +#define SKC_SUBPIXEL_Y_SCALE_UP SKC_SUBPIXEL_RESL_Y_F32 + +#define SKC_SUBPIXEL_X_SCALE_DOWN (1.0f / SKC_SUBPIXEL_RESL_X_F32) +#define SKC_SUBPIXEL_Y_SCALE_DOWN (1.0f / SKC_SUBPIXEL_RESL_Y_F32) + +// +// SUBTILE RESOLUTION +// + +#define SKC_SUBTILE_RESL_X_LOG2 (SKC_TILE_WIDTH_LOG2 + SKC_SUBPIXEL_RESL_X_LOG2) +#define SKC_SUBTILE_RESL_Y_LOG2 (SKC_TILE_HEIGHT_LOG2 + SKC_SUBPIXEL_RESL_Y_LOG2) + +#define SKC_SUBTILE_RESL_X (1 << SKC_SUBTILE_RESL_X_LOG2) +#define SKC_SUBTILE_RESL_Y (1 << SKC_SUBTILE_RESL_Y_LOG2) + +#define SKC_SUBTILE_MASK_X SKC_BITS_TO_MASK(SKC_SUBTILE_RESL_X_LOG2) +#define SKC_SUBTILE_MASK_Y SKC_BITS_TO_MASK(SKC_SUBTILE_RESL_Y_LOG2) + +#define SKC_SUBTILE_RESL_X_F32 ((float)(SKC_SUBTILE_RESL_X)) +#define SKC_SUBTILE_RESL_Y_F32 ((float)(SKC_SUBTILE_RESL_Y)) + +#define SKC_SUBTILE_X_SCALE_DOWN (1.0f / SKC_SUBTILE_RESL_X_F32) +#define SKC_SUBTILE_Y_SCALE_DOWN (1.0f / SKC_SUBTILE_RESL_Y_F32) + +// +// +// + +#define SKC_TILE_X_OFFSET_U32 (1 << (SKC_TTSK_BITS_X-1)) +#define SKC_TILE_X_SPAN_U32 (1 << (SKC_TTSK_BITS_X)) // exclusive + +#define SKC_TILE_Y_OFFSET_U32 (1 << (SKC_TTSK_BITS_Y-1)) +#define SKC_TILE_Y_SPAN_U32 (1 << (SKC_TTSK_BITS_Y)) // exclusive + +#define SKC_TILE_X_OFFSET_F32 0 // ((float)SKC_TILE_X_OFFSET_U32) +#define SKC_TILE_X_SPAN_F32 ((float)SKC_TILE_X_SPAN_U32) + +#define SKC_TILE_Y_OFFSET_F32 0 // ((float)SKC_TILE_Y_OFFSET_U32) +#define SKC_TILE_Y_SPAN_F32 ((float)SKC_TILE_Y_SPAN_U32) + +// +// TILE TRACE SUBPIXEL, PREFIX & COMPOSITION KEYS +// +// These keys are are purposefully 64-bits so they can be sorted with +// Hotsort's 32:32 or 64-bit implementation. +// +// Tiles are 32x32 on CUDA but can be made rectangular or smaller to +// fit other architectures. +// +// TW : tile width +// TH : tile height +// +// TTS : tile trace subpixel +// TTSB : tile trace subpixel block +// TTRK : tile trace subpixel key while in raster cohort +// TTSK : tile trace subpixel key +// +// TTP : tile trace prefix +// TTPB : tile trace prefix block +// TTPK : tile trace prefix key +// +// TTCK : tile trace composition key +// + +// +// TILE TRACE SUBPIXEL +// +// The subpixels are encoded with either absolute tile coordinates +// (32-bits) or packed in delta-encoded form form. +// +// For 32-bit subpixel packing of a 32x32 or smaller tile: +// +// A tile X is encoded as: +// +// TX : 10 : unsigned min(x0,x1) tile subpixel coordinate. +// +// SX : 6 : unsigned subpixel span from min to max x with range +// [0,32]. The original direction is not captured. Would +// be nice to capture dx but not necessary right now but +// could be in the future. <--- SPARE VALUES AVAILABLE +// +// A tile Y is encoded as: +// +// TY : 10 : unsigned min(y0,y1) tile subpixel coordinate. +// +// DY : 6 : signed subpixel delta y1-y0. The range of delta is +// [-32,32] but horizontal lines are not encoded so [1,32] +// is mapped to [0,31]. The resulting range [-32,31] fits +// in 6 bits. +// +// TTS: +// +// 0 31 +// | TX | SX | TY | DY | +// +-----+------+-----+------+ +// | 10 | 6 | 10 | 6 | +// + +#define SKC_TTS_BITS_TX 10 +#define SKC_TTS_BITS_SX 6 +#define SKC_TTS_BITS_TY 10 +#define SKC_TTS_BITS_SY 6 + +// +// +// + +#define SKC_TTS_INVALID ( SKC_UINT_MAX ) // relies on limited range of dx + +// +// +// + +#define SKC_TTS_OFFSET_SX (SKC_TTS_BITS_TX) +#define SKC_TTS_OFFSET_TY (SKC_TTS_BITS_TX + SKC_TTS_BITS_SX) +#define SKC_TTS_OFFSET_DY (SKC_TTS_BITS_TX + SKC_TTS_BITS_SX + SKC_TTS_BITS_TY) + +#define SKC_TTS_MASK_TX SKC_BITS_TO_MASK(SKC_TTS_BITS_TX) +#define SKC_TTS_MASK_SX SKC_BITS_TO_MASK_AT(SKC_TTS_BITS_SX,SKC_TTS_OFFSET_SX) +#define SKC_TTS_MASK_TY SKC_BITS_TO_MASK_AT(SKC_TTS_BITS_TY,SKC_TTS_OFFSET_TY) + +#define SKC_TTS_MASK_TX_PIXEL SKC_BITS_TO_MASK_AT(SKC_TTS_BITS_TX-SKC_SUBPIXEL_RESL_X_LOG2, \ + SKC_SUBPIXEL_RESL_X_LOG2) +#define SKC_TTS_MASK_TY_PIXEL SKC_BITS_TO_MASK_AT(SKC_TTS_BITS_TY-SKC_SUBPIXEL_RESL_Y_LOG2, \ + SKC_TTS_OFFSET_TY+SKC_SUBPIXEL_RESL_Y_LOG2) + +// +// TTRK (64-BIT COMPARE) +// +// 0 63 +// | TTSB ID | X | Y | COHORT ID | +// +---------+------+------+-----------+ +// | 27 | 12 | 12 | 13 | +// +// +// TTRK (32-BIT COMPARE) +// +// 0 63 +// | TTSB ID | N/A | X | Y | COHORT ID | +// +---------+-----+------+------+-----------+ +// | 27 | 5 | 12 | 12 | 8 | +// + +// +// TTRK is sortable intermediate key format for TTSK +// +// We're going to use the 32-bit comparison version for now +// + +// +// TTSK v2: +// +// 0 63 +// | TTSB ID | PREFIX | N/A | X | Y | +// +---------+--------+------+----+----+ +// | 27 | 1 (=0) | 12 | 12 | 12 | +// +// +// TTPK v2: +// +// 0 63 +// | TTPB ID | PREFIX | SPAN | X | Y | +// +---------+--------+------+-----+-----+ +// | 27 | 1 (=1) | 12 | 12 | 12 | +// + +#define SKC_TTXK_LO_BITS_ID 27 +#define SKC_TTXK_LO_BITS_PREFIX 1 +#define SKC_TTXK_HI_BITS_Y 12 +#define SKC_TTXK_HI_BITS_X 12 +#define SKC_TTXK_BITS_SPAN 12 +#define SKC_TTXK_HI_BITS_YX (SKC_TTXK_HI_BITS_Y + SKC_TTXK_HI_BITS_X) + +#define SKC_TTRK_HI_MASK_X SKC_BITS_TO_MASK(SKC_TTXK_HI_BITS_X) +#define SKC_TTRK_HI_MASK_YX SKC_BITS_TO_MASK(SKC_TTXK_HI_BITS_YX) + +#define SKC_TTRK_HI_BITS_COHORT 8 +#define SKC_TTRK_LO_BITS_NA (32 - SKC_TTXK_LO_BITS_ID) +#define SKC_TTRK_HI_BITS_COHORT_Y (SKC_TTRK_HI_BITS_COHORT + SKC_TTXK_HI_BITS_Y) + +#define SKC_TTRK_HI_OFFSET_COHORT (32 - SKC_TTRK_HI_BITS_COHORT) +#define SKC_TTRK_HI_MASK_COHORT SKC_BITS_TO_MASK_AT(SKC_TTRK_HI_BITS_COHORT,SKC_TTRK_HI_OFFSET_COHORT) + +#define SKC_TTRK_HI_BITS_COHORT_YX (SKC_TTRK_HI_BITS_COHORT + SKC_TTXK_HI_BITS_Y + SKC_TTXK_HI_BITS_X) + +#define SKC_TTXK_LO_BITS_ID_PREFIX (SKC_TTXK_LO_BITS_ID + SKC_TTXK_LO_BITS_PREFIX) + +#define SKC_TTXK_LO_OFFSET_PREFIX SKC_TTXK_LO_BITS_ID +#define SKC_TTXK_LO_OFFSET_SPAN SKC_TTXK_LO_BITS_ID_PREFIX + +#define SKC_TTXK_LO_BITS_SPAN (32 - SKC_TTXK_LO_BITS_ID_PREFIX) +#define SKC_TTXK_HI_BITS_SPAN (SKC_TTXK_BITS_SPAN - SKC_TTXK_LO_BITS_SPAN) + +#define SKC_TTXK_LO_OFFSET_PREFIX SKC_TTXK_LO_BITS_ID + +#define SKC_TTXK_LO_MASK_ID SKC_BITS_TO_MASK(SKC_TTXK_LO_BITS_ID) +#define SKC_TTXK_LO_MASK_PREFIX SKC_BITS_TO_MASK_AT(SKC_TTXK_LO_BITS_PREFIX,SKC_TTXK_LO_OFFSET_PREFIX) +#define SKC_TTXK_LO_MASK_ID_PREFIX SKC_BITS_TO_MASK(SKC_TTXK_LO_BITS_ID_PREFIX) + +#define SKC_TTXK_HI_OFFSET_Y (32 - SKC_TTXK_HI_BITS_Y) +#define SKC_TTXK_HI_OFFSET_X (SKC_TTXK_HI_OFFSET_Y - SKC_TTXK_HI_BITS_X) + +#define SKC_TTXK_HI_ONE_X (1u << SKC_TTXK_HI_OFFSET_X) + +#define SKC_TTXK_HI_MASK_YX SKC_BITS_TO_MASK_AT(SKC_TTXK_HI_BITS_YX,SKC_TTXK_HI_OFFSET_X) +#define SKC_TTXK_HI_MASK_Y SKC_BITS_TO_MASK_AT(SKC_TTXK_HI_BITS_Y ,SKC_TTXK_HI_OFFSET_Y) + +#define SKC_TTPK_LO_SHL_YX_SPAN (SKC_TTXK_LO_OFFSET_SPAN - SKC_TTXK_HI_OFFSET_X) +#define SKC_TTPK_HI_SHR_YX_SPAN (SKC_TTXK_HI_OFFSET_X + SKC_TTXK_LO_BITS_SPAN) + +// +// TTCK (32-BIT COMPARE) v1 -- NOT USED: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 18 | 7 | 7 | +// +// +// TTCK (32-BIT COMPARE) v2 -- NOT USED: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 30 | 1 | 1 | 15 | 9 | 8 | +// +// +// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile: +// +// 0 63 +// | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER | X | Y | +// +----------------------+--------+--------+-------+-----+-----+ +// | 27 | 1 | 1 | 18 | 9 | 8 | +// + +#define SKC_TTCK_BITS_LAYER 18 + +#define SKC_TTCK_LO_BITS_ID SKC_TTXK_LO_BITS_ID +#define SKC_TTCK_LO_OFFSET_ID 0 + +#define SKC_TTCK_LO_MASK_ID SKC_BITS_TO_MASK(SKC_TTCK_LO_BITS_ID) + +#define SKC_TTCK_LO_BITS_PREFIX 1 +#define SKC_TTCK_LO_OFFSET_PREFIX SKC_TTCK_LO_BITS_ID +#define SKC_TTCK_LO_MASK_PREFIX SKC_BITS_TO_MASK_AT(SKC_TTCK_LO_BITS_PREFIX,SKC_TTCK_LO_OFFSET_PREFIX) + +#define SKC_TTCK_LO_BITS_ID_PREFIX (SKC_TTCK_LO_BITS_ID + SKC_TTCK_LO_BITS_PREFIX) +#define SKC_TTCK_LO_MASK_ID_PREFIX SKC_BITS_TO_MASK(SKC_TTCK_LO_BITS_ID_PREFIX) + +#define SKC_TTCK_LO_BITS_ESCAPE 1 +#define SKC_TTCK_LO_OFFSET_ESCAPE SKC_TTCK_LO_BITS_ID_PREFIX +#define SKC_TTCK_LO_MASK_ESCAPE SKC_BITS_TO_MASK_AT(SKC_TTCK_LO_BITS_ESCAPE,SKC_TTCK_LO_OFFSET_ESCAPE) + +#define SKC_TTCK_LO_BITS_ID_PREFIX_ESCAPE (SKC_TTCK_LO_BITS_ID_PREFIX + SKC_TTCK_LO_BITS_ESCAPE) + +#define SKC_TTCK_HI_OFFSET_Y 24 +#define SKC_TTCK_HI_OFFSET_X 15 + +#define SKC_TTCK_HI_BITS_Y 8 +#define SKC_TTCK_HI_BITS_X 9 +#define SKC_TTCK_HI_BITS_YX (SKC_TTCK_HI_BITS_X + SKC_TTCK_HI_BITS_Y) +#define SKC_TTCK_HI_MASK_YX SKC_BITS_TO_MASK_AT(SKC_TTCK_HI_BITS_YX,SKC_TTCK_HI_OFFSET_X) + +#define SKC_TTCK_HI_BITS_LAYER (32 - SKC_TTCK_HI_BITS_YX) +#define SKC_TTCK_HI_MASK_LAYER SKC_BITS_TO_MASK(SKC_TTCK_HI_BITS_LAYER) +#define SKC_TTCK_HI_SHR_LAYER (SKC_TTCK_HI_BITS_Y + SKC_TTCK_HI_BITS_X + SKC_TTCK_BITS_LAYER - 32) + +#define SKC_TTCK_LO_BITS_LAYER (SKC_TTCK_BITS_LAYER - SKC_TTCK_HI_BITS_LAYER) + +// +// TILE COORD +// +// 0 32 +// | N/A | X | Y | +// +-----+-----+-----+ +// | 8 | 12 | 12 | +// +// +// This simplifies the clip test in the place kernel. +// + +union skc_tile_coord +{ + skc_uint u32; + + struct { +#if defined(__OPENCL_C_VERSION__) + skc_uint xy; +#else + skc_uint na0 : 32 - SKC_TTXK_HI_BITS_YX; // 8 + skc_uint x : SKC_TTXK_HI_BITS_X; // 12 + skc_uint y : SKC_TTXK_HI_BITS_Y; // 12 +#endif + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_tile_coord) == sizeof(skc_uint)); + +// +// +// + +union skc_tile_clip +{ + skc_uint u32a2[2]; + + skc_uint2 u32v2; + + struct { + union skc_tile_coord xy0; // lower left + union skc_tile_coord xy1; // upper right + }; +}; + +SKC_STATIC_ASSERT(sizeof(union skc_tile_clip) == sizeof(skc_uint2)); + +// +// +// + +#endif + +// +// +// diff --git a/src/compute/skc/types.h b/src/compute/skc/types.h new file mode 100644 index 0000000000..6d6d19aba2 --- /dev/null +++ b/src/compute/skc/types.h @@ -0,0 +1,267 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#ifndef SKC_ONCE_TYPES +#define SKC_ONCE_TYPES + +// +// +// + +#if !defined(__OPENCL_C_VERSION__) + +// +// What is going on here is that OpenCL defines both host and device +// scalar and vector types. +// +// Our actual device kernels should try to use native compiler types +// for anything that's private to the kernel and the skc_* variant for +// types and composites that get pulled into host code. +// +// I'm not excited about redefining all the basic types but this is a +// reasonable solution that allows the code to bridge the host (C/C++) +// and device (OpenCL) environments as well as provide vector types. +// + +#ifdef __APPLE__ +#include "OpenCL/opencl.h" +#else +#include "CL/opencl.h" +#endif + +// +// +// + +#include <stdbool.h> + +// +// +// + +#define SKC_TYPE_HELPER(t) skc_##t +#define SKC_TYPE(t) SKC_TYPE_HELPER(t) + +typedef cl_bool skc_bool; + +typedef cl_char skc_char; +typedef cl_char2 skc_char2; +typedef cl_char3 skc_char3; +typedef cl_char4 skc_char4; +typedef cl_char8 skc_char8; +typedef cl_char16 skc_char16; + +typedef cl_uchar skc_uchar; +typedef cl_uchar2 skc_uchar2; +typedef cl_uchar3 skc_uchar3; +typedef cl_uchar4 skc_uchar4; +typedef cl_uchar8 skc_uchar8; +typedef cl_uchar16 skc_uchar16; + +typedef cl_short skc_short; +typedef cl_short2 skc_short2; +typedef cl_short3 skc_short3; +typedef cl_short4 skc_short4; +typedef cl_short8 skc_short8; +typedef cl_short16 skc_short16; + +typedef cl_ushort skc_ushort; +typedef cl_ushort2 skc_ushort2; +typedef cl_ushort3 skc_ushort3; +typedef cl_ushort4 skc_ushort4; +typedef cl_ushort8 skc_ushort8; +typedef cl_ushort16 skc_ushort16; + +typedef cl_int skc_int; +typedef cl_int2 skc_int2; +typedef cl_int3 skc_int3; +typedef cl_int4 skc_int4; +typedef cl_int8 skc_int8; +typedef cl_int16 skc_int16; + +typedef cl_uint skc_uint; +typedef cl_uint2 skc_uint2; +typedef cl_uint3 skc_uint3; +typedef cl_uint4 skc_uint4; +typedef cl_uint8 skc_uint8; +typedef cl_uint16 skc_uint16; + +typedef cl_ulong skc_ulong; +typedef cl_ulong2 skc_ulong2; +typedef cl_ulong3 skc_ulong3; +typedef cl_ulong4 skc_ulong4; +typedef cl_ulong8 skc_ulong8; +typedef cl_ulong16 skc_ulong16; + +typedef cl_long skc_long; +typedef cl_long2 skc_long2; +typedef cl_long3 skc_long3; +typedef cl_long4 skc_long4; +typedef cl_long8 skc_long8; +typedef cl_long16 skc_long16; + +typedef cl_float skc_float; +typedef cl_float2 skc_float2; +typedef cl_float3 skc_float3; +typedef cl_float4 skc_float4; +typedef cl_float8 skc_float8; +typedef cl_float16 skc_float16; + +typedef cl_half skc_half; + +#if defined( __CL_HALF2__) +typedef cl_half2 skc_half2; +#endif +#if defined( __CL_HALF4__) +typedef cl_half4 skc_half4; +#endif +#if defined( __CL_HALF8__) +typedef cl_half8 skc_half8; +#endif +#if defined( __CL_HALF16__) +typedef cl_half16 skc_half16; +#endif + +// +// +// + +#else + +// +// +// + +#define SKC_TYPE(t) t + +typedef bool skc_bool; + +typedef char skc_char; +typedef char2 skc_char2; +typedef char3 skc_char3; +typedef char4 skc_char4; +typedef char8 skc_char8; +typedef char16 skc_char16; + +typedef uchar skc_uchar; +typedef uchar2 skc_uchar2; +typedef uchar3 skc_uchar3; +typedef uchar4 skc_uchar4; +typedef uchar8 skc_uchar8; +typedef uchar16 skc_uchar16; + +typedef short skc_short; +typedef short2 skc_short2; +typedef short3 skc_short3; +typedef short4 skc_short4; +typedef short8 skc_short8; +typedef short16 skc_short16; + +typedef ushort skc_ushort; +typedef ushort2 skc_ushort2; +typedef ushort3 skc_ushort3; +typedef ushort4 skc_ushort4; +typedef ushort8 skc_ushort8; +typedef ushort16 skc_ushort16; + +typedef int skc_int; +typedef int2 skc_int2; +typedef int3 skc_int3; +typedef int4 skc_int4; +typedef int8 skc_int8; +typedef int16 skc_int16; + +typedef uint skc_uint; +typedef uint2 skc_uint2; +typedef uint3 skc_uint3; +typedef uint4 skc_uint4; +typedef uint8 skc_uint8; +typedef uint16 skc_uint16; + +typedef ulong skc_ulong; +typedef ulong2 skc_ulong2; +typedef ulong3 skc_ulong3; +typedef ulong4 skc_ulong4; +typedef ulong8 skc_ulong8; +typedef ulong16 skc_ulong16; + +typedef long skc_long; +typedef long2 skc_long2; +typedef long3 skc_long3; +typedef long4 skc_long4; +typedef long8 skc_long8; +typedef long16 skc_long16; + +typedef float skc_float; +typedef float2 skc_float2; +typedef float3 skc_float3; +typedef float4 skc_float4; +typedef float8 skc_float8; +typedef float16 skc_float16; + +typedef half skc_half; + +#if defined( __CL_HALF2__) +typedef half2 skc_half2; +#endif +#if defined( __CL_HALF4__) +typedef half4 skc_half4; +#endif +#if defined( __CL_HALF8__) +typedef half8 skc_half8; +#endif +#if defined( __CL_HALF16__) +typedef half16 skc_half16; +#endif + +// +// +// + +#define SKC_AS_HELPER(t) as_##t +#define SKC_AS(t) SKC_AS_HELPER(t) + +#define SKC_CONVERT_HELPER(t) convert_##t +#define SKC_CONVERT(t) SKC_CONVERT_HELPER(t) + +// mode is: sat, rte, rtz, rtp, rtn --or-- sat_rte, sat_rtz, etc. +#define SKC_CONVERT_MODE_HELPER(t,m) convert_##t##_##m +#define SKC_CONVERT_MODE(t,m) SKC_CONVERT_HELPER(t) + +// +// +// + +#endif + +// +// +// + +#endif + +// +// +// + +#define SKC_UCHAR_MAX 0xFF + +#define SKC_SHORT_MAX 0x7FFF +#define SKC_SHORT_MIN (-SKC_SHORT_MAX - 1) +#define SKC_USHORT_MAX 0xFFFF + +#define SKC_INT_MAX 0x7FFFFFFF +#define SKC_INT_MIN (-SKC_INT_MAX - 1) +#define SKC_UINT_MAX 0xFFFFFFFF + +#define SKC_ULONG_MAX 0xFFFFFFFFFFFFFFFFL + +// +// +// + diff --git a/src/compute/skc/util.c b/src/compute/skc/util.c new file mode 100644 index 0000000000..fe368880ce --- /dev/null +++ b/src/compute/skc/util.c @@ -0,0 +1,86 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + */ + +#include "util.h" + +// +// +// + +#include <intrin.h> + +// +// +// + +skc_bool +skc_is_pow2_uint(skc_uint n) +{ + return (n & (n-1)) == 0; +} + +// +// ASSUMES NON-ZERO +// + +skc_uint +skc_msb_idx_uint(skc_uint n) +{ + +#ifdef _MSC_VER + + skc_uint index; + + _BitScanReverse(&index,n); + + return index; + +#elif defined(__GNUC__) + +#error "BUSTED msb_index()" + return 31 - __builtin_clz(mask); + +#else + +#error "No msb_index()" + +#endif + +} + +// +// +// + +skc_uint +skc_pow2_rd_uint(skc_uint n) +{ + return 1u << skc_msb_idx_uint(n); +} + +// +// +// + +skc_uint +skc_pow2_ru_uint(skc_uint n) +{ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + + return n; +} + +// +// +// diff --git a/src/compute/skc/util.h b/src/compute/skc/util.h new file mode 100644 index 0000000000..f7f8d62866 --- /dev/null +++ b/src/compute/skc/util.h @@ -0,0 +1,29 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "types.h" + +// +// +// + +skc_bool skc_is_pow2_uint(skc_uint n); +skc_uint skc_msb_idx_uint(skc_uint n); // 0-based bit position +skc_uint skc_pow2_rd_uint(skc_uint n); +skc_uint skc_pow2_ru_uint(skc_uint n); + +// +// +// + diff --git a/src/compute/skc/weakref.c b/src/compute/skc/weakref.c new file mode 100644 index 0000000000..e8a1d55f08 --- /dev/null +++ b/src/compute/skc/weakref.c @@ -0,0 +1,95 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "weakref.h" +#include "macros.h" + +// +// WEAKREF +// + +#define SKC_WEAKREF_INDEX_BITS 16 // max bits for a weakref index -- this could/should be 12 bits +#define SKC_WEAKREF_INDEX_COUNT (1u << SKC_WEAKREF_INDEX_BITS) + +#define SKC_WEAKREF_INDEX_MASK SKC_BITS_TO_MASK(SKC_WEAKREF_INDEX_BITS) +#define SKC_WEAKREF_EPOCH_MASK SKC_BITS_TO_MASK_AT_64(64-SKC_WEAKREF_INDEX_BITS,SKC_WEAKREF_INDEX_BITS) + +#define SKC_WEAKREF_EPOCH_INIT 0ul +#define SKC_WEAKREF_EPOCH_ONE SKC_BITS_TO_MASK_AT_64(1,SKC_WEAKREF_INDEX_BITS) + +// +// FIXME -- ASSUMES LITTLE-ENDIAN +// + +union skc_weakref +{ + skc_weakref_t u64; // 64-bits containing refutation epoch and an index + + struct { + skc_uint index : SKC_WEAKREF_INDEX_BITS; + skc_uint na_lo : 32 - SKC_WEAKREF_INDEX_BITS; + skc_uint na_hi; + }; + + struct { + skc_ulong : SKC_WEAKREF_INDEX_BITS; + skc_ulong epoch : 64 - SKC_WEAKREF_INDEX_BITS; + }; +}; + +SKC_STATIC_ASSERT(sizeof(skc_weakref_t) == sizeof(skc_ulong)); +SKC_STATIC_ASSERT(sizeof(union skc_weakref) == sizeof(skc_ulong)); + +// +// +// + +void +skc_weakref_epoch_init(skc_epoch_t * const epoch) +{ + *epoch = SKC_WEAKREF_EPOCH_INIT; +} + +void +skc_weakref_epoch_inc(skc_epoch_t * const epoch) +{ + *epoch += SKC_WEAKREF_EPOCH_ONE; +} + +void +skc_weakref_init(skc_weakref_t * const weakref, + skc_epoch_t * const epoch, + skc_uint const index) +{ + *weakref = *epoch | (index & SKC_WEAKREF_INDEX_MASK); +} + +bool +skc_weakref_is_invalid(skc_weakref_t const * const weakref, + skc_epoch_t const * const epoch) +{ + return ((*weakref ^ *epoch) & SKC_WEAKREF_EPOCH_MASK) != 0UL; +} + +skc_uint +skc_weakref_index(skc_weakref_t const * const weakref) +{ + // truncate to word and mask + return (skc_uint)*weakref & SKC_WEAKREF_INDEX_MASK; +} + +// +// +// diff --git a/src/compute/skc/weakref.h b/src/compute/skc/weakref.h new file mode 100644 index 0000000000..9d09f8e5a6 --- /dev/null +++ b/src/compute/skc/weakref.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#pragma once + +// +// +// + +#include "skc.h" +#include "types.h" + +// +// +// + +typedef skc_ulong skc_epoch_t; + +// +// +// + +void +skc_weakref_epoch_init(skc_epoch_t * const epoch); + +void +skc_weakref_epoch_inc(skc_epoch_t * const epoch); + +void +skc_weakref_init(skc_weakref_t * const weakref, + skc_epoch_t * const epoch, + skc_uint const index); + +bool +skc_weakref_is_invalid(skc_weakref_t const * const weakref, + skc_epoch_t const * const epoch); + +skc_uint +skc_weakref_index(skc_weakref_t const * const weakref); + +// +// +// + + diff --git a/src/compute/ts/transform_stack.c b/src/compute/ts/transform_stack.c new file mode 100644 index 0000000000..42a5a1e567 --- /dev/null +++ b/src/compute/ts/transform_stack.c @@ -0,0 +1,720 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +#include <stdlib.h> +#include <assert.h> +#include <math.h> + +// +// +// + +#include "transform_stack.h" + +// +// +// + +#define SKC_TRANSFORM_SUFFIX_EVAL(a) a + +#define SKC_TRANSFORM_SUFFIX_CONCAT(func) \ + SKC_TRANSFORM_SUFFIX_EVAL(func)##SKC_TRANSFORM_SUFFIX_EVAL(SKC_TRANSFORM_FLOAT_SUFFIX) + +// +// +// + +#define SKC_TRANSFORM_SIN(x) SKC_TRANSFORM_SUFFIX_CONCAT(sin)(x) +#define SKC_TRANSFORM_COS(x) SKC_TRANSFORM_SUFFIX_CONCAT(cos)(x) +#define SKC_TRANSFORM_TAN(x) SKC_TRANSFORM_SUFFIX_CONCAT(tan)(x) +#define SKC_TRANSFORM_RCP(x) (SKC_TRANSFORM_SUFFIX_CONCAT(1.0) / (x)) + +// +// +// + +union skc_transform_stack_3x3_u +{ + skc_transform_float_t a9[9]; + + struct { + skc_transform_float_t sx; + skc_transform_float_t shx; + skc_transform_float_t tx; + + skc_transform_float_t shy; + skc_transform_float_t sy; + skc_transform_float_t ty; + + skc_transform_float_t w0; + skc_transform_float_t w1; + skc_transform_float_t w2; + }; +}; + + +struct skc_transform_stack +{ + uint32_t size; + uint32_t count; + + skc_transform_weakref_t * weakrefs; + union skc_transform_stack_3x3_u * transforms; +}; + +// +// +// + +static +void +skc_transform_stack_3x3_u_copy(union skc_transform_stack_3x3_u * const __restrict dst, + union skc_transform_stack_3x3_u const * const __restrict src) +{ + for (int32_t ii=0; ii<9; ii++) + dst->a9[ii] = src->a9[ii]; +} + +// +// C = A * B +// + +static +void +skc_transform_stack_3x3_u_multiply(union skc_transform_stack_3x3_u * const __restrict C, + union skc_transform_stack_3x3_u const * const __restrict A, + union skc_transform_stack_3x3_u const * const __restrict B) +{ + C->sx = A->sx * B->sx + A->shx * B->shy + A->tx * B->w0; + C->shx = A->sx * B->shx + A->shx * B->sy + A->tx * B->w1; + C->tx = A->sx * B->tx + A->shx * B->ty + A->tx * B->w2; + + C->shy = A->shy * B->sx + A->sy * B->shy + A->ty * B->w0; + C->sy = A->shy * B->shx + A->sy * B->sy + A->ty * B->w1; + C->ty = A->shy * B->tx + A->sy * B->ty + A->ty * B->w2; + + C->w0 = A->w0 * B->sx + A->w1 * B->shy + A->w2 * B->w0; + C->w1 = A->w0 * B->shx + A->w1 * B->sy + A->w2 * B->w1; + C->w2 = A->w0 * B->tx + A->w1 * B->ty + A->w2 * B->w2; +} + +// +// +// + +static +void +skc_transform_stack_resize(struct skc_transform_stack * const ts, uint32_t const size) +{ + ts->size = size; + ts->weakrefs = realloc(ts->weakrefs, size * sizeof(*ts->weakrefs)); + ts->transforms = realloc(ts->transforms,size * sizeof(*ts->transforms)); +} + +static +void +skc_transform_stack_ensure(struct skc_transform_stack * const ts) +{ + if (ts->count < ts->size) + return; + + // increase by 50% and by at least 8 + skc_transform_stack_resize(ts,ts->size + max(ts->size/2,8)); +} + +// +// +// + +struct skc_transform_stack * +skc_transform_stack_create(uint32_t const size) +{ + struct skc_transform_stack * ts = malloc(sizeof(*ts)); + + ts->size = size; + ts->count = 0; + + ts->transforms = NULL; + ts->weakrefs = NULL; + + skc_transform_stack_resize(ts,size); + + return ts; +} + +void +skc_transform_stack_release(struct skc_transform_stack * const ts) +{ + free(ts->transforms); + free(ts->weakrefs); + + free(ts); +} + +// +// +// + +uint32_t +skc_transform_stack_save(struct skc_transform_stack * const ts) +{ + return ts->count; +} + +void +skc_transform_stack_restore(struct skc_transform_stack * const ts, + uint32_t const restore) +{ + ts->count = restore; +} + +// +// +// + +static +union skc_transform_stack_3x3_u * +skc_transform_stack_tos(struct skc_transform_stack * const ts) +{ + return ts->transforms + ts->count - 1; +} + +// +// +// + +#if 0 + +void +skc_transform_to_f32a8(float f32a8[8], skc_transform_float_t const a9[9]) +{ + if (a9[8] == 1.0) + { + f32a8[0] = (float)a9[0]; + f32a8[1] = (float)a9[1]; + f32a8[2] = (float)a9[2]; + f32a8[3] = (float)a9[3]; + f32a8[4] = (float)a9[4]; + f32a8[5] = (float)a9[5]; + f32a8[6] = (float)a9[6]; + f32a8[7] = (float)a9[7]; + } + else + { + skc_transform_float_t const rcp = 1.0 / a9[8]; + + f32a8[0] = (float)(a9[0] * rcp); + f32a8[1] = (float)(a9[1] * rcp); + f32a8[2] = (float)(a9[2] * rcp); + f32a8[3] = (float)(a9[3] * rcp); + f32a8[4] = (float)(a9[4] * rcp); + f32a8[5] = (float)(a9[5] * rcp); + f32a8[6] = (float)(a9[6] * rcp); + f32a8[7] = (float)(a9[7] * rcp); + } +} + +#endif + +// +// +// + +skc_transform_float_t * +skc_transform_stack_top_transform(struct skc_transform_stack * const ts) +{ + return skc_transform_stack_tos(ts)->a9; +} + +skc_weakref_t * +skc_transform_stack_top_weakref(struct skc_transform_stack * const ts) +{ + return ts->weakrefs + ts->count - 1; +} + +// +// +// + +void +skc_transform_stack_drop(struct skc_transform_stack * const ts) +{ + assert(ts->count >= 1); + + ts->count -= 1; +} + +void +skc_transform_stack_dup(struct skc_transform_stack * const ts) +{ + skc_transform_stack_ensure(ts); + + union skc_transform_stack_3x3_u * const tos = skc_transform_stack_tos(ts); + + skc_transform_stack_3x3_u_copy(tos+1,tos); + + ts->weakrefs[ts->count] = ts->weakrefs[ts->count-1]; + + ts->count += 1; +} + +// +// +// + +void +skc_transform_stack_push_matrix(struct skc_transform_stack * const ts, + skc_transform_float_t const sx, + skc_transform_float_t const shx, + skc_transform_float_t const tx, + skc_transform_float_t const shy, + skc_transform_float_t const sy, + skc_transform_float_t const ty, + skc_transform_float_t const w0, + skc_transform_float_t const w1, + skc_transform_float_t const w2) +{ + skc_transform_stack_ensure(ts); + + union skc_transform_stack_3x3_u * t = ts->transforms + ts->count; + + t->sx = sx; + t->shx = shx; + t->tx = tx; + + t->shy = shy; + t->sy = sy; + t->ty = ty; + + t->w0 = w0; + t->w1 = w1; + t->w2 = w2; + + ts->weakrefs[ts->count++] = SKC_WEAKREF_INVALID; +} + +void +skc_transform_stack_push_identity(struct skc_transform_stack * const ts) +{ + skc_transform_stack_push_matrix(ts, + 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_affine(struct skc_transform_stack * const ts, + skc_transform_float_t const sx, + skc_transform_float_t const shx, + skc_transform_float_t const tx, + skc_transform_float_t const shy, + skc_transform_float_t const sy, + skc_transform_float_t const ty) +{ + skc_transform_stack_push_matrix(ts, + sx, shx, tx, + shy, sy, ty, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_translate(struct skc_transform_stack * const ts, + skc_transform_float_t const tx, + skc_transform_float_t const ty) +{ + skc_transform_stack_push_matrix(ts, + 1.0, 0.0, tx, + 0.0, 1.0, ty, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_scale(struct skc_transform_stack * const ts, + skc_transform_float_t const sx, + skc_transform_float_t const sy) +{ + skc_transform_stack_push_matrix(ts, + sx, 0.0, 0.0, + 0.0, sy, 0.0, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_shear(struct skc_transform_stack * const ts, + skc_transform_float_t const shx, + skc_transform_float_t const shy) +{ + skc_transform_stack_push_matrix(ts, + 1.0, shx, 0.0, + shy, 1.0, 0.0, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_skew_x(struct skc_transform_stack * const ts, + skc_transform_float_t const theta) +{ + skc_transform_float_t const tan_theta = SKC_TRANSFORM_TAN(theta); // replace with tanpi if available + + skc_transform_stack_push_matrix(ts, + 1.0, tan_theta,0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_skew_y(struct skc_transform_stack * const ts, + skc_transform_float_t const theta) +{ + skc_transform_float_t const tan_theta = SKC_TRANSFORM_TAN(theta); // replace with tanpi if available + + skc_transform_stack_push_matrix(ts, + 1.0, 0.0, 0.0, + tan_theta, 1.0, 0.0, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_rotate(struct skc_transform_stack * const ts, + skc_transform_float_t const theta) +{ + skc_transform_float_t const cos_theta = SKC_TRANSFORM_COS(theta); // replace with cospi if available + skc_transform_float_t const sin_theta = SKC_TRANSFORM_SIN(theta); // replace with sinpi if available + + skc_transform_stack_push_matrix(ts, + cos_theta,-sin_theta, 0.0, + sin_theta, cos_theta, 0.0, + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_rotate_xy2(struct skc_transform_stack * const ts, + skc_transform_float_t const theta, + skc_transform_float_t const cx, + skc_transform_float_t const cy, + skc_transform_float_t const tx, + skc_transform_float_t const ty) +{ + skc_transform_float_t const cos_theta = SKC_TRANSFORM_COS(theta); // replace with cospi if available + skc_transform_float_t const sin_theta = SKC_TRANSFORM_SIN(theta); // replace with sinpi if available + + skc_transform_stack_push_matrix(ts, + cos_theta,-sin_theta, tx - (cx * cos_theta) + (cy * sin_theta), + sin_theta, cos_theta, ty - (cx * sin_theta) - (cy * cos_theta), + 0.0, 0.0, 1.0); +} + +void +skc_transform_stack_push_rotate_xy(struct skc_transform_stack * const ts, + skc_transform_float_t const theta, + skc_transform_float_t const cx, + skc_transform_float_t const cy) +{ + skc_transform_stack_push_rotate_xy2(ts,theta,cx,cy,cx,cy); +} + +void +skc_transform_stack_push_rotate_scale_xy(struct skc_transform_stack * const ts, + skc_transform_float_t const theta, + skc_transform_float_t const sx, + skc_transform_float_t const sy, + skc_transform_float_t const cx, + skc_transform_float_t const cy) +{ + skc_transform_float_t const cos_theta = SKC_TRANSFORM_COS(theta); // replace with cospi if available + skc_transform_float_t const sin_theta = SKC_TRANSFORM_SIN(theta); // replace with sinpi if available + + skc_transform_stack_push_matrix(ts, + sx*cos_theta,-sx*sin_theta, cx - cx*sx*cos_theta + cy*sy*sin_theta, + sy*sin_theta, sy*cos_theta, cy - cy*sy*cos_theta - cx*sx*sin_theta, + 0.0, 0.0, 1.0); +} + +// +// See: https://www.ldv.ei.tum.de/fileadmin/w00bfa/www/content_uploads/Vorlesung_3.2_SpatialTransformations.pdf +// + +#define DET4(m,a,b,c,d) (m->a9[a] * m->a9[d] - m->a9[b] * m->a9[c]) +#define DET3(m,a,b,c) (m->a9[a] - m->a9[b] * m->a9[c]) + +#define DIAG3(m,a,b,c) (m->a9[a] * m->a9[b] * m->a9[c]) +#define DIAG2(m,a,b) (m->a9[a] * m->a9[b]) + +#define X(v,i) v[i*2] +#define Y(v,i) v[i*2+1] + +// +// +// + +bool +skc_transform_stack_push_quad_to_unit(struct skc_transform_stack * const ts, + const float quad_src[8]) +{ + if (!skc_transform_stack_push_unit_to_quad(ts,quad_src)) + return false; + + union skc_transform_stack_3x3_u * const T = skc_transform_stack_tos(ts); + +#if 0 + // + // dividing by the determinant (just w2?) + // + skc_transform_float_t const det = + DIAG2(T,0,4) + + DIAG3(T,3,7,2) + + DIAG3(T,6,1,5) - + DIAG3(T,6,4,2) - + DIAG2(T,3,1) - + DIAG3(T,0,7,5); + + if (det == 0.0) + return false; + + skc_transform_float_t const rcp = 1.0 / det; + + const union skc_transform_stack_3x3_u A = + { + +DET3(T,4,5,7) * rcp, + -DET3(T,1,2,7) * rcp, + +DET4(T,1,2,4,5) * rcp, + + -DET3(T,3,5,6) * rcp, + +DET3(T,0,2,6) * rcp, + -DET4(T,0,2,3,5) * rcp, + + +DET4(T,3,4,6,7) * rcp, + -DET4(T,0,1,6,7) * rcp, + +DET4(T,0,1,3,4) * rcp + }; + +#else // just the adjoint can result in large values + + const union skc_transform_stack_3x3_u A = + { + +DET3(T,4,5,7), + -DET3(T,1,2,7), + +DET4(T,1,2,4,5), + + -DET3(T,3,5,6), + +DET3(T,0,2,6), + -DET4(T,0,2,3,5), + + +DET4(T,3,4,6,7), + -DET4(T,0,1,6,7), + +DET4(T,0,1,3,4) + }; + +#endif + + skc_transform_stack_3x3_u_copy(T,&A); + + return true; +} + +// +// +// + +bool +skc_transform_stack_push_unit_to_quad(struct skc_transform_stack * const ts, + const float quad_dst[8]) +{ + skc_transform_float_t const x0 = (skc_transform_float_t)X(quad_dst,0); + skc_transform_float_t const y0 = (skc_transform_float_t)Y(quad_dst,0); + + skc_transform_float_t const x1 = (skc_transform_float_t)X(quad_dst,1); + skc_transform_float_t const y1 = (skc_transform_float_t)Y(quad_dst,1); + + skc_transform_float_t const x2 = (skc_transform_float_t)X(quad_dst,2); + skc_transform_float_t const y2 = (skc_transform_float_t)Y(quad_dst,2); + + skc_transform_float_t const x3 = (skc_transform_float_t)X(quad_dst,3); + skc_transform_float_t const y3 = (skc_transform_float_t)Y(quad_dst,3); + + skc_transform_float_t sx = x1 - x0; + skc_transform_float_t shy = y1 - y0; + + skc_transform_float_t const dx2 = x3 - x2; + skc_transform_float_t const dy2 = y3 - y2; + + skc_transform_float_t const dx3 = -sx - dx2; + skc_transform_float_t const dy3 = -shy - dy2; + + // if both zero then quad_dst is a parallelogram and affine + if ((dx3 == 0.0) && (dy3 == 0.0)) + { + skc_transform_float_t const shx = x2 - x1; + skc_transform_float_t const sy = y2 - y1; + + skc_transform_stack_push_matrix(ts, + sx, shx, x0, + shy, sy, y0, + 0.0, 0.0, 1.0); + } + else + { + skc_transform_float_t const dx1 = x1 - x2; + skc_transform_float_t const dy1 = y1 - y2; + + skc_transform_float_t const wx_den = dx1 * dy2 - dx2 * dy1; + + if (wx_den == 0.0) + return false; + + skc_transform_float_t const w0_num = dx3 * dy2 - dx2 * dy3; + skc_transform_float_t const w1_num = dx1 * dy3 - dx3 * dy1; + + skc_transform_float_t const w0 = w0_num / wx_den; + skc_transform_float_t const w1 = w1_num / wx_den; + + sx += w0 * x1; + skc_transform_float_t const shx = x3 - x0 + w1 * x3; + + shy += w0 * y1; + skc_transform_float_t const sy = y3 - y0 + w1 * y3; + + skc_transform_stack_push_matrix(ts, + sx, shx, x0, + shy, sy, y0, + w0, w1, 1.0); + } + + return true; +} + +// +// +// + +bool +skc_transform_stack_push_quad_to_quad(struct skc_transform_stack * const ts, + const float quad_src[8], + const float quad_dst[8]) +{ + if (skc_transform_stack_push_quad_to_unit(ts,quad_src) == false) + return false; + + if (skc_transform_stack_push_unit_to_quad(ts,quad_dst) == false) + return false; + + union skc_transform_stack_3x3_u * const U2Q = skc_transform_stack_tos(ts); + union skc_transform_stack_3x3_u * const Q2U = U2Q - 1; + union skc_transform_stack_3x3_u Q2Q; + + // pre-multiply + skc_transform_stack_3x3_u_multiply(&Q2Q,U2Q,Q2U); + + // drop TOS + skc_transform_stack_drop(ts); + + // overwrite TOS + skc_transform_stack_3x3_u_copy(Q2U,&Q2Q); + + return true; +} + +// +// +// + +bool +skc_transform_stack_push_rect_to_quad(struct skc_transform_stack * const ts, + const float x0, + const float y0, + const float x1, + const float y1, + const float quad_dst[8]) +{ + if (skc_transform_stack_push_unit_to_quad(ts,quad_dst) == false) + return false; + + const union skc_transform_stack_3x3_u R2U = + { + SKC_TRANSFORM_RCP((skc_transform_float_t)(x1-x0)), + 0.0f, + (skc_transform_float_t)-x0, + + 0.0f, + SKC_TRANSFORM_RCP((skc_transform_float_t)(y1-y0)), + (skc_transform_float_t)-y0, + + 0.0f, + 0.0f, + 1.0, + }; + + union skc_transform_stack_3x3_u * const U2Q = skc_transform_stack_tos(ts); + union skc_transform_stack_3x3_u Q2Q; + + // pre-multiply + skc_transform_stack_3x3_u_multiply(&Q2Q,U2Q,&R2U); + + // overwrite TOS + skc_transform_stack_3x3_u_copy(U2Q,&Q2Q); + + return true; +} + +// +// +// + +void +skc_transform_stack_concat(struct skc_transform_stack * const ts) +{ + // + // Transformation stack matrices are _post-multiplied_ and the top + // of stack is replaced with the product: + // + // TOS' = TOS[-1] * TOS + // + // -or- + // + // C = A * B + // B = C + // + if (ts->count <= 1) + return; + + // get A and B + union skc_transform_stack_3x3_u * const B = skc_transform_stack_tos(ts); + const union skc_transform_stack_3x3_u * const A = B - 1; + + union skc_transform_stack_3x3_u C; + + // post multiply + skc_transform_stack_3x3_u_multiply(&C,A,B); + + // overwrite TOS + skc_transform_stack_3x3_u_copy(B,&C); + + // invalidate TOS + *skc_transform_stack_top_weakref(ts) = SKC_WEAKREF_INVALID; +} + +// +// +// + +void +skc_transform_stack_transform_affine(struct skc_transform_stack * const ts, + skc_transform_float_t const x_pre, + skc_transform_float_t const y_pre, + skc_transform_float_t * const x_post, + skc_transform_float_t * const y_post) +{ + union skc_transform_stack_3x3_u const * const t = skc_transform_stack_tos(ts); + + *x_post = x_pre * t->sx + y_pre * t->shx + t->tx; + *y_post = x_pre * t->shy + y_pre * t->sy + t->ty; +} + +// +// +// diff --git a/src/compute/ts/transform_stack.h b/src/compute/ts/transform_stack.h new file mode 100644 index 0000000000..275f529db5 --- /dev/null +++ b/src/compute/ts/transform_stack.h @@ -0,0 +1,208 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can + * be found in the LICENSE file. + * + */ + +// +// +// + +#pragma once + +// +// +// + +#include <skc/skc.h> + +// +// +// + +#if 1 +typedef float skc_transform_float_t; +#define SKC_TRANSFORM_FLOAT_SUFFIX f +#else +typedef double skc_transform_float_t; +#define SKC_TRANSFORM_FLOAT_SUFFIX +#endif + +// +// +// + +struct skc_transform_stack; + +// +// +// + +struct skc_transform_stack * +skc_transform_stack_create(const uint32_t size); + +void +skc_transform_stack_release(struct skc_transform_stack * const ts); + +// +// +// + +uint32_t +skc_transform_stack_save(struct skc_transform_stack * const ts); + +void +skc_transform_stack_restore(struct skc_transform_stack * const ts, uint32_t const restore); + +// +// +// + +skc_transform_float_t * +skc_transform_stack_top_transform(struct skc_transform_stack * const ts); + +skc_transform_weakref_t * +skc_transform_stack_top_weakref(struct skc_transform_stack * const ts); + +// +// +// + +void +skc_transform_stack_drop(struct skc_transform_stack * const ts); + +void +skc_transform_stack_dup(struct skc_transform_stack * const ts); + +// +// +// + +void +skc_transform_stack_transform_affine(struct skc_transform_stack * const ts, + skc_transform_float_t const x_pre, + skc_transform_float_t const y_pre, + skc_transform_float_t * const x_post, + skc_transform_float_t * const y_post); + +// +// +// + +void +skc_transform_stack_push_matrix(struct skc_transform_stack * const ts, + skc_transform_float_t const sx, + skc_transform_float_t const shx, + skc_transform_float_t const tx, + skc_transform_float_t const shy, + skc_transform_float_t const sy, + skc_transform_float_t const ty, + skc_transform_float_t const w0, + skc_transform_float_t const w1, + skc_transform_float_t const w2); + +void +skc_transform_stack_push_identity(struct skc_transform_stack * const ts); + +void +skc_transform_stack_push_affine(struct skc_transform_stack * const ts, + skc_transform_float_t const sx, + skc_transform_float_t const shx, + skc_transform_float_t const tx, + skc_transform_float_t const shy, + skc_transform_float_t const sy, + skc_transform_float_t const ty); + +void +skc_transform_stack_push_translate(struct skc_transform_stack * const ts, + skc_transform_float_t const tx, + skc_transform_float_t const ty); + +void +skc_transform_stack_push_scale(struct skc_transform_stack * const ts, + skc_transform_float_t const sx, + skc_transform_float_t const sy); + +void +skc_transform_stack_push_shear(struct skc_transform_stack * const ts, + skc_transform_float_t const shx, + skc_transform_float_t const shy); + + +void +skc_transform_stack_push_skew_x(struct skc_transform_stack * const ts, + skc_transform_float_t const theta); + +void +skc_transform_stack_push_skew_y(struct skc_transform_stack * const ts, + skc_transform_float_t const theta); + +void +skc_transform_stack_push_rotate(struct skc_transform_stack * const ts, + skc_transform_float_t const theta); + +void +skc_transform_stack_push_rotate_xy2(struct skc_transform_stack * const ts, + skc_transform_float_t const theta, + skc_transform_float_t const cx, + skc_transform_float_t const cy, + skc_transform_float_t const tx, + skc_transform_float_t const ty); + +void +skc_transform_stack_push_rotate_xy(struct skc_transform_stack * const ts, + skc_transform_float_t const theta, + skc_transform_float_t const cx, + skc_transform_float_t const cy); + +void +skc_transform_stack_push_rotate_scale_xy(struct skc_transform_stack * const ts, + skc_transform_float_t const theta, + skc_transform_float_t const sx, + skc_transform_float_t const sy, + skc_transform_float_t const cx, + skc_transform_float_t const cy); +// +// Quadrilateral coordinates are skc_transform_float_t2 structs: +// +// float2[4] = { xy0, xy1, xy2, xy3 } +// +// -or- +// +// float[8] = { x0, y0, x1, y1, x2, y2, x3, y3 }; +// + +bool +skc_transform_stack_push_quad_to_unit(struct skc_transform_stack * const ts, + float const quad_src[8]); + +bool +skc_transform_stack_push_unit_to_quad(struct skc_transform_stack * const ts, + float const quad_dst[8]); + +bool +skc_transform_stack_push_rect_to_quad(struct skc_transform_stack * const ts, + float const x0, + float const y0, + float const x1, + float const y1, + float const quad_dst[8]); + +bool +skc_transform_stack_push_quad_to_quad(struct skc_transform_stack * const ts, + float const quad_src[8], + float const quad_dst[8]); + +// +// +// + +void +skc_transform_stack_concat(struct skc_transform_stack * const ts); + +// +// +// + |