summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/gil/test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/gil/test
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/gil/test')
-rw-r--r--src/boost/libs/gil/test/CMakeLists.txt38
-rw-r--r--src/boost/libs/gil/test/Jamfile134
-rw-r--r--src/boost/libs/gil/test/core/CMakeLists.txt41
-rw-r--r--src/boost/libs/gil/test/core/Jamfile34
-rw-r--r--src/boost/libs/gil/test/core/algorithm/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/algorithm/Jamfile13
-rw-r--r--src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp34
-rw-r--r--src/boost/libs/gil/test/core/algorithm/std_fill.cpp55
-rw-r--r--src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp223
-rw-r--r--src/boost/libs/gil/test/core/channel/CMakeLists.txt35
-rw-r--r--src/boost/libs/gil/test/core/channel/Jamfile23
-rw-r--r--src/boost/libs/gil/test/core/channel/TODO.md10
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp170
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp261
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp118
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp119
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp127
-rw-r--r--src/boost/libs/gil/test/core/channel/channel_traits.cpp65
-rw-r--r--src/boost/libs/gil/test/core/channel/concepts.cpp100
-rw-r--r--src/boost/libs/gil/test/core/channel/is_channel_integral.cpp74
-rw-r--r--src/boost/libs/gil/test/core/channel/packed_channel_value.cpp137
-rw-r--r--src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp110
-rw-r--r--src/boost/libs/gil/test/core/channel/test_fixture.cpp134
-rw-r--r--src/boost/libs/gil/test/core/channel/test_fixture.hpp252
-rw-r--r--src/boost/libs/gil/test/core/color/CMakeLists.txt28
-rw-r--r--src/boost/libs/gil/test/core/color/Jamfile15
-rw-r--r--src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp46
-rw-r--r--src/boost/libs/gil/test/core/color/concepts.cpp50
-rw-r--r--src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp112
-rw-r--r--src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp33
-rw-r--r--src/boost/libs/gil/test/core/color_base/CMakeLists.txt28
-rw-r--r--src/boost/libs/gil/test/core/color_base/Jamfile16
-rw-r--r--src/boost/libs/gil/test/core/color_base/concepts.cpp54
-rw-r--r--src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp141
-rw-r--r--src/boost/libs/gil/test/core/color_base/static_transform.cpp72
-rw-r--r--src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp40
-rw-r--r--src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp42
-rw-r--r--src/boost/libs/gil/test/core/image/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/image/Jamfile13
-rw-r--r--src/boost/libs/gil/test/core/image/concepts.cpp30
-rw-r--r--src/boost/libs/gil/test/core/image/image.cpp91
-rw-r--r--src/boost/libs/gil/test/core/image/test_fixture.hpp71
-rw-r--r--src/boost/libs/gil/test/core/image_processing/CMakeLists.txt53
-rw-r--r--src/boost/libs/gil/test/core/image_processing/Jamfile21
-rw-r--r--src/boost/libs/gil/test/core/image_processing/box_filter.cpp65
-rw-r--r--src/boost/libs/gil/test/core/image_processing/harris.cpp73
-rw-r--r--src/boost/libs/gil/test/core/image_processing/hessian.cpp72
-rwxr-xr-xsrc/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp67
-rw-r--r--src/boost/libs/gil/test/core/image_processing/median_filter.cpp65
-rw-r--r--src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp68
-rw-r--r--src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp50
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp137
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp25
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp118
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp233
-rw-r--r--src/boost/libs/gil/test/core/image_view/CMakeLists.txt43
-rw-r--r--src/boost/libs/gil/test/core/image_view/Jamfile29
-rw-r--r--src/boost/libs/gil/test/core/image_view/axis_iterator.cpp91
-rw-r--r--src/boost/libs/gil/test/core/image_view/collection.cpp119
-rw-r--r--src/boost/libs/gil/test/core/image_view/concepts.cpp96
-rw-r--r--src/boost/libs/gil/test/core/image_view/derived_view_type.cpp45
-rw-r--r--src/boost/libs/gil/test/core/image_view/dynamic_step.cpp133
-rw-r--r--src/boost/libs/gil/test/core/image_view/is_planar.cpp77
-rw-r--r--src/boost/libs/gil/test/core/image_view/iterator.cpp95
-rw-r--r--src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp71
-rw-r--r--src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp54
-rw-r--r--src/boost/libs/gil/test/core/image_view/subimage_view.cpp91
-rw-r--r--src/boost/libs/gil/test/core/image_view/test_fixture.hpp37
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_is_basic.cpp76
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp76
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_is_step.cpp57
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_type.cpp114
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp119
-rw-r--r--src/boost/libs/gil/test/core/image_view/x_iterator.cpp98
-rw-r--r--src/boost/libs/gil/test/core/image_view/xy_locator.cpp122
-rw-r--r--src/boost/libs/gil/test/core/image_view/y_iterator.cpp118
-rw-r--r--src/boost/libs/gil/test/core/iterator/CMakeLists.txt28
-rw-r--r--src/boost/libs/gil/test/core/iterator/Jamfile13
-rw-r--r--src/boost/libs/gil/test/core/iterator/concepts.cpp172
-rw-r--r--src/boost/libs/gil/test/core/iterator/dynamic_step.cpp160
-rw-r--r--src/boost/libs/gil/test/core/iterator/is_planar.cpp72
-rw-r--r--src/boost/libs/gil/test/core/locator/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/locator/Jamfile12
-rw-r--r--src/boost/libs/gil/test/core/locator/concepts.cpp202
-rw-r--r--src/boost/libs/gil/test/core/locator/dynamic_step.cpp92
-rw-r--r--src/boost/libs/gil/test/core/pixel/CMakeLists.txt34
-rw-r--r--src/boost/libs/gil/test/core/pixel/Jamfile20
-rw-r--r--src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp46
-rw-r--r--src/boost/libs/gil/test/core/pixel/concepts.cpp67
-rw-r--r--src/boost/libs/gil/test/core/pixel/is_pixel.cpp77
-rw-r--r--src/boost/libs/gil/test/core/pixel/is_planar.cpp137
-rw-r--r--src/boost/libs/gil/test/core/pixel/num_channels.cpp154
-rw-r--r--src/boost/libs/gil/test/core/pixel/packed_pixel.cpp336
-rw-r--r--src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp35
-rw-r--r--src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp132
-rw-r--r--src/boost/libs/gil/test/core/pixel/test_fixture.cpp113
-rw-r--r--src/boost/libs/gil/test/core/pixel/test_fixture.hpp346
-rw-r--r--src/boost/libs/gil/test/core/point/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/point/Jamfile14
-rw-r--r--src/boost/libs/gil/test/core/point/concepts.cpp51
-rw-r--r--src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp23
-rw-r--r--src/boost/libs/gil/test/core/point/point.cpp235
-rw-r--r--src/boost/libs/gil/test/core/promote_integral.cpp370
-rw-r--r--src/boost/libs/gil/test/core/test_fixture.cpp71
-rw-r--r--src/boost/libs/gil/test/core/test_fixture.hpp82
-rw-r--r--src/boost/libs/gil/test/extension/CMakeLists.txt22
-rw-r--r--src/boost/libs/gil/test/extension/Jamfile12
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/Jamfile13
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp96
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp61
-rw-r--r--src/boost/libs/gil/test/extension/io/CMakeLists.txt19
-rw-r--r--src/boost/libs/gil/test/extension/io/Jamfile49
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/Jamfile26
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp289
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp97
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp463
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp284
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp53
-rw-r--r--src/boost/libs/gil/test/extension/io/cmp_view.hpp37
-rw-r--r--src/boost/libs/gil/test/extension/io/color_space_write_test.hpp52
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmpbin0 -> 1086 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmpbin0 -> 1086 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmpbin0 -> 1082 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmpbin0 -> 1086 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g04.bmpbin0 -> 4214 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmpbin0 -> 4166 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmpbin0 -> 922 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmpbin0 -> 9370 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmpbin0 -> 8986 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmpbin0 -> 8502 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmpbin0 -> 1820 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmpbin0 -> 8642 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmpbin0 -> 9014 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmpbin0 -> 9142 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmpbin0 -> 16450 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmpbin0 -> 16450 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmpbin0 -> 16438 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g24.bmpbin0 -> 24630 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmpbin0 -> 32578 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmpbin0 -> 32566 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/test.bmpbin0 -> 1800054 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpgbin0 -> 5878 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/jpeg/test.jpgbin0 -> 19577 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.pngbin0 -> 7406 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt7
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.pngbin0 -> 429 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.pngbin0 -> 2041 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.pngbin0 -> 1499 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.pngbin0 -> 2041 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.pngbin0 -> 1499 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.pngbin0 -> 1633 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.pngbin0 -> 1313 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.pngbin0 -> 116 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.pngbin0 -> 1483 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.pngbin0 -> 1190 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.pngbin0 -> 11864 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/test.pngbin0 -> 52753 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm1203
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm3004
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm16388
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p4.pnmbin0 -> 5016 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p5.pnmbin0 -> 40024 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p6.pnmbin0 -> 196623 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnmbin0 -> 196623 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRWbin0 -> 3120810 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/raw/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/readme.md3
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tgabin0 -> 4185 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tgabin0 -> 4211 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tgabin0 -> 46146 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tgabin0 -> 46172 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tgabin0 -> 4894 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tgabin0 -> 4920 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tgabin0 -> 61522 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tgabin0 -> 61548 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt7
-rw-r--r--src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt7
-rw-r--r--src/boost/libs/gil/test/extension/io/images/tiff/test.tifbin0 -> 78434 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/Jamfile29
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp101
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp106
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp274
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp81
-rw-r--r--src/boost/libs/gil/test/extension/io/mandel_view.hpp103
-rw-r--r--src/boost/libs/gil/test/extension/io/paths.hpp69
-rw-r--r--src/boost/libs/gil/test/extension/io/png/Jamfile32
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp71
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_old_test.cpp101
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_read_test.cpp764
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_test.cpp302
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_write_test.cpp33
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/Jamfile26
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp96
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp124
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp240
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp60
-rw-r--r--src/boost/libs/gil/test/extension/io/raw/Jamfile24
-rw-r--r--src/boost/libs/gil/test/extension/io/raw/raw_test.cpp127
-rw-r--r--src/boost/libs/gil/test/extension/io/scanline_read_test.hpp61
-rw-r--r--src/boost/libs/gil/test/extension/io/simple_all_formats.cpp94
-rw-r--r--src/boost/libs/gil/test/extension/io/subimage_test.hpp30
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/Jamfile22
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp92
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp213
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_test.cpp283
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp50
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/Jamfile54
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp637
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp93
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp128
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp306
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp111
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp47
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp48
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp64
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp56
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp54
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp79
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp114
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp48
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp49
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp65
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp59
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp59
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp86
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp49
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp48
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp65
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp84
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp177
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/numeric/CMakeLists.txt39
-rw-r--r--src/boost/libs/gil/test/extension/numeric/Jamfile28
-rw-r--r--src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp484
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve.cpp121
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp68
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp73
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp73
-rw-r--r--src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp252
-rw-r--r--src/boost/libs/gil/test/extension/numeric/kernel.cpp174
-rw-r--r--src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp16
-rw-r--r--src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp183
-rw-r--r--src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp191
-rw-r--r--src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp343
-rw-r--r--src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp97
-rw-r--r--src/boost/libs/gil/test/extension/numeric/resample.cpp103
-rw-r--r--src/boost/libs/gil/test/extension/numeric/test_fixture.hpp30
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt64
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/Jamfile33
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/channel_type.cpp42
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/channel_view.cpp44
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp32
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp30
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp49
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp87
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp95
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp140
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp38
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp219
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp41
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp39
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp154
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp24
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp26
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp26
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp106
-rw-r--r--src/boost/libs/gil/test/header/CMakeLists.txt106
-rw-r--r--src/boost/libs/gil/test/header/main.cpp19
-rw-r--r--src/boost/libs/gil/test/legacy/CMakeLists.txt64
-rw-r--r--src/boost/libs/gil/test/legacy/Jamfile26
-rw-r--r--src/boost/libs/gil/test/legacy/README.md16
-rw-r--r--src/boost/libs/gil/test/legacy/channel.cpp408
-rw-r--r--src/boost/libs/gil/test/legacy/error_if.cpp13
-rw-r--r--src/boost/libs/gil/test/legacy/gil_reference_checksums.txt125
-rw-r--r--src/boost/libs/gil/test/legacy/image.cpp612
-rw-r--r--src/boost/libs/gil/test/legacy/performance.cpp520
-rw-r--r--src/boost/libs/gil/test/legacy/pixel.cpp322
-rw-r--r--src/boost/libs/gil/test/legacy/pixel_iterator.cpp355
-rw-r--r--src/boost/libs/gil/test/legacy/recreate_image.cpp108
-rw-r--r--src/boost/libs/gil/test/legacy/sample_image.cpp159
-rw-r--r--src/boost/libs/gil/test/test_utility_output_stream.cpp68
-rw-r--r--src/boost/libs/gil/test/test_utility_output_stream.hpp133
298 files changed, 44399 insertions, 0 deletions
diff --git a/src/boost/libs/gil/test/CMakeLists.txt b/src/boost/libs/gil/test/CMakeLists.txt
new file mode 100644
index 000000000..acdf1e82b
--- /dev/null
+++ b/src/boost/libs/gil/test/CMakeLists.txt
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+
+foreach(_name
+ test_utility_output_stream)
+ set(_test t_utility_${_name})
+ set(_target test_utility_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+add_subdirectory(core)
+
+add_subdirectory(legacy)
+
+add_subdirectory(extension)
+
+# TODO: Split headers tests into core and extensions, see Jamfile-s
+# if(BOOST_GIL_BUILD_HEADERS_TESTS)
+# add_subdirectory(headers)
+# endif()
diff --git a/src/boost/libs/gil/test/Jamfile b/src/boost/libs/gil/test/Jamfile
new file mode 100644
index 000000000..cfca2f443
--- /dev/null
+++ b/src/boost/libs/gil/test/Jamfile
@@ -0,0 +1,134 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz@loskot.net>
+# Copyright (c) 2018 Dmitry Arkhipov
+# Copyright (c) 2007-2015 Andrey Semashev
+#
+# Use, modification and distribution is subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import ../../config/checks/config : requires ;
+import os ;
+import path ;
+import regex ;
+import sequence ;
+import testing ;
+
+# Avoid warnings flood on Travis CI, AppVeyor, CircleCI, Azure Pipelines, GitHub Actions
+if ! [ os.environ CI ] && ! [ os.environ AGENT_JOBSTATUS ] && ! [ os.environ GITHUB_ACTIONS ]
+{
+ DEVELOPMENT_EXTRA_WARNINGS =
+ <toolset>msvc:<cxxflags>"-W4"
+ <toolset>gcc:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter"
+ <toolset>clang,<variant>debug:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter -Wsign-conversion"
+ <toolset>clang,<variant>release:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter -Wsign-conversion"
+ <toolset>darwin:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter"
+ ;
+}
+else
+{
+ DEVELOPMENT_EXTRA_WARNINGS =
+ <toolset>msvc:<cxxflags>"-W1"
+ ;
+}
+
+project
+ :
+ requirements
+ <include>.
+ # TODO: Enable concepts check for all, not just test/core
+ #<define>BOOST_GIL_USE_CONCEPT_CHECK=1
+ <toolset>msvc:<cxxflags>"-bigobj"
+ <toolset>msvc:<asynch-exceptions>on
+ <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE
+ <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
+ <toolset>msvc:<define>_CRT_NONSTDC_NO_DEPRECATE
+ <toolset>msvc:<define>NOMINMAX
+ <toolset>intel:<debug-symbols>off
+ <toolset>gcc:<cxxflags>"-fstrict-aliasing"
+ <toolset>darwin:<cxxflags>"-fstrict-aliasing"
+ # variant filter for clang is necessary to allow ubsan_*
+ # custom variants declare distinct set of <cxxflags>
+ <toolset>clang,<variant>debug:<cxxflags>"-fstrict-aliasing"
+ <toolset>clang,<variant>release:<cxxflags>"-fstrict-aliasing"
+ $(DEVELOPMENT_EXTRA_WARNINGS)
+ [ requires
+ cxx11_constexpr
+ cxx11_defaulted_functions
+ cxx11_template_aliases
+ cxx11_trailing_result_types # implies decltype and auto
+ cxx11_variadic_templates
+ ]
+ ;
+
+variant gil_ubsan_integer
+ : release
+ :
+ <cxxflags>"-Wno-unused -fstrict-aliasing -fno-omit-frame-pointer -fsanitize=integer -fno-sanitize-recover=integer -fsanitize-blacklist=libs/gil/.ci/blacklist.supp"
+ <linkflags>"-fsanitize=integer"
+ <debug-symbols>on
+ <define>BOOST_USE_ASAN=1
+ ;
+
+variant gil_ubsan_nullability
+ : release
+ :
+ <cxxflags>"-Wno-unused -fstrict-aliasing -fno-omit-frame-pointer -fsanitize=nullability -fno-sanitize-recover=nullability -fsanitize-blacklist=libs/gil/.ci/blacklist.supp"
+ <linkflags>"-fsanitize=nullability"
+ <debug-symbols>on
+ <define>BOOST_USE_ASAN=1
+ ;
+
+variant gil_ubsan_undefined
+ : release
+ :
+ <cxxflags>"-Wno-unused -fstrict-aliasing -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=undefined -fsanitize-blacklist=libs/gil/.ci/blacklist.supp"
+ <linkflags>"-fsanitize=undefined"
+ <debug-symbols>on
+ <define>BOOST_USE_ASAN=1
+ ;
+
+rule generate_self_contained_headers ( headers_subpath * : exclude_subpaths * )
+{
+ # On CI services, test the self-contained headers on-demand only to avoid build timeouts
+ # CI environment is common for Travis CI, AppVeyor, CircleCI, etc.
+ # For example:
+ # if ! [ os.environ CI ] || [ os.environ TEST_HEADERS ] {
+ # alias self_contained_headers : [ generate_self_contained_headers ] ;
+ # }
+
+ local targets ;
+
+ # NOTE: All '/' in test names are replaced with '-' because apparently
+ # test scripts have a problem with test names containing slashes.
+
+ local top_headers_path = [ path.make $(BOOST_ROOT)/libs/gil/include/boost/gil ] ;
+ local headers_path = $(top_headers_path) ;
+ if $(headers_subpath)
+ {
+ headers_path = $(top_headers_path)/$(headers_subpath) ;
+ }
+
+ for local file in [ path.glob-tree $(headers_path) : *.hpp : $(exclude_subpaths) ]
+ {
+ local target_no = [ sequence.length $(targets) ] ;
+ local rel_file = [ path.relative-to $(top_headers_path) $(file) ] ;
+ local target_name = [ regex.replace h/$(target_no)/$(rel_file) "/" "-" ] ;
+ local target_name = [ regex.replace $(target_name) "\.hpp" "" ] ;
+ targets += [
+ compile $(BOOST_ROOT)/libs/gil/test/header/main.cpp
+ : <define>"BOOST_GIL_TEST_HEADER=$(rel_file)" <dependency>$(file)
+ : $(target_name)
+ ] ;
+ }
+
+ return $(targets) ;
+}
+
+run test_utility_output_stream.cpp ;
+
+build-project core ;
+build-project legacy ;
+build-project extension ;
diff --git a/src/boost/libs/gil/test/core/CMakeLists.txt b/src/boost/libs/gil/test/core/CMakeLists.txt
new file mode 100644
index 000000000..ed3b36f49
--- /dev/null
+++ b/src/boost/libs/gil/test/core/CMakeLists.txt
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2017-2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/core")
+
+foreach(_name
+ promote_integral
+ test_fixture)
+ set(_test t_utility_${_name})
+ set(_target test_utility_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+add_subdirectory(point)
+add_subdirectory(channel)
+add_subdirectory(color)
+add_subdirectory(color_base)
+add_subdirectory(pixel)
+add_subdirectory(iterator)
+add_subdirectory(locator)
+add_subdirectory(image)
+add_subdirectory(image_view)
+add_subdirectory(algorithm)
+add_subdirectory(image_processing)
diff --git a/src/boost/libs/gil/test/core/Jamfile b/src/boost/libs/gil/test/core/Jamfile
new file mode 100644
index 000000000..7ced83833
--- /dev/null
+++ b/src/boost/libs/gil/test/core/Jamfile
@@ -0,0 +1,34 @@
+# Boost.GIL (Generic Image Library) - core tests
+#
+# Copyright (c) 2008 Lubomir Bourdev, Hailin Jin
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+project
+ :
+ requirements
+ <define>BOOST_GIL_USE_CONCEPT_CHECK=1
+ ;
+
+alias headers_concepts : [ generate_self_contained_headers concepts ] ;
+alias headers : [ generate_self_contained_headers : concepts extension io ] ;
+
+run promote_integral.cpp ;
+run test_fixture.cpp ;
+
+build-project point ;
+build-project channel ;
+build-project color ;
+build-project color_base ;
+build-project pixel ;
+build-project iterator ;
+build-project locator ;
+build-project image ;
+build-project image_view ;
+build-project algorithm ;
+build-project image_processing ;
diff --git a/src/boost/libs/gil/test/core/algorithm/CMakeLists.txt b/src/boost/libs/gil/test/core/algorithm/CMakeLists.txt
new file mode 100644
index 000000000..688bd93e1
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ for_each_pixel
+ std_fill
+ std_uninitialized_fill)
+ set(_test t_core_algorithm_${_name})
+ set(_target test_core_algorithm_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/algorithm/Jamfile b/src/boost/libs/gil/test/core/algorithm/Jamfile
new file mode 100644
index 000000000..8510c8009
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+run for_each_pixel.cpp ;
+run std_fill.cpp ;
+run std_uninitialized_fill.cpp ;
diff --git a/src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp b/src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp
new file mode 100644
index 000000000..5490b27f3
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp
@@ -0,0 +1,34 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/image.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_lambda_expression()
+{
+ gil::gray8_pixel_t const gray128(128);
+ gil::gray8_image_t image(2, 2, gray128);
+
+ int sum{0};
+ gil::for_each_pixel(gil::view(image), [&sum](gil::gray8_pixel_t& p) {
+ sum += gil::at_c<0>(p);
+ });
+ BOOST_TEST_EQ(sum, 2 * 2 * 128);
+}
+
+int main()
+{
+ test_lambda_expression();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/algorithm/std_fill.cpp b/src/boost/libs/gil/test/core/algorithm/std_fill.cpp
new file mode 100644
index 000000000..067b6babd
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/std_fill.cpp
@@ -0,0 +1,55 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef BOOST_GIL_USE_CONCEPT_CHECK
+// FIXME: Range as pixel does not seem to fulfill pixel concepts due to no specializations required:
+// pixel.hpp(50) : error C2039 : 'type' : is not a member of 'boost::gil::color_space_type<P>
+#undef BOOST_GIL_USE_CONCEPT_CHECK
+#endif
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+
+#include <boost/array.hpp>
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <array>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+using array_pixel_types = ::boost::mp11::mp_list
+<
+ boost::array<int, 2>,
+ std::array<int, 2>
+>;
+
+struct test_array_as_pixel
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ gil::image<pixel_t> img(1, 1);
+ std::fill(gil::view(img).begin(), gil::view(img).end(), pixel_t{0, 1});
+ auto a = *gil::view(img).at(0, 0);
+ auto e = pixel_t{0, 1};
+ BOOST_TEST(a == e);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<array_pixel_types>(test_array_as_pixel{});
+ }
+};
+
+int main()
+{
+ test_array_as_pixel::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp b/src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp
new file mode 100644
index 000000000..c308f4775
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp
@@ -0,0 +1,223 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <memory>
+#include <random>
+#include <type_traits>
+#include <vector>
+
+#include "test_utility_output_stream.hpp"
+#include "core/channel/test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+#include "core/pixel/test_fixture.hpp"
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+template <typename Pixel>
+struct pixel_array
+{
+ using iterator = Pixel*;
+#ifdef NDEBUG
+ constexpr static std::size_t default_x_size = 256;
+ constexpr static std::size_t default_y_size = 128;
+#else
+ constexpr static std::size_t default_x_size = 16;
+ constexpr static std::size_t default_y_size = 8;
+#endif
+
+ pixel_array(std::size_t x_size = default_x_size, std::size_t y_size = default_y_size)
+ : pixels_(new Pixel[x_size * y_size])
+ , x_size_(x_size)
+ , y_size_(y_size)
+ {}
+
+ auto begin() -> iterator { return pixels_.get(); }
+ auto end() -> iterator { return pixels_.get() + x_size_ * y_size_; }
+
+private:
+ std::unique_ptr<Pixel[]> pixels_;
+ std::size_t x_size_;
+ std::size_t y_size_;
+};
+
+}}}}
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct fill_with_pixel_integer_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ auto min_pixel = fixture::pixel_generator<pixel_t>::min();
+ auto max_pixel = fixture::pixel_generator<pixel_t>::max();
+ auto rnd_pixel = fixture::pixel_generator<pixel_t>::random();
+
+ for (auto const &fill_pixel : {min_pixel, max_pixel, rnd_pixel})
+ {
+ fixture::pixel_array<pixel_t> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (pixel_t const &p : pixels)
+ BOOST_TEST_EQ(p, fill_pixel);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(fill_with_pixel_integer_types{});
+ }
+};
+
+struct fill_with_pixel_float_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ auto min_pixel = fixture::pixel_generator<pixel_t>::min();
+ auto max_pixel = fixture::pixel_generator<pixel_t>::max();
+
+ for (auto const &fill_pixel : {min_pixel, max_pixel})
+ {
+ fixture::pixel_array<Pixel> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (Pixel const &p : pixels)
+ BOOST_TEST_EQ(p, fill_pixel);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_float_types>(fill_with_pixel_float_types{});
+ }
+};
+
+void
+test_fill_with_packed_pixel_gray3()
+{
+ auto min_pixel = fixture::packed_pixel_gray3{0};
+ auto mid_pixel = fixture::packed_pixel_gray3{3};
+ auto max_pixel = fixture::packed_pixel_gray3{7};
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::packed_pixel_gray3> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::packed_pixel_gray3 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::gray_color_t()), (int)get_color(fill_pixel, gil::gray_color_t()));
+ }
+ }
+}
+
+void test_fill_with_packed_pixel_bgr121()
+{
+ auto min_pixel = fixture::packed_pixel_bgr121{0};
+ auto mid_pixel = fixture::packed_pixel_bgr121{8};
+ auto max_pixel = fixture::packed_pixel_bgr121{17};
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::packed_pixel_bgr121> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::packed_pixel_bgr121 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+void test_fill_with_packed_pixel_rgb535()
+{
+ fixture::packed_pixel_rgb535 min_pixel(0, 0, 0);
+ fixture::packed_pixel_rgb535 mid_pixel(15, 3, 15);
+ fixture::packed_pixel_rgb535 max_pixel(31, 7, 31);
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::packed_pixel_rgb535> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::packed_pixel_rgb535 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+void test_bit_aligned_pixel_bgr232()
+{
+ fixture::bit_aligned_pixel_bgr232 min_pixel(0, 0, 0);
+ fixture::bit_aligned_pixel_bgr232 mid_pixel(1, 4, 2);
+ fixture::bit_aligned_pixel_bgr232 max_pixel(3, 7, 3);
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::bit_aligned_pixel_bgr232> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::bit_aligned_pixel_bgr232 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+void test_bit_aligned_pixel_rgb567()
+{
+ fixture::bit_aligned_pixel_rgb567 min_pixel(0, 0, 0);
+ fixture::bit_aligned_pixel_rgb567 mid_pixel(15, 31, 63);
+ fixture::bit_aligned_pixel_rgb567 max_pixel(31, 63, 127);
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::bit_aligned_pixel_rgb567> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::bit_aligned_pixel_rgb567 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+int main()
+{
+ fill_with_pixel_integer_types::run();
+ fill_with_pixel_float_types::run();
+
+ test_fill_with_packed_pixel_gray3();
+ test_fill_with_packed_pixel_bgr121();
+ test_fill_with_packed_pixel_rgb535();
+
+ test_bit_aligned_pixel_bgr232();
+ test_bit_aligned_pixel_rgb567();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/CMakeLists.txt b/src/boost/libs/gil/test/core/channel/CMakeLists.txt
new file mode 100644
index 000000000..365a8274f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/CMakeLists.txt
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ algorithm_channel_arithmetic
+ algorithm_channel_convert
+ algorithm_channel_invert
+ algorithm_channel_multiply
+ algorithm_channel_relation
+ channel_traits
+ concepts
+ is_channel_integral
+ packed_channel_value
+ scoped_channel_value
+ test_fixture)
+ set(_test t_core_channel_${_name})
+ set(_target test_core_channel_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/channel/Jamfile b/src/boost/libs/gil/test/core/channel/Jamfile
new file mode 100644
index 000000000..9e6b65027
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/Jamfile
@@ -0,0 +1,23 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile is_channel_integral.cpp ;
+
+run concepts.cpp ;
+run channel_traits.cpp ;
+run test_fixture.cpp ;
+run packed_channel_value.cpp ;
+run scoped_channel_value.cpp ;
+
+run algorithm_channel_arithmetic.cpp ;
+run algorithm_channel_convert.cpp ;
+run algorithm_channel_invert.cpp ;
+run algorithm_channel_multiply.cpp ;
+run algorithm_channel_relation.cpp ;
diff --git a/src/boost/libs/gil/test/core/channel/TODO.md b/src/boost/libs/gil/test/core/channel/TODO.md
new file mode 100644
index 000000000..7a2604052
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/TODO.md
@@ -0,0 +1,10 @@
+# Channel TODO
+
+Issues and questions related to implementation, testing, etc. of channel:
+
+- Provide algorithm performance overloads for scoped channel and packed channels
+- Update concepts and documentation
+- What to do about pointer types?!
+- Performance!!
+- Is channel_convert the same as native?
+- Is operator++ on float32_t the same as native? How about if operator++ is defined in scoped_channel to do _value++?
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp
new file mode 100644
index 000000000..ef8ec658c
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp
@@ -0,0 +1,170 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+#include <utility>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_arithmetic_mutable(std::false_type) {}
+
+template <typename ChannelFixtureBase>
+void test_channel_arithmetic_mutable(std::true_type)
+{
+ using fixture_t = fixture::channel<ChannelFixtureBase>;
+ using channel_value_t = typename fixture_t::channel_value_t;
+ fixture_t f;
+ channel_value_t const v = f.min_v_;
+ channel_value_t const one = 1;
+
+ ++f.min_v_;
+ f.min_v_++;
+ --f.min_v_;
+ f.min_v_--;
+ BOOST_TEST_EQ(v, f.min_v_);
+
+ f.min_v_ += one;
+ f.min_v_ -= one;
+ BOOST_TEST_EQ(v, f.min_v_);
+
+ f.min_v_ *= one;
+ f.min_v_ /= one;
+ BOOST_TEST_EQ(v, f.min_v_);
+
+ f.min_v_ = one; // assignable to scalar
+ BOOST_TEST_EQ(f.min_v_, one);
+ f.min_v_ = v; // and to value type
+ BOOST_TEST_EQ(f.min_v_, v);
+
+ // test swap
+ channel_value_t v1 = f.min_v_;
+ channel_value_t v2 = f.max_v_;
+ std::swap(f.min_v_, f.max_v_);
+ BOOST_TEST_GT(f.min_v_, f.max_v_);
+ channel_value_t v3 = f.min_v_;
+ channel_value_t v4 = f.max_v_;
+ BOOST_TEST_EQ(v1, v4);
+ BOOST_TEST_EQ(v2, v3);
+}
+
+template <typename ChannelFixtureBase>
+void test_channel_arithmetic()
+{
+ using fixture_t = fixture::channel<ChannelFixtureBase>;
+ fixture_t f;
+ BOOST_TEST_EQ(f.min_v_ * 1, f.min_v_);
+ BOOST_TEST_EQ(f.min_v_ / 1, f.min_v_);
+ BOOST_TEST_EQ((f.min_v_ + 1) + 1, f.min_v_ + 2);
+ BOOST_TEST_EQ((f.max_v_ - 1) - 1, f.max_v_ - 2);
+
+ using is_mutable_t = std::integral_constant
+ <
+ bool,
+ gil::channel_traits<typename fixture_t::channel_t>::is_mutable
+ >;
+ test_channel_arithmetic_mutable<ChannelFixtureBase>(is_mutable_t{});
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_arithmetic<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t &>;
+ test_channel_arithmetic<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const &>;
+ test_channel_arithmetic<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_arithmetic<typename channels565_t::fixture_0_5_t>();
+ test_channel_arithmetic<typename channels565_t::fixture_5_6_t>();
+ test_channel_arithmetic<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_arithmetic<typename channels565_t::fixture_5_t>();
+ test_channel_arithmetic<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp
new file mode 100644
index 000000000..e39555b65
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp
@@ -0,0 +1,261 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+struct test_convert_to
+{
+ using channel_t = typename fixture::channel<ChannelFixtureBase>::channel_t;
+ using channel_value_t = typename fixture::channel<ChannelFixtureBase>::channel_value_t;
+
+ template <typename Channel>
+ static void from(Channel src_min_v, Channel src_max_v)
+ {
+ channel_value_t min_v = gil::channel_convert<channel_t>(src_min_v);
+ channel_value_t max_v = gil::channel_convert<channel_t>(src_max_v);
+ fixture::channel_minmax_value<channel_value_t> expect;
+ BOOST_TEST_EQ(min_v, expect.min_v_);
+ BOOST_TEST_EQ(max_v, expect.max_v_);
+ }
+};
+
+//--- Test gil::channel_convert from integral channels to all byte channels -------------
+template <typename SourceChannel, typename TargetChannel>
+void test_channel_value_convert_from_integral()
+{
+ fixture::channel_minmax_value<SourceChannel> f;
+
+ using channel_t = TargetChannel;
+ // byte channel
+ test_convert_to<fixture::channel_value<channel_t>>::from(f.min_v_, f.max_v_);
+ test_convert_to<fixture::channel_reference<channel_t&>>::from(f.min_v_, f.max_v_);
+ test_convert_to<fixture::channel_reference<channel_t const&>>::from(f.min_v_, f.max_v_);
+
+ // packed_channel_reference
+ {
+ using channels565_t = fixture::packed_channels565<std::uint16_t>;
+ test_convert_to<typename channels565_t::fixture_0_5_t>::from(f.min_v_, f.max_v_);
+ test_convert_to<typename channels565_t::fixture_5_6_t>::from(f.min_v_, f.max_v_);
+ test_convert_to<typename channels565_t::fixture_11_5_t>::from(f.min_v_, f.max_v_);
+ }
+ // packed_dynamic_channel_reference
+ {
+ using channels565_t = fixture::packed_dynamic_channels565<std::uint16_t>;
+ test_convert_to<typename channels565_t::fixture_5_t>::from(f.min_v_, f.max_v_);
+ test_convert_to<typename channels565_t::fixture_6_t>::from(f.min_v_, f.max_v_);
+ }
+}
+
+struct test_channel_value_convert_from_uint8_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::uint8_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_uint8_t{});
+ }
+};
+
+struct test_channel_value_convert_from_int8_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::int8_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_int8_t{});
+ }
+};
+
+struct test_channel_value_convert_from_uint16_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::uint16_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_uint16_t{});
+ }
+};
+
+struct test_channel_value_convert_from_int16_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::int16_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_int16_t{});
+ }
+};
+
+struct test_channel_value_convert_from_uint32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::uint32_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_uint32_t{});
+ }
+};
+
+struct test_channel_value_convert_from_int32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::int32_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_int32_t{});
+ }
+};
+
+// FIXME: gil::float32_t <-> gil::float64_t seems not supported
+
+//--- Test gil::channel_convert from gil::float32_t to all integer channels -------------
+struct test_channel_value_convert_from_float32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float32_t> f;
+ test_convert_to<fixture::channel_value<channel_t>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_value_convert_from_float32_t{});
+ }
+};
+
+struct test_channel_reference_convert_from_float32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float32_t> f;
+ test_convert_to<fixture::channel_reference<channel_t&>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_convert_from_float32_t{});
+ }
+};
+
+struct test_channel_reference_const_from_float32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float32_t> f;
+ test_convert_to<fixture::channel_reference<channel_t const &>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_const_from_float32_t{});
+ }
+};
+
+//--- Test gil::channel_convert from gil::float64_t to all integer channels -------------
+
+struct test_channel_value_convert_from_float64_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float64_t> f;
+ test_convert_to<fixture::channel_value<channel_t>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_value_convert_from_float64_t{});
+ }
+};
+
+struct test_channel_reference_convert_from_float64_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float64_t> f;
+ test_convert_to<fixture::channel_reference<channel_t &>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_convert_from_float64_t{});
+ }
+};
+
+struct test_channel_reference_const_convert_from_float64_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float64_t> f;
+ test_convert_to<fixture::channel_reference<channel_t const &>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_const_convert_from_float64_t{});
+ }
+};
+
+int main()
+{
+ test_channel_value_convert_from_uint8_t::run();
+ test_channel_value_convert_from_int8_t::run();
+ test_channel_value_convert_from_uint16_t::run();
+ test_channel_value_convert_from_int16_t::run();
+ test_channel_value_convert_from_uint32_t::run();
+ test_channel_value_convert_from_int32_t::run();
+
+ test_channel_value_convert_from_float32_t::run();
+ test_channel_reference_convert_from_float32_t::run();
+ test_channel_reference_const_from_float32_t::run();
+
+ test_channel_value_convert_from_float64_t::run();
+ test_channel_reference_convert_from_float64_t::run();
+ test_channel_reference_const_convert_from_float64_t::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp
new file mode 100644
index 000000000..3f8dd5837
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_invert()
+{
+ fixture::channel<ChannelFixtureBase> f;
+ BOOST_TEST_EQ(gil::channel_invert(f.min_v_), f.max_v_);
+ BOOST_TEST_EQ(gil::channel_invert(f.max_v_), f.min_v_);
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_invert<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t&>;
+ test_channel_invert<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const&>;
+ test_channel_invert<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_invert<typename channels565_t::fixture_0_5_t>();
+ test_channel_invert<typename channels565_t::fixture_5_6_t>();
+ test_channel_invert<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_invert<typename channels565_t::fixture_5_t>();
+ test_channel_invert<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ // TODO: packed_channel_reference_const ?
+ // TODO: packed_dynamic_channel_reference_const ?
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp
new file mode 100644
index 000000000..bc7f017c6
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_multiply()
+{
+ fixture::channel<ChannelFixtureBase> f;
+ BOOST_TEST_EQ(gil::channel_multiply(f.min_v_, f.min_v_), f.min_v_);
+ BOOST_TEST_EQ(gil::channel_multiply(f.max_v_, f.max_v_), f.max_v_);
+ BOOST_TEST_EQ(gil::channel_multiply(f.max_v_, f.min_v_), f.min_v_);
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_multiply<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t&>;
+ test_channel_multiply<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const&>;
+ test_channel_multiply<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_multiply<typename channels565_t::fixture_0_5_t>();
+ test_channel_multiply<typename channels565_t::fixture_5_6_t>();
+ test_channel_multiply<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_multiply<typename channels565_t::fixture_5_t>();
+ test_channel_multiply<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ // TODO: packed_channel_reference_const ?
+ // TODO: packed_dynamic_channel_reference_const ?
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp
new file mode 100644
index 000000000..bad3a1d4b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp
@@ -0,0 +1,127 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_relation()
+{
+ using fixture_t = fixture::channel<ChannelFixtureBase>;
+ using channel_value_t = typename fixture_t::channel_value_t;
+ channel_value_t const one = 1;
+
+ fixture_t f;
+ BOOST_TEST_LE(f.min_v_, f.max_v_);
+ BOOST_TEST_GE(f.max_v_, f.min_v_);
+ BOOST_TEST_LT(f.min_v_, f.max_v_);
+ BOOST_TEST_GT(f.max_v_, f.min_v_);
+ BOOST_TEST_NE(f.max_v_, f.min_v_);
+ BOOST_TEST_EQ(f.min_v_, f.min_v_);
+ BOOST_TEST_NE(f.min_v_, one); // comparable to integral
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_relation<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t&>;
+ test_channel_relation<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const&>;
+ test_channel_relation<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_relation<typename channels565_t::fixture_0_5_t>();
+ test_channel_relation<typename channels565_t::fixture_5_6_t>();
+ test_channel_relation<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_relation<typename channels565_t::fixture_5_t>();
+ test_channel_relation<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ // TODO: packed_channel_reference_const ?
+ // TODO: packed_dynamic_channel_reference_const ?
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/channel_traits.cpp b/src/boost/libs/gil/test/core/channel/channel_traits.cpp
new file mode 100644
index 000000000..626f87b2a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/channel_traits.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <limits>
+
+namespace gil = boost::gil;
+
+template <typename T>
+void test_channel_minmax()
+{
+ BOOST_TEST_EQ(gil::channel_traits<T>::min_value(), std::numeric_limits<T>::min());
+ BOOST_TEST_EQ(gil::channel_traits<T>::max_value(), std::numeric_limits<T>::max());
+}
+
+void test_channel_minmax_uint8_t()
+{
+ test_channel_minmax<std::uint8_t>();
+}
+
+void test_channel_minmax_int8_t()
+{
+ test_channel_minmax<std::int8_t>();
+}
+
+void test_channel_minmax_uint16_t()
+{
+ test_channel_minmax<std::uint16_t>();
+}
+
+void test_channel_minmax_int16_t()
+{
+ test_channel_minmax<std::int16_t>();
+}
+
+void test_channel_minmax_uint32_t()
+{
+ test_channel_minmax<std::uint32_t>();
+}
+
+void test_channel_minmax_int32_t()
+{
+ test_channel_minmax<std::int32_t>();
+}
+
+int main()
+{
+ test_channel_minmax_uint8_t();
+ test_channel_minmax_int8_t();
+ test_channel_minmax_uint16_t();
+ test_channel_minmax_int16_t();
+ test_channel_minmax_uint32_t();
+ test_channel_minmax_int32_t();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/concepts.cpp b/src/boost/libs/gil/test/core/channel/concepts.cpp
new file mode 100644
index 000000000..80499b5a1
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/concepts.cpp
@@ -0,0 +1,100 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/concepts.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+// A channel archetype - to test the minimum requirements of the concept
+struct channel_value_archetype;
+
+struct channel_archetype
+{
+ // equality comparable
+ friend bool operator==(channel_archetype const&, channel_archetype const&)
+ { return true; }
+ // inequality comparable
+ friend bool operator!=(channel_archetype const&, channel_archetype const&)
+ { return false; }
+ // less-than comparable
+ friend bool operator<(channel_archetype const&, channel_archetype const&)
+ { return false; }
+ // convertible to a scalar
+ operator std::uint8_t() const { return 0; }
+
+ channel_archetype& operator++() { return *this; }
+ channel_archetype& operator--() { return *this; }
+ channel_archetype operator++(int) { return *this; }
+ channel_archetype operator--(int) { return *this; }
+
+ template <typename Scalar>
+ channel_archetype operator+=(Scalar) { return *this; }
+ template <typename Scalar>
+ channel_archetype operator-=(Scalar) { return *this; }
+ template <typename Scalar>
+ channel_archetype operator*=(Scalar) { return *this; }
+ template <typename Scalar>
+ channel_archetype operator/=(Scalar) { return *this; }
+
+ using value_type = channel_value_archetype;
+ using reference = channel_archetype;
+ using const_reference = channel_archetype const;
+ using pointer = channel_value_archetype*;
+ using const_pointer = channel_value_archetype const*;
+ static constexpr bool is_mutable = true;
+
+ static value_type min_value();
+ static value_type max_value();
+};
+
+struct channel_value_archetype : public channel_archetype
+{
+ // default constructible
+ channel_value_archetype() {}
+ // copy constructible
+ channel_value_archetype(channel_value_archetype const&) = default;
+ // assignable
+ channel_value_archetype& operator=(channel_value_archetype const&)
+ {return *this;}
+ channel_value_archetype(std::uint8_t) {}
+};
+
+channel_value_archetype channel_archetype::min_value()
+{
+ return channel_value_archetype();
+}
+
+channel_value_archetype channel_archetype::max_value()
+{
+ return channel_value_archetype();
+}
+
+void test_channel_minimal_requirements()
+{
+ // Do only compile-time tests for the archetype
+ // (because asserts like val1<val2 fail)
+ boost::function_requires<gil::MutableChannelConcept<channel_archetype>>();
+
+ fixture::channel_value<channel_value_archetype>();
+ fixture::channel_reference<channel_archetype>();
+ fixture::channel_reference<channel_archetype const&>();
+}
+
+int main()
+{
+ test_channel_minimal_requirements();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/is_channel_integral.cpp b/src/boost/libs/gil/test/core/channel/is_channel_integral.cpp
new file mode 100644
index 000000000..0b7cb64f7
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/is_channel_integral.cpp
@@ -0,0 +1,74 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/detail/is_channel_integral.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_channel_value<1>
+ >::value,
+ "1-bit packed_channel_value should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_channel_value<8>
+ >::value,
+ "8-bit packed_channel_value should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_channel_reference
+ <
+ std::uint8_t, 0, 3, true
+ >
+ >::value,
+ "3-bit packed_channel_reference should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_dynamic_channel_reference
+ <
+ std::uint8_t, 2, true
+ >
+ >::value,
+ "2-bit packed_dynamic_channel_reference should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_dynamic_channel_reference
+ <
+ std::uint16_t, 15, true
+ >
+ >::value,
+ "15-bit packed_dynamic_channel_reference should be recognized as integral");
+
+
+ struct int_minus_value { static std::int8_t apply() { return -64; } };
+ struct int_plus_value { static std::int8_t apply() { return 64; } };
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::scoped_channel_value
+ <
+ std::uint8_t, int_minus_value, int_plus_value
+ >
+ >::value,
+ "integer-based scoped_channel_value should be recognized as integral");
+
+ static_assert(!gil::detail::is_channel_integral<gil::float32_t>::value,
+ "float-based packed_channel_value should not be recognized as integral");
+
+ static_assert(!gil::detail::is_channel_integral<gil::float64_t>::value,
+ "float-based packed_channel_value should not be recognized as integral");
+}
diff --git a/src/boost/libs/gil/test/core/channel/packed_channel_value.cpp b/src/boost/libs/gil/test/core/channel/packed_channel_value.cpp
new file mode 100644
index 000000000..5504bdafb
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/packed_channel_value.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <limits>
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+template <typename T>
+void test_packed_channel_value_members()
+{
+ static_assert(std::is_same<typename T::value_type, T>::value,
+ "value_type should be the same as packed_channel_value specialization");
+
+ static_assert(std::is_lvalue_reference<typename T::reference>::value,
+ "reference should be lvalue reference type");
+
+ static_assert(std::is_lvalue_reference<typename T::reference>::value,
+ "const_reference should be lvalue reference type");
+
+ static_assert(std::is_pointer<typename T::pointer>::value,
+ "pointer should be pointer type");
+
+ static_assert(std::is_pointer<typename T::const_pointer>::value,
+ "const_pointer should be pointer type");
+
+ static_assert(T::is_mutable, "packed_channel_value should be mutable by default");
+
+ static_assert(std::is_constructible<T, typename T::integer_t>::value,
+ "packed_channel_value should be constructible from underlying integer_t");
+
+ static_assert(std::is_convertible<T, typename T::integer_t>::value,
+ "packed_channel_value should be convertible to underlying integer_t");
+}
+
+void test_packed_channel_value_with_num_bits_1()
+{
+ using bits1 = gil::packed_channel_value<1>;
+
+ test_packed_channel_value_members<bits1>();
+
+ static_assert(std::is_same<bits1::integer_t, std::uint8_t>::value,
+ "smallest integral type to store 1-bit value should be 8-bit unsigned");
+
+ BOOST_TEST_EQ(bits1::num_bits(), 1u);
+ BOOST_TEST_EQ(bits1::min_value(), 0u);
+ BOOST_TEST_EQ(bits1::max_value(), 1u);
+ BOOST_TEST_EQ(gil::channel_traits<bits1>::min_value(), 0u);
+ BOOST_TEST_EQ(gil::channel_traits<bits1>::max_value(), 1u);
+}
+
+void test_packed_channel_value_with_num_bits_8()
+{
+ using bits8 = gil::packed_channel_value<8>;
+
+ test_packed_channel_value_members<bits8>();
+
+ static_assert(std::is_same<bits8::integer_t, std::uint8_t>::value,
+ "smallest integral type to store 8-bit value should be 8-bit unsigned");
+
+ BOOST_TEST_EQ(bits8::num_bits(), 8u);
+ BOOST_TEST_EQ(bits8::min_value(), 0u);
+ BOOST_TEST_EQ(bits8::max_value(), 255u);
+ BOOST_TEST_EQ(gil::channel_traits<bits8>::min_value(), 0u);
+ BOOST_TEST_EQ(gil::channel_traits<bits8>::max_value(), 255u);
+}
+
+void test_packed_channel_value_with_num_bits15()
+{
+ using bits15 = gil::packed_channel_value<15>;
+
+ test_packed_channel_value_members<bits15>();
+
+ static_assert(std::is_same<bits15::integer_t, std::uint16_t>::value,
+ "smallest integral type to store 15-bit value should be 8-bit unsigned");
+
+ BOOST_TEST_EQ(bits15::num_bits(), 15u);
+ BOOST_TEST_EQ(bits15::min_value(), 0u);
+ BOOST_TEST_EQ(bits15::max_value(), 32767u);
+ BOOST_TEST_EQ(gil::channel_traits<bits15>::min_value(), 0u);
+ BOOST_TEST_EQ(gil::channel_traits<bits15>::max_value(), 32767u);
+}
+
+using fixture = gil::packed_channel_value<8>;
+
+void test_packed_channel_value_default_constructor()
+{
+ fixture f;
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{0});
+}
+
+void test_packed_channel_value_user_defined_constructors()
+{
+ fixture f{1};
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{1});
+}
+
+void test_packed_channel_value_copy_constructors()
+{
+ fixture f1{128};
+ fixture f2{f1};
+
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{128});
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{f2});
+}
+
+void test_packed_channel_value_assignment()
+{
+ fixture f;
+ f = 64;
+ BOOST_TEST_EQ(f, std::uint8_t{64});
+}
+
+int main()
+{
+ test_packed_channel_value_with_num_bits_1();
+ test_packed_channel_value_with_num_bits_8();
+ test_packed_channel_value_with_num_bits15();
+ test_packed_channel_value_default_constructor();
+ test_packed_channel_value_user_defined_constructors();
+ test_packed_channel_value_copy_constructors();
+ test_packed_channel_value_assignment();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp b/src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp
new file mode 100644
index 000000000..6b7c57dd9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp
@@ -0,0 +1,110 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distribtted under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/channel_algorithm.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+#include <cstdint>
+#include <limits>
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+struct int_minus_value { static std::int8_t apply() { return -64; } };
+struct int_plus_value { static std::int8_t apply() { return 64; } };
+using fixture = gil::scoped_channel_value
+ <
+ std::uint8_t, int_minus_value, int_plus_value
+ >;
+
+void test_scoped_channel_value_default_constructor()
+{
+ fixture f;
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{0});
+}
+
+void test_scoped_channel_value_user_defined_constructors()
+{
+ fixture f{1};
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{1});
+}
+
+void test_scoped_channel_value_copy_constructors()
+{
+ fixture f1{128};
+ fixture f2{f1};
+
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{128});
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{f2});
+}
+
+void test_scoped_channel_value_assignment()
+{
+ fixture f;
+ f = 64;
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{64});
+}
+
+void test_scoped_channel_value_float32_t()
+{
+ auto const epsilon = std::numeric_limits<float>::epsilon();
+ // min
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_zero<float>::apply(), 0.0, epsilon);
+ BOOST_TEST_EQ(gil::channel_traits<gil::float32_t>::min_value(), 0.0);
+ // max
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_one<float>::apply(), 1.0, epsilon);
+ BOOST_TEST_EQ(gil::channel_traits<gil::float32_t>::max_value(), 1.0);
+}
+
+void test_scoped_channel_value_float64_t()
+{
+ auto const epsilon = std::numeric_limits<double>::epsilon();
+ // min
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_zero<double>::apply(), 0.0, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<gil::float64_t>::min_value(), 0.0, epsilon);
+ // max
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_one<double>::apply(), 1.0, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<gil::float64_t>::max_value(), 1.0, epsilon);
+}
+
+void test_scoped_channel_value_halfs()
+{
+ // Create a double channel with range [-0.5 .. 0.5]
+ struct minus_half { static double apply() { return -0.5; } };
+ struct plus_half { static double apply() { return 0.5; } };
+ using halfs = gil::scoped_channel_value<double, minus_half, plus_half>;
+
+ auto const epsilon = std::numeric_limits<double>::epsilon();
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<halfs>::min_value(), minus_half::apply(), epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<halfs>::max_value(), plus_half::apply(), epsilon);
+ // scoped channel maximum should map to the maximum
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_convert<std::uint16_t>(
+ gil::channel_traits<halfs>::max_value()), 65535, epsilon);
+}
+
+int main()
+{
+ test_scoped_channel_value_default_constructor();
+ test_scoped_channel_value_user_defined_constructors();
+ test_scoped_channel_value_copy_constructors();
+ test_scoped_channel_value_assignment();
+ test_scoped_channel_value_float32_t();
+ test_scoped_channel_value_float64_t();
+ test_scoped_channel_value_halfs();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/test_fixture.cpp b/src/boost/libs/gil/test/core/channel/test_fixture.cpp
new file mode 100644
index 000000000..b8643a1e4
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/test_fixture.cpp
@@ -0,0 +1,134 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include "test_fixture.hpp"
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <limits>
+
+namespace fixture = boost::gil::test::fixture;
+
+struct test_channel_minmax_value_float
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<channel_t> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_channel_minmax_value_float{});
+ }
+};
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_value<channel_t> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ fixture::channel_reference<channel_t &> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_reference<channel_t const &> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channels565
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ static_assert(std::is_integral<bitfield_t>::value, "bitfield is not integral type");
+
+ // Regardless of BitField buffer bit-size, the fixture is initialized
+ // with max value that fits into 5+6+5 bit integer
+ fixture::packed_channels565<bitfield_t> fix;
+ fixture::channel_minmax_value<std::uint16_t> exp;
+ BOOST_TEST_EQ(fix.data_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channels565{});
+ }
+};
+
+struct test_packed_dynamic_channels565
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ static_assert(std::is_integral<bitfield_t>::value, "bitfield is not integral type");
+
+ // Regardless of BitField buffer bit-size, the fixture is initialized
+ // with max value that fits into 5+6+5 bit integer
+ fixture::packed_dynamic_channels565<bitfield_t> fix;
+ fixture::channel_minmax_value<std::uint16_t> exp;
+ BOOST_TEST_EQ(fix.data_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channels565{});
+ }
+};
+
+int main()
+{
+ test_channel_minmax_value_float::run();
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channels565::run();
+ test_packed_dynamic_channels565::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/test_fixture.hpp b/src/boost/libs/gil/test/core/channel/test_fixture.hpp
new file mode 100644
index 000000000..863fb1bd4
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/test_fixture.hpp
@@ -0,0 +1,252 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_CHANNEL_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_CHANNEL_TEST_FIXTURE_HPP
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cstdint>
+#include <tuple>
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+using channel_byte_types = std::tuple
+ <
+ std::uint8_t,
+ std::int8_t,
+ std::uint16_t,
+ std::int16_t,
+ std::uint32_t,
+ std::int32_t,
+ gil::float32_t,
+ gil::float64_t
+ >;
+
+using channel_integer_types = std::tuple
+ <
+ std::uint8_t,
+ std::int8_t,
+ std::uint16_t,
+ std::int16_t,
+ std::uint32_t,
+ std::int32_t
+ >;
+
+using channel_integer_signed_types = std::tuple
+ <
+ std::int8_t,
+ std::int16_t,
+ std::int32_t
+ >;
+
+using channel_integer_unsigned_types = std::tuple
+ <
+ std::uint8_t,
+ std::uint16_t,
+ std::uint32_t
+ >;
+
+// FIXME: If float types are convertible between each other,
+// currently they are not, then move to channel_byte_types and
+// remove channel_integer_types as redundant.
+using channel_float_types = std::tuple
+ <
+ gil::float32_t,
+ gil::float64_t
+ >;
+
+using channel_bitfield_types = std::tuple
+ <
+ std::uint16_t,
+ std::uint32_t,
+ std::uint64_t
+ // TODO: Shall we test signed types for unexpected conversions, etc.?
+ >;
+
+
+template <typename ChannelValue>
+struct channel_minmax_value
+{
+ //static_assert(std::)
+ ChannelValue min_v_;
+ ChannelValue max_v_;
+ channel_minmax_value()
+ : min_v_(gil::channel_traits<ChannelValue>::min_value())
+ , max_v_(gil::channel_traits<ChannelValue>::max_value())
+ {}
+};
+
+template <typename ChannelFixtureBase>
+struct channel : public ChannelFixtureBase
+{
+ using channel_t = typename ChannelFixtureBase::channel_t;
+ using channel_value_t = typename gil::channel_traits<channel_t>::value_type;
+
+ channel()
+ {
+ BOOST_TEST_EQ(this->min_v_, gil::channel_traits<channel_t>::min_value());
+ BOOST_TEST_EQ(this->max_v_, gil::channel_traits<channel_t>::max_value());
+ }
+};
+
+// The channel fixtures are defined for different types of channels
+// (ie. channel values, references and subbyte references)
+// ensure there are two members, min_v_ and max_v_ initialized
+// with the minimum and maximum channel value.
+// The different channel types have different ways to initialize them,
+// thus require different fixtures provided.
+
+// For basic channel types values can be initialized directly.
+template <typename ChannelValue>
+struct channel_value
+{
+ using channel_t = ChannelValue;
+ channel_t min_v_;
+ channel_t max_v_;
+
+ channel_value()
+ : min_v_(gil::channel_traits<ChannelValue>::min_value())
+ , max_v_(gil::channel_traits<ChannelValue>::max_value())
+ {
+ boost::function_requires<gil::ChannelValueConcept<ChannelValue>>();
+ }
+};
+
+// For channel references we need to have separate channel values.
+template <typename ChannelRef>
+struct channel_reference
+ : public channel_value<typename gil::channel_traits<ChannelRef>::value_type>
+{
+ using parent_t = channel_value<typename gil::channel_traits<ChannelRef>::value_type>;
+ using channel_t = ChannelRef;
+ channel_t min_v_;
+ channel_t max_v_;
+
+ channel_reference()
+ : parent_t()
+ , min_v_(parent_t::min_v_)
+ , max_v_(parent_t::max_v_)
+ {
+ boost::function_requires<ChannelConcept<ChannelRef>>();
+ }
+};
+
+// For sub-byte channel references we need to store the bit buffers somewhere
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+struct packed_channel_reference
+{
+ using channel_t = ChannelSubbyteRef;
+ using integer_t = typename channel_t::integer_t;
+ channel_t min_v_;
+ channel_t max_v_;
+ integer_t min_bitbuf_;
+ integer_t max_bitbuf_;
+
+ packed_channel_reference() : min_v_(&min_bitbuf_), max_v_(&max_bitbuf_)
+ {
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef>>();
+
+ ChannelMutableRef b1(&min_bitbuf_);
+ b1 = gil::channel_traits<channel_t>::min_value();
+ ChannelMutableRef b2(&max_bitbuf_);
+ b2 = gil::channel_traits<channel_t>::max_value();
+ }
+};
+
+// For sub-byte channel references we need to store the bit buffers somewhere
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+struct packed_dynamic_channel_reference
+{
+ using channel_t = ChannelSubbyteRef;
+ using integer_t = typename channel_t::integer_t;
+ channel_t min_v_;
+ channel_t max_v_;
+ integer_t min_bitbuf_;
+ integer_t max_bitbuf_;
+
+ packed_dynamic_channel_reference(int first_bit1 = 1, int first_bit2 = 2)
+ : min_v_(&min_bitbuf_, first_bit1)
+ , max_v_(&max_bitbuf_, first_bit2)
+ {
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef>>();
+
+ ChannelMutableRef b1(&min_bitbuf_, 1);
+ b1 = gil::channel_traits<channel_t>::min_value();
+ ChannelMutableRef b2(&max_bitbuf_, 2);
+ b2 = gil::channel_traits<channel_t>::max_value();
+ }
+};
+
+// Concrete fixture for 16-bit pack of 5,6,5-bit channels
+template <typename BitField>
+struct packed_channels565
+{
+ static_assert(sizeof(BitField) >= sizeof(std::uint16_t), "16-bit or more required");
+ using channel_0_5_t = gil::packed_channel_reference<BitField, 0, 5,true>;
+ using channel_5_6_t = gil::packed_channel_reference<BitField, 5, 6,true>;
+ using channel_11_5_t = gil::packed_channel_reference<BitField, 11, 5,true>;
+
+ using fixture_0_5_t = fixture::packed_channel_reference<channel_0_5_t>;
+ using fixture_5_6_t = fixture::packed_channel_reference<channel_5_6_t>;
+ using fixture_11_5_t = fixture::packed_channel_reference<channel_11_5_t>;
+
+ std::uint16_t data_ = 0;
+ channel_0_5_t channel1_;
+ channel_5_6_t channel2_;
+ channel_11_5_t channel3_;
+
+ packed_channels565() : channel1_(&data_), channel2_(&data_), channel3_(&data_)
+ {
+ channel1_ = gil::channel_traits<channel_0_5_t>::max_value();
+ channel2_ = gil::channel_traits<channel_5_6_t>::max_value();
+ channel3_ = gil::channel_traits<channel_11_5_t>::max_value();
+#ifdef BOOST_TEST_EQ
+ BOOST_TEST_EQ(data_, 65535);
+#endif
+ }
+};
+
+// Concrete fixture for dynamically-referenced 16-bit pack of 5,6,5-bit channels
+template <typename BitField>
+struct packed_dynamic_channels565
+{
+ static_assert(sizeof(BitField) >= sizeof(std::uint16_t), "16-bit or more required");
+ using channel_5_t = gil::packed_dynamic_channel_reference<BitField,5,true>;
+ using channel_6_t = gil::packed_dynamic_channel_reference<BitField,6,true>;
+
+ using fixture_5_t = fixture::packed_dynamic_channel_reference<channel_5_t>;
+ using fixture_6_t = fixture::packed_dynamic_channel_reference<channel_6_t>;
+
+ std::uint16_t data_ = 0;
+ channel_5_t channel1_;
+ channel_6_t channel2_;
+ channel_5_t channel3_;
+
+ packed_dynamic_channels565()
+ : channel1_(&data_, 0)
+ , channel2_(&data_, 5)
+ , channel3_(&data_, 11)
+ {
+ channel1_ = gil::channel_traits<channel_5_t>::max_value();
+ channel2_ = gil::channel_traits<channel_6_t>::max_value();
+ channel3_ = gil::channel_traits<channel_5_t>::max_value();
+#ifdef BOOST_TEST_EQ
+ BOOST_TEST_EQ(data_, 65535);
+#endif
+ }
+};
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/core/color/CMakeLists.txt b/src/boost/libs/gil/test/core/color/CMakeLists.txt
new file mode 100644
index 000000000..664bd74f0
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/CMakeLists.txt
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ color_spaces_are_compatible
+ default_color_converter_impl)
+ set(_test t_core_color_${_name})
+ set(_target test_core_color_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/color/Jamfile b/src/boost/libs/gil/test/core/color/Jamfile
new file mode 100644
index 000000000..0b5a23420
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/Jamfile
@@ -0,0 +1,15 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile color_spaces_are_compatible.cpp ;
+compile-fail default_color_converter_impl_fail.cpp ;
+
+run default_color_converter_impl.cpp ;
diff --git a/src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp b/src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp
new file mode 100644
index 000000000..15f7f41d4
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp
@@ -0,0 +1,46 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/device_n.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+#include <type_traits>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+template <typename T>
+using test_self_compatible = gil::color_spaces_are_compatible<T, T>;
+
+int main()
+{
+ using color_spaces = mp_list
+ <
+ gil::devicen_t<2>,
+ gil::devicen_t<3>,
+ gil::devicen_t<4>,
+ gil::devicen_t<5>,
+ gil::gray_t,
+ gil::cmyk_t,
+ gil::rgb_t,
+ gil::rgba_t
+ >;
+
+ static_assert(std::is_same
+ <
+ mp_all_of<color_spaces, test_self_compatible>,
+ std::true_type
+ >::value,
+ "color_spaces_are_compatible should yield true for the same types");
+}
diff --git a/src/boost/libs/gil/test/core/color/concepts.cpp b/src/boost/libs/gil/test/core/color/concepts.cpp
new file mode 100644
index 000000000..157f28220
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/concepts.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/device_n.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+int main()
+{
+ // TODO: Most constraints() for color concepts are no-op as not implemented.
+ // Once implemented, this test should help to catch any issues early.
+
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<2>>>();
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<3>>>();
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<4>>>();
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<5>>>();
+ function_requires<gil::ColorSpaceConcept<gil::gray_t>>();
+ function_requires<gil::ColorSpaceConcept<gil::cmyk_t>>();
+ function_requires<gil::ColorSpaceConcept<gil::rgb_t>>();
+ function_requires<gil::ColorSpaceConcept<gil::rgba_t>>();
+
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::gray_t, gil::gray_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::cmyk_t, gil::cmyk_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::rgb_t, gil::rgb_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::rgba_t, gil::rgba_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept
+ <
+ gil::devicen_t<2>,
+ gil::devicen_t<2>
+ >>();
+}
diff --git a/src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp b/src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp
new file mode 100644
index 000000000..a2ea7fd9e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp
@@ -0,0 +1,112 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_convert.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+#include "core/pixel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_TEST_DEBUG
+#include <boost/core/demangle.hpp>
+#include <iostream>
+namespace {
+template <class T>
+std::string name() { return boost::core::demangle(typeid(T).name()); }
+}
+#endif
+
+template <typename ColorSpaces>
+struct test_roundtrip_convertible
+{
+ template<typename Src, typename Dst>
+ void operator()(mp11::mp_list<Src, Dst> const&) const
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "test_lossless_roundtrip:\n"
+ << "\tsrc: " << name<Src>() << "\n\tdst: " << name<Dst>() << std::endl;
+#endif
+ using pixel_src_t = gil::pixel<std::uint8_t, gil::layout<Src>>;
+ using pixel_dst_t = gil::pixel<std::uint8_t, gil::layout<Dst>>;
+
+ pixel_src_t src1{};
+ pixel_dst_t dst1{};
+
+ gil::default_color_converter_impl<Src, Dst> convert_to;
+ convert_to(src1, dst1);
+
+ gil::default_color_converter_impl<Dst, Src> convert_from;
+ pixel_src_t src2{};
+ convert_from(dst1, src2);
+
+ BOOST_TEST_EQ(src1, src2);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each
+ <
+ mp11::mp_product<mp11::mp_list, ColorSpaces, ColorSpaces>
+ >(test_roundtrip_convertible{});
+ }
+};
+
+template <typename ColorSpaces>
+struct test_convertible
+{
+ template<typename Src, typename Dst>
+ void operator()(mp11::mp_list<Src, Dst> const&) const
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "test_all:\n"
+ << "\tsrc: " << name<Src>() << "\n\tdst: " << name<Dst>() << std::endl;
+#endif
+ using pixel_src_t = gil::pixel<std::uint8_t, gil::layout<Src>>;
+ using pixel_dst_t = gil::pixel<std::uint8_t, gil::layout<Dst>>;
+
+ pixel_src_t src{};
+ pixel_dst_t dst{};
+
+ gil::default_color_converter_impl<Src, Dst> convert_to;
+ convert_to(src, dst);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each
+ <
+ mp11::mp_product<mp11::mp_list, ColorSpaces, ColorSpaces>
+ >(test_convertible{});
+ }
+};
+
+int main()
+{
+ test_convertible
+ <
+ mp11::mp_list<gil::cmyk_t, gil::gray_t, gil::rgb_t, gil::rgba_t>
+ >::run();
+
+ test_roundtrip_convertible
+ <
+ mp11::mp_list<gil::gray_t, gil::rgb_t>
+ >::run();
+
+ test_roundtrip_convertible<mp11::mp_list<gil::cmyk_t>>::run();
+ test_roundtrip_convertible<mp11::mp_list<gil::gray_t>>::run();
+ test_roundtrip_convertible<mp11::mp_list<gil::rgba_t>>::run();
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp b/src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp
new file mode 100644
index 000000000..0f62af7be
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp
@@ -0,0 +1,33 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_convert.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mp11.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct unknown_color_space {};
+
+int main()
+{
+ {
+ gil::default_color_converter_impl<unknown_color_space, gil::gray_t> c;
+ boost::ignore_unused(c);
+ }
+ {
+ gil::default_color_converter_impl<gil::rgb_t, unknown_color_space> c;
+ boost::ignore_unused(c);
+ }
+}
diff --git a/src/boost/libs/gil/test/core/color_base/CMakeLists.txt b/src/boost/libs/gil/test/core/color_base/CMakeLists.txt
new file mode 100644
index 000000000..db81366dc
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/CMakeLists.txt
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ homogeneous_color_base
+ static_transform)
+ set(_test t_core_color_base_${_name})
+ set(_target test_core_color_base_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/color_base/Jamfile b/src/boost/libs/gil/test/core/color_base/Jamfile
new file mode 100644
index 000000000..68f5dfe7a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/Jamfile
@@ -0,0 +1,16 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile-fail static_transform_gray_to_rgb_fail.cpp ;
+compile-fail static_transform_rgb_to_cmyk_fail.cpp ;
+
+run homogeneous_color_base.cpp ;
+run static_transform.cpp ;
diff --git a/src/boost/libs/gil/test/core/color_base/concepts.cpp b/src/boost/libs/gil/test/core/color_base/concepts.cpp
new file mode 100644
index 000000000..1685df232
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/concepts.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+int main()
+{
+ function_requires<gil::ColorBaseConcept
+ <
+ gil::detail::homogeneous_color_base<std::uint8_t, gil::gray_layout_t, 1>
+ >>();
+
+ function_requires<gil::HomogeneousColorBaseConcept
+ <
+ gil::detail::homogeneous_color_base<std::uint8_t, gil::gray_layout_t, 1>
+ >>();
+
+ function_requires<gil::HomogeneousColorBaseValueConcept
+ <
+ gil::detail::homogeneous_color_base<std::uint8_t, gil::gray_layout_t, 1>
+ >>();
+
+ // FIXME: https://github.com/boostorg/gil/issues/271
+ //function_requires
+ //<
+ // gil::ColorBaseConcept
+ // <
+ // gil::detail::homogeneous_color_base<std::uint8_t, gil::rgb_layout_t, 3>
+ // >
+ //>();
+
+ function_requires<gil::ColorBaseConcept<gil::gray8_pixel_t>>();
+ function_requires<gil::ColorBaseConcept<gil::rgb8_pixel_t>>();
+ function_requires<gil::ColorBaseConcept<gil::bgr8_pixel_t>>();
+
+}
diff --git a/src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp b/src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp
new file mode 100644
index 000000000..76b5570cb
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp
@@ -0,0 +1,141 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/core/typeinfo.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+namespace {
+
+// Unknown layout is used where layout mapping is irrelevant for a test and its result.
+using unknown_layout_t = gil::gray_layout_t;
+
+template <int N>
+using color_base = gil::detail::homogeneous_color_base<std::uint8_t, unknown_layout_t, N>;
+
+std::integral_constant<int, 0> e0;
+std::integral_constant<int, 1> e1;
+std::integral_constant<int, 2> e2;
+std::integral_constant<int, 3> e3;
+std::integral_constant<int, 4> e4;
+
+} // unnamed namespace
+
+void test_homogeneous_color_base_1_default_constructor()
+{
+ using fixture = color_base<1>;
+ fixture f;
+ BOOST_TEST_EQ(std::uint8_t{f}, std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_1_value_constructor()
+{
+ using fixture = color_base<1>;
+ fixture f{1};
+ BOOST_TEST_EQ(std::uint8_t{f}, std::uint8_t{1});
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{1});
+}
+
+void test_homogeneous_color_base_2_default_constructor()
+{
+ using fixture = color_base<2>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_2_value_constructor()
+{
+ using fixture = color_base<2>;
+ fixture f{2};
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{2});
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+}
+
+void test_homogeneous_color_base_3_default_constructor()
+{
+ using fixture = color_base<3>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e2), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_3_value_constructor()
+{
+ using fixture = color_base<3>;
+ fixture f{3};
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{3});
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+ BOOST_TEST_EQ(f.at(e0), f.at(e2));
+}
+
+void test_homogeneous_color_base_4_default_constructor()
+{
+ using fixture = color_base<4>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e2), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e3), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_4_value_constructor()
+{
+ using fixture = color_base<4>;
+ fixture f{4};
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{4});
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+ BOOST_TEST_EQ(f.at(e0), f.at(e2));
+ BOOST_TEST_EQ(f.at(e0), f.at(e3));
+}
+
+void test_homogeneous_color_base_5_default_constructor()
+{
+ using fixture = color_base<5>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e2), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e3), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e4), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_5_value_constructor()
+{
+ using fixture = color_base<5>;
+ fixture f{5};
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+ BOOST_TEST_EQ(f.at(e0), f.at(e2));
+ BOOST_TEST_EQ(f.at(e0), f.at(e3));
+ BOOST_TEST_EQ(f.at(e0), f.at(e4));
+}
+
+int main()
+{
+ test_homogeneous_color_base_1_default_constructor();
+ test_homogeneous_color_base_1_value_constructor();
+ test_homogeneous_color_base_2_default_constructor();
+ test_homogeneous_color_base_2_value_constructor();
+ test_homogeneous_color_base_3_default_constructor();
+ test_homogeneous_color_base_3_value_constructor();
+ test_homogeneous_color_base_4_default_constructor();
+ test_homogeneous_color_base_4_value_constructor();
+ test_homogeneous_color_base_5_default_constructor();
+ test_homogeneous_color_base_5_value_constructor();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/color_base/static_transform.cpp b/src/boost/libs/gil/test/core/color_base/static_transform.cpp
new file mode 100644
index 000000000..f2f6405fd
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/static_transform.cpp
@@ -0,0 +1,72 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_single_source_gray8_to_gray8()
+{
+ gil::gray8_pixel_t src{128};
+ gil::gray8_pixel_t dst{0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(src), gil::at_c<0>(dst));
+}
+
+void test_single_source_rgb8_to_rgb8()
+{
+ gil::rgb8_pixel_t src{32, 64, 128};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(src), gil::at_c<0>(dst));
+ BOOST_TEST_EQ(gil::at_c<1>(src), gil::at_c<1>(dst));
+ BOOST_TEST_EQ(gil::at_c<2>(src), gil::at_c<2>(dst));
+}
+
+void test_single_source_rgb8_to_gray8()
+{
+ // Transformation of wider space to narrower space is a valid operation
+ gil::rgb8_pixel_t src{32,64, 128};
+ gil::gray8_pixel_t dst{0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(dst), std::uint8_t{32});
+}
+
+void test_single_source_cmyk8_to_rgb8()
+{
+ // Transformation of wider space to narrower space is a valid operation
+ gil::cmyk8_pixel_t src{16, 32, 64, 128};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(dst), std::uint8_t{16});
+ BOOST_TEST_EQ(gil::at_c<1>(dst), std::uint8_t{32});
+ BOOST_TEST_EQ(gil::at_c<2>(dst), std::uint8_t{64});
+}
+
+int main()
+{
+ test_single_source_gray8_to_gray8();
+ test_single_source_rgb8_to_rgb8();
+ test_single_source_rgb8_to_gray8();
+ test_single_source_cmyk8_to_rgb8();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp b/src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp
new file mode 100644
index 000000000..f07c9ad49
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base_algorithm.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cassert>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ // K-element index must be less than size of channel_mapping_t sequence
+ // of the *destination* color base.
+
+ // RGB (wider space) transformation to Gray (narrower space) takes only R channel value
+ {
+ gil::rgb8_pixel_t src{ 32, 64, 128 };
+ gil::gray8_pixel_t dst{ 0 };
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ assert(gil::at_c<0>(dst) == std::uint16_t{32});
+ }
+
+ // Gray (narrower space) to RGB (wider space) transformation FAILS to compile
+ {
+ gil::gray8_pixel_t src{32};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ }
+}
diff --git a/src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp b/src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp
new file mode 100644
index 000000000..6aa6ee5d7
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp
@@ -0,0 +1,42 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base_algorithm.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cassert>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ // K-element index must be less than size of channel_mapping_t sequence
+ // of the *destination* color base.
+
+ // RGB (wider space) transformation to Gray (narrower space) takes only R channel value
+ {
+ gil::cmyk8_pixel_t src{16, 32, 64, 128};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ assert(gil::at_c<0>(dst) == std::uint16_t{16});
+ assert(gil::at_c<0>(dst) == std::uint16_t{32});
+ assert(gil::at_c<0>(dst) == std::uint16_t{64});
+ }
+
+ // RGB (narrower space) to CMYK (wider space) transformation FAILS to compile
+ {
+ gil::rgb8_pixel_t src{16, 32, 64};
+ gil::cmyk8_pixel_t dst{0, 0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ }
+}
diff --git a/src/boost/libs/gil/test/core/image/CMakeLists.txt b/src/boost/libs/gil/test/core/image/CMakeLists.txt
new file mode 100644
index 000000000..6574cf275
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ image)
+ set(_test t_core_image_${_name})
+ set(_target test_core_image_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/image/Jamfile b/src/boost/libs/gil/test/core/image/Jamfile
new file mode 100644
index 000000000..07da63467
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+
+run image.cpp ;
diff --git a/src/boost/libs/gil/test/core/image/concepts.cpp b/src/boost/libs/gil/test/core/image/concepts.cpp
new file mode 100644
index 000000000..b9bd25513
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/concepts.cpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil.hpp>
+
+#include <boost/concept_check.hpp>
+
+#include <array>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+int main()
+{
+ function_requires<gil::ImageConcept<gil::gray8_image_t>>();
+ function_requires<gil::ImageConcept<gil::rgb8_image_t>>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/image/image.cpp b/src/boost/libs/gil/test/core/image/image.cpp
new file mode 100644
index 000000000..b12183432
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/image.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+#include "core/pixel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_constructor_with_dimensions_pixel
+{
+ template <typename Image>
+ void operator()(Image const &)
+ {
+ using image_t = Image;
+ gil::point_t const dimensions{256, 128};
+ using pixel_t = typename image_t::view_t::value_type;
+ pixel_t const rnd_pixel = fixture::pixel_generator<pixel_t>::random();
+ image_t image(dimensions, rnd_pixel);
+ BOOST_TEST_EQ(image.width(), dimensions.x);
+ BOOST_TEST_EQ(image.height(), dimensions.y);
+
+ for (pixel_t const &p : gil::view(image))
+ BOOST_TEST_EQ(p, rnd_pixel);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_constructor_with_dimensions_pixel{});
+ }
+};
+
+struct test_move_constructor
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ gil::point_t const dimensions{256, 128};
+ {
+ image_t image(fixture::create_image<image_t>(dimensions.x, dimensions.y, 0));
+
+ image_t image2(std::move(image));
+ BOOST_TEST_EQ(image2.dimensions(), dimensions);
+ BOOST_TEST_EQ(image.dimensions(), gil::point_t{});
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_move_constructor{});
+ }
+};
+
+struct test_move_assignement
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ gil::point_t const dimensions{256, 128};
+ {
+ image_t image = fixture::create_image<image_t>(dimensions.x, dimensions.y, 0);
+ image_t image2 = fixture::create_image<image_t>(dimensions.x * 2, dimensions.y * 2, 1);
+ image2 = std::move(image);
+ BOOST_TEST_EQ(image2.dimensions(), dimensions);
+ BOOST_TEST_EQ(image.dimensions(), gil::point_t{});
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_move_assignement{});
+ }
+};
+
+int main()
+{
+ test_constructor_with_dimensions_pixel::run();
+
+ test_move_constructor::run();
+ test_move_assignement::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image/test_fixture.hpp b/src/boost/libs/gil/test/core/image/test_fixture.hpp
new file mode 100644
index 000000000..da604093b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/test_fixture.hpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_IMAGE_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_IMAGE_TEST_FIXTURE_HPP
+
+#include <boost/gil.hpp>
+#include <boost/assert.hpp>
+
+#include <cstdint>
+#include <initializer_list>
+#include <limits>
+#include <random>
+#include <tuple>
+#include <type_traits>
+
+#include "core/test_fixture.hpp"
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+using image_types = std::tuple
+<
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::gray32_image_t,
+ gil::bgr8_image_t,
+ gil::bgr16_image_t,
+ gil::bgr32_image_t,
+ gil::rgb8_image_t,
+ gil::rgb16_image_t,
+ gil::rgb32_image_t,
+ gil::rgba8_image_t,
+ gil::rgba16_image_t,
+ gil::rgba32_image_t
+>;
+
+template <typename Image, typename Generator>
+auto generate_image(std::ptrdiff_t size_x, std::ptrdiff_t size_y, Generator&& generate) -> Image
+{
+ using pixel_t = typename Image::value_type;
+
+ Image out(size_x, size_y);
+ gil::for_each_pixel(view(out), [&generate](pixel_t& p) {
+ gil::static_generate(p, [&generate]() { return generate(); });
+ });
+
+ return out;
+}
+
+template <typename Image>
+auto create_image(std::ptrdiff_t size_x, std::ptrdiff_t size_y, int channel_value) -> Image
+{
+ using pixel_t = typename Image::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ static_assert(std::is_integral<channel_t>::value, "channel must be integral type");
+
+ Image out(size_x, size_y);
+ gil::for_each_pixel(view(out), [&channel_value](pixel_t& p) {
+ gil::static_fill(p, static_cast<channel_t>(channel_value));
+ });
+
+ return out;
+}
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/core/image_processing/CMakeLists.txt b/src/boost/libs/gil/test/core/image_processing/CMakeLists.txt
new file mode 100644
index 000000000..5ecd59062
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+#
+# Use, modification and distribution are subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ threshold_binary
+ threshold_truncate
+ threshold_otsu)
+ set(_test t_core_image_processing_${_name})
+ set(_target test_core_image_processing_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+endforeach()
+
+foreach(_name
+ lanczos_scaling
+ simple_kernels
+ harris
+ hessian
+ box_filter
+ median_filter
+ sobel_scharr)
+ set(_test t_core_image_processing_${_name})
+ set(_target test_core_image_processing_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/image_processing/Jamfile b/src/boost/libs/gil/test/core/image_processing/Jamfile
new file mode 100644
index 000000000..d9593f079
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/Jamfile
@@ -0,0 +1,21 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+#
+# Use, modification and distribution are subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+import testing ;
+
+compile-fail threshold_color_spaces_not_compatible_fail.cpp ;
+run threshold_binary.cpp ;
+run threshold_truncate.cpp ;
+run threshold_otsu.cpp ;
+run lanczos_scaling.cpp ;
+run simple_kernels.cpp ;
+run harris.cpp ;
+run hessian.cpp ;
+run sobel_scharr.cpp ;
+run box_filter.cpp ;
+run median_filter.cpp ;
diff --git a/src/boost/libs/gil/test/core/image_processing/box_filter.cpp b/src/boost/libs/gil/test/core/image_processing/box_filter.cpp
new file mode 100644
index 000000000..54b0dd0e8
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/box_filter.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/filter.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+std::uint8_t output[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 0, 56, 85, 141, 85, 56, 0, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+void test_box_filter_with_default_parameters()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(img), 9);
+
+ gil::image<gil::gray8_pixel_t> temp_img(src_view.width(), src_view.height());
+ typename gil::image<gil::gray8_pixel_t>::view_t temp_view = view(temp_img);
+ gil::gray8_view_t dst_view(temp_view);
+
+ gil::box_filter(src_view, dst_view, 3);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(output), 9);
+
+ BOOST_TEST(gil::equal_pixels(out_view, dst_view));
+}
+
+int main()
+{
+ test_box_filter_with_default_parameters();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/harris.cpp b/src/boost/libs/gil/test/core/image_processing/harris.cpp
new file mode 100644
index 000000000..f8c8e7dc6
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/harris.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_processing/harris.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+bool are_equal(gil::gray32f_view_t expected, gil::gray32f_view_t actual) {
+ if (expected.dimensions() != actual.dimensions())
+ return false;
+
+ for (long int y = 0; y < expected.height(); ++y)
+ {
+ for (long int x = 0; x < expected.width(); ++x)
+ {
+ if (expected(x, y) != actual(x, y))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void test_blank_image()
+{
+ const gil::point_t dimensions(20, 20);
+ gil::gray16s_image_t dx(dimensions, gil::gray16s_pixel_t(0), 0);
+ gil::gray16s_image_t dy(dimensions, gil::gray16s_pixel_t(0), 0);
+
+ gil::gray32f_image_t m11(dimensions);
+ gil::gray32f_image_t m12_21(dimensions);
+ gil::gray32f_image_t m22(dimensions);
+ gil::gray32f_image_t expected(dimensions, gil::gray32f_pixel_t(0), 0);
+ gil::compute_tensor_entries(
+ gil::view(dx),
+ gil::view(dy),
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m11)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m12_21)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m22)));
+
+ gil::gray32f_image_t harris_response(dimensions, gil::gray32f_pixel_t(0), 0);
+ auto unnormalized_mean = gil::generate_unnormalized_mean(5);
+ gil::compute_harris_responses(
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22),
+ unnormalized_mean,
+ 0.04f,
+ gil::view(harris_response)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(harris_response)));
+}
+
+int main(int argc, char* argv[])
+{
+ test_blank_image();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/hessian.cpp b/src/boost/libs/gil/test/core/image_processing/hessian.cpp
new file mode 100644
index 000000000..b8e797d55
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/hessian.cpp
@@ -0,0 +1,72 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_processing/hessian.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+bool are_equal(gil::gray32f_view_t expected, gil::gray32f_view_t actual) {
+ if (expected.dimensions() != actual.dimensions())
+ return false;
+
+ for (long int y = 0; y < expected.height(); ++y)
+ {
+ for (long int x = 0; x < expected.width(); ++x)
+ {
+ if (expected(x, y) != actual(x, y))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void test_blank_image()
+{
+ const gil::point_t dimensions(20, 20);
+ gil::gray16s_image_t dx(dimensions, gil::gray16s_pixel_t(0), 0);
+ gil::gray16s_image_t dy(dimensions, gil::gray16s_pixel_t(0), 0);
+
+ gil::gray32f_image_t m11(dimensions);
+ gil::gray32f_image_t m12_21(dimensions);
+ gil::gray32f_image_t m22(dimensions);
+ gil::gray32f_image_t expected(dimensions, gil::gray32f_pixel_t(0), 0);
+ gil::compute_hessian_entries(
+ gil::view(dx),
+ gil::view(dy),
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m11)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m12_21)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m22)));
+
+ gil::gray32f_image_t hessian_response(dimensions, gil::gray32f_pixel_t(0), 0);
+ auto unnormalized_mean = gil::generate_unnormalized_mean(5);
+ gil::compute_hessian_responses(
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22),
+ unnormalized_mean,
+ gil::view(hessian_response)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(hessian_response)));
+}
+
+int main(int argc, char* argv[])
+{
+ test_blank_image();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp b/src/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp
new file mode 100755
index 000000000..610de5ade
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp
@@ -0,0 +1,67 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_processing/scaling.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+bool are_equal(gil::rgb8_view_t expected, gil::rgb8_view_t actual)
+{
+ if (expected.dimensions() != actual.dimensions())
+ return false;
+
+ for (long int y = 0; y < expected.height(); ++y)
+ {
+ for (long int x = 0; x < expected.width(); ++x)
+ {
+ if (expected(x, y) != actual(x, y))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void test_lanczos_black_image()
+{
+ const gil::point_t input_dimensions(20, 20);
+ const gil::point_t output_dimensions(input_dimensions.x / 2, input_dimensions.y / 2);
+ gil::rgb8_image_t image(input_dimensions, gil::rgb8_pixel_t(0, 0, 0), 0);
+ // fill with values other than 0
+ gil::rgb8_image_t output_image(
+ output_dimensions,
+ gil::rgb8_pixel_t(100, 100, 100),
+ 0
+ );
+ gil::rgb8_image_t expected(
+ output_dimensions,
+ gil::rgb8_pixel_t(0, 0, 0),
+ 0
+ );
+
+ auto view = gil::view(image);
+ auto output_view = gil::view(output_image);
+ auto expected_view = gil::view(expected);
+ gil::scale_lanczos(view, output_view, 5);
+ BOOST_TEST(are_equal(expected_view,output_view));
+}
+
+void test_lanczos_response_on_zero()
+{
+ //random value for a
+ BOOST_TEST_EQ(gil::lanczos(0, 2), 1);
+}
+
+int main()
+{
+ test_lanczos_black_image();
+ test_lanczos_response_on_zero();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/median_filter.cpp b/src/boost/libs/gil/test/core/image_processing/median_filter.cpp
new file mode 100644
index 000000000..e2b3ca7e2
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/median_filter.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_processing/filter.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 183, 128, 181, 86, 34, 55, 134, 164, 15,
+ 90, 59, 94, 158, 202, 0, 106, 120, 255,
+ 65, 48, 4, 21, 21, 38, 50, 37, 228,
+ 27, 245, 254, 164, 135, 192, 17, 241, 19,
+ 56, 165, 253, 169, 24, 200, 249, 70, 199,
+ 59, 84, 41, 96, 70, 58, 24, 20, 218,
+ 235, 180, 12, 168, 224, 204, 166, 153, 1,
+ 181, 213, 232, 178, 165, 253, 93, 214, 72,
+ 171, 50, 20, 65, 67, 133, 249, 157, 105
+};
+
+std::uint8_t output[] =
+{
+ 128, 128, 128, 94, 55, 55, 120, 134, 120,
+ 90, 90, 86, 86, 38, 50, 55, 120, 164,
+ 65, 65, 94, 135, 135, 50, 50, 106, 228,
+ 56, 65, 165, 135, 135, 50, 70, 70, 199,
+ 59, 84, 165, 135, 135, 70, 70, 70, 199,
+ 84, 84, 165, 96, 168, 166, 153, 153, 153,
+ 181, 180, 168, 165, 168, 165, 153, 93, 72,
+ 181, 180, 168, 165, 168, 166, 166, 153, 105,
+ 171, 171, 65, 67, 133, 133, 157, 157, 105
+};
+
+void test_median_filter_with_kernel_size_3()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(img), 9);
+
+ gil::image<gil::gray8_pixel_t> temp_img(src_view.width(), src_view.height());
+ typename gil::image<gil::gray8_pixel_t>::view_t temp_view = view(temp_img);
+ gil::gray8_view_t dst_view(temp_view);
+
+ gil::median_filter(src_view, dst_view, 3);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(output), 9);
+
+ BOOST_TEST(gil::equal_pixels(out_view, dst_view));
+}
+
+int main()
+{
+ test_median_filter_with_kernel_size_3();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp b/src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp
new file mode 100644
index 000000000..522dec2f1
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+void test_normalized_mean_generation()
+{
+ auto kernel = gil::generate_normalized_mean(5);
+ for (const auto& cell: kernel)
+ {
+ const auto expected_value = static_cast<float>(1 / 25.f);
+ BOOST_TEST_EQ(cell, expected_value);
+ }
+}
+
+void test_unnormalized_mean_generation()
+{
+ auto kernel = gil::generate_unnormalized_mean(5);
+ for (const auto& cell: kernel)
+ {
+ BOOST_TEST_EQ(cell, 1.0f);
+ }
+}
+
+void test_gaussian_kernel_generation()
+{
+ auto kernel = boost::gil::generate_gaussian_kernel(7, 0.84089642);
+ const float expected_values[7][7] =
+ {
+ {0.00000067f, 0.00002292f, 0.00019117f, 0.00038771f, 0.00019117f, 0.00002292f, 0.00000067f},
+ {0.00002292f, 0.00078633f, 0.00655965f, 0.01330373f, 0.00655965f, 0.00078633f, 0.00002292f},
+ {0.00019117f, 0.00655965f, 0.05472157f, 0.11098164f, 0.05472157f, 0.00655965f, 0.00019117f},
+ {0.00038771f, 0.01330373f, 0.11098164f, 0.25508352f, 0.11098164f, 0.01330373f, 0.00038711f},
+ {0.00019117f, 0.00655965f, 0.05472157f, 0.11098164f, 0.05472157f, 0.00655965f, 0.00019117f},
+ {0.00002292f, 0.00078633f, 0.00655965f, 0.01330373f, 0.00655965f, 0.00078633f, 0.00002292f},
+ {0.00000067f, 0.00002292f, 0.00019117f, 0.00038771f, 0.00019117f, 0.00002292f, 0.00000067f}
+ };
+
+ for (gil::gray32f_view_t::coord_t y = 0; static_cast<std::size_t>(y) < kernel.size(); ++y)
+ {
+ for (gil::gray32f_view_t::coord_t x = 0; static_cast<std::size_t>(x) < kernel.size(); ++x)
+ {
+ auto output = kernel.at(static_cast<std::size_t>(x), static_cast<std::size_t>(y));
+ auto expected = expected_values[y][x];
+ auto percent_difference = std::ceil(std::abs(expected - output) / expected);
+ BOOST_TEST_LT(percent_difference, 5);
+ }
+ }
+}
+
+int main()
+{
+ test_normalized_mean_generation();
+ test_unnormalized_mean_generation();
+ test_gaussian_kernel_generation();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp b/src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp
new file mode 100644
index 000000000..6ebc90cad
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/detail/math.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <algorithm>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_dx_sobel_kernel()
+{
+ auto const kernel = gil::generate_dx_sobel(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_sobel.begin(), gil::detail::dx_sobel.end());
+}
+
+void test_dx_scharr_kernel()
+{
+ auto const kernel = gil::generate_dx_scharr(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_scharr.begin(), gil::detail::dx_scharr.end());
+}
+
+void test_dy_sobel_kernel()
+{
+ auto const kernel = gil::generate_dy_sobel(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_sobel.begin(), gil::detail::dy_sobel.end());
+}
+
+void test_dy_scharr_kernel()
+{
+ auto const kernel = gil::generate_dy_scharr(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_scharr.begin(), gil::detail::dy_scharr.end());
+}
+
+int main()
+{
+ test_dx_sobel_kernel();
+ test_dx_scharr_kernel();
+ test_dy_sobel_kernel();
+ test_dy_scharr_kernel();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp
new file mode 100644
index 000000000..098cfc062
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/gray.hpp>
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+int height = 4;
+int width = 4;
+
+gil::gray8_image_t original_gray(width, height), threshold_gray(width, height),
+expected_gray(width, height);
+
+gil::rgb8_image_t original_rgb(width, height), threshold_rgb(width, height),
+expected_rgb(width, height);
+
+
+void fill_original_gray()
+{
+ //filling original_gray view's upper half part with gray pixels of value 50
+ //filling original_gray view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+}
+
+void fill_original_rgb()
+{
+ //filling original_rgb view's upper half part with rgb pixels of value 50, 155, 115
+ //filling original_rgb view's lower half part with rgb pixels of value 203, 9, 60
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 155, 115));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(203, 9, 60));
+}
+
+void binary_gray_to_gray()
+{
+ //expected_gray view after thresholding of the original_gray view with threshold_gray value of 100
+ //filling expected_gray view's upper half part with gray pixels of value 0
+ //filling expected_gray view's lower half part with gray pixels of value 255
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(255));
+
+ gil::threshold_binary(gil::view(original_gray), gil::view(threshold_gray), 100);
+
+ //comparing threshold_gray view generated by the function with the expected_gray view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void binary_inverse_gray_to_gray()
+{
+ //expected_gray view after thresholding of the original_gray view with threshold_gray value of 100
+ //filling expected_gray view's upper half part with gray pixels of value 200
+ //filling expected_gray view's lower half part with gray pixels of value 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(200));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(0));
+
+ gil::threshold_binary
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ 200,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_gray view generated by the function with the expected_gray view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void binary_rgb_to_rgb()
+{
+ //expected_rgb view after thresholding of the original_rgb view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 0, 165, 165
+ //filling expected_rgb view's lower half part with rgb pixels of value 165, 0, 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(0, 165, 165));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(165, 0, 0));
+
+ gil::threshold_binary(gil::view(original_rgb), gil::view(threshold_rgb), 100, 165);
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void binary_inverse_rgb_to_rgb()
+{
+ //expected_rgb view after thresholding of the original_rgb view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 90, 0, 0
+ //filling expected_rgb view's lower half part with rgb pixels of value 0, 90, 90
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(90, 0, 0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(0, 90, 90));
+
+ gil::threshold_binary
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ 90,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+
+int main()
+{
+ fill_original_gray();
+ fill_original_rgb();
+
+ binary_gray_to_gray();
+ binary_inverse_gray_to_gray();
+ binary_rgb_to_rgb();
+ binary_inverse_rgb_to_rgb();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp
new file mode 100644
index 000000000..3facaf19b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp
@@ -0,0 +1,25 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image_processing/threshold.hpp>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ // Source and destination views must have pixels with the same (compatible) color space
+ {
+ gil::rgb8_image_t src;
+ gil::gray8_image_t dst;
+ gil::threshold_binary(const_view(src), view(dst), 0, 255);
+ }
+ {
+ gil::gray8_image_t src;
+ gil::rgb8_image_t dst;
+ gil::threshold_binary(const_view(src), view(dst), 0, 255);
+ }
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp
new file mode 100644
index 000000000..f1eaf849e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+int height = 2;
+int width = 2;
+
+gil::gray8_image_t original_gray(width, height), otsu_gray(width, height),
+expected_gray(width, height);
+
+gil::rgb8_image_t original_rgb(width, height), otsu_rgb(width, height), expected_rgb(width, height);
+
+void fill_gray()
+{
+ gil::view(original_gray)(0, 0) = gil::gray8_pixel_t(56);
+ gil::view(original_gray)(1, 0) = gil::gray8_pixel_t(89);
+ gil::view(original_gray)(0, 1) = gil::gray8_pixel_t(206);
+ gil::view(original_gray)(1, 1) = gil::gray8_pixel_t(139);
+}
+
+void fill_rgb()
+{
+ gil::view(original_rgb)(0, 0) = gil::rgb8_pixel_t(15, 158, 150);
+ gil::view(original_rgb)(1, 0) = gil::rgb8_pixel_t(200, 175, 150);
+ gil::view(original_rgb)(0, 1) = gil::rgb8_pixel_t(230, 170, 150);
+ gil::view(original_rgb)(1, 1) = gil::rgb8_pixel_t(25, 248, 150);
+}
+
+void test_gray_regular()
+{
+ gil::view(expected_gray)(0, 0) = gil::gray8_pixel_t(0);
+ gil::view(expected_gray)(1, 0) = gil::gray8_pixel_t(0);
+ gil::view(expected_gray)(0, 1) = gil::gray8_pixel_t(255);
+ gil::view(expected_gray)(1, 1) = gil::gray8_pixel_t(255);
+
+ gil::threshold_optimal(
+ gil::view(original_gray),
+ gil::view(otsu_gray),
+ gil::threshold_optimal_value::otsu
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_gray), gil::view(expected_gray)));
+}
+
+void test_gray_inverse()
+{
+ gil::view(expected_gray)(0, 0) = gil::gray8_pixel_t(255);
+ gil::view(expected_gray)(1, 0) = gil::gray8_pixel_t(255);
+ gil::view(expected_gray)(0, 1) = gil::gray8_pixel_t(0);
+ gil::view(expected_gray)(1, 1) = gil::gray8_pixel_t(0);
+
+ gil::threshold_optimal(
+ gil::view(original_gray),
+ gil::view(otsu_gray),
+ gil::threshold_optimal_value::otsu,
+ gil::threshold_direction::inverse
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_gray), gil::view(expected_gray)));
+}
+
+void test_rgb_regular()
+{
+ gil::view(expected_rgb)(0, 0) = gil::rgb8_pixel_t(0, 0, 255);
+ gil::view(expected_rgb)(1, 0) = gil::rgb8_pixel_t(255, 0, 255);
+ gil::view(expected_rgb)(0, 1) = gil::rgb8_pixel_t(255, 0, 255);
+ gil::view(expected_rgb)(1, 1) = gil::rgb8_pixel_t(0, 255, 255);
+
+ gil::threshold_optimal(
+ gil::view(original_rgb),
+ gil::view(otsu_rgb),
+ gil::threshold_optimal_value::otsu
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_rgb), gil::view(expected_rgb)));
+}
+
+void test_rgb_inverse()
+{
+ gil::view(expected_rgb)(0, 0) = gil::rgb8_pixel_t(255, 255, 0);
+ gil::view(expected_rgb)(1, 0) = gil::rgb8_pixel_t(0, 255, 0);
+ gil::view(expected_rgb)(0, 1) = gil::rgb8_pixel_t(0, 255, 0);
+ gil::view(expected_rgb)(1, 1) = gil::rgb8_pixel_t(255, 0, 0);
+
+ gil::threshold_optimal(
+ gil::view(original_rgb),
+ gil::view(otsu_rgb),
+ gil::threshold_optimal_value::otsu,
+ gil::threshold_direction::inverse
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_rgb), gil::view(expected_rgb)));
+}
+
+int main()
+{
+ fill_gray();
+ fill_rgb();
+
+ test_gray_regular();
+ test_gray_inverse();
+ test_rgb_regular();
+ test_rgb_inverse();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp
new file mode 100644
index 000000000..18266dec6
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp
@@ -0,0 +1,233 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+int height = 4;
+int width = 4;
+
+gil::gray8_image_t original_gray(width, height), threshold_gray(width, height),
+expected_gray(width, height);
+
+gil::rgb8_image_t original_rgb(width, height), threshold_rgb(width, height),
+expected_rgb(width, height);
+
+void fill_original_gray()
+{
+ //filling original view's upper half part with gray pixels of value 50
+ //filling original view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+}
+
+void fill_original_rgb()
+{
+ //filling original_rgb view's upper half part with rgb pixels of value 50, 85, 135
+ //filling original_rgb view's lower half part with rgb pixels of value 150, 205, 106
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 85, 135));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(150, 205, 106));
+}
+
+void threshold_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 50
+ //filling expected view's lower half part with gray pixels of value 100
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(100));
+
+ gil::threshold_truncate(gil::view(original_gray), gil::view(threshold_gray), 100);
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void threshold_inverse_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 100
+ //filling expected view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(100));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ gil::threshold_truncate_mode::threshold,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void zero_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 0
+ //filling expected view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::regular
+ );
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void zero_inverse_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 50
+ //filling expected view's lower half part with gray pixels of value 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(0));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void threshold_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 50
+ //filling expected_rgb view's lower half part with rgb pixels of value 100
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 85, 100));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(100, 100, 100));
+
+ gil::threshold_truncate(gil::view(original_rgb), gil::view(threshold_rgb), 100);
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void threshold_inverse_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 103, 59, 246
+ //filling expected_rgb view's lower half part with rgb pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(100, 100, 135));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(150, 205, 106));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ gil::threshold_truncate_mode::threshold,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void zero_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 0
+ //filling expected_rgb view's lower half part with rgb pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(0, 0, 135));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(150, 205, 106));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::regular
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void zero_inverse_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 50
+ //filling expected_rgb view's lower half part with rgb pixels of value 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 85, 0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(0, 0, 0));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+
+int main()
+{
+ fill_original_gray();
+ fill_original_rgb();
+
+ threshold_gray_to_gray();
+ threshold_inverse_gray_to_gray();
+ zero_gray_to_gray();
+ zero_inverse_gray_to_gray();
+
+ threshold_rgb_to_rgb();
+ threshold_inverse_rgb_to_rgb();
+ zero_rgb_to_rgb();
+ zero_inverse_rgb_to_rgb();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/CMakeLists.txt b/src/boost/libs/gil/test/core/image_view/CMakeLists.txt
new file mode 100644
index 000000000..e9983da94
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/CMakeLists.txt
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ axis_iterator
+ collection
+ concepts
+ derived_view_type
+ dynamic_step
+ is_planar
+ iterator
+ planar_rgba_view
+ reverse_iterator
+ subimage_view
+ view_is_basic
+ view_is_mutable
+ view_is_step
+ view_type
+ x_iterator
+ xy_locator
+ y_iterator
+ view_type_from_pixel)
+ set(_test t_core_image_view_${_name})
+ set(_target test_core_image_view_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/image_view/Jamfile b/src/boost/libs/gil/test/core/image_view/Jamfile
new file mode 100644
index 000000000..4b654b92c
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/Jamfile
@@ -0,0 +1,29 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile derived_view_type.cpp ;
+compile dynamic_step.cpp ;
+compile is_planar.cpp ;
+compile view_is_basic.cpp ;
+compile view_is_mutable.cpp ;
+compile view_is_step.cpp ;
+compile view_type.cpp ;
+compile view_type_from_pixel.cpp ;
+
+run axis_iterator.cpp ;
+run collection.cpp ;
+run iterator.cpp ;
+run planar_rgba_view.cpp ;
+run reverse_iterator.cpp ;
+run subimage_view.cpp ;
+run x_iterator.cpp ;
+run xy_locator.cpp ;
+run y_iterator.cpp ;
diff --git a/src/boost/libs/gil/test/core/image_view/axis_iterator.cpp b/src/boost/libs/gil/test/core/image_view/axis_iterator.cpp
new file mode 100644
index 000000000..6b7c68813
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/axis_iterator.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_axis_0()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ // 0,0
+ auto axit = view.axis_iterator<0>(gil::point_t{0, 0});
+ BOOST_TEST_EQ(*axit, fixture::gray8_draw_pixel);
+ BOOST_TEST(axit == view.row_begin(0));
+ // 0,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_back_pixel);
+ // 1,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_back_pixel);
+ BOOST_TEST(axit == view.row_end(0));
+ BOOST_TEST(axit == view.row_begin(1));
+ // 1,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_draw_pixel);
+ // 2,0 - pass the end
+ ++axit;
+ BOOST_TEST(axit == view.row_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ auto axit = view.axis_iterator<0>(gil::point_t{0, 0});
+ BOOST_TEST(axit == view.row_begin(0));
+ BOOST_TEST_EQ(*axit, fixture::rgb8_draw_pixel);
+ // 0,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::rgb8_back_pixel);
+ // 1,1
+ ++axit;
+ BOOST_TEST(axit == view.row_end(0));
+ BOOST_TEST_EQ(*axit, fixture::rgb8_back_pixel);
+ BOOST_TEST(axit == view.row_begin(1));
+ // 1,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::rgb8_draw_pixel);
+ // 2,0 - pass the end
+ ++axit;
+ BOOST_TEST(axit == view.row_end(1));
+ }
+}
+
+void test_axis_1()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ // 0,0
+ auto axit = view.axis_iterator<1>(gil::point_t{0, 0});
+ BOOST_TEST(axit == view.col_begin(0));
+ BOOST_TEST_EQ(*axit, fixture::gray8_draw_pixel);
+ // 0,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_back_pixel);
+ // 0,2
+ ++axit;
+ BOOST_TEST(axit == view.col_end(0));
+ }
+}
+
+int main()
+{
+ test_axis_0();
+ test_axis_1();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/collection.cpp b/src/boost/libs/gil/test/core/image_view/collection.cpp
new file mode 100644
index 000000000..113488805
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/collection.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <iterator>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+namespace
+{
+gil::gray8_pixel_t const gray128(128);
+gil::gray8_pixel_t const gray255(255);
+} // unnamed namespace
+
+// Collection
+
+void test_begin()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.begin(), gray255);
+}
+
+void test_end()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST(view.begin() == view.end());
+}
+
+void test_empty()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST(view.empty());
+
+ gil::gray8_image_t image(2, 2);
+ view = gil::view(image);
+ BOOST_TEST(!view.empty());
+}
+
+void test_size()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST_EQ(view.size(), 0);
+
+ gil::gray8_image_t image(2, 2);
+ view = gil::view(image);
+ BOOST_TEST_EQ(view.size(), 4);
+}
+
+void test_swap()
+{
+ gil::gray8_image_t::view_t view1;
+ gil::gray8_image_t::view_t view2;
+
+ gil::gray8_image_t image(2, 2);
+ view1 = gil::view(image);
+ view1.swap(view2);
+
+ BOOST_TEST(view1.empty());
+ BOOST_TEST(!view2.empty());
+}
+
+// ForwardCollection
+
+void test_back()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(view.back(), gray255);
+}
+
+void test_front()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(view.front(), gray255);
+}
+
+// ReversibleCollection
+
+void test_rbegin()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ view(1,1) = gray128;
+ BOOST_TEST_EQ(*view.rbegin(), gray128);
+}
+
+void test_rend()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST(view.rbegin() == view.rend());
+}
+
+int main()
+{
+ test_begin();
+ test_end();
+ test_empty();
+ test_size();
+ test_swap();
+ test_back();
+ test_front();
+ test_rbegin();
+ test_rend();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/concepts.cpp b/src/boost/libs/gil/test/core/image_view/concepts.cpp
new file mode 100644
index 000000000..480e9e86f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/concepts.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+// FIXME: There are missing headers internally, leading to incomplete types
+#if 0
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/typedefs.hpp>
+#else
+#include <boost/gil.hpp>
+#endif
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view()
+{
+ boost::function_requires<gil::ImageViewConcept<View>>();
+ boost::function_requires<gil::CollectionImageViewConcept<View>>();
+ boost::function_requires<gil::ForwardCollectionImageViewConcept<View>>();
+ boost::function_requires<gil::ReversibleCollectionImageViewConcept<View>>();
+}
+
+template <typename View>
+void test_view_planar()
+{
+ boost::function_requires<gil::ImageViewConcept<View>>();
+ boost::function_requires<gil::CollectionImageViewConcept<View>>();
+}
+
+int main()
+{
+ test_view<gil::gray8_view_t>();
+ test_view<gil::gray8c_view_t>();
+
+ test_view<gil::abgr8_view_t>();
+ test_view<gil::abgr8_step_view_t>();
+ test_view<gil::abgr8c_view_t>();
+ test_view<gil::abgr8c_step_view_t>();
+
+ test_view<gil::argb8_view_t>();
+ test_view<gil::argb8_step_view_t>();
+ test_view<gil::argb8c_view_t>();
+ test_view<gil::argb8c_step_view_t>();
+
+ test_view<gil::bgr8_view_t>();
+ test_view<gil::bgr8_step_view_t>();
+ test_view<gil::bgr8c_view_t>();
+ test_view<gil::bgr8c_step_view_t>();
+
+ test_view<gil::bgra8_view_t>();
+ test_view<gil::bgra8_step_view_t>();
+ test_view<gil::bgra8c_view_t>();
+ test_view<gil::bgra8c_step_view_t>();
+
+ test_view<gil::rgb8_view_t>();
+ test_view<gil::rgb8_step_view_t>();
+ test_view<gil::rgb8c_view_t>();
+ test_view<gil::rgb8c_step_view_t>();
+ test_view_planar<gil::rgb8_planar_view_t>();
+ test_view_planar<gil::rgb8_planar_step_view_t>();
+ test_view_planar<gil::rgb8c_planar_view_t>();
+ test_view_planar<gil::rgb8c_planar_step_view_t>();
+
+ test_view<gil::rgba8_view_t>();
+ test_view<gil::rgba8_step_view_t>();
+ test_view<gil::rgba8c_view_t>();
+ test_view<gil::rgba8c_step_view_t>();
+ test_view_planar<gil::rgba8_planar_view_t>();
+ test_view_planar<gil::rgba8_planar_step_view_t>();
+ test_view_planar<gil::rgba8c_planar_view_t>();
+ test_view_planar<gil::rgba8c_planar_step_view_t>();
+
+ test_view<gil::cmyk8_view_t>();
+ test_view<gil::cmyk8_step_view_t>();
+ test_view<gil::cmyk8c_view_t>();
+ test_view<gil::cmyk8c_step_view_t>();
+
+ test_view_planar<gil::cmyk8_planar_view_t>();
+ test_view_planar<gil::cmyk8_planar_step_view_t>();
+ test_view_planar<gil::cmyk8c_planar_view_t>();
+ test_view_planar<gil::cmyk8c_planar_step_view_t>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/image_view/derived_view_type.cpp b/src/boost/libs/gil/test/core/image_view/derived_view_type.cpp
new file mode 100644
index 000000000..0ec59ffc9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/derived_view_type.cpp
@@ -0,0 +1,45 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+int main()
+{
+
+ static_assert(std::is_same
+ <
+ gil::derived_view_type<gil::cmyk8c_planar_step_view_t>::type,
+ gil::cmyk8c_planar_step_view_t
+ >::value, "derived_view_type should be cmyk8c_planar_step_view_t");
+
+ static_assert(std::is_same
+ <
+ gil::derived_view_type
+ <
+ gil::cmyk8c_planar_step_view_t, std::uint16_t, gil::rgb_layout_t
+ >::type,
+ gil::rgb16c_planar_step_view_t
+ >::value, "derived_view_type should be rgb16c_planar_step_view_t");
+
+ static_assert(std::is_same
+ <
+ gil::derived_view_type
+ <
+ gil::cmyk8c_planar_step_view_t,
+ boost::use_default,
+ gil::rgb_layout_t,
+ std::false_type,
+ boost::use_default,
+ std::false_type
+ >::type,
+ gil::rgb8c_step_view_t
+ >::value, "derived_view_type should be rgb8c_step_view_t");
+}
diff --git a/src/boost/libs/gil/test/core/image_view/dynamic_step.cpp b/src/boost/libs/gil/test/core/image_view/dynamic_step.cpp
new file mode 100644
index 000000000..f04b135f8
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/dynamic_step.cpp
@@ -0,0 +1,133 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/dynamic_step.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test()
+{
+ static_assert(
+ gil::view_is_basic
+ <
+ typename gil::dynamic_x_step_type<View>::type
+ >::value, "view does not model HasDynamicXStepTypeConcept");
+
+ static_assert(
+ gil::view_is_basic
+ <
+ typename gil::dynamic_y_step_type<View>::type
+ >::value, "view does not model HasDynamicYStepTypeConcept");
+}
+
+int main()
+{
+ test<gil::gray8_view_t>();
+ test<gil::gray8_step_view_t>();
+ test<gil::gray8c_view_t>();
+ test<gil::gray8c_step_view_t>();
+ test<gil::gray16_view_t>();
+ test<gil::gray16_step_view_t>();
+ test<gil::gray16c_view_t>();
+ test<gil::gray16c_step_view_t>();
+ test<gil::gray32_view_t>();
+ test<gil::gray32_step_view_t>();
+ test<gil::gray32c_view_t>();
+ test<gil::gray32c_step_view_t>();
+ test<gil::gray32f_view_t>();
+ test<gil::gray32f_step_view_t>();
+
+ test<gil::abgr8_view_t>();
+ test<gil::abgr8_step_view_t>();
+ test<gil::abgr16_view_t>();
+ test<gil::abgr16_step_view_t>();
+ test<gil::abgr32_view_t>();
+ test<gil::abgr32_step_view_t>();
+ test<gil::abgr32f_view_t>();
+ test<gil::abgr32f_step_view_t>();
+
+ test<gil::argb8_view_t>();
+ test<gil::argb8_step_view_t>();
+ test<gil::argb16_view_t>();
+ test<gil::argb16_step_view_t>();
+ test<gil::argb32_view_t>();
+ test<gil::argb32_step_view_t>();
+ test<gil::argb32f_view_t>();
+ test<gil::argb32f_step_view_t>();
+
+ test<gil::bgr8_view_t>();
+ test<gil::bgr8_step_view_t>();
+ test<gil::bgr16_view_t>();
+ test<gil::bgr16_step_view_t>();
+ test<gil::bgr32_view_t>();
+ test<gil::bgr32_step_view_t>();
+ test<gil::bgr32f_view_t>();
+ test<gil::bgr32f_step_view_t>();
+
+ test<gil::bgra8_view_t>();
+ test<gil::bgra8_step_view_t>();
+ test<gil::bgra16_view_t>();
+ test<gil::bgra16_step_view_t>();
+ test<gil::bgra32_view_t>();
+ test<gil::bgra32_step_view_t>();
+ test<gil::bgra32f_view_t>();
+ test<gil::bgra32f_step_view_t>();
+
+ test<gil::rgb8_view_t>();
+ test<gil::rgb8_step_view_t>();
+ test<gil::rgb8_planar_view_t>();
+ test<gil::rgb8_planar_step_view_t>();
+ test<gil::rgb16_view_t>();
+ test<gil::rgb16_step_view_t>();
+ test<gil::rgb16_planar_view_t>();
+ test<gil::rgb16_planar_step_view_t>();
+ test<gil::rgb32_view_t>();
+ test<gil::rgb32_step_view_t>();
+ test<gil::rgb32_planar_view_t>();
+ test<gil::rgb32_planar_step_view_t>();
+ test<gil::rgb32f_view_t>();
+ test<gil::rgb32f_step_view_t>();
+ test<gil::rgb32f_planar_view_t>();
+ test<gil::rgb32f_planar_step_view_t>();
+
+ test<gil::rgba8_view_t>();
+ test<gil::rgba8_step_view_t>();
+ test<gil::rgba8_planar_view_t>();
+ test<gil::rgba8_planar_step_view_t>();
+ test<gil::rgba16_view_t>();
+ test<gil::rgba16_step_view_t>();
+ test<gil::rgba16_planar_view_t>();
+ test<gil::rgba16_planar_step_view_t>();
+ test<gil::rgba32_view_t>();
+ test<gil::rgba32_step_view_t>();
+ test<gil::rgba32_planar_view_t>();
+ test<gil::rgba32_planar_step_view_t>();
+ test<gil::rgba32f_view_t>();
+ test<gil::rgba32f_step_view_t>();
+ test<gil::rgba32f_planar_view_t>();
+ test<gil::rgba32f_planar_step_view_t>();
+
+ test<gil::cmyk8_view_t>();
+ test<gil::cmyk8_step_view_t>();
+ test<gil::cmyk8_planar_view_t>();
+ test<gil::cmyk8_planar_step_view_t>();
+ test<gil::cmyk16_view_t>();
+ test<gil::cmyk16_step_view_t>();
+ test<gil::cmyk16_planar_view_t>();
+ test<gil::cmyk16_planar_step_view_t>();
+ test<gil::cmyk32_view_t>();
+ test<gil::cmyk32_step_view_t>();
+ test<gil::cmyk32_planar_view_t>();
+ test<gil::cmyk32_planar_step_view_t>();
+ test<gil::cmyk32f_view_t>();
+ test<gil::cmyk32f_step_view_t>();
+ test<gil::cmyk32f_planar_view_t>();
+ test<gil::cmyk32f_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/is_planar.cpp b/src/boost/libs/gil/test/core/image_view/is_planar.cpp
new file mode 100644
index 000000000..f7f6c3797
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/is_planar.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_is_planar()
+{
+ static_assert(gil::is_planar<View>::value, "view should be planar");
+}
+
+template <typename View>
+void test_is_planar_not()
+{
+ static_assert(!gil::is_planar<View>::value, "view should not be planar");
+}
+
+
+int main()
+{
+ test_is_planar_not<gil::gray8_view_t>();
+ test_is_planar_not<gil::gray8c_view_t>();
+
+ test_is_planar_not<gil::abgr8_view_t>();
+ test_is_planar_not<gil::abgr8_step_view_t>();
+ test_is_planar_not<gil::abgr8c_view_t>();
+ test_is_planar_not<gil::abgr8c_step_view_t>();
+
+ test_is_planar_not<gil::argb8_view_t>();
+ test_is_planar_not<gil::argb8_step_view_t>();
+ test_is_planar_not<gil::argb8c_view_t>();
+ test_is_planar_not<gil::argb8c_step_view_t>();
+
+ test_is_planar_not<gil::bgr8_view_t>();
+ test_is_planar_not<gil::bgr8_step_view_t>();
+ test_is_planar_not<gil::bgr8c_view_t>();
+ test_is_planar_not<gil::bgr8c_step_view_t>();
+
+ test_is_planar_not<gil::bgra8_view_t>();
+ test_is_planar_not<gil::bgra8_step_view_t>();
+ test_is_planar_not<gil::bgra8c_view_t>();
+ test_is_planar_not<gil::bgra8c_step_view_t>();
+
+ test_is_planar_not<gil::rgb8_view_t>();
+ test_is_planar_not<gil::rgb8_step_view_t>();
+ test_is_planar_not<gil::rgb8c_view_t>();
+ test_is_planar_not<gil::rgb8c_step_view_t>();
+ test_is_planar<gil::rgb8_planar_view_t>();
+ test_is_planar<gil::rgb8_planar_step_view_t>();
+ test_is_planar<gil::rgb8c_planar_view_t>();
+ test_is_planar<gil::rgb8c_planar_step_view_t>();
+
+ test_is_planar_not<gil::rgba8_view_t>();
+ test_is_planar_not<gil::rgba8_step_view_t>();
+ test_is_planar_not<gil::rgba8c_view_t>();
+ test_is_planar_not<gil::rgba8c_step_view_t>();
+ test_is_planar<gil::rgba8_planar_view_t>();
+ test_is_planar<gil::rgba8_planar_step_view_t>();
+ test_is_planar<gil::rgba8c_planar_view_t>();
+ test_is_planar<gil::rgba8c_planar_step_view_t>();
+
+ test_is_planar_not<gil::cmyk8_view_t>();
+ test_is_planar_not<gil::cmyk8_step_view_t>();
+ test_is_planar_not<gil::cmyk8c_view_t>();
+ test_is_planar_not<gil::cmyk8c_step_view_t>();
+
+ test_is_planar<gil::cmyk8_planar_view_t>();
+ test_is_planar<gil::cmyk8_planar_step_view_t>();
+ test_is_planar<gil::cmyk8c_planar_view_t>();
+ test_is_planar<gil::cmyk8c_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/iterator.cpp b/src/boost/libs/gil/test/core/image_view/iterator.cpp
new file mode 100644
index 000000000..8b9cecd98
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/iterator.cpp
@@ -0,0 +1,95 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.begin(), fixture::gray8_draw_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.begin(), fixture::rgb8_draw_pixel);
+ }
+}
+
+void test_end()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.begin() == view.end());
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.begin() == view.end());
+ }
+}
+
+void test_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ // begin
+ BOOST_TEST_EQ(*view.at(0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(1), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(0, 1), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 0}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 1}), fixture::gray8_back_pixel);
+ // end
+#ifdef NDEBUG // skip assertions
+ BOOST_TEST(view.at(4) == view.end());
+ // convoluted access to end iterator
+ BOOST_TEST(view.at(0, 2) == view.end());
+ BOOST_TEST(view.at(2, 1) == view.end());
+#endif
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ // begin
+ BOOST_TEST_EQ(*view.at(0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(1), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(0, 1), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 0}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 1}), fixture::rgb8_back_pixel);
+ // end
+#ifdef NDEBUG // skip assertions
+ BOOST_TEST(view.at(4) == view.end());
+ // convoluted access to end iterator
+ BOOST_TEST(view.at(0, 2) == view.end());
+ BOOST_TEST(view.at(2, 1) == view.end());
+#endif
+ }
+}
+
+int main()
+{
+ test_begin();
+ test_end();
+ test_at();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp b/src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp
new file mode 100644
index 000000000..925a2ebec
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_utility_output_stream.hpp"
+
+namespace boost { namespace gil {
+namespace test { namespace fixture {
+
+gil::point_t d{2, 2};
+std::uint8_t r[] = { 1, 2, 3, 4 };
+std::uint8_t g[] = { 10, 20, 30, 40 };
+std::uint8_t b[] = { 110, 120, 130, 140 };
+std::uint8_t a[] = { 251, 252, 253, 254 };
+
+}}}}
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_dimensions()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ BOOST_TEST(!v.empty());
+ BOOST_TEST_EQ(v.dimensions(), fixture::d);
+ BOOST_TEST_EQ(v.num_channels(), 4u);
+ BOOST_TEST_EQ(v.size(), static_cast<std::size_t>(fixture::d.x * fixture::d.y));
+}
+
+void test_front()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ gil::rgba8_pixel_t const pf{1, 10, 110, 251};
+ BOOST_TEST_EQ(v.front(), pf);
+}
+
+void test_back()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ gil::rgba8_pixel_t const pb{4, 40, 140, 254};
+ BOOST_TEST_EQ(v.back(), pb);
+}
+
+void test_pixel_equal_to_operator()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ for (std::ptrdiff_t i = 0; i < static_cast<std::ptrdiff_t>(v.size()); i++)
+ {
+ gil::rgba8_pixel_t const p{fixture::r[i], fixture::g[i], fixture::b[i], fixture::a[i]};
+ BOOST_TEST_EQ(v[i], p);
+ }
+}
+
+int main()
+{
+ test_dimensions();
+ test_front();
+ test_back();
+ test_pixel_equal_to_operator();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp b/src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp
new file mode 100644
index 000000000..c901a00f9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_rbegin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.rbegin(), fixture::gray8_draw_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.rbegin(), fixture::rgb8_draw_pixel);
+ }
+}
+
+void test_rend()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.rbegin() == view.rend());
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.rbegin() == view.rend());
+ }
+}
+
+int main()
+{
+ test_rbegin();
+ test_rend();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/subimage_view.cpp b/src/boost/libs/gil/test/core/image_view/subimage_view.cpp
new file mode 100644
index 000000000..d6ddbd847
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/subimage_view.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_subimage_equals_image
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto i0 = fixture::create_image<image_t>(4, 4, 128);
+ auto const v0 = gil::const_view(i0);
+ BOOST_TEST_EQ(v0.dimensions().x, 4);
+ BOOST_TEST_EQ(v0.dimensions().y, 4);
+
+ // request with 2 x point_t values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), {0, 0}, i0.dimensions());
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ // request with 4 x dimension values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), 0, 0, i0.dimensions().x, i0.dimensions().y);
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image{});
+ }
+};
+
+struct test_subimage_equals_image_quadrants
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto i0 = fixture::create_image<image_t>(4, 4, 0);
+ auto v0 = gil::view(i0);
+ // create test image and set values of pixels in:
+ // quadrant 1
+ auto const i1 = fixture::create_image<image_t>(2, 2, 255);
+ v0[2] = v0[3] = v0[6] = v0[7] = gil::const_view(i1)[0];
+ // quadrant 2
+ auto const i2 = fixture::create_image<image_t>(2, 2, 128);
+ v0[0] = v0[1] = v0[4] = v0[5] = gil::const_view(i2)[0];
+ // quadrant 3
+ auto const i3 = fixture::create_image<image_t>(2, 2, 64);
+ v0[8] = v0[9] = v0[12] = v0[13] = gil::const_view(i3)[0];
+ // quadrant 4
+ auto const i4 = fixture::create_image<image_t>(2, 2, 32);
+ v0[10] = v0[11] = v0[14] = v0[15] = gil::const_view(i4)[0];
+
+ auto v1 = gil::subimage_view(gil::view(i0), { 2, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v1, gil::const_view(i1)));
+ auto v2 = gil::subimage_view(gil::view(i0), { 0, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v2, gil::const_view(i2)));
+ auto v3 = gil::subimage_view(gil::view(i0), { 0, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v3, gil::const_view(i3)));
+ auto v4 = gil::subimage_view(gil::view(i0), { 2, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v4, gil::const_view(i4)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image_quadrants{});
+ }
+};
+
+int main()
+{
+ test_subimage_equals_image::run();
+ test_subimage_equals_image_quadrants::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/test_fixture.hpp b/src/boost/libs/gil/test/core/image_view/test_fixture.hpp
new file mode 100644
index 000000000..559402f6b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/test_fixture.hpp
@@ -0,0 +1,37 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+gil::gray8_pixel_t gray8_back_pixel{128};
+gil::gray8_pixel_t gray8_draw_pixel{64};
+gil::rgb8_pixel_t rgb8_back_pixel{255, 128, 64};
+gil::rgb8_pixel_t rgb8_draw_pixel{64, 32, 16};
+
+auto make_image_gray8() -> gil::gray8_image_t
+{
+ gil::gray8_image_t image(2, 2, gray8_back_pixel);
+ auto view = gil::view(image);
+ view(0, 0) = gray8_draw_pixel;
+ view(1, 1) = gray8_draw_pixel;
+ return image;
+}
+
+auto make_image_rgb8() -> gil::rgb8_image_t
+{
+ gil::rgb8_image_t image(2, 2, rgb8_back_pixel);
+ auto view = gil::view(image);
+ view(0, 0) = rgb8_draw_pixel;
+ view(1, 1) = rgb8_draw_pixel;
+ return image;
+}
+
+}}}}
diff --git a/src/boost/libs/gil/test/core/image_view/view_is_basic.cpp b/src/boost/libs/gil/test/core/image_view/view_is_basic.cpp
new file mode 100644
index 000000000..660efcda9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_is_basic.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view_is_basic()
+{
+ static_assert(gil::view_is_basic<View>::value, "view should be basic");
+}
+
+template <typename View>
+void test_view_is_basic_not()
+{
+ static_assert(!gil::view_is_basic<View>::value, "view should not be basic");
+}
+
+int main()
+{
+ test_view_is_basic<gil::gray8_view_t>();
+ test_view_is_basic<gil::gray8c_view_t>();
+
+ test_view_is_basic<gil::abgr8_view_t>();
+ test_view_is_basic<gil::abgr8_step_view_t>();
+ test_view_is_basic<gil::abgr8c_view_t>();
+ test_view_is_basic<gil::abgr8c_step_view_t>();
+
+ test_view_is_basic<gil::argb8_view_t>();
+ test_view_is_basic<gil::argb8_step_view_t>();
+ test_view_is_basic<gil::argb8c_view_t>();
+ test_view_is_basic<gil::argb8c_step_view_t>();
+
+ test_view_is_basic<gil::bgr8_view_t>();
+ test_view_is_basic<gil::bgr8_step_view_t>();
+ test_view_is_basic<gil::bgr8c_view_t>();
+ test_view_is_basic<gil::bgr8c_step_view_t>();
+
+ test_view_is_basic<gil::bgra8_view_t>();
+ test_view_is_basic<gil::bgra8_step_view_t>();
+ test_view_is_basic<gil::bgra8c_view_t>();
+ test_view_is_basic<gil::bgra8c_step_view_t>();
+
+ test_view_is_basic<gil::rgb8_view_t>();
+ test_view_is_basic<gil::rgb8_step_view_t>();
+ test_view_is_basic<gil::rgb8_planar_view_t>();
+ test_view_is_basic<gil::rgb8_planar_step_view_t>();
+ test_view_is_basic<gil::rgb8c_view_t>();
+ test_view_is_basic<gil::rgb8c_step_view_t>();
+ test_view_is_basic<gil::rgb8c_planar_view_t>();
+ test_view_is_basic<gil::rgb8c_planar_step_view_t>();
+
+ test_view_is_basic<gil::rgba8_view_t>();
+ test_view_is_basic<gil::rgba8_step_view_t>();
+ test_view_is_basic<gil::rgba8_planar_view_t>();
+ test_view_is_basic<gil::rgba8_planar_step_view_t>();
+ test_view_is_basic<gil::rgba8c_view_t>();
+ test_view_is_basic<gil::rgba8c_step_view_t>();
+ test_view_is_basic<gil::rgba8c_planar_view_t>();
+ test_view_is_basic<gil::rgba8c_planar_step_view_t>();
+
+ test_view_is_basic<gil::cmyk8_view_t>();
+ test_view_is_basic<gil::cmyk8_step_view_t>();
+ test_view_is_basic<gil::cmyk8c_view_t>();
+ test_view_is_basic<gil::cmyk8c_step_view_t>();
+
+ test_view_is_basic<gil::cmyk8_planar_view_t>();
+ test_view_is_basic<gil::cmyk8_planar_step_view_t>();
+ test_view_is_basic<gil::cmyk8c_planar_view_t>();
+ test_view_is_basic<gil::cmyk8c_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp b/src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp
new file mode 100644
index 000000000..560007df3
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view_is_mutable()
+{
+ static_assert(gil::view_is_mutable<View>::value, "view should be mutable");
+}
+
+template <typename View>
+void test_view_is_mutable_not()
+{
+ static_assert(!gil::view_is_mutable<View>::value, "view should not be mutable");
+}
+
+int main()
+{
+ test_view_is_mutable<gil::gray8_view_t>();
+ test_view_is_mutable_not<gil::gray8c_view_t>();
+
+ test_view_is_mutable<gil::abgr8_view_t>();
+ test_view_is_mutable<gil::abgr8_step_view_t>();
+ test_view_is_mutable_not<gil::abgr8c_view_t>();
+ test_view_is_mutable_not<gil::abgr8c_step_view_t>();
+
+ test_view_is_mutable<gil::argb8_view_t>();
+ test_view_is_mutable<gil::argb8_step_view_t>();
+ test_view_is_mutable_not<gil::argb8c_view_t>();
+ test_view_is_mutable_not<gil::argb8c_step_view_t>();
+
+ test_view_is_mutable<gil::bgr8_view_t>();
+ test_view_is_mutable<gil::bgr8_step_view_t>();
+ test_view_is_mutable_not<gil::bgr8c_view_t>();
+ test_view_is_mutable_not<gil::bgr8c_step_view_t>();
+
+ test_view_is_mutable<gil::bgra8_view_t>();
+ test_view_is_mutable<gil::bgra8_step_view_t>();
+ test_view_is_mutable_not<gil::bgra8c_view_t>();
+ test_view_is_mutable_not<gil::bgra8c_step_view_t>();
+
+ test_view_is_mutable<gil::rgb8_view_t>();
+ test_view_is_mutable<gil::rgb8_step_view_t>();
+ test_view_is_mutable<gil::rgb8_planar_view_t>();
+ test_view_is_mutable<gil::rgb8_planar_step_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_step_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_planar_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_planar_step_view_t>();
+
+ test_view_is_mutable<gil::rgba8_view_t>();
+ test_view_is_mutable<gil::rgba8_step_view_t>();
+ test_view_is_mutable<gil::rgba8_planar_view_t>();
+ test_view_is_mutable<gil::rgba8_planar_step_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_step_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_planar_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_planar_step_view_t>();
+
+ test_view_is_mutable<gil::cmyk8_view_t>();
+ test_view_is_mutable<gil::cmyk8_step_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_step_view_t>();
+
+ test_view_is_mutable<gil::cmyk8_planar_view_t>();
+ test_view_is_mutable<gil::cmyk8_planar_step_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_planar_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_is_step.cpp b/src/boost/libs/gil/test/core/image_view/view_is_step.cpp
new file mode 100644
index 000000000..5371a7825
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_is_step.cpp
@@ -0,0 +1,57 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view_is_step_in_xy()
+{
+ static_assert(gil::view_is_step_in_x<View>::value, "view should support horizontal step");
+ static_assert(gil::view_is_step_in_y<View>::value, "view should support vertical step");
+}
+
+template <typename View>
+void test_view_is_step_in_y()
+{
+ static_assert(gil::view_is_step_in_y<View>::value, "view should support vertical step");
+}
+
+template <typename View>
+void test_view_is_step_in_x_not()
+{
+ static_assert(!gil::view_is_step_in_x<View>::value, "view should not support horizontal step");
+}
+
+int main()
+{
+ test_view_is_step_in_xy<gil::gray8_step_view_t>();
+ test_view_is_step_in_xy<gil::abgr8_step_view_t>();
+ test_view_is_step_in_xy<gil::argb8_step_view_t>();
+ test_view_is_step_in_xy<gil::bgr8_step_view_t>();
+ test_view_is_step_in_xy<gil::bgra8_step_view_t>();
+ test_view_is_step_in_xy<gil::rgb8_step_view_t>();
+ test_view_is_step_in_xy<gil::rgba8_step_view_t>();
+ test_view_is_step_in_xy<gil::rgba8_planar_step_view_t>();
+ test_view_is_step_in_xy<gil::cmyk8_step_view_t>();
+ test_view_is_step_in_xy<gil::cmyk8_planar_step_view_t>();
+
+ test_view_is_step_in_y<gil::rgb8_view_t>();
+ test_view_is_step_in_y<gil::rgb8_planar_view_t>();
+ test_view_is_step_in_y<gil::rgba8_view_t>();
+ test_view_is_step_in_y<gil::rgba8_planar_view_t>();
+ test_view_is_step_in_y<gil::cmyk8_view_t>();
+ test_view_is_step_in_y<gil::cmyk8_planar_view_t>();
+
+ test_view_is_step_in_x_not<gil::rgb8_view_t>();
+ test_view_is_step_in_x_not<gil::rgb8_planar_view_t>();
+ test_view_is_step_in_x_not<gil::rgba8_view_t>();
+ test_view_is_step_in_x_not<gil::rgba8_planar_view_t>();
+ test_view_is_step_in_x_not<gil::cmyk8_view_t>();
+ test_view_is_step_in_x_not<gil::cmyk8_planar_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_type.cpp b/src/boost/libs/gil/test/core/image_view/view_type.cpp
new file mode 100644
index 000000000..6c8180035
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_type.cpp
@@ -0,0 +1,114 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct Interleaved : std::false_type {};
+struct Planar : std::true_type {};
+struct NotStepX : std::false_type {};
+struct StepX : std::true_type {};
+struct Immutable : std::false_type {};
+struct Mutable : std::true_type {};
+
+template <typename ResultView, typename Layout, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test()
+{
+ static_assert(std::is_same
+ <
+ typename gil::view_type
+ <
+ std::uint8_t,
+ Layout,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type yields unexpected view");
+}
+
+template <typename ResultView, typename Layout, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test_not()
+{
+ static_assert(!std::is_same
+ <
+ typename gil::view_type
+ <
+ std::uint8_t,
+ Layout,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type yields unexpected view");
+}
+
+int main()
+{
+ test<gil::gray8_view_t, gil::gray_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::gray8c_view_t, gil::gray_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::gray8_step_view_t, gil::gray_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::gray8c_step_view_t, gil::gray_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::gray8_view_t, gil::gray_layout_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::rgb_layout_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray_layout_t, Interleaved, StepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray_layout_t, Interleaved, NotStepX, Immutable>();
+
+ test<gil::abgr8_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::abgr8c_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::abgr8_step_view_t, gil::abgr_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::abgr8c_step_view_t, gil::abgr_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::abgr8_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::abgr8_view_t, gil::rgba_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::argb8_view_t, gil::argb_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::argb8c_view_t, gil::argb_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::argb8_step_view_t, gil::argb_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::argb8c_step_view_t, gil::argb_layout_t, Interleaved, StepX, Immutable>();
+
+ test<gil::bgr8_view_t, gil::bgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgr8c_view_t, gil::bgr_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgr8_step_view_t, gil::bgr_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::bgr8c_step_view_t, gil::bgr_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgr8_view_t, gil::rgb_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::bgra8_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgra8c_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgra8_step_view_t, gil::bgra_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::bgra8c_step_view_t, gil::bgra_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgra8_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::bgra8_view_t, gil::rgba_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_view_t, gil::rgb_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::rgb8c_view_t, gil::rgb_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::rgb8_step_view_t, gil::rgb_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::rgb8c_step_view_t, gil::rgb_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::rgb8_view_t, gil::rgb_layout_t, Planar, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_planar_view_t, gil::rgb_layout_t, Planar, NotStepX, Mutable>();
+ test<gil::rgb8c_planar_view_t, gil::rgb_layout_t, Planar, NotStepX, Immutable>();
+ test<gil::rgb8_planar_step_view_t, gil::rgb_layout_t, Planar, StepX, Mutable>();
+ test<gil::rgb8c_planar_step_view_t, gil::rgb_layout_t, Planar, StepX, Immutable>();
+
+ test<gil::cmyk8_view_t, gil::cmyk_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::cmyk8c_view_t, gil::cmyk_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::cmyk8_step_view_t, gil::cmyk_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::cmyk8c_step_view_t, gil::cmyk_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::cmyk8_view_t, gil::rgba_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::cmyk8_planar_view_t, gil::cmyk_layout_t, Planar, NotStepX, Mutable>();
+ test<gil::cmyk8c_planar_view_t, gil::cmyk_layout_t, Planar, NotStepX, Immutable>();
+ test<gil::cmyk8_planar_step_view_t, gil::cmyk_layout_t, Planar, StepX, Mutable>();
+ test<gil::cmyk8c_planar_step_view_t, gil::cmyk_layout_t, Planar, StepX, Immutable>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp b/src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp
new file mode 100644
index 000000000..bb5144095
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct Interleaved : std::false_type {};
+struct Planar : std::true_type {};
+struct NotStepX : std::false_type {};
+struct StepX : std::true_type {};
+struct Immutable : std::false_type {};
+struct Mutable : std::true_type {};
+
+template <typename ResultView, typename Pixel, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test()
+{
+ static_assert(std::is_same
+ <
+ typename gil::view_type_from_pixel
+ <
+ Pixel,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type_from_pixel yields unexpected view");
+}
+
+template <typename ResultView, typename Pixel, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test_not()
+{
+ static_assert(!std::is_same
+ <
+ typename gil::view_type_from_pixel
+ <
+ Pixel,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type_from_pixel yields unexpected view");
+}
+
+int main()
+{
+ test<gil::gray8_view_t, gil::gray8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::gray8c_view_t, gil::gray8c_pixel_t, Interleaved, NotStepX, Immutable>();
+ // Immutable view from mutable pixel type is allowed
+ test<gil::gray8c_view_t, gil::gray8_pixel_t, Interleaved, NotStepX, Immutable>();
+ // Mutable view from immutable pixel type not allowed
+ test_not<gil::gray8_view_t, gil::gray8c_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::gray8_step_view_t, gil::gray8_pixel_t, Interleaved, StepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray8c_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::gray8c_step_view_t, gil::gray8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::gray8_view_t, gil::gray8_pixel_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray8_pixel_t, Interleaved, StepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray8_pixel_t, Interleaved, NotStepX, Immutable>();
+
+ test<gil::abgr8_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::abgr8c_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::abgr8_step_view_t, gil::abgr8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::abgr8c_step_view_t, gil::abgr8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::abgr8_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::abgr8_view_t, gil::rgba8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::argb8_view_t, gil::argb8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::argb8c_view_t, gil::argb8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::argb8_step_view_t, gil::argb8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::argb8c_step_view_t, gil::argb8_pixel_t, Interleaved, StepX, Immutable>();
+
+ test<gil::bgr8_view_t, gil::bgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgr8c_view_t, gil::bgr8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgr8_step_view_t, gil::bgr8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::bgr8c_step_view_t, gil::bgr8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgr8_view_t, gil::rgb8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::bgra8_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgra8c_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgra8_step_view_t, gil::bgra8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::bgra8c_step_view_t, gil::bgra8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgra8_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::bgra8_view_t, gil::rgba8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_view_t, gil::rgb8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::rgb8c_view_t, gil::rgb8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::rgb8_step_view_t, gil::rgb8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::rgb8c_step_view_t, gil::rgb8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::rgb8_view_t, gil::rgb8c_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_planar_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Mutable>();
+ test<gil::rgb8c_planar_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Immutable>();
+ test<gil::rgb8_planar_step_view_t, gil::rgb8_pixel_t, Planar, StepX, Mutable>();
+ test<gil::rgb8c_planar_step_view_t, gil::rgb8_pixel_t, Planar, StepX, Immutable>();
+
+ test<gil::cmyk8_view_t, gil::cmyk8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::cmyk8c_view_t, gil::cmyk8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::cmyk8_step_view_t, gil::cmyk8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::cmyk8c_step_view_t, gil::cmyk8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::cmyk8_view_t, gil::rgba8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::cmyk8_planar_view_t, gil::cmyk8_pixel_t, Planar, NotStepX, Mutable>();
+ test<gil::cmyk8c_planar_view_t, gil::cmyk8_pixel_t, Planar, NotStepX, Immutable>();
+ test<gil::cmyk8_planar_step_view_t, gil::cmyk8_pixel_t, Planar, StepX, Mutable>();
+ test<gil::cmyk8c_planar_step_view_t, gil::cmyk8_pixel_t, Planar, StepX, Immutable>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/x_iterator.cpp b/src/boost/libs/gil/test/core/image_view/x_iterator.cpp
new file mode 100644
index 000000000..30a73b965
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/x_iterator.cpp
@@ -0,0 +1,98 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_x_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.x_at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 0), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 1), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 0}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 1}), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{1, 1}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(view.x_at(0, 0), view.row_begin(0));
+ BOOST_TEST_EQ(view.x_at(0, 1), view.row_begin(1));
+ BOOST_TEST_EQ(view.x_at(2, 0), view.row_end(0));
+ BOOST_TEST_EQ(view.x_at(2, 1), view.row_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.x_at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 0), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 1), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 0}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 1}), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{1, 1}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(view.x_at(0, 0), view.row_begin(0));
+ BOOST_TEST_EQ(view.x_at(0, 1), view.row_begin(1));
+ BOOST_TEST_EQ(view.x_at(2, 0), view.row_end(0));
+ BOOST_TEST_EQ(view.x_at(2, 1), view.row_end(1));
+ }
+}
+
+void test_row_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.row_begin(0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.row_begin(1), fixture::gray8_back_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.row_begin(0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.row_begin(1), fixture::rgb8_back_pixel);
+ }
+}
+
+void test_row_end()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on y < height(), see TODO comment in image_view.hpp
+ BOOST_TEST_EQ(view.row_begin(0), view.row_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on y < height(), see TODO comment in image_view.hpp
+ BOOST_TEST_EQ(view.row_begin(0), view.row_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+}
+
+int main()
+{
+ test_x_at();
+ test_row_begin();
+ test_row_end();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/xy_locator.cpp b/src/boost/libs/gil/test/core/image_view/xy_locator.cpp
new file mode 100644
index 000000000..af42ee641
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/xy_locator.cpp
@@ -0,0 +1,122 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_xy_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.xy_at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 0), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(0, 1), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 1), fixture::gray8_draw_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.xy_at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 0), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(0, 1), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 1), fixture::rgb8_draw_pixel);
+ }
+}
+
+void test_xy_x_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).x() == view.row_begin(0));
+ BOOST_TEST(view.xy_at(0, 1).x() == view.row_begin(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).x() == view.row_begin(0));
+ BOOST_TEST(view.xy_at(0, 1).x() == view.row_begin(1));
+ }
+}
+
+void test_xy_x_end()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.xy_at(2, 0).x() == view.row_end(0));
+ BOOST_TEST(view.xy_at(2, 1).x() == view.row_end(1));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.xy_at(2, 0).x() == view.row_end(0));
+ BOOST_TEST(view.xy_at(2, 1).x() == view.row_end(1));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+}
+
+void test_xy_y_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).y() == view.col_begin(0));
+ BOOST_TEST(view.xy_at(1, 0).y() == view.col_begin(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).y() == view.col_begin(0));
+ BOOST_TEST(view.xy_at(1, 0).y() == view.col_begin(1));
+ }
+}
+
+void test_xy_y_end()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 2).y() == view.col_end(0));
+ BOOST_TEST(view.xy_at(1, 2).y() == view.col_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 2).y() == view.col_end(0));
+ BOOST_TEST(view.xy_at(1, 2).y() == view.col_end(1));
+ }
+}
+
+int main()
+{
+ test_xy_at();
+ test_xy_x_begin();
+ test_xy_x_end();
+ test_xy_y_begin();
+ test_xy_y_end();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/y_iterator.cpp b/src/boost/libs/gil/test/core/image_view/y_iterator.cpp
new file mode 100644
index 000000000..6070ebd2f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/y_iterator.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <vector>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_y_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.y_at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 0), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 1), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 0}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 1}), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{1, 1}), fixture::gray8_draw_pixel);
+ BOOST_TEST(view.y_at(0, 0) == view.col_begin(0));
+ BOOST_TEST(view.y_at(1, 0) == view.col_begin(1));
+ BOOST_TEST(view.y_at(0, 2) == view.col_end(0));
+ BOOST_TEST(view.y_at(1, 2) == view.col_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.y_at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 0), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 1), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 0}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 1}), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{1, 1}), fixture::rgb8_draw_pixel);
+ BOOST_TEST(view.y_at(0, 0) == view.col_begin(0));
+ BOOST_TEST(view.y_at(1, 0) == view.col_begin(1));
+ BOOST_TEST(view.y_at(0, 2) == view.col_end(0));
+ BOOST_TEST(view.y_at(1, 2) == view.col_end(1));
+ }
+}
+
+void test_col_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.col_begin(0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.col_begin(1), fixture::gray8_back_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.col_begin(0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.col_begin(1), fixture::rgb8_back_pixel);
+ }
+}
+void test_col_end()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.col_begin(0) == view.col_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.col_begin(0) == view.col_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+}
+
+void test_issue_432()
+{
+ // Verifies https://github.com/boostorg/gil/pull/450 fix for https://github.com/boostorg/gil/issues/432
+ // The tests were adapted from contribution of Daniel Evans by Olzhas Zhumabek.
+ {
+ std::vector<gil::gray8_pixel_t> v(50);
+ auto view = boost::gil::interleaved_view(10, 5, v.data(), 10 * sizeof(gil::gray8_pixel_t));
+ view.col_end(0); // BUG: Boost 1.72 always asserts
+ }
+ {
+ std::vector<gil::rgb8_pixel_t> v(50);
+ auto view = boost::gil::interleaved_view(10, 5, v.data(), 10 * sizeof(gil::rgb8_pixel_t));
+ auto it = view.row_end(0); // BUG: Boost 1.72 always asserts
+ boost::ignore_unused(it);
+ }
+}
+
+int main()
+{
+ test_y_at();
+ test_col_begin();
+ test_col_end();
+
+ test_issue_432();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/iterator/CMakeLists.txt b/src/boost/libs/gil/test/core/iterator/CMakeLists.txt
new file mode 100644
index 000000000..cff287e66
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/CMakeLists.txt
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ dynamic_step
+ is_planar)
+ set(_test t_core_iterator_${_name})
+ set(_target test_core_iterator_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/iterator/Jamfile b/src/boost/libs/gil/test/core/iterator/Jamfile
new file mode 100644
index 000000000..8da365c86
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile dynamic_step.cpp ;
+compile is_planar.cpp ;
diff --git a/src/boost/libs/gil/test/core/iterator/concepts.cpp b/src/boost/libs/gil/test/core/iterator/concepts.cpp
new file mode 100644
index 000000000..39f5bc736
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/concepts.cpp
@@ -0,0 +1,172 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/color_base.hpp> // kth_element_type
+#include <boost/gil/pixel.hpp> // kth_element_type
+#include <boost/gil/pixel_iterator.hpp>
+#include <boost/gil/pixel_iterator_adaptor.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp> // kth_element_type
+#include <boost/gil/planar_pixel_reference.hpp> // kth_element_type
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+template <typename Iterator>
+void test_immutable()
+{
+ function_requires<gil::PixelIteratorConcept<Iterator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Iterator>>();
+ // NOTE: Pixel iterator does not model Y-step
+ //function_requires<gil::HasDynamicYStepTypeConcept<Iterator>>();
+}
+
+template <typename Iterator>
+void test_mutable()
+{
+ function_requires<gil::MutablePixelIteratorConcept<Iterator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Iterator>>();
+ // NOTE: Pixel iterator does not model Y-step
+ //function_requires<gil::HasDynamicYStepTypeConcept<Iterator>>();
+}
+
+int main()
+{
+ test_mutable<gil::gray8_ptr_t>();
+ test_mutable<gil::gray8_step_ptr_t>();
+ test_mutable<gil::gray16_ptr_t>();
+ test_mutable<gil::gray16_step_ptr_t>();
+ test_mutable<gil::gray32_ptr_t>();
+ test_mutable<gil::gray32_step_ptr_t>();
+ test_mutable<gil::gray32f_ptr_t>();
+ test_mutable<gil::gray32f_step_ptr_t>();
+ test_immutable<gil::gray8c_ptr_t>();
+ test_immutable<gil::gray8c_step_ptr_t>();
+ test_immutable<gil::gray16c_ptr_t>();
+ test_immutable<gil::gray16c_step_ptr_t>();
+ test_immutable<gil::gray32c_ptr_t>();
+ test_immutable<gil::gray32c_step_ptr_t>();
+ test_immutable<gil::gray32fc_ptr_t>();
+ test_immutable<gil::gray32fc_step_ptr_t>();
+
+ test_mutable<gil::abgr8_ptr_t>();
+ test_mutable<gil::abgr8_step_ptr_t>();
+ test_mutable<gil::abgr16_ptr_t>();
+ test_mutable<gil::abgr16_step_ptr_t>();
+ test_mutable<gil::abgr32_ptr_t>();
+ test_mutable<gil::abgr32_step_ptr_t>();
+ test_mutable<gil::abgr32f_ptr_t>();
+ test_mutable<gil::abgr32f_step_ptr_t>();
+ test_immutable<gil::abgr8c_ptr_t>();
+ test_immutable<gil::abgr8c_step_ptr_t>();
+ test_immutable<gil::abgr16c_ptr_t>();
+ test_immutable<gil::abgr16c_step_ptr_t>();
+ test_immutable<gil::abgr32c_ptr_t>();
+ test_immutable<gil::abgr32c_step_ptr_t>();
+ test_immutable<gil::abgr32fc_ptr_t>();
+ test_immutable<gil::abgr32fc_step_ptr_t>();
+
+ test_mutable<gil::argb8_ptr_t>();
+ test_mutable<gil::argb8_step_ptr_t>();
+ test_mutable<gil::argb16_ptr_t>();
+ test_mutable<gil::argb16_step_ptr_t>();
+ test_mutable<gil::argb32_ptr_t>();
+ test_mutable<gil::argb32_step_ptr_t>();
+ test_mutable<gil::argb32f_ptr_t>();
+ test_mutable<gil::argb32f_step_ptr_t>();
+
+ test_mutable<gil::bgr8_ptr_t>();
+ test_mutable<gil::bgr8_step_ptr_t>();
+ test_mutable<gil::bgr16_ptr_t>();
+ test_mutable<gil::bgr16_step_ptr_t>();
+ test_mutable<gil::bgr32_ptr_t>();
+ test_mutable<gil::bgr32_step_ptr_t>();
+ test_mutable<gil::bgr32f_ptr_t>();
+ test_mutable<gil::bgr32f_step_ptr_t>();
+
+ test_mutable<gil::bgra8_ptr_t>();
+ test_mutable<gil::bgra8_step_ptr_t>();
+ test_mutable<gil::bgra16_ptr_t>();
+ test_mutable<gil::bgra16_step_ptr_t>();
+ test_mutable<gil::bgra32_ptr_t>();
+ test_mutable<gil::bgra32_step_ptr_t>();
+ test_mutable<gil::bgra32f_ptr_t>();
+ test_mutable<gil::bgra32f_step_ptr_t>();
+
+ test_mutable<gil::rgb8_ptr_t>();
+ test_mutable<gil::rgb8_step_ptr_t>();
+ test_mutable<gil::rgb8_planar_ptr_t>();
+ test_mutable<gil::rgb8_planar_step_ptr_t>();
+ test_mutable<gil::rgb16_ptr_t>();
+ test_mutable<gil::rgb16_step_ptr_t>();
+ test_mutable<gil::rgb16_planar_ptr_t>();
+ test_mutable<gil::rgb16_planar_step_ptr_t>();
+ test_mutable<gil::rgb32_ptr_t>();
+ test_mutable<gil::rgb32_step_ptr_t>();
+ test_mutable<gil::rgb32_planar_ptr_t>();
+ test_mutable<gil::rgb32_planar_step_ptr_t>();
+ test_mutable<gil::rgb32f_ptr_t>();
+ test_mutable<gil::rgb32f_step_ptr_t>();
+ test_mutable<gil::rgb32f_planar_ptr_t>();
+ test_mutable<gil::rgb32f_planar_step_ptr_t>();
+ test_immutable<gil::rgb8c_ptr_t>();
+ test_immutable<gil::rgb8c_step_ptr_t>();
+ test_immutable<gil::rgb16c_ptr_t>();
+ test_immutable<gil::rgb16c_step_ptr_t>();
+ test_immutable<gil::rgb32c_ptr_t>();
+ test_immutable<gil::rgb32c_step_ptr_t>();
+ test_immutable<gil::rgb32fc_ptr_t>();
+ test_immutable<gil::rgb32fc_step_ptr_t>();
+
+ test_mutable<gil::rgba8_ptr_t>();
+ test_mutable<gil::rgba8_step_ptr_t>();
+ test_mutable<gil::rgba8_planar_ptr_t>();
+ test_mutable<gil::rgba8_planar_step_ptr_t>();
+ test_mutable<gil::rgba16_ptr_t>();
+ test_mutable<gil::rgba16_step_ptr_t>();
+ test_mutable<gil::rgba16_planar_ptr_t>();
+ test_mutable<gil::rgba16_planar_step_ptr_t>();
+ test_mutable<gil::rgba32_ptr_t>();
+ test_mutable<gil::rgba32_step_ptr_t>();
+ test_mutable<gil::rgba32_planar_ptr_t>();
+ test_mutable<gil::rgba32_planar_step_ptr_t>();
+ test_mutable<gil::rgba32f_ptr_t>();
+ test_mutable<gil::rgba32f_step_ptr_t>();
+ test_mutable<gil::rgba32f_planar_ptr_t>();
+ test_mutable<gil::rgba32f_planar_step_ptr_t>();
+
+ test_mutable<gil::cmyk8_ptr_t>();
+ test_mutable<gil::cmyk8_step_ptr_t>();
+ test_mutable<gil::cmyk8_planar_ptr_t>();
+ test_mutable<gil::cmyk8_planar_step_ptr_t>();
+ test_mutable<gil::cmyk16_ptr_t>();
+ test_mutable<gil::cmyk16_step_ptr_t>();
+ test_mutable<gil::cmyk16_planar_ptr_t>();
+ test_mutable<gil::cmyk16_planar_step_ptr_t>();
+ test_mutable<gil::cmyk32_ptr_t>();
+ test_mutable<gil::cmyk32_step_ptr_t>();
+ test_mutable<gil::cmyk32_planar_ptr_t>();
+ test_mutable<gil::cmyk32_planar_step_ptr_t>();
+ test_mutable<gil::cmyk32f_ptr_t>();
+ test_mutable<gil::cmyk32f_step_ptr_t>();
+ test_mutable<gil::cmyk32f_planar_ptr_t>();
+ test_mutable<gil::cmyk32f_planar_step_ptr_t>();
+ test_immutable<gil::cmyk8c_ptr_t>();
+ test_immutable<gil::cmyk8c_step_ptr_t>();
+ test_immutable<gil::cmyk8c_planar_ptr_t>();
+ test_immutable<gil::cmyk8c_planar_step_ptr_t>();
+}
diff --git a/src/boost/libs/gil/test/core/iterator/dynamic_step.cpp b/src/boost/libs/gil/test/core/iterator/dynamic_step.cpp
new file mode 100644
index 000000000..269c7306b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/dynamic_step.cpp
@@ -0,0 +1,160 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/dynamic_step.hpp>
+#include <boost/gil/color_base.hpp> // kth_element_type
+#include <boost/gil/pixel.hpp> // kth_element_type
+#include <boost/gil/pixel_iterator.hpp>
+#include <boost/gil/pixel_iterator_adaptor.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp> // kth_element_type
+#include <boost/gil/planar_pixel_reference.hpp> // kth_element_type
+#include <boost/gil/step_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+// NOTE: Iterator does not model HasDynamicYStepTypeConcept
+// TODO: Add compile-fail tests to verify that.
+
+template <typename Iterator>
+void test_non_step()
+{
+ static_assert(std::is_same
+ <
+ gil::memory_based_step_iterator<Iterator>,
+ typename gil::dynamic_x_step_type<Iterator>::type
+ >::value, "iterator does not model HasDynamicXStepTypeConcept");
+
+ static_assert(!std::is_same
+ <
+ Iterator,
+ typename gil::dynamic_x_step_type<Iterator>::type
+ >::value, "dynamic_x_step_type yields X step iterator, not X iterator");
+}
+
+template <typename Iterator>
+void test_step()
+{
+ static_assert(std::is_same
+ <
+ Iterator,
+ typename gil::dynamic_x_step_type<Iterator>::type
+ >::value, "iterator does not model HasDynamicXStepTypeConcept");
+
+ static_assert(!std::is_same
+ <
+ typename Iterator::x_iterator,
+ typename gil::dynamic_x_step_type<gil::gray8_step_ptr_t>::type
+ >::value, "dynamic_x_step_type yields X step iterator, not X iterator");
+}
+
+int main()
+{
+ test_non_step<gil::gray8_ptr_t>();
+ test_non_step<gil::gray8c_ptr_t>();
+ test_non_step<gil::gray16_ptr_t>();
+ test_non_step<gil::gray16c_ptr_t>();
+ test_non_step<gil::gray32_ptr_t>();
+ test_non_step<gil::gray32c_ptr_t>();
+ test_non_step<gil::gray32f_ptr_t>();
+ test_step<gil::gray8_step_ptr_t>();
+ test_step<gil::gray8c_step_ptr_t>();
+ test_step<gil::gray16_step_ptr_t>();
+ test_step<gil::gray16c_step_ptr_t>();
+ test_step<gil::gray32_step_ptr_t>();
+ test_step<gil::gray32c_step_ptr_t>();
+ test_step<gil::gray32f_step_ptr_t>();
+
+ test_non_step<gil::abgr8_ptr_t>();
+ test_non_step<gil::abgr16_ptr_t>();
+ test_non_step<gil::abgr32_ptr_t>();
+ test_non_step<gil::abgr32f_ptr_t>();
+ test_step<gil::abgr8_step_ptr_t>();
+ test_step<gil::abgr16_step_ptr_t>();
+ test_step<gil::abgr32_step_ptr_t>();
+ test_step<gil::abgr32f_step_ptr_t>();
+
+ test_non_step<gil::argb8_ptr_t>();
+ test_non_step<gil::argb16_ptr_t>();
+ test_non_step<gil::argb32_ptr_t>();
+ test_non_step<gil::argb32f_ptr_t>();
+ test_step<gil::argb8_step_ptr_t>();
+ test_step<gil::argb16_step_ptr_t>();
+ test_step<gil::argb32_step_ptr_t>();
+ test_step<gil::argb32f_step_ptr_t>();
+
+ test_non_step<gil::bgr8_ptr_t>();
+ test_non_step<gil::bgr16_ptr_t>();
+ test_non_step<gil::bgr32_ptr_t>();
+ test_non_step<gil::bgr32f_ptr_t>();
+ test_step<gil::bgr8_step_ptr_t>();
+ test_step<gil::bgr16_step_ptr_t>();
+ test_step<gil::bgr32_step_ptr_t>();
+ test_step<gil::bgr32f_step_ptr_t>();
+
+ test_non_step<gil::bgra8_ptr_t>();
+ test_non_step<gil::bgra16_ptr_t>();
+ test_non_step<gil::bgra32_ptr_t>();
+ test_non_step<gil::bgra32f_ptr_t>();
+ test_step<gil::bgra8_step_ptr_t>();
+ test_step<gil::bgra16_step_ptr_t>();
+ test_step<gil::bgra32_step_ptr_t>();
+ test_step<gil::bgra32f_step_ptr_t>();
+
+ test_non_step<gil::rgb8_ptr_t>();
+ test_non_step<gil::rgb8_planar_ptr_t>();
+ test_non_step<gil::rgb16_ptr_t>();
+ test_non_step<gil::rgb16_planar_ptr_t>();
+ test_non_step<gil::rgb32_ptr_t>();
+ test_non_step<gil::rgb32_planar_ptr_t>();
+ test_non_step<gil::rgb32f_ptr_t>();
+ test_non_step<gil::rgb32f_planar_ptr_t>();
+ test_step<gil::rgb8_step_ptr_t>();
+ test_step<gil::rgb8_planar_step_ptr_t>();
+ test_step<gil::rgb16_step_ptr_t>();
+ test_step<gil::rgb16_planar_step_ptr_t>();
+ test_step<gil::rgb32_step_ptr_t>();
+ test_step<gil::rgb32_planar_step_ptr_t>();
+ test_step<gil::rgb32f_step_ptr_t>();
+ test_step<gil::rgb32f_planar_step_ptr_t>();
+
+ test_non_step<gil::rgba8_ptr_t>();
+ test_non_step<gil::rgba8_planar_ptr_t>();
+ test_non_step<gil::rgba16_ptr_t>();
+ test_non_step<gil::rgba16_planar_ptr_t>();
+ test_non_step<gil::rgba32_ptr_t>();
+ test_non_step<gil::rgba32_planar_ptr_t>();
+ test_non_step<gil::rgba32f_ptr_t>();
+ test_non_step<gil::rgba32f_planar_ptr_t>();
+ test_step<gil::rgba8_step_ptr_t>();
+ test_step<gil::rgba8_planar_step_ptr_t>();
+ test_step<gil::rgba16_step_ptr_t>();
+ test_step<gil::rgba16_planar_step_ptr_t>();
+ test_step<gil::rgba32_step_ptr_t>();
+ test_step<gil::rgba32_planar_step_ptr_t>();
+ test_step<gil::rgba32f_step_ptr_t>();
+ test_step<gil::rgba32f_planar_step_ptr_t>();
+
+ test_non_step<gil::cmyk8_ptr_t>();
+ test_non_step<gil::cmyk8_planar_ptr_t>();
+ test_non_step<gil::cmyk16_ptr_t>();
+ test_non_step<gil::cmyk16_planar_ptr_t>();
+ test_non_step<gil::cmyk32_ptr_t>();
+ test_non_step<gil::cmyk32_planar_ptr_t>();
+ test_non_step<gil::cmyk32f_ptr_t>();
+ test_non_step<gil::cmyk32f_planar_ptr_t>();
+ test_step<gil::cmyk8_step_ptr_t>();
+ test_step<gil::cmyk8_planar_step_ptr_t>();
+ test_step<gil::cmyk16_step_ptr_t>();
+ test_step<gil::cmyk16_planar_step_ptr_t>();
+ test_step<gil::cmyk32_step_ptr_t>();
+ test_step<gil::cmyk32_planar_step_ptr_t>();
+ test_step<gil::cmyk32f_step_ptr_t>();
+ test_step<gil::cmyk32f_planar_step_ptr_t>();
+}
diff --git a/src/boost/libs/gil/test/core/iterator/is_planar.cpp b/src/boost/libs/gil/test/core/iterator/is_planar.cpp
new file mode 100644
index 000000000..240e5854b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/is_planar.cpp
@@ -0,0 +1,72 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ using iterators = mp_list
+ <
+ gil::planar_pixel_iterator<gil::rgb8_view_t*, gil::rgb_t>,
+ gil::rgb8_planar_ptr_t,
+ gil::rgb8_planar_step_ptr_t,
+ gil::rgb8c_planar_ptr_t,
+ gil::rgb8c_planar_step_ptr_t,
+ gil::rgb16_planar_ptr_t,
+ gil::rgb16c_planar_ptr_t,
+ gil::rgb16s_planar_ptr_t,
+ gil::rgb16sc_planar_ptr_t,
+ gil::rgb32_planar_ptr_t,
+ gil::rgb32c_planar_ptr_t,
+ gil::rgb32f_planar_ptr_t,
+ gil::rgb32fc_planar_ptr_t,
+ gil::rgb32s_planar_ptr_t,
+ gil::rgb32sc_planar_ptr_t,
+ gil::cmyk8_planar_ptr_t,
+ gil::cmyk8c_planar_ptr_t,
+ gil::cmyk8s_planar_ptr_t,
+ gil::cmyk8sc_planar_ptr_t,
+ gil::cmyk16_planar_ptr_t,
+ gil::cmyk16c_planar_ptr_t,
+ gil::cmyk16s_planar_ptr_t,
+ gil::cmyk16sc_planar_ptr_t,
+ gil::cmyk32_planar_ptr_t,
+ gil::cmyk32c_planar_ptr_t,
+ gil::cmyk32f_planar_ptr_t,
+ gil::cmyk32fc_planar_ptr_t,
+ gil::cmyk32s_planar_ptr_t,
+ gil::cmyk32sc_planar_ptr_t,
+ gil::rgba8_planar_ptr_t,
+ gil::rgba8c_planar_ptr_t,
+ gil::rgba8s_planar_ptr_t,
+ gil::rgba8sc_planar_ptr_t,
+ gil::rgba16_planar_ptr_t,
+ gil::rgba16c_planar_ptr_t,
+ gil::rgba16s_planar_ptr_t,
+ gil::rgba16sc_planar_ptr_t,
+ gil::rgba32_planar_ptr_t,
+ gil::rgba32c_planar_ptr_t,
+ gil::rgba32f_planar_ptr_t,
+ gil::rgba32fc_planar_ptr_t,
+ gil::rgba32s_planar_ptr_t,
+ gil::rgba32sc_planar_ptr_t
+ >;
+
+ static_assert(std::is_same
+ <
+ mp_all_of<iterators, gil::is_planar>,
+ std::true_type
+ >::value,
+ "is_planar yields true for non-planar pixel iterator");
+}
diff --git a/src/boost/libs/gil/test/core/locator/CMakeLists.txt b/src/boost/libs/gil/test/core/locator/CMakeLists.txt
new file mode 100644
index 000000000..b9beac82f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ dynamic_step)
+ set(_test t_core_locator_${_name})
+ set(_target test_core_locator_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/locator/Jamfile b/src/boost/libs/gil/test/core/locator/Jamfile
new file mode 100644
index 000000000..54e8e5aeb
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/Jamfile
@@ -0,0 +1,12 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile dynamic_step.cpp ;
diff --git a/src/boost/libs/gil/test/core/locator/concepts.cpp b/src/boost/libs/gil/test/core/locator/concepts.cpp
new file mode 100644
index 000000000..bf72d2c9e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/concepts.cpp
@@ -0,0 +1,202 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/locator.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/virtual_locator.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+template <typename Locator>
+void test_immutable()
+{
+ function_requires<gil::PixelLocatorConcept<Locator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Locator>>();
+ function_requires<gil::HasDynamicYStepTypeConcept<Locator>>();
+}
+
+template <typename Locator>
+void test_mutable()
+{
+ function_requires<gil::MutablePixelLocatorConcept<Locator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Locator>>();
+ function_requires<gil::HasDynamicYStepTypeConcept<Locator>>();
+}
+
+template <typename Pixel>
+struct archetype_pixel_dereference
+{
+ using point_t = gil::point_t;
+ using const_t = archetype_pixel_dereference;
+ using value_type = Pixel;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = gil::point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable = false;
+ result_type operator()(argument_type const&) const { return result_type{}; }
+};
+
+template <typename Pixel>
+using virtual_locator = gil::virtual_2d_locator<archetype_pixel_dereference<Pixel>, false>;
+
+int main()
+{
+ test_mutable<gil::gray8_loc_t>();
+ test_mutable<gil::gray8_step_loc_t>();
+ test_mutable<gil::gray16_loc_t>();
+ test_mutable<gil::gray16_step_loc_t>();
+ test_mutable<gil::gray32_loc_t>();
+ test_mutable<gil::gray32_step_loc_t>();
+ test_mutable<gil::gray32f_loc_t>();
+ test_mutable<gil::gray32f_step_loc_t>();
+ test_immutable<gil::gray8c_loc_t>();
+ test_immutable<gil::gray8c_step_loc_t>();
+ test_immutable<gil::gray16c_loc_t>();
+ test_immutable<gil::gray16c_step_loc_t>();
+ test_immutable<gil::gray32c_loc_t>();
+ test_immutable<gil::gray32c_step_loc_t>();
+ test_immutable<gil::gray32fc_loc_t>();
+ test_immutable<gil::gray32fc_step_loc_t>();
+
+ test_mutable<gil::memory_based_2d_locator<gil::gray8_step_ptr_t>>();
+ test_immutable<gil::memory_based_2d_locator<gil::gray8c_step_ptr_t>>();
+ test_mutable<virtual_locator<gil::gray8_pixel_t>>();
+ test_immutable<virtual_locator<gil::gray8c_pixel_t>>();
+
+ test_mutable<gil::abgr8_loc_t>();
+ test_mutable<gil::abgr8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::abgr8_step_ptr_t>>();
+ test_mutable<gil::abgr16_loc_t>();
+ test_mutable<gil::abgr16_step_loc_t>();
+ test_mutable<gil::abgr32_loc_t>();
+ test_mutable<gil::abgr32_step_loc_t>();
+ test_mutable<gil::abgr32f_loc_t>();
+ test_mutable<gil::abgr32f_step_loc_t>();
+ test_immutable<gil::abgr8c_loc_t>();
+ test_immutable<gil::abgr8c_step_loc_t>();
+ test_immutable<gil::memory_based_2d_locator<gil::abgr8c_step_ptr_t>>();
+ test_immutable<gil::abgr16c_loc_t>();
+ test_immutable<gil::abgr16c_step_loc_t>();
+ test_immutable<gil::abgr32c_loc_t>();
+ test_immutable<gil::abgr32c_step_loc_t>();
+ test_immutable<gil::abgr32fc_loc_t>();
+ test_immutable<gil::abgr32fc_step_loc_t>();
+
+ test_mutable<gil::argb8_loc_t>();
+ test_mutable<gil::argb8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::argb8_step_ptr_t>>();
+ test_mutable<gil::argb16_loc_t>();
+ test_mutable<gil::argb16_step_loc_t>();
+ test_mutable<gil::argb32_loc_t>();
+ test_mutable<gil::argb32_step_loc_t>();
+ test_mutable<gil::argb32f_loc_t>();
+ test_mutable<gil::argb32f_step_loc_t>();
+
+ test_mutable<gil::bgr8_loc_t>();
+ test_mutable<gil::bgr8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::bgr8_step_ptr_t>>();
+ test_mutable<gil::bgr16_loc_t>();
+ test_mutable<gil::bgr16_step_loc_t>();
+ test_mutable<gil::bgr32_loc_t>();
+ test_mutable<gil::bgr32_step_loc_t>();
+ test_mutable<gil::bgr32f_loc_t>();
+ test_mutable<gil::bgr32f_step_loc_t>();
+
+ test_mutable<gil::bgra8_loc_t>();
+ test_mutable<gil::bgra8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::bgra8_step_ptr_t>>();
+ test_mutable<gil::bgra16_loc_t>();
+ test_mutable<gil::bgra16_step_loc_t>();
+ test_mutable<gil::bgra32_loc_t>();
+ test_mutable<gil::bgra32_step_loc_t>();
+ test_mutable<gil::bgra32f_loc_t>();
+ test_mutable<gil::bgra32f_step_loc_t>();
+
+ test_mutable<gil::rgb8_loc_t>();
+ test_mutable<gil::rgb8_step_loc_t>();
+ test_mutable<gil::rgb8_planar_loc_t>();
+ test_mutable<gil::rgb8_planar_step_loc_t>();
+ test_mutable<gil::rgb16_loc_t>();
+ test_mutable<gil::rgb16_step_loc_t>();
+ test_mutable<gil::rgb16_planar_loc_t>();
+ test_mutable<gil::rgb16_planar_step_loc_t>();
+ test_mutable<gil::rgb32_loc_t>();
+ test_mutable<gil::rgb32_step_loc_t>();
+ test_mutable<gil::rgb32_planar_loc_t>();
+ test_mutable<gil::rgb32_planar_step_loc_t>();
+ test_mutable<gil::rgb32f_loc_t>();
+ test_mutable<gil::rgb32f_step_loc_t>();
+ test_mutable<gil::rgb32f_planar_loc_t>();
+ test_mutable<gil::rgb32f_planar_step_loc_t>();
+ test_immutable<gil::rgb8c_loc_t>();
+ test_immutable<gil::rgb8c_step_loc_t>();
+ test_immutable<gil::rgb16c_loc_t>();
+ test_immutable<gil::rgb16c_step_loc_t>();
+ test_immutable<gil::rgb32c_loc_t>();
+ test_immutable<gil::rgb32c_step_loc_t>();
+ test_immutable<gil::rgb32fc_loc_t>();
+ test_immutable<gil::rgb32fc_step_loc_t>();
+
+ test_mutable<gil::memory_based_2d_locator<gil::rgb8_step_ptr_t>>();
+ test_immutable<gil::memory_based_2d_locator<gil::rgb8c_step_ptr_t>>();
+ test_mutable<virtual_locator<gil::rgb8_pixel_t>>();
+ test_immutable<virtual_locator<gil::rgb8c_pixel_t>>();
+
+ test_mutable<gil::rgba8_loc_t>();
+ test_mutable<gil::rgba8_step_loc_t>();
+ test_mutable<gil::rgba8_planar_loc_t>();
+ test_mutable<gil::rgba8_planar_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::rgba8_step_ptr_t>>();
+ test_mutable<gil::rgba16_loc_t>();
+ test_mutable<gil::rgba16_step_loc_t>();
+ test_mutable<gil::rgba16_planar_loc_t>();
+ test_mutable<gil::rgba16_planar_step_loc_t>();
+ test_mutable<gil::rgba32_loc_t>();
+ test_mutable<gil::rgba32_step_loc_t>();
+ test_mutable<gil::rgba32_planar_loc_t>();
+ test_mutable<gil::rgba32_planar_step_loc_t>();
+ test_mutable<gil::rgba32f_loc_t>();
+ test_mutable<gil::rgba32f_step_loc_t>();
+ test_mutable<gil::rgba32f_planar_loc_t>();
+ test_mutable<gil::rgba32f_planar_step_loc_t>();
+
+ test_mutable<gil::cmyk8_loc_t>();
+ test_mutable<gil::cmyk8_step_loc_t>();
+ test_mutable<gil::cmyk8_planar_loc_t>();
+ test_mutable<gil::cmyk8_planar_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::cmyk8_step_ptr_t>>();
+ test_mutable<gil::cmyk16_loc_t>();
+ test_mutable<gil::cmyk16_step_loc_t>();
+ test_mutable<gil::cmyk16_planar_loc_t>();
+ test_mutable<gil::cmyk16_planar_step_loc_t>();
+ test_mutable<gil::cmyk32_loc_t>();
+ test_mutable<gil::cmyk32_step_loc_t>();
+ test_mutable<gil::cmyk32_planar_loc_t>();
+ test_mutable<gil::cmyk32_planar_step_loc_t>();
+ test_mutable<gil::cmyk32f_loc_t>();
+ test_mutable<gil::cmyk32f_step_loc_t>();
+ test_mutable<gil::cmyk32f_planar_loc_t>();
+ test_mutable<gil::cmyk32f_planar_step_loc_t>();
+ test_immutable<gil::cmyk8c_loc_t>();
+ test_immutable<gil::cmyk8c_step_loc_t>();
+ test_immutable<gil::cmyk8c_planar_loc_t>();
+ test_immutable<gil::cmyk8c_planar_step_loc_t>();
+ test_immutable<gil::memory_based_2d_locator<gil::cmyk8c_step_ptr_t>>();
+}
diff --git a/src/boost/libs/gil/test/core/locator/dynamic_step.cpp b/src/boost/libs/gil/test/core/locator/dynamic_step.cpp
new file mode 100644
index 000000000..c19d8093a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/dynamic_step.cpp
@@ -0,0 +1,92 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/dynamic_step.hpp>
+#include <boost/gil/color_base.hpp> // kth_element_type
+#include <boost/gil/pixel.hpp> // kth_element_type
+#include <boost/gil/locator.hpp>
+#include <boost/gil/pixel_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+template <typename Locator>
+void test_locator_from_iterator()
+{
+ // The `memory_based_2d_locator` for X-step is calculated based on adapted iterator
+ // Only verify `type` member is available (i.e. specialization defined).
+ static_assert(std::is_class
+ <
+ typename gil::dynamic_x_step_type<Locator>::type
+ >::value, "");
+
+ static_assert(std::is_same
+ <
+ Locator,
+ typename gil::dynamic_y_step_type<Locator>::type
+ >::value, "locator does not model HasDynamicYStepTypeConcept");
+}
+
+int main()
+{
+ test_locator_from_iterator<gil::gray8_loc_t>();
+ test_locator_from_iterator<gil::gray8c_loc_t>();
+ test_locator_from_iterator<gil::gray16_loc_t>();
+ test_locator_from_iterator<gil::gray16c_loc_t>();
+ test_locator_from_iterator<gil::gray32_loc_t>();
+ test_locator_from_iterator<gil::gray32c_loc_t>();
+ test_locator_from_iterator<gil::gray32f_loc_t>();
+
+ test_locator_from_iterator<gil::abgr8_loc_t>();
+ test_locator_from_iterator<gil::abgr16_loc_t>();
+ test_locator_from_iterator<gil::abgr32_loc_t>();
+ test_locator_from_iterator<gil::abgr32f_loc_t>();
+
+ test_locator_from_iterator<gil::argb8_loc_t>();
+ test_locator_from_iterator<gil::argb16_loc_t>();
+ test_locator_from_iterator<gil::argb32_loc_t>();
+ test_locator_from_iterator<gil::argb32f_loc_t>();
+
+ test_locator_from_iterator<gil::bgr8_loc_t>();
+ test_locator_from_iterator<gil::bgr16_loc_t>();
+ test_locator_from_iterator<gil::bgr32_loc_t>();
+ test_locator_from_iterator<gil::bgr32f_loc_t>();
+
+ test_locator_from_iterator<gil::bgra8_loc_t>();
+ test_locator_from_iterator<gil::bgra16_loc_t>();
+ test_locator_from_iterator<gil::bgra32_loc_t>();
+ test_locator_from_iterator<gil::bgra32f_loc_t>();
+
+ test_locator_from_iterator<gil::rgb8_loc_t>();
+ test_locator_from_iterator<gil::rgb8_planar_loc_t>();
+ test_locator_from_iterator<gil::rgb16_loc_t>();
+ test_locator_from_iterator<gil::rgb16_planar_loc_t>();
+ test_locator_from_iterator<gil::rgb32_loc_t>();
+ test_locator_from_iterator<gil::rgb32_planar_loc_t>();
+ test_locator_from_iterator<gil::rgb32f_loc_t>();
+ test_locator_from_iterator<gil::rgb32f_planar_loc_t>();
+
+ test_locator_from_iterator<gil::rgba8_loc_t>();
+ test_locator_from_iterator<gil::rgba8_planar_loc_t>();
+ test_locator_from_iterator<gil::rgba16_loc_t>();
+ test_locator_from_iterator<gil::rgba16_planar_loc_t>();
+ test_locator_from_iterator<gil::rgba32_loc_t>();
+ test_locator_from_iterator<gil::rgba32_planar_loc_t>();
+ test_locator_from_iterator<gil::rgba32f_loc_t>();
+ test_locator_from_iterator<gil::rgba32f_planar_loc_t>();
+
+ test_locator_from_iterator<gil::cmyk8_loc_t>();
+ test_locator_from_iterator<gil::cmyk8_planar_loc_t>();
+ test_locator_from_iterator<gil::cmyk16_loc_t>();
+ test_locator_from_iterator<gil::cmyk16_planar_loc_t>();
+ test_locator_from_iterator<gil::cmyk32_loc_t>();
+ test_locator_from_iterator<gil::cmyk32_planar_loc_t>();
+ test_locator_from_iterator<gil::cmyk32f_loc_t>();
+ test_locator_from_iterator<gil::cmyk32f_planar_loc_t>();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/CMakeLists.txt b/src/boost/libs/gil/test/core/pixel/CMakeLists.txt
new file mode 100644
index 000000000..8f90a72be
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/CMakeLists.txt
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ bit_aligned_pixel_reference
+ is_pixel
+ is_planar
+ num_channels
+ packed_pixel
+ pixel_reference_is_mutable
+ pixels_are_compatible
+ test_fixture)
+ set(_test t_core_pixel_${_name})
+ set(_target test_core_pixel_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/pixel/Jamfile b/src/boost/libs/gil/test/core/pixel/Jamfile
new file mode 100644
index 000000000..724565236
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/Jamfile
@@ -0,0 +1,20 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile bit_aligned_pixel_reference.cpp ;
+compile concepts.cpp ;
+compile is_pixel.cpp ;
+compile is_planar.cpp ;
+compile num_channels.cpp ;
+compile pixel_reference_is_mutable.cpp ;
+compile pixels_are_compatible.cpp ;
+
+run packed_pixel.cpp ;
+run test_fixture.cpp ;
diff --git a/src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp b/src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp
new file mode 100644
index 000000000..8f834e695
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp
@@ -0,0 +1,46 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/mp11.hpp>
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+int main()
+{
+ using bgr121_ref_t = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t, mp11::mp_list_c<int, 1, 2, 1>, gil::bgr_layout_t, true
+ >;
+
+ static_assert(bgr121_ref_t::bit_size == 4,
+ "bit size should be 4");
+
+ static_assert(std::is_same<bgr121_ref_t::bitfield_t, std::uint8_t>::value,
+ "bit field type should be std::uint8_t");
+
+ static_assert(std::is_same<bgr121_ref_t::layout_t, gil::bgr_layout_t>::value,
+ "layout type should be bgr");
+
+ static_assert(std::is_same<decltype(bgr121_ref_t::is_mutable), bool const>::value &&
+ bgr121_ref_t::is_mutable,
+ "is_mutable should be boolean");
+
+ using packed_pixel_t = gil::packed_pixel
+ <
+ std::uint8_t,
+ typename gil::detail::packed_channel_references_vector_type
+ <
+ std::uint8_t, mp11::mp_list_c<int, 1, 2, 1>
+ >::type,
+ gil::bgr_layout_t
+ >;
+ static_assert(std::is_same<bgr121_ref_t::value_type, packed_pixel_t>::value,
+ "value_type should be specialization of packed_pixel");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/concepts.cpp b/src/boost/libs/gil/test/core/pixel/concepts.cpp
new file mode 100644
index 000000000..7543ec60f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/concepts.cpp
@@ -0,0 +1,67 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil.hpp>
+
+#include <boost/concept_check.hpp>
+#include <boost/mp11.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+using boost::function_requires;
+
+template <template<typename> class Concept>
+struct assert_concept
+{
+ template <typename Pixel>
+ void operator()(Pixel&&)
+ {
+ function_requires<Concept<Pixel>>();
+ }
+};
+
+template <template<typename> class Concept, typename... Pixels>
+void test_concept()
+{
+ mp11::mp_for_each<Pixels...>(assert_concept<Concept>());
+}
+
+int main()
+{
+ test_concept<gil::PixelConcept, gil::test::fixture::pixel_typedefs>();
+ test_concept<gil::MutablePixelConcept, gil::test::fixture::pixel_typedefs>();
+
+ using rgb565_pixel_t = gil::packed_pixel_type
+ <
+ std::uint16_t,
+ mp11::mp_list_c<unsigned, 5, 6, 5>,
+ gil::rgb_layout_t
+ >::type;
+ function_requires<gil::PixelConcept<rgb565_pixel_t>>();
+ function_requires<gil::PixelValueConcept<rgb565_pixel_t>>();
+
+ using bgr556_pixel_t = gil::packed_pixel_type
+ <
+ std::uint16_t,
+ mp11::mp_list_c<unsigned, 5, 6, 5>,
+ gil::bgr_layout_t>::type;
+ function_requires<gil::PixelConcept<bgr556_pixel_t>>();
+ function_requires<gil::PixelValueConcept<bgr556_pixel_t>>();
+
+ function_requires<gil::PixelsCompatibleConcept<rgb565_pixel_t, bgr556_pixel_t>>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/pixel/is_pixel.cpp b/src/boost/libs/gil/test/core/pixel/is_pixel.cpp
new file mode 100644
index 000000000..b9f84975a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/is_pixel.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+
+#include <boost/mp11.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ static_assert(std::is_same
+ <
+ mp_all_of<gil::test::fixture::pixel_typedefs, gil::is_pixel>,
+ std::true_type
+ >::value,
+ "is_pixel does not yield true for all core pixel types");
+
+ static_assert(std::is_same
+ <
+ mp_all_of
+ <
+ mp_transform
+ <
+ gil::test::fixture::nested_pixel_type,
+ gil::test::fixture::representative_pixel_types
+ >,
+ gil::is_pixel
+ >,
+ std::true_type
+ >::value,
+ "is_pixel does not yield true for representative pixel types");
+
+ static_assert(std::is_same
+ <
+ mp_all_of<gil::test::fixture::non_pixels, gil::is_pixel>,
+ std::false_type
+ >::value,
+ "is_pixel yields true for non-pixel type");
+
+ static_assert(std::is_same
+ <
+ mp_none_of<gil::test::fixture::non_pixels, gil::is_pixel>,
+ std::true_type
+ >::value,
+ "is_pixel yields true for non-pixel type");
+
+ using bgr121_ref_t = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t, mp_list_c<int, 1, 2, 1>, gil::bgr_layout_t, true
+ >;
+ static_assert(gil::is_pixel<bgr121_ref_t>::value,
+ "is_pixel does not yield true for bit_aligned_pixel_reference");
+
+ using rgb121_ref_t = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t, mp_list_c<int, 1, 2, 1>, gil::rgb_layout_t, true
+ >;
+ static_assert(gil::is_pixel<bgr121_ref_t>::value,
+ "is_pixel does not yield true for bit_aligned_pixel_reference");
+
+ using rgb121_packed_pixel_t = rgb121_ref_t::value_type;
+ static_assert(gil::is_pixel<rgb121_packed_pixel_t>::value,
+ "is_pixel does not yield true for packed_pixel");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/is_planar.cpp b/src/boost/libs/gil/test/core/pixel/is_planar.cpp
new file mode 100644
index 000000000..fde33d4bd
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/is_planar.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ using non_planar_pixels = mp_list
+ <
+ gil::gray8_pixel_t,
+ gil::gray8c_pixel_t,
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray16c_pixel_t,
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray32_pixel_t,
+ gil::gray32c_pixel_t,
+ gil::gray32f_pixel_t,
+ gil::gray32fc_pixel_t,
+ gil::gray32s_pixel_t,
+ gil::gray32sc_pixel_t,
+ gil::bgr8_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::bgr16_pixel_t,
+ gil::bgr16c_pixel_t,
+ gil::bgr16s_pixel_t,
+ gil::bgr16sc_pixel_t,
+ gil::bgr32_pixel_t,
+ gil::bgr32c_pixel_t,
+ gil::bgr32f_pixel_t,
+ gil::bgr32fc_pixel_t,
+ gil::bgr32s_pixel_t,
+ gil::bgr32sc_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8c_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgb16c_pixel_t,
+ gil::rgb16s_pixel_t,
+ gil::rgb16sc_pixel_t,
+ gil::rgb32_pixel_t,
+ gil::rgb32c_pixel_t,
+ gil::rgb32f_pixel_t,
+ gil::rgb32fc_pixel_t,
+ gil::rgb32s_pixel_t,
+ gil::rgb32sc_pixel_t,
+ gil::abgr8_pixel_t,
+ gil::abgr8c_pixel_t,
+ gil::abgr8s_pixel_t,
+ gil::abgr8sc_pixel_t,
+ gil::abgr16_pixel_t,
+ gil::abgr16c_pixel_t,
+ gil::abgr16s_pixel_t,
+ gil::abgr16sc_pixel_t,
+ gil::abgr32_pixel_t,
+ gil::abgr32c_pixel_t,
+ gil::abgr32f_pixel_t,
+ gil::abgr32fc_pixel_t,
+ gil::abgr32s_pixel_t,
+ gil::abgr32sc_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::bgra8s_pixel_t,
+ gil::bgra8sc_pixel_t,
+ gil::bgra16_pixel_t,
+ gil::bgra16c_pixel_t,
+ gil::bgra16s_pixel_t,
+ gil::bgra16sc_pixel_t,
+ gil::bgra32_pixel_t,
+ gil::bgra32c_pixel_t,
+ gil::bgra32f_pixel_t,
+ gil::bgra32fc_pixel_t,
+ gil::bgra32s_pixel_t,
+ gil::bgra32sc_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk8c_pixel_t,
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t,
+ gil::cmyk16_pixel_t,
+ gil::cmyk16c_pixel_t,
+ gil::cmyk16s_pixel_t,
+ gil::cmyk16sc_pixel_t,
+ gil::cmyk32_pixel_t,
+ gil::cmyk32c_pixel_t,
+ gil::cmyk32f_pixel_t,
+ gil::cmyk32fc_pixel_t,
+ gil::cmyk32s_pixel_t,
+ gil::cmyk32sc_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8c_pixel_t,
+ gil::rgba8s_pixel_t,
+ gil::rgba8sc_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::rgba16c_pixel_t,
+ gil::rgba16s_pixel_t,
+ gil::rgba16sc_pixel_t,
+ gil::rgba32_pixel_t,
+ gil::rgba32c_pixel_t,
+ gil::rgba32f_pixel_t,
+ gil::rgba32fc_pixel_t,
+ gil::rgba32s_pixel_t,
+ gil::rgba32sc_pixel_t
+ >;
+
+ static_assert(
+ std::is_same
+ <
+ mp_all_of<non_planar_pixels, gil::is_planar>,
+ std::false_type
+ >::value,
+ "is_planar yields true for non-planar pixel type");
+
+ static_assert(
+ std::is_same
+ <
+ mp_none_of<non_planar_pixels, gil::is_planar>,
+ std::true_type
+ >::value,
+ "is_planar yields true for non-planar pixel type");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/num_channels.cpp b/src/boost/libs/gil/test/core/pixel/num_channels.cpp
new file mode 100644
index 000000000..ba80a260e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/num_channels.cpp
@@ -0,0 +1,154 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+template <std::size_t NumChannels>
+struct assert_num_channels
+{
+ template <typename Pixel>
+ void operator()(Pixel&&)
+ {
+ static_assert(
+ gil::num_channels<Pixel>::value == NumChannels,
+ "pixels does not have expected number of channels");
+
+ // TODO: Verify num_channels type with std::is_same
+ // e.g. is std::integral_constant<T, ...>
+ }
+};
+
+template <std::size_t NumChannels, typename... Pixels>
+void test()
+{
+ mp_for_each<Pixels...>(assert_num_channels<NumChannels>());
+}
+
+
+int main()
+{
+ using one = mp_list
+ <
+ gil::gray8_pixel_t,
+ gil::gray8c_pixel_t,
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray16c_pixel_t,
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray32_pixel_t,
+ gil::gray32c_pixel_t,
+ gil::gray32f_pixel_t,
+ gil::gray32fc_pixel_t,
+ gil::gray32s_pixel_t,
+ gil::gray32sc_pixel_t
+ >;
+ test<1, one>();
+
+ using three = mp_list
+ <
+ gil::bgr8_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::bgr16_pixel_t,
+ gil::bgr16c_pixel_t,
+ gil::bgr16s_pixel_t,
+ gil::bgr16sc_pixel_t,
+ gil::bgr32_pixel_t,
+ gil::bgr32c_pixel_t,
+ gil::bgr32f_pixel_t,
+ gil::bgr32fc_pixel_t,
+ gil::bgr32s_pixel_t,
+ gil::bgr32sc_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8c_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgb16c_pixel_t,
+ gil::rgb16s_pixel_t,
+ gil::rgb16sc_pixel_t,
+ gil::rgb32_pixel_t,
+ gil::rgb32c_pixel_t,
+ gil::rgb32f_pixel_t,
+ gil::rgb32fc_pixel_t,
+ gil::rgb32s_pixel_t,
+ gil::rgb32sc_pixel_t
+ >;
+ test<3, three>();
+
+ using four = mp_list
+ <
+ gil::abgr8_pixel_t,
+ gil::abgr8c_pixel_t,
+ gil::abgr8s_pixel_t,
+ gil::abgr8sc_pixel_t,
+ gil::abgr16_pixel_t,
+ gil::abgr16c_pixel_t,
+ gil::abgr16s_pixel_t,
+ gil::abgr16sc_pixel_t,
+ gil::abgr32_pixel_t,
+ gil::abgr32c_pixel_t,
+ gil::abgr32f_pixel_t,
+ gil::abgr32fc_pixel_t,
+ gil::abgr32s_pixel_t,
+ gil::abgr32sc_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::bgra8s_pixel_t,
+ gil::bgra8sc_pixel_t,
+ gil::bgra16_pixel_t,
+ gil::bgra16c_pixel_t,
+ gil::bgra16s_pixel_t,
+ gil::bgra16sc_pixel_t,
+ gil::bgra32_pixel_t,
+ gil::bgra32c_pixel_t,
+ gil::bgra32f_pixel_t,
+ gil::bgra32fc_pixel_t,
+ gil::bgra32s_pixel_t,
+ gil::bgra32sc_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk8c_pixel_t,
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t,
+ gil::cmyk16_pixel_t,
+ gil::cmyk16c_pixel_t,
+ gil::cmyk16s_pixel_t,
+ gil::cmyk16sc_pixel_t,
+ gil::cmyk32_pixel_t,
+ gil::cmyk32c_pixel_t,
+ gil::cmyk32f_pixel_t,
+ gil::cmyk32fc_pixel_t,
+ gil::cmyk32s_pixel_t,
+ gil::cmyk32sc_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8c_pixel_t,
+ gil::rgba8s_pixel_t,
+ gil::rgba8sc_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::rgba16c_pixel_t,
+ gil::rgba16s_pixel_t,
+ gil::rgba16sc_pixel_t,
+ gil::rgba32_pixel_t,
+ gil::rgba32c_pixel_t,
+ gil::rgba32f_pixel_t,
+ gil::rgba32fc_pixel_t,
+ gil::rgba32s_pixel_t,
+ gil::rgba32sc_pixel_t
+ >;
+ test<4, four>();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/packed_pixel.cpp b/src/boost/libs/gil/test/core/pixel/packed_pixel.cpp
new file mode 100644
index 000000000..d73584c34
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/packed_pixel.cpp
@@ -0,0 +1,336 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/rgb.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+#include <boost/core/typeinfo.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+namespace mp11 = boost::mp11;
+
+void test_packed_pixel_gray3_definition()
+{
+ // Verify packed_pixel members
+
+ static_assert(std::is_same<fixture::packed_pixel_gray3::layout_t, gil::gray_layout_t>::value,
+ "layout should be bgr");
+
+ static_assert(std::is_same<fixture::packed_pixel_gray3::value_type, fixture::packed_pixel_gray3>::value,
+ "value_type member should be of the same type as the packed_pixel specialization");
+
+ static_assert(std::is_reference<fixture::packed_pixel_gray3::reference>::value,
+ "reference member should be a reference");
+
+ static_assert(std::is_reference<fixture::packed_pixel_gray3::const_reference>::value,
+ "const_reference member should be a reference");
+
+ static_assert(std::is_same<decltype(fixture::packed_pixel_gray3::is_mutable), bool const>::value &&
+ fixture::packed_pixel_gray3::is_mutable,
+ "is_mutable should be boolean");
+
+ // Verify metafunctions
+
+ static_assert(mp11::mp_size<fixture::packed_channel_references_3>::value == 1,
+ "packed_channel_references_vector_type should define one reference to channel start bits");
+
+ using channel1_ref_t = mp11::mp_at_c<fixture::packed_channel_references_3, 0>;
+ static_assert(channel1_ref_t::num_bits == 3,
+ "1st channel of gray3 pixel should be of 3-bit size");
+
+ static_assert(std::is_same
+ <
+ channel1_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 0, 3, true> const
+ >::value,
+ "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel");
+
+ // double check intermediate metafunction packed_channel_reference_type
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 3>
+ >::type,
+ channel1_ref_t
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 3>
+ >::type,
+ gil::packed_channel_reference<std::uint8_t, 0, 3, true> const
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+}
+
+void test_packed_pixel_gray3_assignment()
+{
+ fixture::packed_pixel_gray3 p1{int{5}};
+ fixture::packed_pixel_gray3 p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1._bitfield, p2._bitfield);
+}
+
+void test_packed_pixel_gray3_equality()
+{
+ fixture::packed_pixel_gray3 p1{int{5}};
+ fixture::packed_pixel_gray3 p2{int{5}};
+ BOOST_TEST_EQ(p1, p2);
+
+ fixture::packed_pixel_gray3 p3{int{3}};
+ BOOST_TEST_NE(p2, p3);
+}
+
+void test_packed_pixel_gray3_assignment_gray_channel()
+{
+ {
+ fixture::packed_pixel_gray3 p1; // default-initialized
+ p1 = int{5};
+ BOOST_TEST_EQ(p1._bitfield, int{5});
+ }
+
+ {
+ fixture::packed_pixel_gray3 p1{0}; // value-initialized
+ p1 = int{5};
+ BOOST_TEST_EQ(p1._bitfield, int{5});
+ }
+}
+
+void test_packed_pixel_gray3_equality_gray_channel()
+{
+ fixture::packed_pixel_gray3 p1{int{3}};
+ BOOST_TEST_EQ(p1, int{3});
+}
+
+void test_packed_pixel_bgr121_definition()
+{
+ // Verify packed_pixel members
+
+ static_assert(std::is_same<fixture::packed_pixel_bgr121::layout_t, gil::bgr_layout_t>::value,
+ "layout should be bgr");
+
+ static_assert(std::is_same<fixture::packed_pixel_bgr121::value_type, fixture::packed_pixel_bgr121>::value,
+ "value_type member should be of the same type as the packed_pixel specialization");
+
+ static_assert(std::is_reference<fixture::packed_pixel_bgr121::reference>::value,
+ "reference member should be a reference");
+
+ static_assert(std::is_reference<fixture::packed_pixel_bgr121::const_reference>::value,
+ "const_reference member should be a reference");
+
+ static_assert(std::is_same<decltype(fixture::packed_pixel_bgr121::is_mutable), bool const>::value &&
+ fixture::packed_pixel_bgr121::is_mutable,
+ "is_mutable should be boolean");
+
+ // Verify metafunctions
+
+ static_assert(mp11::mp_size<fixture::packed_channel_references_121>::value == 3,
+ "packed_channel_references_vector_type should define three references to channel start bits");
+
+ using channel1_ref_t = mp11::mp_at_c<fixture::packed_channel_references_121, 0>;
+ static_assert(channel1_ref_t::num_bits == 1,
+ "1st channel of bgr121 pixel should be of 1-bit size");
+
+ using channel2_ref_t = mp11::mp_at_c<fixture::packed_channel_references_121, 1>;
+ static_assert(channel2_ref_t::num_bits == 2,
+ "2nd channel of bgr121 pixel should be of 2-bit size");
+
+ using channel3_ref_t = mp11::mp_at_c<fixture::packed_channel_references_121, 2>;
+ static_assert(channel3_ref_t::num_bits == 1,
+ "3rd channel of bgr121 pixel should be of 1-bit size");
+
+ static_assert(std::is_same
+ <
+ channel1_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 0, 1, true> const
+ >::value,
+ "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel");
+
+ static_assert(std::is_same
+ <
+ channel2_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 1, 2, true> const
+ >::value,
+ "2nd element of packed_channel_references_vector should be packed_channel_reference of 2nd channel");
+
+ static_assert(std::is_same
+ <
+ channel3_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 3, 1, true> const
+ >::value,
+ "3rd element of packed_channel_references_vector should be packed_channel_reference of 3rd channel");
+
+ // double check intermediate metafunction packed_channel_reference_type
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t, mp11::mp_int<0>, mp11::mp_int<1>
+ >::type,
+ channel1_ref_t
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t, mp11::mp_int<0>, mp11::mp_int<1>
+ >::type,
+ gil::packed_channel_reference<std::uint8_t, 0, 1, true> const
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+}
+
+void test_packed_pixel_bgr121_assignment()
+{
+ fixture::packed_pixel_bgr121 p1{0, 3, 1};
+ fixture::packed_pixel_bgr121 p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1._bitfield, p2._bitfield);
+}
+
+void test_packed_pixel_bgr121_equality()
+{
+ fixture::packed_pixel_bgr121 p1{1, 3, 0};
+ fixture::packed_pixel_bgr121 p2{1, 3, 0};
+ BOOST_TEST_EQ(p1, p2);
+
+ fixture::packed_pixel_bgr121 p3{0, 3, 1};
+ BOOST_TEST_NE(p2, p3);
+}
+
+void test_packed_pixel_rgb535_definition()
+{
+ // Verify packed_pixel members
+
+ static_assert(std::is_same<fixture::packed_pixel_rgb535::layout_t, gil::rgb_layout_t>::value,
+ "layout should be bgr");
+
+ static_assert(std::is_same<fixture::packed_pixel_rgb535::value_type, fixture::packed_pixel_rgb535>::value,
+ "value_type member should be of the same type as the packed_pixel specialization");
+
+ static_assert(std::is_reference<fixture::packed_pixel_rgb535::reference>::value,
+ "reference member should be a reference");
+
+ static_assert(std::is_reference<fixture::packed_pixel_rgb535::const_reference>::value,
+ "const_reference member should be a reference");
+
+ static_assert(std::is_same<decltype(fixture::packed_pixel_rgb535::is_mutable), bool const>::value &&
+ fixture::packed_pixel_rgb535::is_mutable,
+ "is_mutable should be boolean");
+
+ // Verify metafunctions
+
+ static_assert(mp11::mp_size<fixture::packed_channel_references_535>::value == 3,
+ "packed_channel_references_vector_type should define three references to channel start bits");
+
+ using channel1_ref_t = mp11::mp_at_c<fixture::packed_channel_references_535, 0>;
+ static_assert(channel1_ref_t::num_bits == 5,
+ "1st channel of rgb535 pixel should be of 5-bit size");
+
+ using channel2_ref_t = mp11::mp_at_c<fixture::packed_channel_references_535, 1>;
+ static_assert(channel2_ref_t::num_bits == 3,
+ "2nd channel of rgb535 pixel should be of 3-bit size");
+
+ using channel3_ref_t = mp11::mp_at_c<fixture::packed_channel_references_535, 2>;
+ static_assert(channel3_ref_t::num_bits == 5,
+ "3rd channel of rgb535 pixel should be of 5-bit size");
+
+ static_assert(std::is_same
+ <
+ channel1_ref_t,
+ gil::packed_channel_reference<std::uint16_t, 0, 5, true> const
+ >::value,
+ "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel");
+
+ static_assert(std::is_same
+ <
+ channel2_ref_t,
+ gil::packed_channel_reference<std::uint16_t, 5, 3, true> const
+ >::value,
+ "2nd element of packed_channel_references_vector should be packed_channel_reference of 2nd channel");
+
+ static_assert(std::is_same
+ <
+ channel3_ref_t,
+ gil::packed_channel_reference<std::uint16_t, 8, 5, true> const
+ >::value,
+ "3rd element of packed_channel_references_vector should be packed_channel_reference of 3rd channel");
+
+ // double check intermediate metafunction packed_channel_reference_type
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint16_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 5>
+ >::type,
+ channel1_ref_t
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint16_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 5>
+ >::type,
+ gil::packed_channel_reference<std::uint16_t, 0, 5, true> const
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+}
+
+void test_packed_pixel_rgb535_assignment()
+{
+ fixture::packed_pixel_rgb535 p1{31, 7, 31};
+ fixture::packed_pixel_rgb535 p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1._bitfield, p2._bitfield);
+}
+
+void test_packed_pixel_rgb535_equality()
+{
+ fixture::packed_pixel_rgb535 p1{7, 3, 7};
+ fixture::packed_pixel_rgb535 p2{7, 3, 7};
+ BOOST_TEST_EQ(p1, p2);
+
+ fixture::packed_pixel_rgb535 p3{7, 7, 7};
+ BOOST_TEST_NE(p2, p3);
+}
+
+int main()
+{
+ test_packed_pixel_gray3_definition();
+ test_packed_pixel_gray3_assignment();
+ test_packed_pixel_gray3_equality();
+ test_packed_pixel_gray3_assignment_gray_channel();
+ test_packed_pixel_gray3_equality_gray_channel();
+ test_packed_pixel_bgr121_definition();
+ test_packed_pixel_bgr121_assignment();
+ test_packed_pixel_bgr121_equality();
+ test_packed_pixel_rgb535_definition();
+ test_packed_pixel_rgb535_assignment();
+ test_packed_pixel_rgb535_equality();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp b/src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp
new file mode 100644
index 000000000..a9f1475cf
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/mp11.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ static_assert(mp_all_of
+ <
+ gil::test::fixture::pixel_typedefs,
+ gil::pixel_reference_is_mutable
+ >::value,
+ "pixel_reference_is_mutable should yield true for all core pixel typedefs");
+
+ static_assert(!mp_all_of
+ <
+ mp_transform
+ <
+ gil::test::fixture::nested_type,
+ gil::test::fixture::representative_pixel_types
+ >,
+ gil::pixel_reference_is_mutable
+ >::value,
+ "pixel_reference_is_mutable should yield true for some representative core pixel types");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp b/src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp
new file mode 100644
index 000000000..f4ce4d84d
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp
@@ -0,0 +1,132 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+template <typename Pixel>
+struct assert_compatible
+{
+ template <typename CompatiblePixel>
+ void operator()(CompatiblePixel&&)
+ {
+ using result_t = typename gil::pixels_are_compatible<Pixel, CompatiblePixel>::type;
+ static_assert(result_t::value, "pixels should be compatible");
+
+ // TODO: Refine after MPL -> MP11 switch
+ static_assert(
+ std::is_same<result_t, std::true_type>::value,
+ "pixels_are_compatible result type should be std::true_type");
+
+ static_assert(
+ !std::is_same<result_t, std::false_type>::value,
+ "pixels_are_compatible result type should no be std::false_type");
+ }
+};
+
+template <typename Pixel>
+struct assert_not_compatible
+{
+ template <typename NotCompatiblePixel>
+ void operator()(NotCompatiblePixel&&)
+ {
+ static_assert(
+ !gil::pixels_are_compatible<Pixel, NotCompatiblePixel>::value,
+ "pixels should not be compatible");
+ }
+};
+
+template <typename Pixel, typename... CompatiblePixels>
+void test_compatible()
+{
+ mp_for_each<CompatiblePixels...>(assert_compatible<Pixel>());
+}
+
+template <typename Pixel, typename... CompatiblePixels>
+void test_not_compatible()
+{
+ mp_for_each<CompatiblePixels...>(assert_not_compatible<Pixel>());
+}
+
+int main()
+{
+ test_compatible<gil::gray8_pixel_t, mp_list<
+ gil::gray8_pixel_t,
+ gil::gray8c_pixel_t>>();
+ test_compatible<gil::gray8s_pixel_t, mp_list<
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t>>();
+ test_not_compatible<gil::gray8_pixel_t, mp_list<
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t>>();
+
+ test_compatible<gil::gray16_pixel_t, mp_list<
+ gil::gray16_pixel_t,
+ gil::gray16c_pixel_t>>();
+ test_compatible<gil::gray16s_pixel_t, mp_list<
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t>>();
+ test_not_compatible<gil::gray16_pixel_t, mp_list<
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t>>();
+
+ test_compatible<gil::rgb8_pixel_t, mp_list<
+ gil::bgr8_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8c_pixel_t>>();
+ test_compatible<gil::rgb8s_pixel_t, mp_list<
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t>>();
+ test_not_compatible<gil::rgb8_pixel_t, mp_list<
+ gil::argb8_pixel_t,
+ gil::abgr8_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t>>();
+
+ test_compatible<gil::rgba8_pixel_t, mp_list<
+ gil::abgr8_pixel_t,
+ gil::argb8_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8c_pixel_t>>();
+ test_not_compatible<gil::rgba8_pixel_t, mp_list<
+ gil::rgb8_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk16_pixel_t>>();
+
+ test_compatible<gil::cmyk8_pixel_t, mp_list<
+ gil::cmyk8_pixel_t,
+ gil::cmyk8c_pixel_t>>();
+ test_compatible<gil::cmyk8s_pixel_t, mp_list<
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t>>();
+ test_not_compatible<gil::cmyk8_pixel_t, mp_list<
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t>>();
+
+ test_compatible<gil::cmyk32f_pixel_t, mp_list<
+ gil::cmyk32f_pixel_t,
+ gil::cmyk32fc_pixel_t>>();
+
+}
diff --git a/src/boost/libs/gil/test/core/pixel/test_fixture.cpp b/src/boost/libs/gil/test/core/pixel/test_fixture.cpp
new file mode 100644
index 000000000..1d6e5d470
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/test_fixture.cpp
@@ -0,0 +1,113 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconversion"
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#pragma clang diagnostic ignored "-Wsign-conversion"
+#elif BOOST_GCC >= 40700
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#endif
+
+#include <boost/gil/channel.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <limits>
+#include <ostream>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_pixel_value_default_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ fixture::pixel_value<pixel_t> fix;
+ pixel_t const default_value{};
+ BOOST_TEST_EQ(fix.pixel_, default_value);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_value_default_constructor{});
+ }
+};
+
+struct test_pixel_value_parameterized_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ // Sample channel value, simplified, could be min, max, random
+ channel_t const sample_channel = 2;
+ pixel_t sample_pixel;
+ gil::static_fill(sample_pixel, sample_channel);
+ fixture::pixel_value<pixel_t> fix{sample_pixel};
+ BOOST_TEST_EQ(fix.pixel_, sample_pixel);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_value_parameterized_constructor{});
+ }
+};
+
+struct test_pixel_reference_default_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ fixture::pixel_reference<pixel_t&> fix;
+ pixel_t pix_default{};
+ BOOST_TEST_EQ(fix.pixel_, pix_default);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_reference_default_constructor{});
+ }
+};
+
+struct test_pixel_reference_parameterized_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ // Sample channel value, simplified, could be min, max, random
+ channel_t const sample_channel = 3;
+ pixel_t sample_pixel;
+ gil::static_fill(sample_pixel, sample_channel);
+ fixture::pixel_reference<pixel_t&> fix{sample_pixel};
+ BOOST_TEST_EQ(fix.pixel_, sample_pixel);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_reference_parameterized_constructor{});
+ }
+};
+
+int main()
+{
+ test_pixel_value_default_constructor::run();
+ test_pixel_value_parameterized_constructor::run();
+ test_pixel_reference_default_constructor::run();
+ test_pixel_reference_parameterized_constructor::run();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/test_fixture.hpp b/src/boost/libs/gil/test/core/pixel/test_fixture.hpp
new file mode 100644
index 000000000..bf4e1ed8d
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/test_fixture.hpp
@@ -0,0 +1,346 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_PIXEL_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_PIXEL_TEST_FIXTURE_HPP
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/color_base_algorithm.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/promote_integral.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp> // channel_type for packed and bit-aligned pixels
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mp11.hpp>
+#include <boost/mp11/mpl.hpp> // for compatibility with Boost.Test
+
+#include <cstdint>
+#include <iterator>
+#include <tuple>
+#include <type_traits>
+
+#include "core/test_fixture.hpp" // random_value
+#include "core/channel/test_fixture.hpp" // channel_minmax_value
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+template <typename Pixel>
+struct pixel_generator
+{
+ using channel_t = typename gil::channel_type<Pixel>::type;
+
+ static auto max() -> Pixel
+ {
+ channel_minmax_value<channel_t> channel;
+ Pixel pixel;
+ gil::static_fill(pixel, channel.max_v_);
+ return pixel;
+ }
+
+ static auto min()-> Pixel
+ {
+ channel_minmax_value<channel_t> channel;
+ Pixel pixel;
+ gil::static_fill(pixel, channel.min_v_);
+ return pixel;
+ }
+
+ static auto random() -> Pixel
+ {
+ random_value<channel_t> generate;
+ Pixel pixel;
+ gil::static_generate(pixel, [&generate]() { return generate(); });
+ return pixel;
+ }
+};
+
+template <typename Pixel, int Tag = 0>
+class pixel_value
+{
+public:
+ using type = Pixel;
+ using pixel_t = type;
+ type pixel_{};
+
+ pixel_value() = default;
+ explicit pixel_value(pixel_t const& pixel)
+ : pixel_(pixel) // test copy constructor
+ {
+ type temp_pixel; // test default constructor
+ boost::ignore_unused(temp_pixel);
+ boost::function_requires<PixelValueConcept<pixel_t> >();
+ }
+};
+
+// Alias compatible with naming of equivalent class in the test/legacy/pixel.cpp
+// The core suffix indicates `Pixel` is GIL core pixel type.
+template <typename Pixel, int Tag = 0>
+using value_core = pixel_value<Pixel, Tag>;
+
+template <typename PixelRef, int Tag = 0>
+struct pixel_reference
+ : pixel_value
+ <
+ typename std::remove_reference<PixelRef>::type,
+ Tag
+ >
+{
+ static_assert(
+ std::is_reference<PixelRef>::value ||
+ gil::is_planar<PixelRef>::value, // poor-man test for specialization of planar_pixel_reference
+ "PixelRef must be reference or gil::planar_pixel_reference");
+
+ using type = PixelRef;
+ using pixel_t = typename std::remove_reference<PixelRef>::type;
+ using parent_t = pixel_value<typename pixel_t::value_type, Tag>;
+ using value_t = typename pixel_t::value_type;
+ type pixel_; // reference
+
+ pixel_reference() : parent_t{}, pixel_(parent_t::pixel_) {}
+ explicit pixel_reference(value_t const& pixel) : parent_t(pixel), pixel_(parent_t::pixel_)
+ {
+ boost::function_requires<PixelConcept<pixel_t>>();
+ }
+};
+
+// Alias compatible with naming of equivalent class in the test/legacy/pixel.cpp
+// The core suffix indicates `Pixel` is GIL core pixel type.
+template <typename Pixel, int Tag = 0>
+using reference_core = pixel_reference<Pixel, Tag>;
+
+// Metafunction to yield nested type of a representative pixel type
+template <typename PixelValueOrReference>
+using nested_type = typename PixelValueOrReference::type;
+
+// Metafunction to yield nested type of a representative pixel_t type
+template <typename PixelValueOrReference>
+using nested_pixel_type = typename PixelValueOrReference::pixel_t;
+
+// Subset of pixel models that covers all color spaces, channel depths,
+// reference/value, planar/interleaved, const/mutable.
+// Operations like color conversion will be invoked on pairs of those.
+using representative_pixel_types= ::boost::mp11::mp_list
+<
+ value_core<gil::gray8_pixel_t>,
+ reference_core<gil::gray16_pixel_t&>,
+ value_core<gil::bgr8_pixel_t>,
+ reference_core<gil::rgb8_planar_ref_t>,
+ value_core<gil::argb32_pixel_t>,
+ reference_core<gil::cmyk32f_pixel_t&>,
+ reference_core<gil::abgr16c_ref_t>, // immutable reference
+ reference_core<gil::rgb32fc_planar_ref_t>
+>;
+
+// List of all integer-based core pixel typedefs (i.e. with cv-qualifiers)
+using pixel_integer_types = ::boost::mp11::mp_list
+<
+ gil::gray8_pixel_t,
+ gil::gray8s_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray16s_pixel_t,
+ gil::gray32_pixel_t,
+ gil::gray32s_pixel_t,
+ gil::bgr8_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr16_pixel_t,
+ gil::bgr16s_pixel_t,
+ gil::bgr32_pixel_t,
+ gil::bgr32s_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgb16s_pixel_t,
+ gil::rgb32_pixel_t,
+ gil::rgb32s_pixel_t,
+ gil::abgr8_pixel_t,
+ gil::abgr8s_pixel_t,
+ gil::abgr16_pixel_t,
+ gil::abgr16s_pixel_t,
+ gil::abgr32_pixel_t,
+ gil::abgr32s_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8s_pixel_t,
+ gil::bgra16_pixel_t,
+ gil::bgra16s_pixel_t,
+ gil::bgra32_pixel_t,
+ gil::bgra32s_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk8s_pixel_t,
+ gil::cmyk16_pixel_t,
+ gil::cmyk16s_pixel_t,
+ gil::cmyk32_pixel_t,
+ gil::cmyk32s_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8s_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::rgba16s_pixel_t,
+ gil::rgba32_pixel_t,
+ gil::rgba32s_pixel_t
+>;
+
+// List of all integer-based core pixel typedefs (i.e. with cv-qualifiers)
+using pixel_float_types = ::boost::mp11::mp_list
+<
+ gil::gray32f_pixel_t,
+ gil::bgr32f_pixel_t,
+ gil::rgb32f_pixel_t,
+ gil::abgr32f_pixel_t,
+ gil::bgra32f_pixel_t,
+ gil::cmyk32f_pixel_t,
+ gil::rgba32f_pixel_t
+>;
+
+// List of all core pixel types (i.e. without cv-qualifiers)
+using pixel_types = ::boost::mp11::mp_append
+<
+ pixel_integer_types,
+ pixel_float_types
+>;
+
+// List of all core pixel typedefs (i.e. with cv-qualifiers)
+using pixel_typedefs = ::boost::mp11::mp_append
+<
+ pixel_integer_types,
+ pixel_float_types,
+ ::boost::mp11::mp_list
+ <
+ gil::gray8c_pixel_t,
+ gil::gray8sc_pixel_t,
+ gil::gray16c_pixel_t,
+ gil::gray16sc_pixel_t,
+ gil::gray32c_pixel_t,
+ gil::gray32fc_pixel_t,
+ gil::gray32sc_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::bgr16c_pixel_t,
+ gil::bgr16sc_pixel_t,
+ gil::bgr32c_pixel_t,
+ gil::bgr32fc_pixel_t,
+ gil::bgr32sc_pixel_t,
+ gil::rgb8c_pixel_t,
+ gil::rgb8sc_pixel_t,
+ gil::rgb16c_pixel_t,
+ gil::rgb16sc_pixel_t,
+ gil::rgb32c_pixel_t,
+ gil::rgb32fc_pixel_t,
+ gil::rgb32sc_pixel_t,
+ gil::abgr8c_pixel_t,
+ gil::abgr8sc_pixel_t,
+ gil::abgr16c_pixel_t,
+ gil::abgr16sc_pixel_t,
+ gil::abgr32c_pixel_t,
+ gil::abgr32fc_pixel_t,
+ gil::abgr32sc_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::bgra8sc_pixel_t,
+ gil::bgra16c_pixel_t,
+ gil::bgra16sc_pixel_t,
+ gil::bgra32c_pixel_t,
+ gil::bgra32fc_pixel_t,
+ gil::bgra32sc_pixel_t,
+ gil::cmyk8c_pixel_t,
+ gil::cmyk8sc_pixel_t,
+ gil::cmyk16c_pixel_t,
+ gil::cmyk16sc_pixel_t,
+ gil::cmyk32c_pixel_t,
+ gil::cmyk32fc_pixel_t,
+ gil::cmyk32sc_pixel_t,
+ gil::rgba8c_pixel_t,
+ gil::rgba8sc_pixel_t,
+ gil::rgba16c_pixel_t,
+ gil::rgba16sc_pixel_t,
+ gil::rgba32c_pixel_t,
+ gil::rgba32fc_pixel_t,
+ gil::rgba32sc_pixel_t
+ >
+>;
+
+struct not_a_pixel_type {};
+
+using non_pixels = ::boost::mp11::mp_list
+<
+ not_a_pixel_type,
+ char,
+ short, int, long,
+ double, float,
+ std::size_t,
+ std::true_type,
+ std::false_type
+>;
+
+using packed_channel_references_3 = typename gil::detail::packed_channel_references_vector_type
+<
+ std::uint8_t,
+ mp11::mp_list_c<int, 3>
+>::type;
+
+using packed_pixel_gray3 = gil::packed_pixel
+<
+ std::uint8_t,
+ packed_channel_references_3,
+ gil::gray_layout_t
+>;
+
+using packed_channel_references_121 = typename gil::detail::packed_channel_references_vector_type
+<
+ std::uint8_t,
+ mp11::mp_list_c<int, 1, 2, 1>
+>::type;
+
+using packed_pixel_bgr121 = gil::packed_pixel
+<
+ std::uint8_t,
+ packed_channel_references_121,
+ gil::bgr_layout_t
+>;
+
+using packed_channel_references_535 = typename gil::detail::packed_channel_references_vector_type
+<
+ std::uint16_t,
+ mp11::mp_list_c<int, 5, 3, 5>
+>::type;
+
+using packed_pixel_rgb535 = gil::packed_pixel
+<
+ std::uint16_t,
+ packed_channel_references_535,
+ gil::rgb_layout_t
+>;
+
+using bit_aligned_pixel_bgr232_refefence = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t,
+ mp11::mp_list_c<int, 2, 3, 2>,
+ gil::bgr_layout_t,
+ true
+ > const;
+
+using bit_aligned_pixel_bgr232_iterator = bit_aligned_pixel_iterator<bit_aligned_pixel_bgr232_refefence>;
+
+using bit_aligned_pixel_bgr232 = std::iterator_traits<bit_aligned_pixel_bgr232_iterator>::value_type;
+
+using bit_aligned_pixel_rgb567_refefence = gil::bit_aligned_pixel_reference
+ <
+ std::uint32_t,
+ mp11::mp_list_c<int, 5, 6, 7>,
+ gil::rgb_layout_t,
+ true
+ > const;
+
+using bit_aligned_pixel_rgb567_iterator = bit_aligned_pixel_iterator<bit_aligned_pixel_rgb567_refefence>;
+
+using bit_aligned_pixel_rgb567 = std::iterator_traits<bit_aligned_pixel_rgb567_iterator>::value_type;
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/core/point/CMakeLists.txt b/src/boost/libs/gil/test/core/point/CMakeLists.txt
new file mode 100644
index 000000000..e30f6752b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ point)
+ set(_test t_core_point_${_name})
+ set(_target test_core_point_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/point/Jamfile b/src/boost/libs/gil/test/core/point/Jamfile
new file mode 100644
index 000000000..4d0a82928
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/Jamfile
@@ -0,0 +1,14 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile-fail multiply_by_non_arithmetic_fail.cpp ;
+
+run point.cpp ;
diff --git a/src/boost/libs/gil/test/core/point/concepts.cpp b/src/boost/libs/gil/test/core/point/concepts.cpp
new file mode 100644
index 000000000..09c04c524
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/concepts.cpp
@@ -0,0 +1,51 @@
+//
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/point.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+
+template <typename Point>
+void test_members()
+{
+ static_assert(Point::num_dimensions == 2U, "point is not 2D");
+
+ using value_t = typename Point::value_type;
+ using coord_t = typename Point::template axis<0>::coord_t;
+ static_assert(std::is_same<value_t, coord_t>::value,
+ "point and axis type mismatch");
+}
+
+int main()
+{
+ boost::function_requires<gil::PointNDConcept<gil::point<int>>>();
+ boost::function_requires<gil::PointNDConcept<gil::point_t>>();
+
+ boost::function_requires<gil::Point2DConcept<gil::point<int>>>();
+ boost::function_requires<gil::Point2DConcept<gil::point_t>>();
+
+ test_members<gil::point<int>>();
+ test_members<gil::point_t>();
+
+ // NOTE: point2 is deprecated, available for backward compatibility
+ boost::function_requires<gil::PointNDConcept<gil::point2<int>>>();
+ boost::function_requires<gil::Point2DConcept<gil::point2<int>>>();
+ test_members<gil::point2<int>>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp b/src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp
new file mode 100644
index 000000000..b5c703109
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/point.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct FakeMatrix {};
+
+int main()
+{
+ gil::point<int> p1{2, 4};
+
+ FakeMatrix m1;
+ auto r1 = p1 * m1;
+ auto r2 = m1 * p1;
+}
diff --git a/src/boost/libs/gil/test/core/point/point.cpp b/src/boost/libs/gil/test/core/point/point.cpp
new file mode 100644
index 000000000..00e52f212
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/point.cpp
@@ -0,0 +1,235 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/point.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_default_constructor()
+{
+ gil::point<int> p;
+ BOOST_TEST_EQ(p.x, 0);
+ BOOST_TEST_EQ(p.y, 0);
+}
+
+void test_user_constructor()
+{
+ gil::point<int> p{1, 2};
+ BOOST_TEST_EQ(p.x, 1);
+ BOOST_TEST_EQ(p.y, 2);
+}
+
+void test_copy_constructor()
+{
+ gil::point<int> p1{1, 2};
+ gil::point<int> p2{p1};
+ BOOST_TEST_EQ(p1.x, p2.x);
+ BOOST_TEST_EQ(p1.y, p2.y);
+}
+
+void test_copy_assignment_operator()
+{
+ gil::point<int> p1{1, 2};
+ gil::point<int> p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1.x, p2.x);
+ BOOST_TEST_EQ(p1.y, p2.y);
+}
+
+void test_index_operator()
+{
+ gil::point<int> p{1, 2};
+ BOOST_TEST_EQ(p[0], 1);
+ BOOST_TEST_EQ(p[1], 2);
+}
+
+void test_addition_operator()
+{
+ gil::point<int> p1{1, 1};
+ gil::point<int> const p2{2, 4};
+ auto p3 = p1 + p2;
+ BOOST_TEST_EQ(p3.x, 3);
+ BOOST_TEST_EQ(p3.y, 5);
+}
+
+void test_addition_assignment_operator()
+{
+ gil::point<int> p1{1, 1};
+ gil::point<int> const p2{2, 4};
+ p1 += p2;
+ BOOST_TEST_EQ(p1.x, 3);
+ BOOST_TEST_EQ(p1.y, 5);
+}
+
+void test_subtraction_assignment_operator()
+{
+ gil::point<int> p1{2, 4};
+ gil::point<int> const p2{1, 1};
+ p1 -= p2;
+ BOOST_TEST_EQ(p1.x, 1);
+ BOOST_TEST_EQ(p1.y, 3);
+}
+
+void test_subtraction_operator()
+{
+ gil::point<int> p1{2, 4};
+ gil::point<int> const p2{1, 1};
+ p1 = p1 - p2;
+ BOOST_TEST_EQ(p1.x, 1);
+ BOOST_TEST_EQ(p1.y, 3);
+}
+
+void test_unary_minus_operator()
+{
+ gil::point<int> p1{2, 4};
+ auto p2 = -p1;
+ BOOST_TEST_EQ(p2.x, -2);
+ BOOST_TEST_EQ(p2.y, -4);
+ p2 = -p2;
+ BOOST_TEST_EQ(p2.x, p1.x);
+ BOOST_TEST_EQ(p2.y, p1.y);
+}
+
+void test_division_assignment_operator()
+{
+ {
+ gil::point<int> p1{2, 4};
+ p1 /= 2;
+ static_assert(std::is_same<decltype((p1 / short{}).x), int>::value, "!int");
+ static_assert(std::is_same<decltype((p1 / int{}).x), int>::value, "!int");
+ static_assert(std::is_same<decltype((p1 / float{}).x), float>::value, "!float");
+ static_assert(std::is_same<decltype((p1 / double{}).x), double>::value, "!double");
+ BOOST_TEST_EQ(p1.x, 1);
+ BOOST_TEST_EQ(p1.y, 2);
+ }
+ // point / d
+ {
+ gil::point<int> p1{2, 4};
+ auto p2 = p1 / float{2};
+ static_assert(std::is_same<decltype((p2 / int{}).x), float>::value, "!float");
+ static_assert(std::is_same<decltype((p2 / float{}).x), float>::value, "!float");
+ static_assert(std::is_same<decltype((p2 / double{}).x), double>::value, "!double");
+ BOOST_TEST_GE(p2.x, 1.0); // means, but >= avoids compiler warning
+ BOOST_TEST_GE(p2.y, 2.0);
+ }
+}
+
+void test_multiplication_operator()
+{
+ gil::point<int> p1{2, 4};
+ p1 *= 2;
+ BOOST_TEST_EQ(p1.x, 4);
+ BOOST_TEST_EQ(p1.y, 8);
+
+ // point * m
+ {
+ auto p2 = p1 * int{2};
+ static_assert(std::is_same<decltype(p2.x), int>::value, "!int");
+ static_assert(std::is_same<decltype(p2.y), int>::value, "!int");
+ BOOST_TEST_EQ(p2.x, 8);
+ BOOST_TEST_EQ(p2.y, 16);
+ }
+ // m * point
+ {
+ auto p2 = double{2} *p1;
+ static_assert(std::is_same<decltype(p2.x), double>::value, "!double");
+ static_assert(std::is_same<decltype(p2.y), double>::value, "!double");
+ BOOST_TEST_GE(p2.x, 8); // means, but >= avoids compiler warning
+ BOOST_TEST_GE(p2.y, 16);
+ }
+}
+
+void test_multiplication_assignment_operator()
+{
+ gil::point<int> p1{2, 4};
+ // point * m
+ {
+ auto p2 = p1 * int{2};
+ static_assert(std::is_same<decltype(p2.x), int>::value, "!int");
+ static_assert(std::is_same<decltype(p2.y), int>::value, "!int");
+ BOOST_TEST_EQ(p2.x, 4);
+ BOOST_TEST_EQ(p2.y, 8);
+ }
+ // m * point
+ {
+ auto p2 = double{2} * p1;
+ static_assert(std::is_same<decltype(p2.x), double>::value, "!double");
+ static_assert(std::is_same<decltype(p2.y), double>::value, "!double");
+ BOOST_TEST_GE(p2.x, 4); // means, but >= avoids compiler warning
+ BOOST_TEST_GE(p2.y, 8);
+ }
+}
+
+void test_bitwise_left_shift_operator()
+{
+ gil::point<unsigned int> p{2, 4};
+ p = p << 1;
+ BOOST_TEST_EQ(p.x, 4u);
+ BOOST_TEST_EQ(p.y, 8u);
+}
+
+void test_bitwise_right_shift_operator()
+{
+ gil::point<unsigned int> p{2, 4};
+ p = p >> 1;
+ BOOST_TEST_EQ(p.x, 2u / 2);
+ BOOST_TEST_EQ(p.y, 4u / 2);
+}
+
+void test_equal_to_operator()
+{
+ gil::point<int> p1{2, 4};
+ gil::point<int> p2{2, 4};
+ BOOST_TEST_EQ(p1, p2);
+}
+
+void test_not_equal_to_operator()
+{
+ gil::point<int> p1{1, 1};
+ gil::point<int> p2{2, 4};
+ BOOST_TEST_NE(p1, p2);
+}
+
+void test_axis_value()
+{
+ gil::point<int> p1{1, 2};
+ gil::point<int> const p2{1, 2};
+ BOOST_TEST_EQ(gil::axis_value<0>(p1), p1.x);
+ BOOST_TEST_EQ(gil::axis_value<1>(p1), p1.y);
+ BOOST_TEST_EQ(gil::axis_value<0>(p2), p2.x);
+ BOOST_TEST_EQ(gil::axis_value<1>(p2), p2.y);
+}
+
+int main()
+{
+ test_default_constructor();
+ test_user_constructor();
+ test_copy_constructor();
+ test_copy_assignment_operator();
+ test_index_operator();
+ test_addition_operator();
+ test_addition_assignment_operator();
+ test_subtraction_assignment_operator();
+ test_subtraction_operator();
+ test_unary_minus_operator();
+ test_division_assignment_operator();
+ test_multiplication_operator();
+ test_multiplication_assignment_operator();
+ test_bitwise_left_shift_operator();
+ test_bitwise_right_shift_operator();
+ test_equal_to_operator();
+ test_not_equal_to_operator();
+ test_axis_value();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/promote_integral.cpp b/src/boost/libs/gil/test/core/promote_integral.cpp
new file mode 100644
index 000000000..d0e97c820
--- /dev/null
+++ b/src/boost/libs/gil/test/core/promote_integral.cpp
@@ -0,0 +1,370 @@
+// Boost.GIL (Generic Image Library)
+//
+// Copyright (c) 2015, Oracle and/or its affiliates.
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+//
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+//
+// Source: Boost.Geometry (aka GGL, Generic Geometry Library)
+// Modifications: adapted for Boost.GIL
+// - Rename namespace boost::geometry to boost::gil
+// - Rename define BOOST_GEOMETRY_TEST_DEBUG to BOOST_GIL_TEST_DEBUG
+// - Remove use of macro BOOST_GEOMETRY_CONDITION
+// - Remove support for boost::multiprecision types
+// - Remove support for 128-bit integer types
+// - Update and sort includes
+// - Add explicit conversions to avoid warnings due to implicit integral promotions
+//
+// Uncomment to enable debugging output
+//#define BOOST_GIL_TEST_DEBUG 1
+#include <boost/config.hpp> // BOOST_HAS_LONG_LONG
+#include <boost/gil/promote_integral.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <algorithm>
+#include <climits>
+#include <cstddef>
+#ifdef BOOST_GIL_TEST_DEBUG
+#include <iostream>
+#endif
+#include <limits>
+#include <string>
+
+namespace bg = boost::gil;
+
+template
+<
+ typename T,
+ bool Signed = std::is_fundamental<T>::value && !std::is_unsigned<T>::type::value
+>
+struct absolute_value
+{
+ static inline T apply(T const& t)
+ {
+ return static_cast<T>(t < 0 ? -t : t);
+ }
+};
+
+template <typename T>
+struct absolute_value<T, false>
+{
+ static inline T apply(T const& t)
+ {
+ return t;
+ }
+};
+
+template
+ <
+ typename Integral,
+ typename Promoted,
+ bool Signed = !std::is_unsigned<Promoted>::value
+ >
+struct test_max_values
+{
+ static inline void apply()
+ {
+ // Use >= where value is guaranteed to never be greater than comparator
+ // but to avoid warning: comparing floating point with == is unsafe.
+
+ Promoted min_value = (std::numeric_limits<Integral>::min)();
+ // Explicit casts to avoid warning: conversion to short int from int may alter its value
+ min_value = static_cast<Promoted>(min_value * min_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(min_value) >= min_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(min_value) <= min_value);
+ Promoted max_value = (std::numeric_limits<Integral>::max)();
+ max_value = static_cast<Promoted>(max_value * max_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(max_value) >= max_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(max_value) <= max_value);
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "integral min_value^2: " << min_value << std::endl;
+ std::cout << "promoted max_value: "
+ << (std::numeric_limits<Promoted>::max)() << std::endl;
+#endif
+ }
+};
+
+template <typename Integral, typename Promoted>
+struct test_max_values<Integral, Promoted, false>
+{
+ static inline void apply()
+ {
+ Promoted max_value = (std::numeric_limits<Integral>::max)();
+ Promoted max_value_sqr = static_cast<Promoted>(max_value * max_value);
+ BOOST_TEST(max_value_sqr < (std::numeric_limits<Promoted>::max)()
+ &&
+ max_value_sqr > max_value);
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "integral max_value^2: " << max_value_sqr << std::endl;
+ std::cout << "promoted max_value: "
+ << (std::numeric_limits<Promoted>::max)() << std::endl;
+#endif
+ }
+};
+
+
+// helper function that returns the bit size of a type
+template
+ <
+ typename T,
+ bool IsFundamental = std::is_fundamental<T>::value
+ >
+struct bit_size_impl : std::integral_constant<std::size_t, 0>
+{};
+
+template <typename T>
+struct bit_size_impl<T, true> : bg::detail::promote_integral::bit_size<T>::type
+{};
+
+template <typename T>
+std::size_t bit_size()
+{
+ return bit_size_impl<T>::value;
+}
+
+#define BOOST_CHECK_MESSAGE(expr, msg) BOOST_TEST(expr)
+
+template <bool PromoteUnsignedToUnsigned>
+struct test_promote_integral
+{
+ template <typename Type, typename ExpectedPromotedType>
+ static inline void apply(std::string const& case_id)
+ {
+ using promoted_integral_type = typename bg::promote_integral
+ <
+ Type, PromoteUnsignedToUnsigned
+ >::type;
+
+ bool const same_types = std::is_same
+ <
+ promoted_integral_type, ExpectedPromotedType
+ >::value;
+
+ BOOST_CHECK_MESSAGE(same_types,
+ "case ID: " << case_id
+ << "input type: " << typeid(Type).name()
+ << "; detected: "
+ << typeid(promoted_integral_type).name()
+ << "; expected: "
+ << typeid(ExpectedPromotedType).name());
+
+ if (!std::is_same<Type, promoted_integral_type>::value)
+ {
+ test_max_values<Type, promoted_integral_type>::apply();
+ }
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "case ID: " << case_id << std::endl
+ << "type : " << typeid(Type).name()
+ << ", sizeof (bits): " << bit_size<Type>()
+ << ", min value: "
+ << (std::numeric_limits<Type>::min)()
+ << ", max value: "
+ << (std::numeric_limits<Type>::max)()
+ << std::endl;
+ std::cout << "detected promoted type : "
+ << typeid(promoted_integral_type).name()
+ << ", sizeof (bits): " << bit_size<promoted_integral_type>()
+ << ", min value: "
+ << (std::numeric_limits<promoted_integral_type>::min)()
+ << ", max value: "
+ << (std::numeric_limits<promoted_integral_type>::max)()
+ << std::endl;
+ std::cout << "expected promoted type : "
+ << typeid(ExpectedPromotedType).name()
+ << ", sizeof (bits): " << bit_size<ExpectedPromotedType>()
+ << ", min value: "
+ << (std::numeric_limits<ExpectedPromotedType>::min)()
+ << ", max value: "
+ << (std::numeric_limits<ExpectedPromotedType>::max)()
+ << std::endl;
+ std::cout << std::endl;
+#endif
+ }
+};
+
+template
+ <
+ typename T,
+ bool PromoteUnsignedToUnsigned = false,
+ bool IsSigned = !std::is_unsigned<T>::value
+ >
+struct test_promotion
+{
+ static inline void apply(std::string case_id)
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "*** "
+ << (IsSigned ? "signed" : "unsigned")
+ << " -> signed ***" << std::endl;
+#endif
+
+ using tester = test_promote_integral<PromoteUnsignedToUnsigned>;
+
+ case_id += (PromoteUnsignedToUnsigned ? "-t" : "-f");
+
+ std::size_t min_size = 2 * bit_size<T>() - 1;
+ if (!IsSigned)
+ {
+ min_size += 2;
+ }
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "min size: " << min_size << std::endl;
+#endif
+
+ if (bit_size<short>() >= min_size)
+ {
+ tester::template apply<T, short>(case_id);
+ }
+ else if (bit_size<int>() >= min_size)
+ {
+ tester::template apply<T, int>(case_id);
+ }
+ else if (bit_size<long>() >= min_size)
+ {
+ tester::template apply<T, long>(case_id);
+ }
+#if defined(BOOST_HAS_LONG_LONG)
+ else if (bit_size<boost::long_long_type>() >= min_size)
+ {
+ tester::template apply<T, boost::long_long_type>(case_id);
+ }
+#endif
+ else
+ {
+ tester::template apply<T, T>(case_id);
+ }
+ }
+};
+
+template <typename T>
+struct test_promotion<T, true, false>
+{
+ static inline void apply(std::string case_id)
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "*** unsigned -> unsigned ***" << std::endl;
+#endif
+ case_id += "-t";
+
+ using tester = test_promote_integral<true>;
+
+ std::size_t min_size = 2 * bit_size<T>();
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "min size: " << min_size << std::endl;
+#endif
+
+ if (bit_size<unsigned short>() >= min_size)
+ {
+ tester::apply<T, unsigned short>(case_id);
+ }
+ else if (bit_size<unsigned int>() >= min_size)
+ {
+ tester::apply<T, unsigned int>(case_id);
+ }
+ else if (bit_size<unsigned long>() >= min_size)
+ {
+ tester::apply<T, unsigned long>(case_id);
+ }
+ else if (bit_size<std::size_t>() >= min_size)
+ {
+ tester::apply<T, std::size_t>(case_id);
+ }
+#if defined(BOOST_HAS_LONG_LONG)
+ else if (bit_size<boost::ulong_long_type>() >= min_size)
+ {
+ tester::template apply<T, boost::ulong_long_type>(case_id);
+ }
+#endif
+ else
+ {
+ tester::apply<T, T>(case_id);
+ }
+ }
+};
+
+void test_char()
+{
+ test_promotion<char>::apply("char");
+ test_promotion<char, true>::apply("char");
+ test_promotion<signed char>::apply("schar");
+ test_promotion<signed char, true>::apply("schar");
+ test_promotion<unsigned char>::apply("uchar");
+ test_promotion<unsigned char, true>::apply("uchar");
+}
+
+void test_short()
+{
+ test_promotion<short>::apply("short");
+ test_promotion<short, true>::apply("short");
+ test_promotion<unsigned short>::apply("ushort");
+ test_promotion<unsigned short, true>::apply("ushort");
+}
+
+void test_int()
+{
+ test_promotion<int>::apply("int");
+ test_promotion<int, true>::apply("int");
+ test_promotion<unsigned int>::apply("uint");
+ test_promotion<unsigned int, true>::apply("uint");
+}
+
+void test_long()
+{
+ test_promotion<long>::apply("long");
+ test_promotion<long, true>::apply("long");
+ test_promotion<unsigned long>::apply("ulong");
+ test_promotion<unsigned long, true>::apply("ulong");
+}
+
+void test_std_size_t()
+{
+ test_promotion<std::size_t>::apply("size_t");
+ test_promotion<std::size_t, true>::apply("size_t");
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+void test_long_long()
+{
+ test_promotion<boost::long_long_type>::apply("long long");
+ test_promotion<boost::long_long_type, true>::apply("long long");
+ test_promotion<boost::ulong_long_type>::apply("ulong long");
+ test_promotion<boost::ulong_long_type, true>::apply("ulong long");
+}
+#endif
+
+void test_floating_point()
+{
+ using tester1 = test_promote_integral<true>;
+ using tester2 = test_promote_integral<false>;
+
+ // for floating-point types we do not do any promotion
+ tester1::apply<float, float>("fp-f");
+ tester1::apply<double, double>("fp-d");
+ tester1::apply<long double, long double>("fp-ld");
+
+ tester2::apply<float, float>("fp-f");
+ tester2::apply<double, double>("fp-d");
+ tester2::apply<long double, long double>("fp-ld");
+}
+
+int main()
+{
+ test_char();
+ test_short();
+ test_int();
+ test_long();
+ test_std_size_t();
+#ifdef BOOST_HAS_LONG_LONG
+ test_long_long();
+#endif
+ test_floating_point();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/test_fixture.cpp b/src/boost/libs/gil/test/core/test_fixture.cpp
new file mode 100644
index 000000000..d0de5964d
--- /dev/null
+++ b/src/boost/libs/gil/test/core/test_fixture.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconversion"
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#pragma clang diagnostic ignored "-Wsign-conversion"
+#elif BOOST_GCC >= 40700
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#endif
+
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <algorithm>
+#include <cstdint>
+#include <vector>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_consecutive_value()
+{
+ fixture::consecutive_value<std::uint8_t> v(10);
+ BOOST_TEST_EQ(v(), std::uint8_t{11});
+ BOOST_TEST_EQ(v(), std::uint8_t{12});
+ BOOST_TEST_EQ(v(), std::uint8_t{13});
+}
+
+void test_reverse_consecutive_value()
+{
+ fixture::reverse_consecutive_value<std::uint8_t> v(10);
+ BOOST_TEST_EQ(v(), std::uint8_t{9});
+ BOOST_TEST_EQ(v(), std::uint8_t{8});
+ BOOST_TEST_EQ(v(), std::uint8_t{7});
+}
+
+void test_random_value()
+{
+ // Generate N pseudo-random values
+ fixture::random_value<std::uint8_t> random;
+ std::vector<std::uint8_t> v(10, 0);
+ for (auto& i : v) i = random();
+
+ // Require not all of N values are equal (duplicates are possible!)
+ std::sort(v.begin(), v.end());
+ auto last = std::unique(v.begin(), v.end());
+ v.erase(last, v.end());
+ BOOST_TEST_GT(v.size(), 0);
+ BOOST_TEST_LE(v.size(), 10);
+}
+
+int main()
+{
+ test_consecutive_value();
+ test_reverse_consecutive_value();
+ test_random_value();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/test_fixture.hpp b/src/boost/libs/gil/test/core/test_fixture.hpp
new file mode 100644
index 000000000..819b2cac2
--- /dev/null
+++ b/src/boost/libs/gil/test/core/test_fixture.hpp
@@ -0,0 +1,82 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_TEST_FIXTURE_HPP
+
+#include <boost/gil/promote_integral.hpp>
+#include <boost/assert.hpp>
+
+#include <cstdint>
+#include <initializer_list>
+#include <limits>
+#include <random>
+#include <tuple>
+#include <type_traits>
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+template <typename T>
+struct consecutive_value
+{
+ consecutive_value(T start) : current_(start)
+ {
+ BOOST_ASSERT(static_cast<int>(current_) >= 0);
+ }
+
+ T operator()()
+ {
+ BOOST_ASSERT(static_cast<int>(current_) + 1 > 0);
+ current_++;
+ return current_;
+ }
+
+ T current_;
+};
+
+template <typename T>
+struct reverse_consecutive_value
+{
+ reverse_consecutive_value(T start) : current_(start)
+ {
+ BOOST_ASSERT(static_cast<int>(current_) > 0);
+ }
+
+ T operator()()
+ {
+ BOOST_ASSERT(static_cast<int>(current_) + 1 >= 0);
+ current_--;
+ return current_;
+ }
+
+ T current_;
+};
+
+template <typename T>
+struct random_value
+{
+ static_assert(std::is_integral<T>::value, "T must be integral type");
+ static constexpr auto range_min = std::numeric_limits<T>::min();
+ static constexpr auto range_max = std::numeric_limits<T>::max();
+
+ random_value() : rng_(rd_()), uid_(range_min, range_max) {}
+
+ T operator()()
+ {
+ auto value = uid_(rng_);
+ BOOST_ASSERT(range_min <= value && value <= range_max);
+ return static_cast<T>(value);
+ }
+
+ std::random_device rd_;
+ std::mt19937 rng_;
+ std::uniform_int_distribution<typename gil::promote_integral<T>::type> uid_;
+};
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/extension/CMakeLists.txt b/src/boost/libs/gil/test/extension/CMakeLists.txt
new file mode 100644
index 000000000..b642d2b29
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/CMakeLists.txt
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+if(BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE)
+ add_subdirectory(dynamic_image)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_NUMERIC)
+ add_subdirectory(numeric)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_TOOLBOX)
+ add_subdirectory(toolbox)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_IO)
+ add_subdirectory(io)
+endif()
diff --git a/src/boost/libs/gil/test/extension/Jamfile b/src/boost/libs/gil/test/extension/Jamfile
new file mode 100644
index 000000000..cf9ef4089
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/Jamfile
@@ -0,0 +1,12 @@
+# Boost.GIL (Generic Image Library) - extensions tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+build-project dynamic_image ;
+build-project numeric ;
+build-project toolbox ;
+build-project io ;
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt b/src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt
new file mode 100644
index 000000000..cf80e8f8c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/dynamic_image")
+foreach(_name
+ subimage_view)
+ set(_test t_ext_dynamic_image_${_name})
+ set(_target test_ext_dynamic_image_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/Jamfile b/src/boost/libs/gil/test/extension/dynamic_image/Jamfile
new file mode 100644
index 000000000..5f9bdd23a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - dynamic_image tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+alias headers : [ generate_self_contained_headers extension/dynamic_image ] ;
+
+run subimage_view.cpp ;
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp b/src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp
new file mode 100644
index 000000000..b1e22ae5f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_subimage_equals_image
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ fixture::dynamic_image i0(fixture::create_image<image_t>(4, 4, 128));
+ auto const v0 = gil::const_view(i0);
+ BOOST_TEST_EQ(v0.dimensions().x, 4);
+ BOOST_TEST_EQ(v0.dimensions().y, 4);
+ BOOST_TEST_EQ(v0.size(), 4 * 4);
+
+ // request with 2 x point_t values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), {0, 0}, i0.dimensions());
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST_EQ(v0.size(), v1.size());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ // request with 4 x dimension values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), 0, 0, i0.dimensions().x, i0.dimensions().y);
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST_EQ(v0.size(), v1.size());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image{});
+ }
+};
+
+struct test_subimage_equals_image_quadrants
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ fixture::dynamic_image i0(fixture::create_image<image_t>(4, 4, 0));
+ auto v0 = gil::view(i0);
+ // create test image and set values of pixels in:
+ // quadrant 1
+ auto const i1 = fixture::create_image<image_t>(2, 2, 255);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({2, 3, 6, 7}, gil::const_view(i1)[0]));
+ // quadrant 2
+ auto const i2 = fixture::create_image<image_t>(2, 2, 128);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({0, 1, 4, 5}, gil::const_view(i2)[0]));
+ // quadrant 3
+ auto const i3 = fixture::create_image<image_t>(2, 2, 64);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({8, 9, 12, 13}, gil::const_view(i3)[0]));
+ // quadrant 4
+ auto const i4 = fixture::create_image<image_t>(2, 2, 32);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({10, 11, 14, 15}, gil::const_view(i4)[0]));
+
+ auto v1 = gil::subimage_view(gil::view(i0), { 2, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v1, gil::const_view(i1)));
+ auto v2 = gil::subimage_view(gil::view(i0), { 0, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v2, gil::const_view(i2)));
+ auto v3 = gil::subimage_view(gil::view(i0), { 0, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v3, gil::const_view(i3)));
+ auto v4 = gil::subimage_view(gil::view(i0), { 2, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v4, gil::const_view(i4)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image_quadrants{});
+ }
+};
+
+int main()
+{
+ test_subimage_equals_image::run();
+ test_subimage_equals_image_quadrants::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp b/src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp
new file mode 100644
index 000000000..00b1b38cf
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp
@@ -0,0 +1,61 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/any_image.hpp>
+#include <boost/mp11.hpp>
+
+#include <tuple>
+
+namespace boost { namespace gil {
+
+namespace test { namespace fixture {
+
+using dynamic_image = gil::any_image
+<
+ boost::mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::gray32_image_t,
+ gil::bgr8_image_t,
+ gil::bgr16_image_t,
+ gil::bgr32_image_t,
+ gil::rgb8_image_t,
+ gil::rgb16_image_t,
+ gil::rgb32_image_t,
+ gil::rgba8_image_t,
+ gil::rgba16_image_t,
+ gil::rgba32_image_t
+ >
+>;
+
+template <typename Image>
+struct fill_any_view
+{
+ using result_type = void;
+ using pixel_t = typename Image::value_type;
+
+ fill_any_view(std::initializer_list<int> dst_view_indices, pixel_t pixel_value)
+ : dst_view_indices_(dst_view_indices), pixel_value_(pixel_value)
+ {}
+
+ template <typename View>
+ void operator()(View& /*dst_view*/) { /* sink any other views here */ }
+
+ void operator()(typename Image::view_t& dst_view)
+ {
+ // sink view of interest here
+ for (auto const& i : dst_view_indices_)
+ dst_view[i] = pixel_value_;
+ }
+
+ std::initializer_list<int> dst_view_indices_;
+ pixel_t pixel_value_;
+};
+
+}}}} // namespace boost::gil::test::fixture
diff --git a/src/boost/libs/gil/test/extension/io/CMakeLists.txt b/src/boost/libs/gil/test/extension/io/CMakeLists.txt
new file mode 100644
index 000000000..bc4fe25a4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/CMakeLists.txt
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2017-2020 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/io")
+
+add_executable(test_ext_io_simple "simple_all_formats.cpp")
+target_link_libraries(test_ext_io_simple
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+add_test(NAME t_ext_io_simple COMMAND test_ext_io_simple)
+
+# TODO: Add <format>/CMakeLists.txt configuration for each format ~mloskot
diff --git a/src/boost/libs/gil/test/extension/io/Jamfile b/src/boost/libs/gil/test/extension/io/Jamfile
new file mode 100644
index 000000000..6e1705d7c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/Jamfile
@@ -0,0 +1,49 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using libjpeg : : : : true ; # work around bug on master
+using zlib ;
+using libpng : : : : true ;
+using libtiff : : : : true ;
+
+lib libraw : : <name>raw ;
+
+project
+ :
+ requirements
+ <include>.
+ ;
+
+alias headers : [ generate_self_contained_headers extension/io ] ;
+explicit headers ;
+
+# The `simple` in names of targets, somewhat misleading, means two things:
+# - minimal set of tests
+# - set of tests that require third-party libraries which are de-facto ubiquitous
+alias simple
+ :
+ [
+ run simple_all_formats.cpp
+ : # args
+ : # input files
+ : # requirements
+ <library>/boost/filesystem//boost_filesystem
+ [ ac.check-library /libjpeg//libjpeg : <library>/libjpeg//libjpeg : <build>no ]
+ [ ac.check-library /zlib//zlib : <library>/zlib//zlib : <build>no ]
+ [ ac.check-library /libpng//libpng : <library>/libpng//libpng : <build>no ]
+ [ ac.check-library /libtiff//libtiff : <library>/libtiff//libtiff : <build>no ]
+ ]
+ ;
+
+alias full : bmp jpeg png pnm raw targa tiff ;
+explicit full ;
diff --git a/src/boost/libs/gil/test/extension/io/bmp/Jamfile b/src/boost/libs/gil/test/extension/io/bmp/Jamfile
new file mode 100644
index 000000000..f1cfe092a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/Jamfile
@@ -0,0 +1,26 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+# TODO: Download BMP test suite images and build with <define>BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <library>/boost/filesystem//boost_filesystem
+ ;
+
+run bmp_make.cpp ;
+
+run bmp_test.cpp ;
+run bmp_read_test.cpp ;
+run bmp_write_test.cpp ;
+
+run bmp_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp
new file mode 100644
index 000000000..26be07726
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp
@@ -0,0 +1,289 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/gil.hpp>
+#include <boost/gil/detail/mp11.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <string>
+#include <type_traits>
+
+#include "paths.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+
+void test_make_reader_backend()
+{
+ {
+ static_assert(
+ std::is_same<gil::detail::is_supported_path_spec<char*>::type, std::true_type>::value,
+ "");
+
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type backend_char =
+ gil::make_reader_backend(bmp_filename.c_str(), gil::bmp_tag());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type backend_string =
+ gil::make_reader_backend(bmp_filename, gil::bmp_tag());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type backend_file =
+ gil::make_reader_backend(file, gil::bmp_tag());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type backend_ifstream =
+ gil::make_reader_backend(in, gil::bmp_tag());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type backend_wstring =
+ gil::make_reader_backend(my_path.wstring(), gil::bmp_tag());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type backend_path =
+ gil::make_reader_backend(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type backend_char =
+ gil::make_reader_backend(bmp_filename.c_str(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type backend_string =
+ gil::make_reader_backend(bmp_filename, gil::image_read_settings<gil::bmp_tag>());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type backend_file =
+ gil::make_reader_backend(file, gil::image_read_settings<gil::bmp_tag>());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type backend_ifstream =
+ gil::make_reader_backend(in, gil::image_read_settings<gil::bmp_tag>());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type backend_wstring =
+ gil::make_reader_backend(my_path.wstring(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type backend_path =
+ gil::make_reader_backend(my_path, gil::image_read_settings<gil::bmp_tag>());
+ }
+}
+
+void test_make_reader()
+{
+ {
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type reader_char = gil::make_reader(
+ bmp_filename.c_str(), gil::bmp_tag(), gil::detail::read_and_no_convert());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type reader_string =
+ gil::make_reader(bmp_filename, gil::bmp_tag(), gil::detail::read_and_no_convert());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type reader_file =
+ gil::make_reader(file, gil::bmp_tag(), gil::detail::read_and_no_convert());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_reader(in, gil::bmp_tag(), gil::detail::read_and_no_convert());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type reader_wstring =
+ gil::make_reader(my_path.wstring(), gil::bmp_tag(), gil::detail::read_and_no_convert());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type reader_path =
+ gil::make_reader(my_path, gil::bmp_tag(), gil::detail::read_and_no_convert());
+ }
+ {
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type reader_char = gil::make_reader(
+ bmp_filename.c_str(), gil::image_read_settings<gil::bmp_tag>(),
+ gil::detail::read_and_no_convert());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type reader_string = gil::make_reader(
+ bmp_filename, gil::image_read_settings<gil::bmp_tag>(),
+ gil::detail::read_and_no_convert());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type reader_file = gil::make_reader(
+ file, gil::image_read_settings<gil::bmp_tag>(), gil::detail::read_and_no_convert());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_reader(
+ in, gil::image_read_settings<gil::bmp_tag>(), gil::detail::read_and_no_convert());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type reader_wstring = gil::make_reader(
+ my_path.wstring(), gil::image_read_settings<gil::bmp_tag>(),
+ gil::detail::read_and_no_convert());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type reader_path = gil::make_reader(
+ my_path, gil::image_read_settings<gil::bmp_tag>(), gil::detail::read_and_no_convert());
+ }
+}
+
+void test_make_dynamic_image_reader()
+{
+ {
+ gil::get_dynamic_image_reader<const char*, gil::bmp_tag>::type reader_char =
+ gil::make_dynamic_image_reader(bmp_filename.c_str(), gil::bmp_tag());
+ gil::get_dynamic_image_reader<std::string, gil::bmp_tag>::type reader_string =
+ gil::make_dynamic_image_reader(bmp_filename, gil::bmp_tag());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_dynamic_image_reader<FILE*, gil::bmp_tag>::type reader_file =
+ gil::make_dynamic_image_reader(file, gil::bmp_tag());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_dynamic_image_reader<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_dynamic_image_reader(in, gil::bmp_tag());
+
+ fs::path my_path(bmp_filename);
+ gil::get_dynamic_image_reader<std::wstring, gil::bmp_tag>::type reader_wstring =
+ gil::make_dynamic_image_reader(my_path.wstring(), gil::bmp_tag());
+ gil::get_dynamic_image_reader<fs::path, gil::bmp_tag>::type reader_path =
+ gil::make_dynamic_image_reader(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_dynamic_image_reader<const char*, gil::bmp_tag>::type reader_char =
+ gil::make_dynamic_image_reader(
+ bmp_filename.c_str(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_dynamic_image_reader<std::string, gil::bmp_tag>::type reader_string =
+ gil::make_dynamic_image_reader(bmp_filename, gil::image_read_settings<gil::bmp_tag>());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_dynamic_image_reader<FILE*, gil::bmp_tag>::type reader_file =
+ gil::make_dynamic_image_reader(file, gil::image_read_settings<gil::bmp_tag>());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_dynamic_image_reader<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_dynamic_image_reader(in, gil::image_read_settings<gil::bmp_tag>());
+
+ fs::path my_path(bmp_filename);
+ gil::get_dynamic_image_reader<std::wstring, gil::bmp_tag>::type reader_wstring =
+ gil::make_dynamic_image_reader(
+ my_path.wstring(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_dynamic_image_reader<fs::path, gil::bmp_tag>::type reader_path =
+ gil::make_dynamic_image_reader(my_path, gil::image_read_settings<gil::bmp_tag>());
+ }
+}
+
+void test_make_writer()
+{
+ // Empty files may be created, but noo image data is written.
+ {
+ using writer_t = gil::get_writer<char const*, gil::bmp_tag>::type;
+
+ static_assert(
+ std::is_same<gil::detail::is_writer<writer_t>::type, std::true_type>::value, "");
+ }
+ {
+ gil::get_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_writer((bmp_out + "make_test.bmp").c_str(), gil::bmp_tag());
+ gil::get_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_writer((bmp_out + "make_test.bmp"), gil::bmp_tag());
+
+ FILE* file = fopen((bmp_out + "make_test.bmp").c_str(), "wb");
+ gil::get_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_writer(file, gil::bmp_tag());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_writer(out, gil::image_write_info<gil::bmp_tag>());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path((bmp_out + "make_test.bmp").c_str());
+ gil::get_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_writer(my_path.wstring(), gil::bmp_tag());
+ gil::get_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_writer(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_writer((bmp_out + "make_test.bmp").c_str(), gil::image_write_info<gil::bmp_tag>());
+ gil::get_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_writer((bmp_out + "make_test.bmp"), gil::image_write_info<gil::bmp_tag>());
+
+ FILE* file = fopen((bmp_out + std::string("make_test.bmp")).c_str(), "wb");
+ gil::get_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_writer(file, gil::image_write_info<gil::bmp_tag>());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_writer(out, gil::image_write_info<gil::bmp_tag>());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path(bmp_out + "make_test.bmp");
+ gil::get_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_writer(my_path.wstring(), gil::image_write_info<gil::bmp_tag>());
+ gil::get_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_writer(my_path, gil::image_write_info<gil::bmp_tag>());
+ }
+}
+
+void test_make_dynamic_image_writer()
+{
+ // Empty files may be created, but noo image data is written.
+ {
+ gil::get_dynamic_image_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_dynamic_image_writer(
+ (bmp_out + std::string("make_test.bmp")).c_str(), gil::bmp_tag());
+ gil::get_dynamic_image_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_dynamic_image_writer(bmp_out + "make_test.bmp", gil::bmp_tag());
+
+ FILE* file = fopen((bmp_out + std::string("make_test.bmp")).c_str(), "wb");
+ gil::get_dynamic_image_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_dynamic_image_writer(file, gil::bmp_tag());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_dynamic_image_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_dynamic_image_writer(out, gil::bmp_tag());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path(bmp_out + "make_test.bmp");
+ gil::get_dynamic_image_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_dynamic_image_writer(my_path.wstring(), gil::bmp_tag());
+ gil::get_dynamic_image_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_dynamic_image_writer(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_dynamic_image_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_dynamic_image_writer(
+ (bmp_out + std::string("make_test.bmp")).c_str(), gil::image_write_info<gil::bmp_tag>());
+
+ gil::get_dynamic_image_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_dynamic_image_writer(
+ bmp_out + "make_test.bmp", gil::image_write_info<gil::bmp_tag>());
+
+ FILE* file = fopen((bmp_out + std::string("make_test.bmp")).c_str(), "wb");
+ gil::get_dynamic_image_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_dynamic_image_writer(file, gil::image_write_info<gil::bmp_tag>());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_dynamic_image_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_dynamic_image_writer(out, gil::image_write_info<gil::bmp_tag>());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path(bmp_out + "make_test.bmp");
+ gil::get_dynamic_image_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_dynamic_image_writer(my_path.wstring(), gil::image_write_info<gil::bmp_tag>());
+ gil::get_dynamic_image_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_dynamic_image_writer(my_path, gil::image_write_info<gil::bmp_tag>());
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_make_reader_backend();
+ test_make_reader();
+ test_make_dynamic_image_reader();
+ test_make_writer();
+ test_make_dynamic_image_writer();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp
new file mode 100644
index 000000000..bd7fd27d8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp
@@ -0,0 +1,97 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::bmp_read_dimensions(bmp_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::bmp_read_image(bmp_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::bmp_read_and_convert_image(bmp_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::bmp_read_view(bmp_filename, view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::bmp_read_and_convert_view(bmp_filename, view(img));
+}
+
+void test_old_write_view()
+{
+ auto b = gil::rgb8_pixel_t(0, 0, 255);
+ auto g = gil::rgb8_pixel_t(0, 255, 0);
+ gil::bmp_write_view(bmp_out + "old_write_view_test.bmp", create_mandel_view(1000, 600, b, g));
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::bmp_read_image(bmp_filename.c_str(), image);
+
+ gil::bmp_write_view(bmp_out + "old_dynamic_image_test.bmp", gil::view(image));
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp
new file mode 100644
index 000000000..5d36c22de
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp
@@ -0,0 +1,463 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+#include <string>
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+template <typename Image>
+void write(Image& img, std::string const& file_name)
+{
+ write_view(bmp_out + file_name, gil::view(img), gil::bmp_tag());
+}
+
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::bmp_tag>::type;
+ backend_t backend = gil::read_image_info(bmp_filename, gil::bmp_tag());
+ BOOST_TEST_EQ(backend._info._offset , 54u);
+ BOOST_TEST_EQ(backend._info._header_size , 40u);
+ BOOST_TEST_EQ(backend._info._width , 1000);
+ BOOST_TEST_EQ(backend._info._height , 600);
+ BOOST_TEST_EQ(backend._info._bits_per_pixel , 24);
+ BOOST_TEST_EQ(backend._info._compression , 0u);
+ BOOST_TEST_EQ(backend._info._image_size , 1800000u);
+ BOOST_TEST_EQ(backend._info._horizontal_resolution, 0);
+ BOOST_TEST_EQ(backend._info._vertical_resolution , 0);
+ BOOST_TEST_EQ(backend._info._num_colors , 0u);
+ BOOST_TEST_EQ(backend._info._num_important_colors , 0u);
+ BOOST_TEST_EQ(backend._info._valid , true);
+}
+
+#ifdef BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+void test_read_reference_images_test()
+{
+ // comments are taken from http://entropymine.com/jason/bmpsuite/reference/reference.html
+
+ // g01bw.bmp - black and white palette (#000000,#FFFFFF)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01bw.bmp", img, gil::bmp_tag());
+ }
+
+ // g01wb.bmp - white and black palette (#FFFFFF,#000000).
+ // Should look the same as g01bw, not inverted.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01wb.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g01wb.bmp");
+ }
+
+ // g01bg.bmp - blue and green palette (#4040FF,#40FF40)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01bg.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g01bg.bmp");
+ }
+
+ // g01p1.bmp - 1-color (blue) palette (#4040FF)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01p1.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g01p1.bmp");
+ }
+
+ // g04.bmp - basic 4bpp (16 color) image
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g04.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+ write(img, "g04.bmp");
+ }
+
+ // g04rle.bmp - RLE compressed.
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g04rle.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g04rle.bmp");
+ }
+
+ // g04p4.bmp - 4-color grayscale palette
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g04p4.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g04p4.bmp");
+ }
+
+ // g08.bmp - basic 8bpp (256 color) image
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08.bmp");
+ }
+
+ // g08p256.bmp - biClrUsed=256, biClrImportant=0 [=256]
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08p256.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08p256.bmp");
+ }
+
+ // g08pi256.bmp - biClrUsed=256, biClrImportant=256
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08pi256.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08pi256.bmp");
+ }
+
+ // g08pi64.bmp - biClrUsed=256, biClrImportant=64. It's barely possible that some
+ // sophisticated viewers may display this image in grayscale, if there are a
+ // limited number of colors available.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08pi64.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08pi64.bmp");
+ }
+
+ // g08rle.bmp - RLE compressed.
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g08rle.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08rle.bmp");
+ }
+
+ // g08os2.bmp - OS/2-style bitmap. This is an obsolete variety of BMP
+ // that is still encountered sometimes. It has 3-byte palette
+ // entries (instead of 4), and 16-bit width/height fields (instead of 32).
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g08os2.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08os2.bmp");
+ }
+
+ // g08res22.bmp - resolution 7874x7874 pixels/meter (200x200 dpi)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08res22.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08res22.bmp");
+ }
+
+ // g08res11.bmp - resolution 3937x3937 pixels/meter (100x100 dpi)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08res11.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08res11.bmp");
+ }
+
+ // g08res21.bmp resolution 7874x3937 pixels/meter (200x100 dpi).
+ // Some programs (e.g. Imaging for Windows) may display this image
+ // stretched vertically, which is the optimal thing to do if the
+ // program is primarily a viewer, rather than an editor.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08res21.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08res21.bmp");
+ }
+
+ // g08s0.bmp - bits size not given (set to 0). This is legal for uncompressed bitmaps.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08s0.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08s0.bmp");
+ }
+
+ // g08offs.bmp - bfOffBits in header not set to the usual value.
+ // There are 100 extra unused bytes between palette and bits.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08offs.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08offs.bmp");
+ }
+
+ // g08w126.bmp - size 126x63 (right and bottom slightly clipped)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08w126.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 126u);
+ BOOST_TEST_EQ(view(img).height(), 63u);
+
+ write(img, "g08w126.bmp");
+ }
+
+ // g08w125.bmp - size 125x62
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08w125.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 125u);
+ BOOST_TEST_EQ(view(img).height(), 62u);
+
+ write(img, "g08w125.bmp");
+ }
+
+ // g08w124.bmp - size 124x61
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08w124.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 124u);
+ BOOST_TEST_EQ(view(img).height(), 61u);
+
+ write(img, "g08w124.bmp");
+ }
+
+ // g08p64.bmp - 64-color grayscale palette
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08p64.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08p64.bmp");
+ }
+
+ // g16def555.bmp - 15-bit color (1 bit wasted), biCompression=BI_RGB (no bitfields, defaults to 5-5-5)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g16def555.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g16def555.bmp");
+ }
+
+ // g16bf555.bmp - 15-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-5-5)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g16bf555.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g16bf555.bmp");
+ }
+
+ // g16bf565.bmp - 16-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-6-5)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g16bf565.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g16bf565.bmp");
+ }
+
+ // g24.bmp - 24-bit color (BGR)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g24.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g24.bmp");
+ }
+
+ // g32def.bmp - 24-bit color (8 bits wasted), biCompression=BI_RGB (no bitfields, defaults to BGRx)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g32def.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g32def.bmp");
+ }
+
+ // g32bf.bmp - 24-bit color (8 bits wasted), biCompression=BI_BITFIELDS (bitfields indicate BGRx)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g32bf.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g32bf.bmp");
+ }
+}
+
+void test_read_reference_images_image_iterator()
+{
+ // comments are taken from http://entropymine.com/jason/bmpsuite/reference/reference.html
+
+ // g01bw.bmp - black and white palette (#000000,#FFFFFF)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01bw.bmp").c_str());
+
+ // g01wb.bmp - white and black palette (#FFFFFF,#000000).
+ // Should look the same as g01bw, not inverted.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01wb.bmp").c_str());
+
+ // g01bg.bmp - blue and green palette (#4040FF,#40FF40)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01bg.bmp").c_str());
+
+ // g01p1.bmp - 1-color (blue) palette (#4040FF)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01p1.bmp").c_str());
+
+ // g04.bmp - basic 4bpp (16 color) image
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g04.bmp").c_str());
+
+ // not supported
+ // g04rle.bmp - RLE compressed.
+ //test_scanline_reader<gil::bgra8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01bg.bmp").c_str());
+
+ // g04p4.bmp - 4-color grayscale palette
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g04p4.bmp").c_str());
+
+ // g08.bmp - basic 8bpp (256 color) image
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08.bmp").c_str());
+
+ // g08p256.bmp - biClrUsed=256, biClrImportant=0 [=256]
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08p256.bmp").c_str());
+
+ // g08pi256.bmp - biClrUsed=256, biClrImportant=256
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08pi256.bmp").c_str());
+
+ // g08pi64.bmp - biClrUsed=256, biClrImportant=64. It's barely possible that some
+ // sophisticated viewers may display this image in grayscale, if there are a
+ // limited number of colors available.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08pi64.bmp").c_str());
+
+ // not supported
+ // g08rle.bmp - RLE compressed.
+
+ // g08os2.bmp - OS/2-style bitmap. This is an obsolete variety of BMP
+ // that is still encountered sometimes. It has 3-byte palette
+ // entries (instead of 4), and 16-bit width/height fields (instead of 32).
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08os2.bmp").c_str());
+
+ // g08res22.bmp - resolution 7874x7874 pixels/meter (200x200 dpi)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08res22.bmp").c_str());
+
+ // g08res11.bmp - resolution 3937x3937 pixels/meter (100x100 dpi)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08res11.bmp").c_str());
+
+ // g08res21.bmp resolution 7874x3937 pixels/meter (200x100 dpi).
+ // Some programs (e.g. Imaging for Windows) may display this image
+ // stretched vertically, which is the optimal thing to do if the
+ // program is primarily a viewer, rather than an editor.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08res21.bmp").c_str());
+
+ // g08s0.bmp - bits size not given (set to 0). This is legal for uncompressed bitmaps.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08s0.bmp").c_str());
+
+ // g08offs.bmp - bfOffBits in header not set to the usual value.
+ // There are 100 extra unused bytes between palette and bits.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08offs.bmp").c_str());
+
+ // g08w126.bmp - size 126x63 (right and bottom slightly clipped)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08w126.bmp").c_str());
+
+ // g08w125.bmp - size 125x62
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08w125.bmp").c_str());
+
+ // g08w124.bmp - size 124x61
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08w124.bmp").c_str());
+
+ // g08p64.bmp - 64-color grayscale palette
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08p64.bmp").c_str());
+
+ // g16def555.bmp - 15-bit color (1 bit wasted), biCompression=BI_RGB (no bitfields, defaults to 5-5-5)
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g16def555.bmp").c_str());
+
+ // g16bf555.bmp - 15-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-5-5)
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g16bf555.bmp").c_str());
+
+ // g16bf565.bmp - 16-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-6-5)
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g16bf565.bmp").c_str());
+
+ // g24.bmp - 24-bit color (BGR)
+ test_scanline_reader<gil::bgr8_image_t, gil::bmp_tag>(std::string(bmp_in + "g24.bmp").c_str());
+
+ // g32def.bmp - 24-bit color (8 bits wasted), biCompression=BI_RGB (no bitfields, defaults to BGRx)
+ test_scanline_reader<gil::bgra8_image_t, gil::bmp_tag>(std::string(bmp_in + "g32def.bmp").c_str());
+
+ // g32bf.bmp - 24-bit color (8 bits wasted), biCompression=BI_BITFIELDS (bitfields indicate BGRx)
+ test_scanline_reader<gil::bgra8_image_t, gil::bmp_tag>(std::string(bmp_in + "g32bf.bmp").c_str());
+}
+
+void test_partial_image()
+{
+ std::string const filename(bmp_in + "g24.bmp");
+
+ gil::rgb8_image_t img;
+ gil::read_image(filename, img, gil::image_read_settings<gil::bmp_tag>(
+ gil::point_t(0, 0), gil::point_t(50, 50)));
+
+ write_view(bmp_out + "rgb_partial.bmp", gil::view(img), gil::bmp_tag());
+}
+#endif // BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_read_header();
+
+#ifdef BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+ test_read_reference_images_test();
+ test_read_reference_images_image_iterator();
+ test_partial_image();
+#endif
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp
new file mode 100644
index 000000000..6b1385464
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp
@@ -0,0 +1,284 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(bmp_filename, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(in, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+ using backend_t = gil::get_reader_backend<FILE *, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(file, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+ {
+ fs::path my_path(bmp_filename);
+ using backend_t = gil::get_reader_backend<fs::path, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(my_path, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ read_image(bmp_filename, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ read_image(in, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ read_image(file, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ fs::path my_path(bmp_filename);
+
+ gil::rgb8_image_t img;
+ read_image(my_path, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ read_and_convert_image(bmp_filename, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ read_and_convert_image(in, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ read_and_convert_image(file, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ read_view(bmp_filename, gil::view(img), gil::bmp_tag());
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ read_view(in, gil::view(img), gil::bmp_tag());
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ read_view(file, gil::view(img), gil::bmp_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ read_and_convert_view(bmp_filename, gil::view(img), gil::bmp_tag());
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ read_and_convert_view(in, gil::view(img), gil::bmp_tag());
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ read_and_convert_view(file, gil::view(img), gil::bmp_tag());
+ }
+}
+
+void test_write_view()
+{
+ auto const b = gil::rgb8_pixel_t(0, 0, 255);
+ auto const g = gil::rgb8_pixel_t(0, 255, 0);
+ {
+ std::string filename(bmp_out + "write_test_string.bmp");
+ gil::write_view(filename, create_mandel_view(1000, 600, b, g), gil::bmp_tag());
+ }
+ {
+ std::string filename(bmp_out + "write_test_ofstream.bmp");
+ std::ofstream out(filename.c_str(), std::ios::binary);
+
+ gil::write_view(out, create_mandel_view(1000, 600, b, g), gil::bmp_tag());
+ }
+ {
+ std::string filename(bmp_out + "write_test_file.bmp");
+
+ FILE *file = fopen(filename.c_str(), "wb");
+ gil::write_view(file, create_mandel_view(1000, 600, b, g), gil::bmp_tag());
+ }
+ {
+ std::string filename(bmp_out + "write_test_info.bmp");
+
+ gil::image_write_info<gil::bmp_tag> info;
+ FILE *file = fopen(filename.c_str(), "wb");
+ gil::write_view(file, create_mandel_view(1000, 600, b, g), info);
+ }
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::bmp_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::bmp_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::bmp_tag());
+
+ // 5. Write out image.
+ std::string filename(bmp_out + "stream_test.bmp");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+
+ gil::write_view( out, gil::view( dst ), gil::bmp_tag() );
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(bmp_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ read_image(in, img, gil::bmp_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::bmp_tag>(
+ bmp_filename, gil::point_t(0, 0), gil::point_t(1000, 1));
+
+ run_subimage_test<gil::rgb8_image_t, gil::bmp_tag>(
+ bmp_filename, gil::point_t(39, 7), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(bmp_filename.c_str(), image, gil::bmp_tag());
+
+ gil::write_view(bmp_out + "dynamic_image_test.bmp", gil::view(image), gil::bmp_tag());
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp
new file mode 100644
index 000000000..2dea9e514
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp
@@ -0,0 +1,53 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/io/typedefs.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "cmp_view.hpp"
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+void test_write_rgb8()
+{
+ gil::write_view(bmp_out + "rgb8_test.bmp", create_mandel_view(200, 200,
+ gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)), gil::bmp_tag());
+}
+
+void test_write_rgba8()
+{
+ gil::write_view(bmp_out + "rgba8_test.bmp", create_mandel_view(200, 200,
+ gil::rgba8_pixel_t(0, 0, 255, 0), gil::rgba8_pixel_t(0, 255, 0, 0)), gil::bmp_tag());
+}
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::bmp_tag>(
+ bmp_out + "rgb_color_space_test.bmp",
+ bmp_out + "bgr_color_space_test.bmp");
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_write_rgb8();
+ test_write_rgba8();
+ test_rgb_color_space_write();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/cmp_view.hpp b/src/boost/libs/gil/test/extension/io/cmp_view.hpp
new file mode 100644
index 000000000..9141f55d4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/cmp_view.hpp
@@ -0,0 +1,37 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_IO_TEST_EXTENSION_IO_CMP_VIEW_HPP
+#define BOOST_GIL_IO_TEST_EXTENSION_IO_CMP_VIEW_HPP
+
+#include <boost/gil.hpp>
+
+#include <stdexcept>
+
+template <typename View1, typename View2>
+void cmp_view(View1 const& v1, View2 const& v2)
+{
+ if (v1.dimensions() != v2.dimensions())
+ throw std::runtime_error("Images are not equal.");
+
+ typename View1::x_coord_t width = v1.width();
+ typename View1::y_coord_t height = v1.height();
+
+ for (typename View1::y_coord_t y = 0; y < height; ++y)
+ {
+ typename View1::x_iterator const src_it = v1.row_begin(y);
+ typename View2::x_iterator const dst_it = v2.row_begin(y);
+
+ for (typename View1::x_coord_t x = 0; x < width; ++x)
+ {
+ if (*src_it != *dst_it)
+ throw std::runtime_error("Images are not equal.");
+ }
+ }
+}
+
+#endif // BOOST_GIL_IO_TEST_EXTENSION_IO_CMP_VIEW_HPP
diff --git a/src/boost/libs/gil/test/extension/io/color_space_write_test.hpp b/src/boost/libs/gil/test/extension/io/color_space_write_test.hpp
new file mode 100644
index 000000000..c7fb1577b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/color_space_write_test.hpp
@@ -0,0 +1,52 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_COLOR_SPACE_WRITE_TEST_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_COLOR_SPACE_WRITE_TEST_HPP
+
+#include <boost/gil.hpp>
+
+#ifndef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+#include <boost/core/ignore_unused.hpp>
+#endif
+#include <string>
+
+#include "cmp_view.hpp"
+
+template <typename Tag>
+void color_space_write_test(std::string const& file_name_1, std::string const& file_name_2)
+{
+ namespace gil = boost::gil;
+
+ gil::rgb8_image_t rgb(320, 200);
+ gil::bgr8_image_t bgr(320, 200);
+
+ gil::fill_pixels(gil::view(rgb), gil::rgb8_pixel_t(0, 0, 255));
+ gil::fill_pixels(gil::view(bgr), gil::bgr8_pixel_t(255, 0, 0));
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(file_name_1, gil::view(rgb), Tag());
+ gil::write_view(file_name_2, gil::view(bgr), Tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::rgb8_image_t rgb_1;
+ gil::rgb8_image_t rgb_2;
+
+ gil::read_image(file_name_1, rgb_1, Tag());
+ gil::read_image(file_name_2, rgb_2, Tag());
+
+ cmp_view(gil::view(rgb_1), gil::view(rgb_2));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifndef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ boost::ignore_unused(file_name_1);
+ boost::ignore_unused(file_name_2);
+#endif
+}
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_COLOR_SPACE_WRITE_TEST_HPP
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp
new file mode 100644
index 000000000..a72034764
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp
new file mode 100644
index 000000000..06189a6c6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp
new file mode 100644
index 000000000..706b4a1dd
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp
new file mode 100644
index 000000000..2f05b4366
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp
new file mode 100644
index 000000000..a064f66a7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp
new file mode 100644
index 000000000..4c1096b5e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp
new file mode 100644
index 000000000..7239fa668
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp
new file mode 100644
index 000000000..3be9a2066
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp
new file mode 100644
index 000000000..71def41c6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp
new file mode 100644
index 000000000..f7f9f5795
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp
new file mode 100644
index 000000000..a129bbc34
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp
new file mode 100644
index 000000000..9d3affd66
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp
new file mode 100644
index 000000000..45df3f836
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp
new file mode 100644
index 000000000..52baf9180
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp
new file mode 100644
index 000000000..f03d0f3dc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp
new file mode 100644
index 000000000..61198e562
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp
new file mode 100644
index 000000000..1af0ecce3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp
new file mode 100644
index 000000000..082f7f481
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp
new file mode 100644
index 000000000..4b2c521d5
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp
new file mode 100644
index 000000000..18960354d
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp
new file mode 100644
index 000000000..b348a7c21
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp
new file mode 100644
index 000000000..3628d6665
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp
new file mode 100644
index 000000000..639a57f87
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp
new file mode 100644
index 000000000..cb0ea24f5
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp
new file mode 100644
index 000000000..a5a3195cc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp
new file mode 100644
index 000000000..d6d9e6afa
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp
new file mode 100644
index 000000000..0f41534e1
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp
new file mode 100644
index 000000000..9524f765b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/readme.txt b/src/boost/libs/gil/test/extension/io/images/bmp/readme.txt
new file mode 100644
index 000000000..2478f5dd3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+Image were found at http://entropymine.com/jason/bmpsuite/ . \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp
new file mode 100644
index 000000000..24d396d57
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg b/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg
new file mode 100644
index 000000000..793e31781
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg b/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg
new file mode 100644
index 000000000..d221c054d
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png b/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png
new file mode 100644
index 000000000..bea4eb6f7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt
new file mode 100644
index 000000000..46c5ccb79
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt
@@ -0,0 +1,7 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+test images can be found at http://www.schaik.com/pngsuite/pngsuite.html
+
+if not available please send me an email at chhenning ** at ** gmail.com \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png
new file mode 100644
index 000000000..39a7050d2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png
new file mode 100644
index 000000000..dd3168e5c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png
new file mode 100644
index 000000000..0ede3574d
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png
new file mode 100644
index 000000000..85cec395c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png
new file mode 100644
index 000000000..8cf2e6fb6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png
new file mode 100644
index 000000000..5cca0d621
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png
new file mode 100644
index 000000000..99bdeed2b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png
new file mode 100644
index 000000000..fb3ef1d0c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png
new file mode 100644
index 000000000..a6c9f35a8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png b/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png
new file mode 100644
index 000000000..c914fb4b8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png b/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png
new file mode 100644
index 000000000..9fae9a157
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/test.png b/src/boost/libs/gil/test/extension/io/images/png/test.png
new file mode 100644
index 000000000..bd731ed8f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/test.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm
new file mode 100644
index 000000000..087e56b51
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm
@@ -0,0 +1,1203 @@
+P1
+# ASCII PBM file created by PBMA_WRITE.
+ 200 200
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm
new file mode 100644
index 000000000..1673f5167
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm
@@ -0,0 +1,3004 @@
+P2
+# ASCII PGM file created by PGMA_WRITE.
+ 200 200
+ 199
+ 0 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1
+ 0 0 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2
+ 0 1 0 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3
+ 0 0 1 0 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4
+ 0 1 2 1 0 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5
+ 0 0 0 2 1 0 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6
+ 0 1 1 3 2 1 0 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7
+ 0 0 2 0 3 2 1 0 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8
+ 0 1 0 1 4 3 2 1 0 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9
+ 0 0 1 2 0 4 3 2 1 0 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10
+ 0 1 2 3 1 5 4 3 2 1 0 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11
+ 0 0 0 0 2 0 5 4 3 2 1 0 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12
+ 0 1 1 1 3 1 6 5 4 3 2 1 0 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13
+ 0 0 2 2 4 2 0 6 5 4 3 2 1 0
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14
+ 0 1 0 3 0 3 1 7 6 5 4 3 2 1
+ 0 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15
+ 0 0 1 0 1 4 2 0 7 6 5 4 3 2
+ 1 0 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16
+ 0 1 2 1 2 5 3 1 8 7 6 5 4 3
+ 2 1 0 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17
+ 0 0 0 2 3 0 4 2 0 8 7 6 5 4
+ 3 2 1 0 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18
+ 0 1 1 3 4 1 5 3 1 9 8 7 6 5
+ 4 3 2 1 0 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19
+ 0 0 2 0 0 2 6 4 2 0 9 8 7 6
+ 5 4 3 2 1 0 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20
+ 0 1 0 1 1 3 0 5 3 1 10 9 8 7
+ 6 5 4 3 2 1 0 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21
+ 0 0 1 2 2 4 1 6 4 2 0 10 9 8
+ 7 6 5 4 3 2 1 0 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22
+ 0 1 2 3 3 5 2 7 5 3 1 11 10 9
+ 8 7 6 5 4 3 2 1 0 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23
+ 0 0 0 0 4 0 3 0 6 4 2 0 11 10
+ 9 8 7 6 5 4 3 2 1 0 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24
+ 0 1 1 1 0 1 4 1 7 5 3 1 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25
+ 0 0 2 2 1 2 5 2 8 6 4 2 0 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26
+ 0 1 0 3 2 3 6 3 0 7 5 3 1 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27
+ 0 0 1 0 3 4 0 4 1 8 6 4 2 0
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28
+ 0 1 2 1 4 5 1 5 2 9 7 5 3 1
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29
+ 0 0 0 2 0 0 2 6 3 0 8 6 4 2
+ 0 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30
+ 0 1 1 3 1 1 3 7 4 1 9 7 5 3
+ 1 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31
+ 0 0 2 0 2 2 4 0 5 2 10 8 6 4
+ 2 0 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32
+ 0 1 0 1 3 3 5 1 6 3 0 9 7 5
+ 3 1 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33
+ 0 0 1 2 4 4 6 2 7 4 1 10 8 6
+ 4 2 0 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34
+ 0 1 2 3 0 5 0 3 8 5 2 11 9 7
+ 5 3 1 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35
+ 0 0 0 0 1 0 1 4 0 6 3 0 10 8
+ 6 4 2 0 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36
+ 0 1 1 1 2 1 2 5 1 7 4 1 11 9
+ 7 5 3 1 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37
+ 0 0 2 2 3 2 3 6 2 8 5 2 12 10
+ 8 6 4 2 0 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38
+ 0 1 0 3 4 3 4 7 3 9 6 3 0 11
+ 9 7 5 3 1 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39
+ 0 0 1 0 0 4 5 0 4 0 7 4 1 12
+ 10 8 6 4 2 0 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40
+ 0 1 2 1 1 5 6 1 5 1 8 5 2 13
+ 11 9 7 5 3 1 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41
+ 0 0 0 2 2 0 0 2 6 2 9 6 3 0
+ 12 10 8 6 4 2 0 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42
+ 0 1 1 3 3 1 1 3 7 3 10 7 4 1
+ 13 11 9 7 5 3 1 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43
+ 0 0 2 0 4 2 2 4 8 4 0 8 5 2
+ 14 12 10 8 6 4 2 0 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44
+ 0 1 0 1 0 3 3 5 0 5 1 9 6 3
+ 0 13 11 9 7 5 3 1 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45
+ 0 0 1 2 1 4 4 6 1 6 2 10 7 4
+ 1 14 12 10 8 6 4 2 0 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46
+ 0 1 2 3 2 5 5 7 2 7 3 11 8 5
+ 2 15 13 11 9 7 5 3 1 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47
+ 0 0 0 0 3 0 6 0 3 8 4 0 9 6
+ 3 0 14 12 10 8 6 4 2 0 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48
+ 0 1 1 1 4 1 0 1 4 9 5 1 10 7
+ 4 1 15 13 11 9 7 5 3 1 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49
+ 0 0 2 2 0 2 1 2 5 0 6 2 11 8
+ 5 2 16 14 12 10 8 6 4 2 0 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50
+ 0 1 0 3 1 3 2 3 6 1 7 3 12 9
+ 6 3 0 15 13 11 9 7 5 3 1 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51
+ 0 0 1 0 2 4 3 4 7 2 8 4 0 10
+ 7 4 1 16 14 12 10 8 6 4 2 0 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52
+ 0 1 2 1 3 5 4 5 8 3 9 5 1 11
+ 8 5 2 17 15 13 11 9 7 5 3 1 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53
+ 0 0 0 2 4 0 5 6 0 4 10 6 2 12
+ 9 6 3 0 16 14 12 10 8 6 4 2 0 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54
+ 0 1 1 3 0 1 6 7 1 5 0 7 3 13
+ 10 7 4 1 17 15 13 11 9 7 5 3 1 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55
+ 0 0 2 0 1 2 0 0 2 6 1 8 4 0
+ 11 8 5 2 18 16 14 12 10 8 6 4 2 0
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56
+ 0 1 0 1 2 3 1 1 3 7 2 9 5 1
+ 12 9 6 3 0 17 15 13 11 9 7 5 3 1
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57
+ 0 0 1 2 3 4 2 2 4 8 3 10 6 2
+ 13 10 7 4 1 18 16 14 12 10 8 6 4 2
+ 0 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58
+ 0 1 2 3 4 5 3 3 5 9 4 11 7 3
+ 14 11 8 5 2 19 17 15 13 11 9 7 5 3
+ 1 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59
+ 0 0 0 0 0 0 4 4 6 0 5 0 8 4
+ 0 12 9 6 3 0 18 16 14 12 10 8 6 4
+ 2 0 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60
+ 0 1 1 1 1 1 5 5 7 1 6 1 9 5
+ 1 13 10 7 4 1 19 17 15 13 11 9 7 5
+ 3 1 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61
+ 0 0 2 2 2 2 6 6 8 2 7 2 10 6
+ 2 14 11 8 5 2 20 18 16 14 12 10 8 6
+ 4 2 0 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62
+ 0 1 0 3 3 3 0 7 0 3 8 3 11 7
+ 3 15 12 9 6 3 0 19 17 15 13 11 9 7
+ 5 3 1 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63
+ 0 0 1 0 4 4 1 0 1 4 9 4 12 8
+ 4 0 13 10 7 4 1 20 18 16 14 12 10 8
+ 6 4 2 0 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64
+ 0 1 2 1 0 5 2 1 2 5 10 5 0 9
+ 5 1 14 11 8 5 2 21 19 17 15 13 11 9
+ 7 5 3 1 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65
+ 0 0 0 2 1 0 3 2 3 6 0 6 1 10
+ 6 2 15 12 9 6 3 0 20 18 16 14 12 10
+ 8 6 4 2 0 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66
+ 0 1 1 3 2 1 4 3 4 7 1 7 2 11
+ 7 3 16 13 10 7 4 1 21 19 17 15 13 11
+ 9 7 5 3 1 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67
+ 0 0 2 0 3 2 5 4 5 8 2 8 3 12
+ 8 4 0 14 11 8 5 2 22 20 18 16 14 12
+ 10 8 6 4 2 0 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68
+ 0 1 0 1 4 3 6 5 6 9 3 9 4 13
+ 9 5 1 15 12 9 6 3 0 21 19 17 15 13
+ 11 9 7 5 3 1 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69
+ 0 0 1 2 0 4 0 6 7 0 4 10 5 0
+ 10 6 2 16 13 10 7 4 1 22 20 18 16 14
+ 12 10 8 6 4 2 0 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70
+ 0 1 2 3 1 5 1 7 8 1 5 11 6 1
+ 11 7 3 17 14 11 8 5 2 23 21 19 17 15
+ 13 11 9 7 5 3 1 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71
+ 0 0 0 0 2 0 2 0 0 2 6 0 7 2
+ 12 8 4 0 15 12 9 6 3 0 22 20 18 16
+ 14 12 10 8 6 4 2 0 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72
+ 0 1 1 1 3 1 3 1 1 3 7 1 8 3
+ 13 9 5 1 16 13 10 7 4 1 23 21 19 17
+ 15 13 11 9 7 5 3 1 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73
+ 0 0 2 2 4 2 4 2 2 4 8 2 9 4
+ 14 10 6 2 17 14 11 8 5 2 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74
+ 0 1 0 3 0 3 5 3 3 5 9 3 10 5
+ 0 11 7 3 18 15 12 9 6 3 0 23 21 19
+ 17 15 13 11 9 7 5 3 1 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75
+ 0 0 1 0 1 4 6 4 4 6 10 4 11 6
+ 1 12 8 4 0 16 13 10 7 4 1 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76
+ 0 1 2 1 2 5 0 5 5 7 0 5 12 7
+ 2 13 9 5 1 17 14 11 8 5 2 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77
+ 0 0 0 2 3 0 1 6 6 8 1 6 0 8
+ 3 14 10 6 2 18 15 12 9 6 3 0 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78
+ 0 1 1 3 4 1 2 7 7 9 2 7 1 9
+ 4 15 11 7 3 19 16 13 10 7 4 1 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79
+ 0 0 2 0 0 2 3 0 8 0 3 8 2 10
+ 5 0 12 8 4 0 17 14 11 8 5 2 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80
+ 0 1 0 1 1 3 4 1 0 1 4 9 3 11
+ 6 1 13 9 5 1 18 15 12 9 6 3 0 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81
+ 0 0 1 2 2 4 5 2 1 2 5 10 4 12
+ 7 2 14 10 6 2 19 16 13 10 7 4 1 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82
+ 0 1 2 3 3 5 6 3 2 3 6 11 5 13
+ 8 3 15 11 7 3 20 17 14 11 8 5 2 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83
+ 0 0 0 0 4 0 0 4 3 4 7 0 6 0
+ 9 4 16 12 8 4 0 18 15 12 9 6 3 0
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84
+ 0 1 1 1 0 1 1 5 4 5 8 1 7 1
+ 10 5 0 13 9 5 1 19 16 13 10 7 4 1
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85
+ 0 0 2 2 1 2 2 6 5 6 9 2 8 2
+ 11 6 1 14 10 6 2 20 17 14 11 8 5 2
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86
+ 0 1 0 3 2 3 3 7 6 7 10 3 9 3
+ 12 7 2 15 11 7 3 21 18 15 12 9 6 3
+ 0 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87
+ 0 0 1 0 3 4 4 0 7 8 0 4 10 4
+ 13 8 3 16 12 8 4 0 19 16 13 10 7 4
+ 1 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88
+ 0 1 2 1 4 5 5 1 8 9 1 5 11 5
+ 14 9 4 17 13 9 5 1 20 17 14 11 8 5
+ 2 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89
+ 0 0 0 2 0 0 6 2 0 0 2 6 12 6
+ 0 10 5 0 14 10 6 2 21 18 15 12 9 6
+ 3 0 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90
+ 0 1 1 3 1 1 0 3 1 1 3 7 0 7
+ 1 11 6 1 15 11 7 3 22 19 16 13 10 7
+ 4 1 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91
+ 0 0 2 0 2 2 1 4 2 2 4 8 1 8
+ 2 12 7 2 16 12 8 4 0 20 17 14 11 8
+ 5 2 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92
+ 0 1 0 1 3 3 2 5 3 3 5 9 2 9
+ 3 13 8 3 17 13 9 5 1 21 18 15 12 9
+ 6 3 0 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93
+ 0 0 1 2 4 4 3 6 4 4 6 10 3 10
+ 4 14 9 4 18 14 10 6 2 22 19 16 13 10
+ 7 4 1 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94
+ 0 1 2 3 0 5 4 7 5 5 7 11 4 11
+ 5 15 10 5 0 15 11 7 3 23 20 17 14 11
+ 8 5 2 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95
+ 0 0 0 0 1 0 5 0 6 6 8 0 5 12
+ 6 0 11 6 1 16 12 8 4 0 21 18 15 12
+ 9 6 3 0 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96
+ 0 1 1 1 2 1 6 1 7 7 9 1 6 13
+ 7 1 12 7 2 17 13 9 5 1 22 19 16 13
+ 10 7 4 1 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97
+ 0 0 2 2 3 2 0 2 8 8 10 2 7 0
+ 8 2 13 8 3 18 14 10 6 2 23 20 17 14
+ 11 8 5 2 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98
+ 0 1 0 3 4 3 1 3 0 9 0 3 8 1
+ 9 3 14 9 4 19 15 11 7 3 24 21 18 15
+ 12 9 6 3 0 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99 99 99 99 99 99 99 99 99 99 99
+ 99 99 99 99
+ 0 0 1 0 0 4 2 4 1 0 1 4 9 2
+ 10 4 15 10 5 0 16 12 8 4 0 22 19 16
+ 13 10 7 4 1 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100
+ 0 1 2 1 1 5 3 5 2 1 2 5 10 3
+ 11 5 16 11 6 1 17 13 9 5 1 23 20 17
+ 14 11 8 5 2 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101
+ 0 0 0 2 2 0 4 6 3 2 3 6 11 4
+ 12 6 0 12 7 2 18 14 10 6 2 24 21 18
+ 15 12 9 6 3 0 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102
+ 0 1 1 3 3 1 5 7 4 3 4 7 12 5
+ 13 7 1 13 8 3 19 15 11 7 3 25 22 19
+ 16 13 10 7 4 1 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103
+ 0 0 2 0 4 2 6 0 5 4 5 8 0 6
+ 14 8 2 14 9 4 20 16 12 8 4 0 23 20
+ 17 14 11 8 5 2 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104
+ 0 1 0 1 0 3 0 1 6 5 6 9 1 7
+ 0 9 3 15 10 5 0 17 13 9 5 1 24 21
+ 18 15 12 9 6 3 0 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105
+ 0 0 1 2 1 4 1 2 7 6 7 10 2 8
+ 1 10 4 16 11 6 1 18 14 10 6 2 25 22
+ 19 16 13 10 7 4 1 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106
+ 0 1 2 3 2 5 2 3 8 7 8 11 3 9
+ 2 11 5 17 12 7 2 19 15 11 7 3 26 23
+ 20 17 14 11 8 5 2 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107
+ 0 0 0 0 3 0 3 4 0 8 9 0 4 10
+ 3 12 6 0 13 8 3 20 16 12 8 4 0 24
+ 21 18 15 12 9 6 3 0 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108
+ 0 1 1 1 4 1 4 5 1 9 10 1 5 11
+ 4 13 7 1 14 9 4 21 17 13 9 5 1 25
+ 22 19 16 13 10 7 4 1 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109
+ 0 0 2 2 0 2 5 6 2 0 0 2 6 12
+ 5 14 8 2 15 10 5 0 18 14 10 6 2 26
+ 23 20 17 14 11 8 5 2 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110
+ 0 1 0 3 1 3 6 7 3 1 1 3 7 13
+ 6 15 9 3 16 11 6 1 19 15 11 7 3 27
+ 24 21 18 15 12 9 6 3 0 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111
+ 0 0 1 0 2 4 0 0 4 2 2 4 8 0
+ 7 0 10 4 17 12 7 2 20 16 12 8 4 0
+ 25 22 19 16 13 10 7 4 1 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112
+ 0 1 2 1 3 5 1 1 5 3 3 5 9 1
+ 8 1 11 5 18 13 8 3 21 17 13 9 5 1
+ 26 23 20 17 14 11 8 5 2 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113
+ 0 0 0 2 4 0 2 2 6 4 4 6 10 2
+ 9 2 12 6 0 14 9 4 22 18 14 10 6 2
+ 27 24 21 18 15 12 9 6 3 0 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114
+ 0 1 1 3 0 1 3 3 7 5 5 7 11 3
+ 10 3 13 7 1 15 10 5 0 19 15 11 7 3
+ 28 25 22 19 16 13 10 7 4 1 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115
+ 0 0 2 0 1 2 4 4 8 6 6 8 12 4
+ 11 4 14 8 2 16 11 6 1 20 16 12 8 4
+ 0 26 23 20 17 14 11 8 5 2 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116
+ 0 1 0 1 2 3 5 5 0 7 7 9 0 5
+ 12 5 15 9 3 17 12 7 2 21 17 13 9 5
+ 1 27 24 21 18 15 12 9 6 3 0 37 35 33
+ 31 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117
+ 0 0 1 2 3 4 6 6 1 8 8 10 1 6
+ 13 6 16 10 4 18 13 8 3 22 18 14 10 6
+ 2 28 25 22 19 16 13 10 7 4 1 38 36 34
+ 32 30 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118
+ 0 1 2 3 4 5 0 7 2 9 9 11 2 7
+ 14 7 0 11 5 19 14 9 4 23 19 15 11 7
+ 3 29 26 23 20 17 14 11 8 5 2 39 37 35
+ 33 31 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119
+ 0 0 0 0 0 0 1 0 3 0 10 0 3 8
+ 0 8 1 12 6 0 15 10 5 0 20 16 12 8
+ 4 0 27 24 21 18 15 12 9 6 3 0 38 36
+ 34 32 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120
+ 0 1 1 1 1 1 2 1 4 1 0 1 4 9
+ 1 9 2 13 7 1 16 11 6 1 21 17 13 9
+ 5 1 28 25 22 19 16 13 10 7 4 1 39 37
+ 35 33 31 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121
+ 0 0 2 2 2 2 3 2 5 2 1 2 5 10
+ 2 10 3 14 8 2 17 12 7 2 22 18 14 10
+ 6 2 29 26 23 20 17 14 11 8 5 2 40 38
+ 36 34 32 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122
+ 0 1 0 3 3 3 4 3 6 3 2 3 6 11
+ 3 11 4 15 9 3 18 13 8 3 23 19 15 11
+ 7 3 30 27 24 21 18 15 12 9 6 3 0 39
+ 37 35 33 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123
+ 0 0 1 0 4 4 5 4 7 4 3 4 7 12
+ 4 12 5 16 10 4 19 14 9 4 24 20 16 12
+ 8 4 0 28 25 22 19 16 13 10 7 4 1 40
+ 38 36 34 32 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124
+ 0 1 2 1 0 5 6 5 8 5 4 5 8 13
+ 5 13 6 17 11 5 20 15 10 5 0 21 17 13
+ 9 5 1 29 26 23 20 17 14 11 8 5 2 41
+ 39 37 35 33 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125
+ 0 0 0 2 1 0 0 6 0 6 5 6 9 0
+ 6 14 7 0 12 6 0 16 11 6 1 22 18 14
+ 10 6 2 30 27 24 21 18 15 12 9 6 3 0
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126
+ 0 1 1 3 2 1 1 7 1 7 6 7 10 1
+ 7 15 8 1 13 7 1 17 12 7 2 23 19 15
+ 11 7 3 31 28 25 22 19 16 13 10 7 4 1
+ 41 39 37 35 33 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127
+ 0 0 2 0 3 2 2 0 2 8 7 8 11 2
+ 8 0 9 2 14 8 2 18 13 8 3 24 20 16
+ 12 8 4 0 29 26 23 20 17 14 11 8 5 2
+ 42 40 38 36 34 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128
+ 0 1 0 1 4 3 3 1 3 9 8 9 12 3
+ 9 1 10 3 15 9 3 19 14 9 4 25 21 17
+ 13 9 5 1 30 27 24 21 18 15 12 9 6 3
+ 0 41 39 37 35 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129
+ 0 0 1 2 0 4 4 2 4 0 9 10 0 4
+ 10 2 11 4 16 10 4 20 15 10 5 0 22 18
+ 14 10 6 2 31 28 25 22 19 16 13 10 7 4
+ 1 42 40 38 36 34 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130
+ 0 1 2 3 1 5 5 3 5 1 10 11 1 5
+ 11 3 12 5 17 11 5 21 16 11 6 1 23 19
+ 15 11 7 3 32 29 26 23 20 17 14 11 8 5
+ 2 43 41 39 37 35 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131
+ 0 0 0 0 2 0 6 4 6 2 0 0 2 6
+ 12 4 13 6 18 12 6 0 17 12 7 2 24 20
+ 16 12 8 4 0 30 27 24 21 18 15 12 9 6
+ 3 0 42 40 38 36 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132
+ 0 1 1 1 3 1 0 5 7 3 1 1 3 7
+ 13 5 14 7 0 13 7 1 18 13 8 3 25 21
+ 17 13 9 5 1 31 28 25 22 19 16 13 10 7
+ 4 1 43 41 39 37 35 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133
+ 0 0 2 2 4 2 1 6 8 4 2 2 4 8
+ 14 6 15 8 1 14 8 2 19 14 9 4 26 22
+ 18 14 10 6 2 32 29 26 23 20 17 14 11 8
+ 5 2 44 42 40 38 36 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134
+ 0 1 0 3 0 3 2 7 0 5 3 3 5 9
+ 0 7 16 9 2 15 9 3 20 15 10 5 0 23
+ 19 15 11 7 3 33 30 27 24 21 18 15 12 9
+ 6 3 0 43 41 39 37 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135
+ 0 0 1 0 1 4 3 0 1 6 4 4 6 10
+ 1 8 0 10 3 16 10 4 21 16 11 6 1 24
+ 20 16 12 8 4 0 31 28 25 22 19 16 13 10
+ 7 4 1 44 42 40 38 36 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136
+ 0 1 2 1 2 5 4 1 2 7 5 5 7 11
+ 2 9 1 11 4 17 11 5 22 17 12 7 2 25
+ 21 17 13 9 5 1 32 29 26 23 20 17 14 11
+ 8 5 2 45 43 41 39 37 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137
+ 0 0 0 2 3 0 5 2 3 8 6 6 8 12
+ 3 10 2 12 5 18 12 6 0 18 13 8 3 26
+ 22 18 14 10 6 2 33 30 27 24 21 18 15 12
+ 9 6 3 0 44 42 40 38 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138
+ 0 1 1 3 4 1 6 3 4 9 7 7 9 13
+ 4 11 3 13 6 19 13 7 1 19 14 9 4 27
+ 23 19 15 11 7 3 34 31 28 25 22 19 16 13
+ 10 7 4 1 45 43 41 39 37 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139
+ 0 0 2 0 0 2 0 4 5 0 8 8 10 0
+ 5 12 4 14 7 0 14 8 2 20 15 10 5 0
+ 24 20 16 12 8 4 0 32 29 26 23 20 17 14
+ 11 8 5 2 46 44 42 40 38 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140
+ 0 1 0 1 1 3 1 5 6 1 9 9 11 1
+ 6 13 5 15 8 1 15 9 3 21 16 11 6 1
+ 25 21 17 13 9 5 1 33 30 27 24 21 18 15
+ 12 9 6 3 0 45 43 41 39 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141
+ 0 0 1 2 2 4 2 6 7 2 10 10 12 2
+ 7 14 6 16 9 2 16 10 4 22 17 12 7 2
+ 26 22 18 14 10 6 2 34 31 28 25 22 19 16
+ 13 10 7 4 1 46 44 42 40 38 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142
+ 0 1 2 3 3 5 3 7 8 3 0 11 0 3
+ 8 15 7 17 10 3 17 11 5 23 18 13 8 3
+ 27 23 19 15 11 7 3 35 32 29 26 23 20 17
+ 14 11 8 5 2 47 45 43 41 39 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143
+ 0 0 0 0 4 0 4 0 0 4 1 0 1 4
+ 9 0 8 0 11 4 18 12 6 0 19 14 9 4
+ 28 24 20 16 12 8 4 0 33 30 27 24 21 18
+ 15 12 9 6 3 0 46 44 42 40 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144
+ 0 1 1 1 0 1 5 1 1 5 2 1 2 5
+ 10 1 9 1 12 5 19 13 7 1 20 15 10 5
+ 0 25 21 17 13 9 5 1 34 31 28 25 22 19
+ 16 13 10 7 4 1 47 45 43 41 39 37 35 33
+ 31 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 145 145 145 145 145 145 145 145 145
+ 145 145 145 145 145 145 145 145 145 145 145 145 145 145
+ 145 145 145 145 145 145 145 145 145 145 145 145 145 145
+ 145 145 145 145 145 145 145 145 145 145 145 145 145 145
+ 145 145 145 145
+ 0 0 2 2 1 2 6 2 2 6 3 2 3 6
+ 11 2 10 2 13 6 20 14 8 2 21 16 11 6
+ 1 26 22 18 14 10 6 2 35 32 29 26 23 20
+ 17 14 11 8 5 2 48 46 44 42 40 38 36 34
+ 32 30 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 146 146 146 146 146 146 146 146
+ 146 146 146 146 146 146 146 146 146 146 146 146 146 146
+ 146 146 146 146 146 146 146 146 146 146 146 146 146 146
+ 146 146 146 146 146 146 146 146 146 146 146 146 146 146
+ 146 146 146 146
+ 0 1 0 3 2 3 0 3 3 7 4 3 4 7
+ 12 3 11 3 14 7 0 15 9 3 22 17 12 7
+ 2 27 23 19 15 11 7 3 36 33 30 27 24 21
+ 18 15 12 9 6 3 0 47 45 43 41 39 37 35
+ 33 31 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 147 147 147 147 147 147 147
+ 147 147 147 147 147 147 147 147 147 147 147 147 147 147
+ 147 147 147 147 147 147 147 147 147 147 147 147 147 147
+ 147 147 147 147 147 147 147 147 147 147 147 147 147 147
+ 147 147 147 147
+ 0 0 1 0 3 4 1 4 4 8 5 4 5 8
+ 13 4 12 4 15 8 1 16 10 4 23 18 13 8
+ 3 28 24 20 16 12 8 4 0 34 31 28 25 22
+ 19 16 13 10 7 4 1 48 46 44 42 40 38 36
+ 34 32 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 148 148 148 148 148 148
+ 148 148 148 148 148 148 148 148 148 148 148 148 148 148
+ 148 148 148 148 148 148 148 148 148 148 148 148 148 148
+ 148 148 148 148 148 148 148 148 148 148 148 148 148 148
+ 148 148 148 148
+ 0 1 2 1 4 5 2 5 5 9 6 5 6 9
+ 14 5 13 5 16 9 2 17 11 5 24 19 14 9
+ 4 29 25 21 17 13 9 5 1 35 32 29 26 23
+ 20 17 14 11 8 5 2 49 47 45 43 41 39 37
+ 35 33 31 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 149 149 149 149 149
+ 149 149 149 149 149 149 149 149 149 149 149 149 149 149
+ 149 149 149 149 149 149 149 149 149 149 149 149 149 149
+ 149 149 149 149 149 149 149 149 149 149 149 149 149 149
+ 149 149 149 149
+ 0 0 0 2 0 0 3 6 6 0 7 6 7 10
+ 0 6 14 6 17 10 3 18 12 6 0 20 15 10
+ 5 0 26 22 18 14 10 6 2 36 33 30 27 24
+ 21 18 15 12 9 6 3 0 48 46 44 42 40 38
+ 36 34 32 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 150 150 150 150
+ 150 150 150 150 150 150 150 150 150 150 150 150 150 150
+ 150 150 150 150 150 150 150 150 150 150 150 150 150 150
+ 150 150 150 150 150 150 150 150 150 150 150 150 150 150
+ 150 150 150 150
+ 0 1 1 3 1 1 4 7 7 1 8 7 8 11
+ 1 7 15 7 18 11 4 19 13 7 1 21 16 11
+ 6 1 27 23 19 15 11 7 3 37 34 31 28 25
+ 22 19 16 13 10 7 4 1 49 47 45 43 41 39
+ 37 35 33 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 151 151 151
+ 151 151 151 151 151 151 151 151 151 151 151 151 151 151
+ 151 151 151 151 151 151 151 151 151 151 151 151 151 151
+ 151 151 151 151 151 151 151 151 151 151 151 151 151 151
+ 151 151 151 151
+ 0 0 2 0 2 2 5 0 8 2 9 8 9 12
+ 2 8 16 8 0 12 5 20 14 8 2 22 17 12
+ 7 2 28 24 20 16 12 8 4 0 35 32 29 26
+ 23 20 17 14 11 8 5 2 50 48 46 44 42 40
+ 38 36 34 32 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 152 152
+ 152 152 152 152 152 152 152 152 152 152 152 152 152 152
+ 152 152 152 152 152 152 152 152 152 152 152 152 152 152
+ 152 152 152 152 152 152 152 152 152 152 152 152 152 152
+ 152 152 152 152
+ 0 1 0 1 3 3 6 1 0 3 10 9 10 13
+ 3 9 0 9 1 13 6 21 15 9 3 23 18 13
+ 8 3 29 25 21 17 13 9 5 1 36 33 30 27
+ 24 21 18 15 12 9 6 3 0 49 47 45 43 41
+ 39 37 35 33 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 153
+ 153 153 153 153 153 153 153 153 153 153 153 153 153 153
+ 153 153 153 153 153 153 153 153 153 153 153 153 153 153
+ 153 153 153 153 153 153 153 153 153 153 153 153 153 153
+ 153 153 153 153
+ 0 0 1 2 4 4 0 2 1 4 0 10 11 0
+ 4 10 1 10 2 14 7 0 16 10 4 24 19 14
+ 9 4 30 26 22 18 14 10 6 2 37 34 31 28
+ 25 22 19 16 13 10 7 4 1 50 48 46 44 42
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 154 154 154 154 154 154 154 154 154 154 154 154 154 154
+ 154 154 154 154 154 154 154 154 154 154 154 154 154 154
+ 154 154 154 154 154 154 154 154 154 154 154 154 154 154
+ 154 154 154 154
+ 0 1 2 3 0 5 1 3 2 5 1 11 12 1
+ 5 11 2 11 3 15 8 1 17 11 5 25 20 15
+ 10 5 0 27 23 19 15 11 7 3 38 35 32 29
+ 26 23 20 17 14 11 8 5 2 51 49 47 45 43
+ 41 39 37 35 33 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 155 155 155 155 155 155 155 155 155 155 155 155 155
+ 155 155 155 155 155 155 155 155 155 155 155 155 155 155
+ 155 155 155 155 155 155 155 155 155 155 155 155 155 155
+ 155 155 155 155
+ 0 0 0 0 1 0 2 4 3 6 2 0 0 2
+ 6 12 3 12 4 16 9 2 18 12 6 0 21 16
+ 11 6 1 28 24 20 16 12 8 4 0 36 33 30
+ 27 24 21 18 15 12 9 6 3 0 50 48 46 44
+ 42 40 38 36 34 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 156 156 156 156 156 156 156 156 156 156 156 156
+ 156 156 156 156 156 156 156 156 156 156 156 156 156 156
+ 156 156 156 156 156 156 156 156 156 156 156 156 156 156
+ 156 156 156 156
+ 0 1 1 1 2 1 3 5 4 7 3 1 1 3
+ 7 13 4 13 5 17 10 3 19 13 7 1 22 17
+ 12 7 2 29 25 21 17 13 9 5 1 37 34 31
+ 28 25 22 19 16 13 10 7 4 1 51 49 47 45
+ 43 41 39 37 35 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 157 157 157 157 157 157 157 157 157 157 157
+ 157 157 157 157 157 157 157 157 157 157 157 157 157 157
+ 157 157 157 157 157 157 157 157 157 157 157 157 157 157
+ 157 157 157 157
+ 0 0 2 2 3 2 4 6 5 8 4 2 2 4
+ 8 14 5 14 6 18 11 4 20 14 8 2 23 18
+ 13 8 3 30 26 22 18 14 10 6 2 38 35 32
+ 29 26 23 20 17 14 11 8 5 2 52 50 48 46
+ 44 42 40 38 36 34 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 158 158 158 158 158 158 158 158 158 158
+ 158 158 158 158 158 158 158 158 158 158 158 158 158 158
+ 158 158 158 158 158 158 158 158 158 158 158 158 158 158
+ 158 158 158 158
+ 0 1 0 3 4 3 5 7 6 9 5 3 3 5
+ 9 15 6 15 7 19 12 5 21 15 9 3 24 19
+ 14 9 4 31 27 23 19 15 11 7 3 39 36 33
+ 30 27 24 21 18 15 12 9 6 3 0 51 49 47
+ 45 43 41 39 37 35 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 79 78 77 76 75
+ 74 73 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 159 159 159 159 159 159 159 159 159
+ 159 159 159 159 159 159 159 159 159 159 159 159 159 159
+ 159 159 159 159 159 159 159 159 159 159 159 159 159 159
+ 159 159 159 159
+ 0 0 1 0 0 4 6 0 7 0 6 4 4 6
+ 10 0 7 16 8 0 13 6 22 16 10 4 25 20
+ 15 10 5 0 28 24 20 16 12 8 4 0 37 34
+ 31 28 25 22 19 16 13 10 7 4 1 52 50 48
+ 46 44 42 40 38 36 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 79 78 77 76
+ 75 74 73 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 160 160 160 160 160 160 160 160
+ 160 160 160 160 160 160 160 160 160 160 160 160 160 160
+ 160 160 160 160 160 160 160 160 160 160 160 160 160 160
+ 160 160 160 160
+ 0 1 2 1 1 5 0 1 8 1 7 5 5 7
+ 11 1 8 17 9 1 14 7 0 17 11 5 26 21
+ 16 11 6 1 29 25 21 17 13 9 5 1 38 35
+ 32 29 26 23 20 17 14 11 8 5 2 53 51 49
+ 47 45 43 41 39 37 35 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 80 79 78 77
+ 76 75 74 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 161 161 161 161 161 161 161
+ 161 161 161 161 161 161 161 161 161 161 161 161 161 161
+ 161 161 161 161 161 161 161 161 161 161 161 161 161 161
+ 161 161 161 161
+ 0 0 0 2 2 0 1 2 0 2 8 6 6 8
+ 12 2 9 0 10 2 15 8 1 18 12 6 0 22
+ 17 12 7 2 30 26 22 18 14 10 6 2 39 36
+ 33 30 27 24 21 18 15 12 9 6 3 0 52 50
+ 48 46 44 42 40 38 36 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 80 79 78
+ 77 76 75 74 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 162 162 162 162 162 162
+ 162 162 162 162 162 162 162 162 162 162 162 162 162 162
+ 162 162 162 162 162 162 162 162 162 162 162 162 162 162
+ 162 162 162 162
+ 0 1 1 3 3 1 2 3 1 3 9 7 7 9
+ 13 3 10 1 11 3 16 9 2 19 13 7 1 23
+ 18 13 8 3 31 27 23 19 15 11 7 3 40 37
+ 34 31 28 25 22 19 16 13 10 7 4 1 53 51
+ 49 47 45 43 41 39 37 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 81 80 79
+ 78 77 76 75 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 163 163 163 163 163
+ 163 163 163 163 163 163 163 163 163 163 163 163 163 163
+ 163 163 163 163 163 163 163 163 163 163 163 163 163 163
+ 163 163 163 163
+ 0 0 2 0 4 2 3 4 2 4 10 8 8 10
+ 14 4 11 2 12 4 17 10 3 20 14 8 2 24
+ 19 14 9 4 32 28 24 20 16 12 8 4 0 38
+ 35 32 29 26 23 20 17 14 11 8 5 2 54 52
+ 50 48 46 44 42 40 38 36 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 81 80
+ 79 78 77 76 75 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 164 164 164 164
+ 164 164 164 164 164 164 164 164 164 164 164 164 164 164
+ 164 164 164 164 164 164 164 164 164 164 164 164 164 164
+ 164 164 164 164
+ 0 1 0 1 0 3 4 5 3 5 0 9 9 11
+ 0 5 12 3 13 5 18 11 4 21 15 9 3 25
+ 20 15 10 5 0 29 25 21 17 13 9 5 1 39
+ 36 33 30 27 24 21 18 15 12 9 6 3 0 53
+ 51 49 47 45 43 41 39 37 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 82 81
+ 80 79 78 77 76 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 165 165 165
+ 165 165 165 165 165 165 165 165 165 165 165 165 165 165
+ 165 165 165 165 165 165 165 165 165 165 165 165 165 165
+ 165 165 165 165
+ 0 0 1 2 1 4 5 6 4 6 1 10 10 12
+ 1 6 13 4 14 6 19 12 5 22 16 10 4 26
+ 21 16 11 6 1 30 26 22 18 14 10 6 2 40
+ 37 34 31 28 25 22 19 16 13 10 7 4 1 54
+ 52 50 48 46 44 42 40 38 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 82
+ 81 80 79 78 77 76 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 166 166
+ 166 166 166 166 166 166 166 166 166 166 166 166 166 166
+ 166 166 166 166 166 166 166 166 166 166 166 166 166 166
+ 166 166 166 166
+ 0 1 2 3 2 5 6 7 5 7 2 11 11 13
+ 2 7 14 5 15 7 20 13 6 23 17 11 5 27
+ 22 17 12 7 2 31 27 23 19 15 11 7 3 41
+ 38 35 32 29 26 23 20 17 14 11 8 5 2 55
+ 53 51 49 47 45 43 41 39 37 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 83
+ 82 81 80 79 78 77 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 167
+ 167 167 167 167 167 167 167 167 167 167 167 167 167 167
+ 167 167 167 167 167 167 167 167 167 167 167 167 167 167
+ 167 167 167 167
+ 0 0 0 0 3 0 0 0 6 8 3 0 12 0
+ 3 8 15 6 16 8 0 14 7 0 18 12 6 0
+ 23 18 13 8 3 32 28 24 20 16 12 8 4 0
+ 39 36 33 30 27 24 21 18 15 12 9 6 3 0
+ 54 52 50 48 46 44 42 40 38 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 83 82 81 80 79 78 77 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 168 168 168 168 168 168 168 168 168 168 168 168 168 168
+ 168 168 168 168 168 168 168 168 168 168 168 168 168 168
+ 168 168 168 168
+ 0 1 1 1 4 1 1 1 7 9 4 1 0 1
+ 4 9 16 7 17 9 1 15 8 1 19 13 7 1
+ 24 19 14 9 4 33 29 25 21 17 13 9 5 1
+ 40 37 34 31 28 25 22 19 16 13 10 7 4 1
+ 55 53 51 49 47 45 43 41 39 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 84 83 82 81 80 79 78 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 169 169 169 169 169 169 169 169 169 169 169 169 169
+ 169 169 169 169 169 169 169 169 169 169 169 169 169 169
+ 169 169 169 169
+ 0 0 2 2 0 2 2 2 8 0 5 2 1 2
+ 5 10 0 8 18 10 2 16 9 2 20 14 8 2
+ 25 20 15 10 5 0 30 26 22 18 14 10 6 2
+ 41 38 35 32 29 26 23 20 17 14 11 8 5 2
+ 56 54 52 50 48 46 44 42 40 38 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 84 83 82 81 80 79 78 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 170 170 170 170 170 170 170 170 170 170 170 170
+ 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+ 170 170 170 170
+ 0 1 0 3 1 3 3 3 0 1 6 3 2 3
+ 6 11 1 9 0 11 3 17 10 3 21 15 9 3
+ 26 21 16 11 6 1 31 27 23 19 15 11 7 3
+ 42 39 36 33 30 27 24 21 18 15 12 9 6 3
+ 0 55 53 51 49 47 45 43 41 39 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 85 84 83 82 81 80 79 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 171 171 171 171 171 171 171 171 171 171 171
+ 171 171 171 171 171 171 171 171 171 171 171 171 171 171
+ 171 171 171 171
+ 0 0 1 0 2 4 4 4 1 2 7 4 3 4
+ 7 12 2 10 1 12 4 18 11 4 22 16 10 4
+ 27 22 17 12 7 2 32 28 24 20 16 12 8 4
+ 0 40 37 34 31 28 25 22 19 16 13 10 7 4
+ 1 56 54 52 50 48 46 44 42 40 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 85 84 83 82 81 80 79 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 172 172 172 172 172 172 172 172 172 172
+ 172 172 172 172 172 172 172 172 172 172 172 172 172 172
+ 172 172 172 172
+ 0 1 2 1 3 5 5 5 2 3 8 5 4 5
+ 8 13 3 11 2 13 5 19 12 5 23 17 11 5
+ 28 23 18 13 8 3 33 29 25 21 17 13 9 5
+ 1 41 38 35 32 29 26 23 20 17 14 11 8 5
+ 2 57 55 53 51 49 47 45 43 41 39 37 35 33
+ 31 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 86 85 84 83 82 81 80 79 78 77 76 75
+ 74 73 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 173 173 173 173 173 173 173 173 173
+ 173 173 173 173 173 173 173 173 173 173 173 173 173 173
+ 173 173 173 173
+ 0 0 0 2 4 0 6 6 3 4 9 6 5 6
+ 9 14 4 12 3 14 6 20 13 6 24 18 12 6
+ 0 24 19 14 9 4 34 30 26 22 18 14 10 6
+ 2 42 39 36 33 30 27 24 21 18 15 12 9 6
+ 3 0 56 54 52 50 48 46 44 42 40 38 36 34
+ 32 30 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 86 85 84 83 82 81 80 79 78 77 76
+ 75 74 73 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 174 174 174 174 174 174 174 174
+ 174 174 174 174 174 174 174 174 174 174 174 174 174 174
+ 174 174 174 174
+ 0 1 1 3 0 1 0 7 4 5 10 7 6 7
+ 10 15 5 13 4 15 7 21 14 7 0 19 13 7
+ 1 25 20 15 10 5 0 31 27 23 19 15 11 7
+ 3 43 40 37 34 31 28 25 22 19 16 13 10 7
+ 4 1 57 55 53 51 49 47 45 43 41 39 37 35
+ 33 31 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 87 86 85 84 83 82 81 80 79 78 77
+ 76 75 74 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 175 175 175 175 175 175 175
+ 175 175 175 175 175 175 175 175 175 175 175 175 175 175
+ 175 175 175 175
+ 0 0 2 0 1 2 1 0 5 6 0 8 7 8
+ 11 0 6 14 5 16 8 0 15 8 1 20 14 8
+ 2 26 21 16 11 6 1 32 28 24 20 16 12 8
+ 4 0 41 38 35 32 29 26 23 20 17 14 11 8
+ 5 2 58 56 54 52 50 48 46 44 42 40 38 36
+ 34 32 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 87 86 85 84 83 82 81 80 79 78
+ 77 76 75 74 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 176 176 176 176 176 176
+ 176 176 176 176 176 176 176 176 176 176 176 176 176 176
+ 176 176 176 176
+ 0 1 0 1 2 3 2 1 6 7 1 9 8 9
+ 12 1 7 15 6 17 9 1 16 9 2 21 15 9
+ 3 27 22 17 12 7 2 33 29 25 21 17 13 9
+ 5 1 42 39 36 33 30 27 24 21 18 15 12 9
+ 6 3 0 57 55 53 51 49 47 45 43 41 39 37
+ 35 33 31 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 88 87 86 85 84 83 82 81 80 79
+ 78 77 76 75 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 177 177 177 177 177
+ 177 177 177 177 177 177 177 177 177 177 177 177 177 177
+ 177 177 177 177
+ 0 0 1 2 3 4 3 2 7 8 2 10 9 10
+ 13 2 8 16 7 18 10 2 17 10 3 22 16 10
+ 4 28 23 18 13 8 3 34 30 26 22 18 14 10
+ 6 2 43 40 37 34 31 28 25 22 19 16 13 10
+ 7 4 1 58 56 54 52 50 48 46 44 42 40 38
+ 36 34 32 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 88 87 86 85 84 83 82 81 80
+ 79 78 77 76 75 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 178 178 178 178
+ 178 178 178 178 178 178 178 178 178 178 178 178 178 178
+ 178 178 178 178
+ 0 1 2 3 4 5 4 3 8 9 3 11 10 11
+ 14 3 9 17 8 19 11 3 18 11 4 23 17 11
+ 5 29 24 19 14 9 4 35 31 27 23 19 15 11
+ 7 3 44 41 38 35 32 29 26 23 20 17 14 11
+ 8 5 2 59 57 55 53 51 49 47 45 43 41 39
+ 37 35 33 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 89 88 87 86 85 84 83 82 81
+ 80 79 78 77 76 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 179 179 179
+ 179 179 179 179 179 179 179 179 179 179 179 179 179 179
+ 179 179 179 179
+ 0 0 0 0 0 0 5 4 0 0 4 0 11 12
+ 0 4 10 0 9 0 12 4 19 12 5 24 18 12
+ 6 0 25 20 15 10 5 0 32 28 24 20 16 12
+ 8 4 0 42 39 36 33 30 27 24 21 18 15 12
+ 9 6 3 0 58 56 54 52 50 48 46 44 42 40
+ 38 36 34 32 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 89 88 87 86 85 84 83 82
+ 81 80 79 78 77 76 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 180 180
+ 180 180 180 180 180 180 180 180 180 180 180 180 180 180
+ 180 180 180 180
+ 0 1 1 1 1 1 6 5 1 1 5 1 12 13
+ 1 5 11 1 10 1 13 5 20 13 6 25 19 13
+ 7 1 26 21 16 11 6 1 33 29 25 21 17 13
+ 9 5 1 43 40 37 34 31 28 25 22 19 16 13
+ 10 7 4 1 59 57 55 53 51 49 47 45 43 41
+ 39 37 35 33 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 90 89 88 87 86 85 84 83
+ 82 81 80 79 78 77 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 181
+ 181 181 181 181 181 181 181 181 181 181 181 181 181 181
+ 181 181 181 181
+ 0 0 2 2 2 2 0 6 2 2 6 2 0 0
+ 2 6 12 2 11 2 14 6 21 14 7 0 20 14
+ 8 2 27 22 17 12 7 2 34 30 26 22 18 14
+ 10 6 2 44 41 38 35 32 29 26 23 20 17 14
+ 11 8 5 2 60 58 56 54 52 50 48 46 44 42
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 90 89 88 87 86 85 84
+ 83 82 81 80 79 78 77 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 182 182 182 182 182 182 182 182 182 182 182 182 182 182
+ 182 182 182 182
+ 0 1 0 3 3 3 1 7 3 3 7 3 1 1
+ 3 7 13 3 12 3 15 7 22 15 8 1 21 15
+ 9 3 28 23 18 13 8 3 35 31 27 23 19 15
+ 11 7 3 45 42 39 36 33 30 27 24 21 18 15
+ 12 9 6 3 0 59 57 55 53 51 49 47 45 43
+ 41 39 37 35 33 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 91 90 89 88 87 86 85
+ 84 83 82 81 80 79 78 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 183 183 183 183 183 183 183 183 183 183 183 183 183
+ 183 183 183 183
+ 0 0 1 0 4 4 2 0 4 4 8 4 2 2
+ 4 8 14 4 13 4 16 8 0 16 9 2 22 16
+ 10 4 29 24 19 14 9 4 36 32 28 24 20 16
+ 12 8 4 0 43 40 37 34 31 28 25 22 19 16
+ 13 10 7 4 1 60 58 56 54 52 50 48 46 44
+ 42 40 38 36 34 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 91 90 89 88 87 86
+ 85 84 83 82 81 80 79 78 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 184 184 184 184 184 184 184 184 184 184 184 184
+ 184 184 184 184
+ 0 1 2 1 0 5 3 1 5 5 9 5 3 3
+ 5 9 15 5 14 5 17 9 1 17 10 3 23 17
+ 11 5 30 25 20 15 10 5 0 33 29 25 21 17
+ 13 9 5 1 44 41 38 35 32 29 26 23 20 17
+ 14 11 8 5 2 61 59 57 55 53 51 49 47 45
+ 43 41 39 37 35 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 92 91 90 89 88 87
+ 86 85 84 83 82 81 80 79 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 185 185 185 185 185 185 185 185 185 185 185
+ 185 185 185 185
+ 0 0 0 2 1 0 4 2 6 6 10 6 4 4
+ 6 10 16 6 15 6 18 10 2 18 11 4 24 18
+ 12 6 0 26 21 16 11 6 1 34 30 26 22 18
+ 14 10 6 2 45 42 39 36 33 30 27 24 21 18
+ 15 12 9 6 3 0 60 58 56 54 52 50 48 46
+ 44 42 40 38 36 34 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 92 91 90 89 88
+ 87 86 85 84 83 82 81 80 79 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 186 186 186 186 186 186 186 186 186 186
+ 186 186 186 186
+ 0 1 1 3 2 1 5 3 7 7 0 7 5 5
+ 7 11 0 7 16 7 19 11 3 19 12 5 25 19
+ 13 7 1 27 22 17 12 7 2 35 31 27 23 19
+ 15 11 7 3 46 43 40 37 34 31 28 25 22 19
+ 16 13 10 7 4 1 61 59 57 55 53 51 49 47
+ 45 43 41 39 37 35 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 93 92 91 90 89
+ 88 87 86 85 84 83 82 81 80 79 78 77 76 75
+ 74 73 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 187 187 187 187 187 187 187 187 187
+ 187 187 187 187
+ 0 0 2 0 3 2 6 4 8 8 1 8 6 6
+ 8 12 1 8 17 8 20 12 4 20 13 6 26 20
+ 14 8 2 28 23 18 13 8 3 36 32 28 24 20
+ 16 12 8 4 0 44 41 38 35 32 29 26 23 20
+ 17 14 11 8 5 2 62 60 58 56 54 52 50 48
+ 46 44 42 40 38 36 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 93 92 91 90
+ 89 88 87 86 85 84 83 82 81 80 79 78 77 76
+ 75 74 73 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 188 188 188 188 188 188 188 188
+ 188 188 188 188
+ 0 1 0 1 4 3 0 5 0 9 2 9 7 7
+ 9 13 2 9 18 9 0 13 5 21 14 7 0 21
+ 15 9 3 29 24 19 14 9 4 37 33 29 25 21
+ 17 13 9 5 1 45 42 39 36 33 30 27 24 21
+ 18 15 12 9 6 3 0 61 59 57 55 53 51 49
+ 47 45 43 41 39 37 35 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 94 93 92 91
+ 90 89 88 87 86 85 84 83 82 81 80 79 78 77
+ 76 75 74 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 189 189 189 189 189 189 189
+ 189 189 189 189
+ 0 0 1 2 0 4 1 6 1 0 3 10 8 8
+ 10 14 3 10 0 10 1 14 6 22 15 8 1 22
+ 16 10 4 30 25 20 15 10 5 0 34 30 26 22
+ 18 14 10 6 2 46 43 40 37 34 31 28 25 22
+ 19 16 13 10 7 4 1 62 60 58 56 54 52 50
+ 48 46 44 42 40 38 36 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 94 93 92
+ 91 90 89 88 87 86 85 84 83 82 81 80 79 78
+ 77 76 75 74 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 190 190 190 190 190 190
+ 190 190 190 190
+ 0 1 2 3 1 5 2 7 2 1 4 11 9 9
+ 11 15 4 11 1 11 2 15 7 23 16 9 2 23
+ 17 11 5 31 26 21 16 11 6 1 35 31 27 23
+ 19 15 11 7 3 47 44 41 38 35 32 29 26 23
+ 20 17 14 11 8 5 2 63 61 59 57 55 53 51
+ 49 47 45 43 41 39 37 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 95 94 93
+ 92 91 90 89 88 87 86 85 84 83 82 81 80 79
+ 78 77 76 75 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 191 191 191 191 191
+ 191 191 191 191
+ 0 0 0 0 2 0 3 0 3 2 5 0 10 10
+ 12 0 5 12 2 12 3 16 8 0 17 10 3 24
+ 18 12 6 0 27 22 17 12 7 2 36 32 28 24
+ 20 16 12 8 4 0 45 42 39 36 33 30 27 24
+ 21 18 15 12 9 6 3 0 62 60 58 56 54 52
+ 50 48 46 44 42 40 38 36 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 95 94
+ 93 92 91 90 89 88 87 86 85 84 83 82 81 80
+ 79 78 77 76 75 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 192 192 192 192
+ 192 192 192 192
+ 0 1 1 1 3 1 4 1 4 3 6 1 11 11
+ 13 1 6 13 3 13 4 17 9 1 18 11 4 25
+ 19 13 7 1 28 23 18 13 8 3 37 33 29 25
+ 21 17 13 9 5 1 46 43 40 37 34 31 28 25
+ 22 19 16 13 10 7 4 1 63 61 59 57 55 53
+ 51 49 47 45 43 41 39 37 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 96 95
+ 94 93 92 91 90 89 88 87 86 85 84 83 82 81
+ 80 79 78 77 76 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 193 193 193
+ 193 193 193 193
+ 0 0 2 2 4 2 5 2 5 4 7 2 12 12
+ 14 2 7 14 4 14 5 18 10 2 19 12 5 26
+ 20 14 8 2 29 24 19 14 9 4 38 34 30 26
+ 22 18 14 10 6 2 47 44 41 38 35 32 29 26
+ 23 20 17 14 11 8 5 2 64 62 60 58 56 54
+ 52 50 48 46 44 42 40 38 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 96
+ 95 94 93 92 91 90 89 88 87 86 85 84 83 82
+ 81 80 79 78 77 76 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 194 194
+ 194 194 194 194
+ 0 1 0 3 0 3 6 3 6 5 8 3 0 13
+ 0 3 8 15 5 15 6 19 11 3 20 13 6 27
+ 21 15 9 3 30 25 20 15 10 5 0 35 31 27
+ 23 19 15 11 7 3 48 45 42 39 36 33 30 27
+ 24 21 18 15 12 9 6 3 0 63 61 59 57 55
+ 53 51 49 47 45 43 41 39 37 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 97
+ 96 95 94 93 92 91 90 89 88 87 86 85 84 83
+ 82 81 80 79 78 77 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 195
+ 195 195 195 195
+ 0 0 1 0 1 4 0 4 7 6 9 4 1 0
+ 1 4 9 16 6 16 7 20 12 4 21 14 7 0
+ 22 16 10 4 31 26 21 16 11 6 1 36 32 28
+ 24 20 16 12 8 4 0 46 43 40 37 34 31 28
+ 25 22 19 16 13 10 7 4 1 64 62 60 58 56
+ 54 52 50 48 46 44 42 40 38 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 97 96 95 94 93 92 91 90 89 88 87 86 85 84
+ 83 82 81 80 79 78 77 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 196 196 196 196
+ 0 1 2 1 2 5 1 5 8 7 10 5 2 1
+ 2 5 10 17 7 17 8 21 13 5 22 15 8 1
+ 23 17 11 5 32 27 22 17 12 7 2 37 33 29
+ 25 21 17 13 9 5 1 47 44 41 38 35 32 29
+ 26 23 20 17 14 11 8 5 2 65 63 61 59 57
+ 55 53 51 49 47 45 43 41 39 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 98 97 96 95 94 93 92 91 90 89 88 87 86 85
+ 84 83 82 81 80 79 78 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 197 197 197
+ 0 0 0 2 3 0 2 6 0 8 0 6 3 2
+ 3 6 11 0 8 18 9 0 14 6 23 16 9 2
+ 24 18 12 6 0 28 23 18 13 8 3 38 34 30
+ 26 22 18 14 10 6 2 48 45 42 39 36 33 30
+ 27 24 21 18 15 12 9 6 3 0 64 62 60 58
+ 56 54 52 50 48 46 44 42 40 38 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 98 97 96 95 94 93 92 91 90 89 88 87 86
+ 85 84 83 82 81 80 79 78 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 198 198
+ 0 1 1 3 4 1 3 7 1 9 1 7 4 3
+ 4 7 12 1 9 19 10 1 15 7 24 17 10 3
+ 25 19 13 7 1 29 24 19 14 9 4 39 35 31
+ 27 23 19 15 11 7 3 49 46 43 40 37 34 31
+ 28 25 22 19 16 13 10 7 4 1 65 63 61 59
+ 57 55 53 51 49 47 45 43 41 39 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 99 98 97 96 95 94 93 92 91 90 89 88 87
+ 86 85 84 83 82 81 80 79 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 199
+ 0 0 2 0 0 2 4 0 2 0 2 8 5 4
+ 5 8 13 2 10 0 11 2 16 8 0 18 11 4
+ 26 20 14 8 2 30 25 20 15 10 5 0 36 32
+ 28 24 20 16 12 8 4 0 47 44 41 38 35 32
+ 29 26 23 20 17 14 11 8 5 2 66 64 62 60
+ 58 56 54 52 50 48 46 44 42 40 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 99 98 97 96 95 94 93 92 91 90 89 88
+ 87 86 85 84 83 82 81 80 79 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm
new file mode 100644
index 000000000..5c2320cd6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm
@@ -0,0 +1,16388 @@
+P3
+# snail.ppm
+256 256
+255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 246 234
+255 248 232 255 244 232 255 249 232 255 246 235
+251 244 228 252 244 233 253 245 233 255 249 239
+255 251 239 248 239 232 221 202 179 211 191 167
+220 206 157 254 246 225 255 250 243 254 243 241
+237 223 214 233 208 164 238 218 179 247 241 211
+255 250 236 253 249 238 255 250 245 248 242 233
+240 224 215 252 247 232 250 246 232 253 244 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 245 233 255 255 255 255 255 255
+255 248 236 255 252 244 253 243 234 240 229 220
+206 190 156 223 201 165 249 233 191 255 252 228
+255 253 244 251 245 235 236 221 189 230 212 162
+250 237 194 255 252 236 255 251 240 255 251 242
+255 250 244 255 244 241 227 210 195 237 217 171
+249 229 188 255 248 240 255 247 234 255 245 234
+249 243 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 252 244
+248 238 228 223 201 175 217 208 160 227 208 176
+255 247 214 255 251 241 255 247 238 255 245 233
+250 241 221 253 237 190 255 250 235 255 250 234
+255 250 242 255 249 242 255 248 239 245 225 216
+227 212 170 232 212 176 249 236 186 255 252 239
+255 251 238 255 248 232 255 246 232 255 247 234
+255 245 232 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 252 236 227 230 213 191 220 194 161
+228 208 173 253 237 204 250 245 216 234 219 201
+243 222 193 255 248 236 255 247 234 255 247 231
+255 247 231 255 246 237 255 247 233 255 245 239
+253 248 229 231 209 187 236 214 169 250 235 189
+255 252 230 255 252 236 255 249 241 255 248 233
+255 236 224 255 249 235 255 246 232 255 246 227
+255 246 234 255 246 229 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 253 243 236 228 226 237 218 205
+212 196 181 219 194 144 247 232 200 254 247 221
+236 224 203 230 209 177 239 215 168 246 238 204
+255 244 224 255 247 238 255 255 255 255 255 255
+255 255 255 255 255 246 255 245 233 255 245 235
+255 246 225 255 247 216 255 248 226 255 249 242
+255 244 238 255 246 236 255 246 236 255 246 231
+255 247 236 255 250 234 255 247 233 255 246 234
+255 248 235 255 246 234 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 249 236 255 253 243 255 246 238
+233 220 197 226 208 190 227 204 154 234 214 173
+242 229 199 245 241 222 231 219 196 220 200 166
+242 225 182 255 244 217 255 251 234 254 245 238
+253 239 232 255 255 255 156 152 178 87 63 0
+127 102 95 197 189 192 255 255 255 255 246 235
+255 247 234 255 245 234 255 247 235 255 246 232
+255 250 233 255 246 236 255 244 229 255 249 232
+255 244 236 255 246 225 255 248 235 255 246 232
+255 250 234 255 246 232 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 239 219 197 206 182 151
+225 204 156 248 224 192 249 238 220 252 239 233
+249 241 237 239 228 187 255 248 222 255 247 219
+255 251 241 252 246 233 249 242 229 252 238 230
+255 248 232 172 188 225 198 115 0 137 153 0
+94 72 0 65 63 0 255 239 247 255 248 236
+255 246 231 255 245 233 255 244 228 255 246 235
+255 246 232 255 246 231 255 247 232 255 246 232
+255 244 233 255 246 231 255 246 232 255 242 230
+255 246 230 255 246 232 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 245 236 224 241 220 201
+212 196 165 225 198 160 226 210 157 255 243 220
+255 245 236 249 238 226 244 224 181 245 235 209
+248 239 230 250 241 234 255 248 236 255 245 233
+252 245 231 253 245 233 248 244 225 255 243 235
+255 255 255 86 129 65 242 191 44 240 229 229
+249 195 0 174 165 0 149 112 105 255 255 255
+255 246 232 255 245 233 255 247 233 255 246 232
+255 247 233 255 245 234 255 245 236 255 247 232
+255 247 236 255 248 232 255 246 232 255 245 232
+255 247 234 255 247 234 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 247 233 255 255 255 255 251 240 253 241 226
+245 228 217 210 193 153 218 188 158 211 194 164
+238 228 186 255 245 232 251 243 229 236 218 182
+244 233 202 249 240 217 254 245 236 255 245 237
+246 243 229 249 241 227 253 245 230 251 244 231
+246 238 227 250 240 229 247 242 224 254 241 237
+255 255 255 65 0 0 58 0 0 204 199 0
+212 182 0 0 43 0 218 158 143 255 254 246
+255 247 229 255 245 231 255 245 228 255 246 236
+248 242 227 248 245 230 252 244 229 249 240 225
+255 244 233 255 245 229 255 247 232 255 245 232
+255 244 233 250 243 227 251 241 230 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 244 232
+255 250 239 255 253 238 255 243 234 217 194 167
+208 185 147 230 220 176 254 246 223 255 250 242
+238 230 215 230 213 177 243 228 190 255 251 229
+253 247 237 250 242 232 253 244 235 251 244 230
+251 241 229 247 237 227 252 244 231 250 242 231
+244 239 227 253 244 232 252 246 229 255 255 255
+37 66 93 168 65 0 197 194 0 54 0 0
+0 0 0 97 2 0 255 255 255 246 239 235
+253 246 230 255 246 233 253 244 231 249 241 229
+246 239 230 250 241 229 252 245 234 249 242 228
+251 241 234 248 244 229 255 247 234 255 245 234
+248 243 229 247 242 231 246 239 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 247 235 255 250 242 255 250 244
+242 228 212 229 205 171 208 179 152 237 220 175
+255 255 128 248 243 242 240 223 198 230 214 192
+240 227 179 252 242 232 251 245 236 255 247 232
+255 245 234 255 246 236 248 243 232 251 244 231
+250 240 230 246 238 228 250 244 227 252 246 231
+250 241 228 252 239 229 255 250 238 204 234 255
+129 22 0 233 191 0 181 134 0 0 0 0
+180 154 0 255 255 209 254 247 249 248 240 231
+248 242 230 255 244 231 252 245 231 250 241 232
+250 245 229 252 246 233 255 246 235 249 241 227
+248 240 230 249 240 226 255 247 233 255 246 232
+248 241 230 247 243 230 251 244 231 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 251 237 225 240 223 207 211 191 150
+216 190 163 228 216 166 255 248 240 249 238 235
+243 226 205 246 227 188 247 237 200 255 247 236
+252 248 238 249 240 229 249 241 228 255 249 237
+253 243 233 243 233 221 239 223 210 247 238 230
+243 237 224 244 236 224 254 247 230 253 243 231
+253 243 228 255 244 234 255 255 255 85 0 0
+249 198 0 178 158 0 25 0 0 255 239 131
+255 255 255 255 250 246 254 243 232 249 239 230
+246 239 228 255 247 232 252 245 230 247 239 228
+249 245 230 255 243 232 255 246 232 251 246 232
+250 240 232 252 245 229 255 247 234 255 246 232
+247 241 229 250 243 232 254 246 232 255 247 233
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 247 233
+255 255 255 255 255 255 255 255 255 255 255 255
+222 200 186 200 180 154 216 189 155 239 213 180
+255 252 244 255 244 237 241 220 189 237 219 172
+255 241 216 255 250 235 255 248 239 255 245 238
+250 243 229 249 243 235 246 239 233 240 225 197
+242 222 189 238 222 181 246 239 216 252 243 235
+248 238 228 248 240 229 252 243 228 251 244 230
+255 241 236 255 255 255 77 73 81 236 174 109
+162 129 0 53 24 0 224 190 105 255 255 255
+255 245 236 255 247 235 253 246 232 250 238 230
+249 246 230 255 244 233 252 245 232 253 241 231
+249 245 230 255 246 234 255 246 234 251 241 229
+249 240 231 254 247 233 255 247 233 255 245 236
+251 245 233 247 242 229 255 246 233 255 247 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 244 232 255 250 239
+255 253 238 255 243 234 212 194 160 199 182 153
+222 201 157 252 242 220 254 246 240 252 243 235
+240 221 190 242 226 188 248 232 215 255 246 239
+252 244 234 250 241 225 255 246 235 251 243 232
+244 237 231 239 220 183 243 235 205 251 241 218
+248 242 231 253 242 236 251 241 230 251 244 230
+248 240 226 247 241 229 250 241 226 254 240 230
+255 255 255 59 42 28 194 119 0 228 190 0
+0 0 0 162 82 0 255 255 255 255 245 232
+252 245 231 253 246 230 248 240 226 246 238 229
+248 245 226 255 243 232 251 243 231 244 235 225
+248 242 226 255 246 234 255 246 233 249 242 228
+248 239 230 248 243 227 255 247 233 255 246 232
+249 241 229 246 243 228 254 244 229 255 246 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 247 235 255 250 242 255 250 244 242 228 212
+229 205 171 202 180 150 236 217 174 245 231 211
+255 252 243 254 243 233 253 242 237 247 232 196
+246 236 221 254 243 234 252 244 235 251 240 231
+252 245 230 246 239 226 247 238 227 248 239 229
+251 244 229 253 242 226 253 242 233 250 242 229
+246 238 227 248 238 228 252 240 230 248 240 227
+247 236 227 249 238 225 253 239 233 255 255 255
+86 97 140 199 126 0 231 190 0 96 112 0
+186 140 15 255 255 255 255 242 235 249 242 231
+249 239 230 245 237 228 249 242 230 252 241 233
+255 246 233 254 242 231 254 243 232 236 228 216
+236 231 209 252 246 232 253 244 231 248 243 229
+249 238 234 250 241 229 255 246 233 253 244 233
+248 241 231 250 241 228 252 245 232 249 240 227
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+251 237 225 240 223 207 211 191 150 216 190 163
+228 216 166 255 253 237 249 238 235 252 242 233
+230 214 191 252 242 233 252 241 231 252 239 232
+252 241 230 251 242 230 252 240 231 248 237 228
+249 237 226 251 241 227 253 244 231 251 242 231
+251 242 230 250 240 229 253 244 228 250 241 228
+253 245 230 253 243 230 251 239 229 251 243 232
+252 245 228 253 241 231 255 255 255 137 161 194
+140 14 0 255 233 0 161 170 0 87 11 0
+255 255 255 255 248 241 255 245 230 255 248 232
+255 246 233 251 244 229 255 246 231 255 246 232
+255 247 232 255 246 233 252 244 231 255 246 232
+253 245 232 253 246 233 255 245 235 255 246 231
+255 244 233 253 248 230 252 243 229 254 243 229
+255 246 233 251 246 229 255 245 231 255 248 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 222 200 186
+200 180 154 216 189 155 239 213 180 255 252 244
+255 244 237 244 232 220 230 202 166 227 207 162
+253 233 216 254 242 233 249 240 228 253 241 232
+251 241 228 249 240 227 251 242 231 253 243 232
+249 230 193 255 246 233 255 245 231 255 246 231
+251 241 226 255 244 228 250 245 228 255 245 228
+255 243 228 255 244 228 251 242 229 252 244 230
+255 243 231 255 255 255 111 129 163 150 49 0
+226 208 0 172 152 0 41 0 0 255 255 255
+255 249 242 253 242 229 255 245 235 255 245 229
+255 245 233 255 247 233 255 247 232 255 245 234
+255 245 230 255 245 232 255 245 230 255 245 233
+255 247 232 255 245 234 255 247 232 255 247 231
+255 245 235 255 246 228 255 249 234 255 246 229
+255 247 233 255 247 231 255 245 231 255 245 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 244 234 255 249 233 255 248 239
+255 255 255 212 194 160 199 182 153 222 201 157
+252 242 220 254 246 240 252 243 235 240 221 190
+242 226 188 248 232 215 255 246 239 254 239 234
+247 242 228 253 243 234 255 247 238 250 240 230
+237 222 186 232 211 181 248 232 196 254 244 230
+255 240 233 255 244 226 254 245 229 255 239 231
+253 244 226 255 241 230 255 245 231 255 247 229
+254 241 230 254 242 227 255 244 230 254 239 228
+255 255 255 157 190 197 119 0 0 215 178 0
+248 241 0 0 0 0 230 208 135 255 255 255
+250 242 229 251 243 227 251 239 228 255 247 230
+255 243 233 253 245 229 255 247 230 255 247 234
+255 245 230 255 245 234 255 247 232 255 247 232
+255 245 232 255 247 234 241 227 217 255 249 231
+255 245 232 255 244 233 255 246 233 255 247 231
+255 244 231 255 247 229 255 245 232 253 243 227
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+254 242 230 255 249 243 253 242 230 238 219 200
+202 180 150 236 217 174 245 231 211 255 252 243
+254 243 233 253 242 237 247 232 196 246 236 221
+254 243 234 252 244 235 251 240 231 254 241 232
+253 244 234 242 228 218 231 214 183 236 222 183
+250 238 215 254 243 231 254 242 233 252 239 229
+255 243 228 251 242 228 255 243 231 252 242 231
+254 246 228 252 242 228 250 243 230 251 245 227
+255 245 229 255 243 234 255 243 231 255 254 245
+214 241 251 91 0 0 249 237 0 232 202 168
+44 22 0 243 215 155 255 255 244 255 239 234
+250 239 226 250 243 230 253 240 229 254 244 226
+255 244 232 255 243 229 255 245 233 255 245 234
+255 247 232 255 245 232 255 244 230 255 247 233
+255 245 230 255 247 232 255 247 237 255 247 227
+255 245 233 255 247 233 255 245 228 255 243 232
+255 246 232 253 245 230 253 243 227 255 245 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 228 204 187 171 151 121 205 186 127
+255 253 237 255 255 255 252 242 233 230 214 191
+252 242 233 252 241 231 252 239 232 252 241 230
+251 242 230 252 240 231 248 237 228 246 235 226
+241 229 203 241 231 200 254 240 219 252 242 234
+250 242 232 251 240 231 251 241 228 250 243 230
+252 240 230 252 242 226 255 245 227 255 242 231
+252 242 228 251 240 228 249 242 228 253 242 230
+253 245 230 254 239 229 255 255 255 156 192 192
+79 0 0 218 164 0 207 169 0 142 126 0
+142 76 0 255 255 255 250 240 230 246 239 227
+249 243 226 254 244 231 255 241 234 255 246 230
+253 244 232 255 246 230 255 245 233 255 245 232
+255 245 233 255 245 233 255 247 231 255 246 234
+255 246 236 255 247 232 255 245 233 255 243 226
+255 245 234 255 248 230 255 248 237 255 247 233
+252 242 232 255 245 234 255 247 233 255 247 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 212 193 174
+197 175 146 225 199 152 255 251 233 255 247 237
+244 232 220 230 202 166 227 207 162 253 233 216
+254 242 233 249 240 228 253 241 232 251 241 228
+249 240 227 251 242 231 253 243 232 247 235 212
+250 241 226 252 240 233 250 239 231 249 240 226
+253 238 228 252 239 228 253 243 228 252 241 228
+254 241 228 250 240 228 255 246 230 253 238 229
+250 239 228 253 241 228 252 243 228 249 242 224
+254 240 229 255 253 234 206 230 254 80 0 0
+219 188 0 255 231 0 163 168 0 32 0 0
+255 255 246 255 247 241 250 244 226 252 239 229
+252 244 227 255 245 230 255 244 229 255 246 230
+253 244 230 255 243 228 255 246 229 255 243 231
+255 246 229 255 246 233 255 248 237 255 236 227
+253 237 219 255 246 234 255 245 231 255 246 226
+255 246 238 250 233 224 254 242 212 254 237 206
+252 242 210 255 248 237 255 247 229 255 246 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 202 181 144 225 207 174
+250 235 211 252 243 245 234 221 199 228 208 170
+239 220 180 255 245 230 255 245 236 253 244 230
+253 242 232 252 242 233 253 241 233 252 238 230
+251 241 228 251 240 229 247 238 226 250 239 230
+250 238 228 252 242 231 253 243 231 252 245 232
+254 243 227 252 243 230 250 240 228 255 241 230
+251 243 228 251 238 228 250 244 229 253 245 231
+251 243 230 252 241 228 250 242 230 252 241 231
+255 251 244 255 255 255 67 0 0 223 188 0
+255 206 140 186 167 0 38 0 0 235 220 134
+255 255 255 253 242 232 249 245 228 251 241 230
+252 241 231 253 245 232 255 244 234 255 245 229
+255 246 234 255 245 231 255 245 233 255 246 235
+255 247 237 246 231 217 240 224 199 246 225 177
+255 249 233 255 247 238 255 245 233 255 246 229
+255 241 216 250 237 205 255 250 233 255 247 236
+254 242 236 240 230 194 255 244 232 255 247 235
+255 246 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 210 199 170
+197 175 132 223 199 172 255 247 227 251 246 244
+239 229 222 229 205 170 241 224 198 252 242 230
+252 248 238 253 242 230 253 243 231 255 244 234
+253 243 233 248 239 230 232 212 187 249 232 201
+251 241 230 252 242 232 251 238 227 253 240 230
+251 244 229 248 241 231 252 243 227 254 242 227
+251 243 230 252 238 228 252 243 228 251 243 228
+255 240 230 252 243 228 251 244 230 249 239 229
+250 240 228 246 239 229 251 241 230 255 255 246
+189 219 226 42 0 0 217 148 0 255 231 134
+251 212 0 70 77 0 249 212 148 255 255 255
+252 242 230 253 241 230 251 242 228 251 239 228
+253 245 229 249 239 228 255 246 232 255 247 231
+255 245 232 255 248 234 255 245 233 255 244 237
+245 237 201 255 239 200 255 249 231 255 254 245
+249 236 222 248 237 214 255 246 234 255 245 229
+255 246 232 255 248 236 251 237 216 255 244 226
+255 246 218 255 248 228 255 248 234 255 246 232
+255 247 234 255 244 231 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 211 189 168 207 182 144 241 221 197
+255 247 241 255 252 245 234 223 212 229 215 170
+241 224 185 251 243 233 253 244 234 249 241 230
+252 244 233 255 242 236 250 242 237 236 222 206
+229 203 165 236 216 177 255 242 230 255 244 234
+255 243 230 255 243 231 252 243 231 254 242 229
+252 241 229 254 239 229 255 241 232 251 243 228
+255 243 228 252 241 228 252 243 228 254 242 228
+253 245 230 252 242 226 254 243 228 251 236 228
+250 242 227 251 240 229 255 251 246 222 244 242
+87 0 0 209 158 0 227 189 0 250 215 0
+136 141 0 112 27 0 255 255 255 255 241 232
+253 242 229 251 241 228 251 245 228 251 239 228
+251 241 228 253 240 232 254 240 234 254 243 229
+245 234 220 243 224 196 255 248 234 255 246 235
+255 249 236 255 242 239 243 228 216 238 220 182
+254 243 209 255 249 230 255 248 235 255 245 228
+254 242 230 250 238 203 255 245 222 255 247 237
+255 248 237 255 246 234 255 248 233 255 246 230
+255 244 232 255 247 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+208 183 120 239 222 196 254 242 222 255 255 255
+234 221 208 218 199 176 225 204 173 254 245 234
+253 243 234 253 238 231 255 242 231 255 245 236
+242 236 225 229 211 187 221 204 167 237 222 185
+255 245 236 251 245 233 252 241 230 255 239 228
+255 245 228 251 241 229 252 242 229 252 235 228
+252 242 228 252 240 228 254 240 228 252 239 224
+253 242 231 252 239 226 251 241 229 253 243 229
+254 241 229 252 241 227 255 243 227 252 241 229
+253 240 230 255 252 234 245 255 255 62 0 0
+196 150 0 245 200 154 221 193 0 203 201 12
+26 0 0 255 255 237 255 249 240 252 241 230
+250 242 226 252 241 231 250 243 228 251 239 230
+253 245 231 253 240 235 235 220 189 239 224 183
+249 235 195 255 247 229 255 246 235 251 241 228
+251 235 217 246 233 179 253 240 204 255 250 242
+249 237 230 241 223 204 255 246 234 255 246 232
+255 244 235 255 246 236 254 249 237 245 232 198
+255 240 224 255 249 235 255 246 236 255 247 233
+255 245 233 255 249 230 255 249 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 245 230 255 255 255
+255 255 255 255 255 255 209 181 134 233 211 182
+255 248 233 255 249 244 254 244 237 217 194 157
+234 219 185 249 238 210 254 244 237 248 243 227
+249 240 226 254 243 237 241 231 216 217 198 177
+222 198 154 250 235 210 255 242 233 254 244 233
+253 241 228 252 240 229 254 240 229 253 240 227
+253 239 227 252 240 228 252 242 228 254 240 229
+252 242 226 252 240 227 252 240 227 252 242 227
+254 240 229 253 243 229 248 240 227 249 238 225
+250 239 226 247 239 224 255 241 228 253 241 228
+255 255 255 168 180 152 67 0 0 199 127 0
+232 216 0 224 189 0 238 230 0 39 0 0
+237 194 138 255 255 255 250 237 225 248 237 228
+246 237 225 252 242 230 250 245 232 245 235 228
+239 224 200 251 237 214 251 242 212 255 247 239
+253 244 239 252 243 231 252 237 213 249 237 205
+255 247 229 255 246 241 242 228 209 241 223 188
+247 231 194 255 245 221 255 247 236 255 246 232
+253 241 229 255 244 227 255 245 224 255 248 223
+250 236 222 251 239 221 248 231 195 255 252 240
+255 252 241 243 231 226 255 242 222 255 247 238
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 220 202 170
+198 177 132 234 208 179 255 250 235 255 251 244
+255 244 233 234 212 182 234 219 178 248 237 214
+254 241 237 250 240 230 252 241 230 253 242 236
+244 237 219 222 198 189 216 200 150 245 227 199
+255 246 238 253 243 234 251 243 230 253 240 228
+252 239 225 252 238 229 254 241 227 252 238 225
+251 241 225 252 239 229 252 240 229 252 241 227
+252 240 229 252 240 224 252 240 230 253 243 226
+249 235 226 251 236 224 246 238 227 247 238 227
+248 238 225 246 238 223 254 242 231 255 255 255
+198 223 214 90 0 0 218 157 0 203 147 0
+244 218 134 232 208 0 19 0 0 228 191 128
+255 255 236 253 241 229 252 245 227 250 241 227
+253 241 231 243 235 220 236 219 196 227 214 170
+255 244 218 255 246 234 255 242 237 237 225 206
+239 226 198 253 242 234 255 245 231 254 245 238
+249 238 221 238 215 168 251 239 207 255 248 235
+255 247 243 249 236 225 244 229 202 251 235 199
+255 244 222 255 248 234 255 247 234 255 247 231
+255 241 199 255 250 239 255 251 244 232 219 205
+233 207 169 255 233 196 255 253 241 244 227 220
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 253 243 235 254 248 237 255 246 237
+255 247 242 255 251 240 255 252 241 255 254 242
+255 254 246 255 255 237 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 245 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 229 218 192 207 174 150 226 204 161
+246 231 203 255 255 255 249 237 228 228 215 192
+221 198 153 255 243 222 255 246 234 250 242 231
+248 241 232 255 244 235 243 235 225 213 196 169
+217 193 150 233 211 189 255 249 239 254 243 232
+250 241 228 252 240 227 249 238 229 251 241 225
+251 239 230 253 241 229 252 237 229 252 241 229
+255 241 227 250 237 227 253 240 228 250 237 225
+251 241 228 253 240 230 253 239 228 250 237 222
+249 237 227 248 237 227 247 237 223 245 237 223
+249 240 228 248 242 232 255 255 241 223 242 220
+51 0 0 163 90 0 215 182 19 250 217 137
+217 178 0 142 130 0 147 66 0 255 255 255
+252 243 233 254 239 227 252 241 227 251 238 231
+245 236 226 232 220 180 248 239 213 255 245 237
+253 242 235 247 238 226 234 213 175 255 240 210
+255 246 231 252 242 237 234 221 210 248 239 227
+252 243 232 255 250 240 254 242 235 250 235 222
+246 231 186 250 239 206 255 244 238 244 232 201
+247 231 206 255 248 228 255 250 237 255 246 238
+250 235 232 237 221 204 232 215 172 254 245 212
+249 237 225 238 225 219 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 243 229
+251 239 227 251 243 231 255 251 242 255 250 245
+255 255 246 255 255 255 255 255 255 255 245 243
+251 227 237 247 217 203 255 229 216 255 223 197
+243 222 184 233 207 181 220 184 180 185 151 163
+176 152 161 144 103 95 85 49 39 77 1 0
+48 0 0 89 25 0 90 16 0 145 96 37
+171 148 107 213 174 152 255 247 221 255 255 255
+255 255 246 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+192 172 149 208 173 132 248 243 212 255 250 244
+255 248 241 231 214 186 225 196 148 242 221 193
+255 245 234 253 242 231 251 239 231 253 242 232
+239 229 217 219 206 186 213 190 139 248 237 206
+250 244 234 255 242 235 249 238 227 250 238 228
+251 241 229 252 241 227 252 241 227 253 241 226
+251 239 226 251 241 225 251 238 228 253 237 225
+252 241 227 251 240 229 251 236 223 253 238 227
+249 237 222 251 242 226 253 235 226 248 238 223
+247 235 225 248 235 223 247 238 224 246 233 224
+252 238 230 255 255 255 121 149 128 46 0 0
+223 129 0 192 179 0 251 213 217 239 209 67
+153 174 0 30 0 0 255 255 245 255 247 238
+252 239 225 254 243 232 245 236 221 249 239 227
+248 239 225 251 241 235 250 244 233 240 227 219
+248 237 202 250 239 221 255 246 243 243 237 226
+230 217 210 223 205 154 249 237 210 254 241 233
+245 237 227 250 234 217 241 232 186 255 248 232
+245 235 228 235 213 197 243 227 188 255 246 217
+255 247 240 255 243 235 230 217 196 235 214 184
+255 243 204 253 248 227 242 234 223 207 197 180
+219 194 163 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 241 231 255 246 238 255 251 247 255 255 255
+255 255 255 255 255 240 253 237 166 238 214 152
+225 168 111 210 172 16 217 128 0 224 176 0
+187 111 0 199 134 0 205 162 0 186 147 0
+227 166 0 194 147 0 236 197 0 237 198 0
+225 216 0 167 175 0 137 122 0 122 103 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 133 34 0
+176 154 125 255 255 227 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 209 185 161 209 179 131
+252 231 206 254 246 223 255 243 233 238 223 197
+229 210 163 243 218 193 255 245 235 255 245 230
+253 242 226 252 240 232 243 235 221 219 195 169
+215 190 154 233 216 179 253 241 232 250 239 234
+251 239 226 249 239 226 249 239 227 250 236 226
+245 238 226 249 236 224 249 237 226 250 238 225
+250 238 226 252 242 230 252 238 225 248 237 226
+253 239 225 249 237 229 251 238 225 251 238 226
+250 238 225 249 239 226 253 242 226 252 242 227
+251 239 227 248 237 226 246 240 222 255 241 236
+255 255 255 89 136 127 111 0 0 189 117 0
+218 168 0 222 173 54 224 196 55 218 181 0
+12 0 0 191 149 24 255 255 255 255 243 235
+254 244 235 225 206 176 246 225 202 254 241 231
+253 240 232 246 236 222 233 227 187 245 229 195
+255 248 237 252 242 236 228 215 205 226 206 159
+235 223 188 255 248 237 249 242 234 241 227 214
+245 228 190 255 248 240 244 231 217 219 198 158
+251 236 187 255 248 224 255 250 244 243 233 218
+224 209 177 250 235 190 255 249 225 255 252 244
+225 216 209 205 182 163 213 196 150 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 246 239 255 255 255
+255 255 255 252 243 187 235 216 148 197 169 110
+141 47 0 173 0 0 15 0 0 124 0 0
+31 0 0 2 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 22 0 0
+27 0 0 168 39 0 251 207 0 255 233 0
+255 255 0 193 178 0 118 90 0 0 0 0
+27 0 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 152 130 19 255 249 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 243 228 255 249 237 255 255 255 255 255 255
+210 177 146 203 178 139 237 219 189 255 251 236
+255 245 237 254 243 231 254 242 228 251 239 209
+255 242 226 255 247 233 255 243 230 252 240 227
+255 245 233 222 218 197 212 182 147 236 223 184
+253 243 236 250 240 231 249 238 228 248 239 225
+246 237 223 248 237 227 248 237 223 248 239 227
+249 238 226 249 238 227 248 243 227 250 238 223
+249 236 227 247 238 226 250 238 226 254 242 226
+252 241 225 253 239 229 251 240 229 249 236 226
+252 238 226 250 240 226 250 236 225 247 237 223
+248 238 228 251 239 227 255 255 255 250 254 235
+57 86 56 131 0 0 197 121 0 202 176 0
+245 217 2 207 193 80 235 184 0 66 55 0
+161 100 0 255 255 255 255 247 243 225 211 183
+216 193 152 247 226 188 255 247 239 250 237 229
+242 228 202 252 239 209 255 246 228 252 240 239
+228 216 193 222 206 158 249 235 212 255 249 238
+255 245 243 237 224 209 243 224 182 255 244 218
+253 240 242 240 219 180 244 234 191 255 254 242
+244 239 231 237 213 198 255 252 239 255 245 218
+255 254 228 249 237 240 226 209 189 212 197 173
+230 213 163 250 244 215 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 247 243
+255 255 255 255 255 246 255 229 175 239 220 97
+133 48 0 40 0 0 49 0 0 31 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+131 0 0 249 202 0 255 246 0 255 247 0
+130 133 0 58 0 0 0 0 0 197 0 0
+94 0 0 127 0 0 38 0 0 0 0 0
+153 91 0 255 255 255 255 253 246 255 254 242
+255 254 245 255 255 255 255 255 255 255 255 255
+255 255 255 249 249 239 203 198 177 215 196 165
+231 223 196 247 244 227 251 245 253 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 241 255 252 243 255 255 244
+255 247 239 253 245 216 253 242 228 255 249 238
+250 241 231 249 241 228 246 238 225 250 240 227
+249 238 224 249 236 228 246 237 223 249 239 227
+246 239 227 244 235 225 244 235 223 247 235 224
+249 237 227 248 239 227 253 239 226 249 238 226
+253 240 228 253 238 229 253 240 227 252 238 226
+253 238 227 247 239 227 252 238 226 251 239 227
+255 246 238 255 255 255 198 228 198 0 0 0
+103 0 0 241 212 0 191 143 0 208 173 0
+203 173 156 231 201 104 144 122 0 0 0 0
+255 255 233 244 232 224 231 204 173 248 225 183
+255 248 231 255 243 239 238 223 189 235 217 185
+255 255 255 253 250 255 255 255 255 245 235 199
+244 235 204 255 246 235 250 243 242 233 222 194
+239 227 190 255 244 214 255 250 239 255 251 241
+243 233 184 255 245 241 251 238 233 231 216 189
+247 232 195 255 247 206 255 242 241 232 218 204
+214 198 189 214 191 151 227 225 176 245 236 206
+253 249 237 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 240 234 255 248 246 255 255 255 255 242 192
+217 196 134 81 8 0 0 0 0 0 0 0
+0 0 0 99 0 0 0 0 0 0 0 0
+2 14 0 0 0 0 160 33 0 146 101 0
+146 75 0 169 104 0 205 143 0 229 140 0
+225 160 0 235 150 0 232 154 0 231 130 0
+231 130 0 223 116 0 219 119 0 190 101 0
+193 85 0 150 29 0 40 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 221 172 0
+255 222 0 255 247 0 206 208 0 0 0 0
+16 0 0 41 0 0 147 0 0 83 4 0
+0 0 0 0 0 0 231 187 136 222 202 168
+185 159 153 169 144 122 116 95 0 132 111 60
+101 38 0 123 45 0 92 53 0 110 41 0
+95 2 0 113 75 0 137 108 0 97 53 0
+158 148 103 142 130 113 119 91 36 158 145 142
+169 159 119 214 189 168 198 197 180 161 155 147
+237 239 217 236 237 217 255 255 255 220 229 214
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 250 244 255 251 238 255 251 241
+255 249 237 253 242 232 249 241 230 251 239 228
+247 238 225 246 235 225 249 237 226 249 238 226
+250 238 224 252 237 228 254 241 228 250 239 227
+252 242 228 255 245 235 255 247 238 255 255 255
+214 221 196 113 130 111 10 0 0 118 0 0
+180 111 0 146 88 0 234 202 0 251 231 227
+204 161 0 187 152 0 127 164 0 191 148 9
+255 255 255 238 221 161 255 245 234 253 244 235
+233 218 197 242 221 184 255 249 235 255 255 255
+95 61 55 81 37 0 35 21 0 255 255 255
+254 244 239 232 219 208 233 210 183 245 237 213
+239 228 224 233 217 183 255 248 234 255 244 238
+238 227 217 239 219 185 241 229 197 255 253 231
+238 224 223 223 203 194 199 180 146 232 215 172
+237 225 172 255 250 234 255 247 239 251 242 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 251 244 233 255 255 255
+255 255 224 253 240 176 132 70 0 0 0 0
+0 0 0 34 0 0 0 0 0 16 0 0
+107 65 0 72 0 0 158 97 0 182 108 0
+233 177 0 227 145 0 240 186 0 245 189 0
+255 202 0 248 207 0 230 196 0 228 182 0
+239 213 0 246 216 0 236 217 0 237 205 0
+252 225 0 242 211 0 245 211 0 244 215 0
+240 206 0 249 218 0 255 213 0 253 203 0
+230 149 0 196 140 0 128 71 0 169 1 0
+242 215 0 236 191 0 249 204 0 234 225 0
+138 150 0 76 0 0 0 0 0 128 0 0
+62 0 0 155 24 0 0 0 0 0 0 0
+203 67 0 175 117 0 188 136 0 0 0 0
+205 169 0 107 17 0 94 20 0 114 16 0
+35 0 0 133 68 0 125 59 0 118 53 0
+93 0 0 92 25 0 158 75 0 99 45 0
+0 0 0 0 0 0 112 16 0 166 112 0
+42 0 0 0 0 0 95 23 0 90 6 0
+50 33 0 31 0 0 93 90 14 85 66 4
+142 138 112 193 187 169 214 226 208 182 193 171
+204 207 197 245 243 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 224 232 214 213 219 205 0 26 0
+81 0 0 74 0 0 177 69 0 138 2 0
+162 87 0 173 143 0 204 193 166 187 155 30
+255 236 15 38 0 0 0 0 0 255 255 255
+254 240 232 248 240 238 241 228 217 234 220 178
+245 233 200 255 248 245 209 221 239 64 19 0
+255 246 194 255 246 214 168 191 0 188 154 172
+253 251 238 237 219 178 229 221 202 230 206 163
+245 233 198 253 245 240 228 215 201 219 201 170
+244 233 197 247 239 236 238 219 213 202 192 165
+216 195 155 218 210 170 255 243 209 255 251 238
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 239 214 194 110
+23 0 0 0 0 0 0 0 0 63 0 0
+0 0 0 146 164 0 106 0 0 126 0 0
+219 144 0 237 187 0 245 191 0 244 205 0
+226 183 0 238 214 0 239 220 97 246 229 0
+238 212 0 222 189 0 249 231 0 239 229 0
+232 198 0 239 201 0 241 219 0 233 208 0
+248 206 0 247 227 0 236 205 0 242 217 0
+239 216 0 235 193 0 243 216 0 251 216 0
+238 211 0 245 203 0 255 223 0 216 187 0
+241 199 0 245 202 0 243 205 0 246 197 0
+249 215 0 230 242 0 0 0 0 0 0 0
+113 0 0 196 206 0 101 0 0 0 0 0
+45 0 0 239 141 0 101 38 0 178 25 0
+195 105 0 173 69 0 137 14 0 99 0 0
+139 12 0 107 0 0 113 0 0 76 0 0
+96 0 0 116 0 0 59 0 0 122 0 0
+154 0 0 61 0 0 88 0 0 0 0 0
+75 0 0 40 0 0 73 0 0 79 0 0
+21 0 0 41 0 0 44 0 0 130 34 0
+113 37 0 42 0 0 79 0 0 39 0 0
+72 24 0 35 0 0 0 0 0 62 0 0
+95 67 0 119 105 42 96 78 38 141 128 116
+121 112 85 88 68 0 111 103 89 76 65 0
+0 0 0 39 0 0 128 0 0 81 0 0
+148 0 0 165 90 0 184 114 0 186 139 0
+222 179 0 182 147 0 216 186 0 216 155 0
+176 97 0 0 0 0 216 177 116 255 255 255
+245 238 221 231 211 178 236 224 191 255 247 240
+255 255 255 185 199 236 127 62 0 255 248 136
+207 190 102 140 84 0 11 9 0 244 192 194
+242 232 217 234 217 185 249 234 199 242 234 228
+230 214 194 215 198 160 244 227 187 243 234 220
+227 214 204 203 179 133 204 188 157 245 229 186
+253 247 235 247 239 229 255 246 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 154 140 0 14 0 0 0 0 0
+0 0 0 79 0 0 37 35 0 135 0 0
+174 146 0 200 92 0 251 218 0 244 208 0
+233 211 0 235 215 137 251 233 187 249 237 130
+236 223 36 220 199 0 248 213 47 245 232 0
+247 228 33 239 223 26 249 228 0 245 227 41
+243 230 0 244 214 0 241 223 0 249 228 0
+249 221 0 251 228 0 242 224 0 244 218 0
+249 223 0 243 220 0 243 218 0 246 218 0
+241 215 0 243 210 0 238 205 0 238 207 0
+227 189 0 242 193 0 247 211 0 237 190 0
+238 194 0 255 203 0 248 234 0 114 139 0
+0 0 0 134 0 0 191 120 0 190 54 0
+0 0 0 0 0 0 238 183 0 130 102 0
+138 22 0 142 53 0 183 121 0 138 44 0
+188 149 0 162 43 0 101 0 0 192 149 0
+128 0 0 156 86 0 160 60 0 150 7 0
+182 155 0 160 64 0 132 0 0 174 35 0
+143 41 0 73 0 0 124 0 0 164 64 0
+179 101 0 116 41 0 166 59 0 137 55 0
+81 0 0 169 78 0 147 39 0 144 48 0
+112 0 0 128 0 0 204 106 0 31 0 0
+140 40 0 108 0 0 85 10 0 60 0 0
+30 0 0 20 0 0 121 0 0 76 0 0
+165 75 0 154 36 0 182 85 0 138 28 0
+218 171 0 189 130 0 201 138 0 190 151 0
+199 164 0 185 147 0 219 204 73 225 147 23
+59 13 0 131 43 0 255 255 255 250 241 229
+248 237 219 252 241 228 255 255 255 218 221 239
+127 103 130 175 126 0 201 201 184 134 101 0
+6 0 0 86 0 0 164 125 0 240 241 223
+244 235 209 255 248 242 225 214 198 228 203 173
+233 221 183 248 229 219 208 198 178 204 182 136
+220 212 175 243 237 207 251 244 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 247 244 216 131
+0 0 0 0 0 0 0 0 0 93 0 0
+47 0 0 146 0 0 205 129 0 243 198 0
+247 209 0 241 210 19 233 206 0 229 204 90
+243 226 139 239 219 100 247 224 139 251 238 110
+249 233 132 249 232 3 242 222 0 255 243 82
+254 239 44 255 248 124 255 244 0 255 255 56
+255 253 51 255 244 0 255 237 0 255 231 0
+255 214 0 236 202 0 255 219 0 255 227 0
+255 226 0 255 232 0 255 250 0 255 252 0
+255 246 0 255 241 0 255 243 0 239 206 0
+248 215 0 240 209 0 238 201 0 245 206 0
+240 196 0 237 199 0 241 196 0 255 223 0
+184 196 0 0 0 0 88 0 0 255 255 127
+134 41 0 153 97 0 0 0 0 239 193 0
+240 157 0 230 189 0 132 79 0 194 106 0
+205 128 0 217 193 0 105 0 0 224 172 0
+226 184 0 90 9 0 187 126 0 222 166 0
+203 134 0 187 146 0 144 52 0 190 159 0
+201 139 0 206 164 0 193 164 0 129 0 0
+213 153 0 204 152 0 189 137 0 164 70 0
+110 9 0 163 81 0 151 105 0 172 69 0
+174 95 0 147 59 0 136 37 0 91 0 0
+131 27 0 111 0 0 183 86 0 170 96 0
+166 39 0 165 38 0 190 111 0 190 98 0
+172 99 0 201 139 0 137 75 0 168 76 0
+206 158 0 178 104 0 181 157 0 220 161 0
+213 195 0 219 189 47 229 196 136 242 206 57
+57 0 0 217 211 206 255 255 255 255 253 246
+255 255 255 236 235 252 129 106 115 167 104 0
+222 223 74 95 10 0 56 0 0 178 145 12
+251 249 177 255 251 199 255 255 255 251 239 231
+216 204 181 212 192 163 241 226 196 232 220 209
+212 195 170 209 186 148 229 215 176 243 233 201
+247 241 228 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 246 236 208 67 0 0 0 0 0
+0 0 0 35 0 0 91 0 0 147 22 0
+255 179 0 244 207 0 234 206 0 236 209 0
+238 216 0 253 232 93 249 240 128 247 231 129
+252 238 157 250 242 156 253 241 164 253 234 136
+255 245 130 255 239 146 255 226 0 253 188 14
+218 197 0 176 139 0 125 110 0 71 0 0
+156 13 0 0 0 0 0 0 0 6 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 42 0 0 15 0 0 104 0 0
+114 0 0 171 67 0 185 48 0 227 143 0
+247 171 0 255 197 0 247 220 0 244 205 0
+247 208 0 244 209 0 235 192 0 230 191 0
+255 221 0 149 181 0 0 0 0 250 186 52
+255 238 227 218 176 31 55 50 0 160 137 0
+154 148 0 100 0 0 189 142 0 171 130 0
+131 37 0 160 119 0 196 149 0 97 0 0
+193 172 0 194 150 0 153 108 0 193 120 0
+170 101 0 200 137 0 187 133 0 171 101 0
+145 54 0 188 113 0 178 130 0 211 167 0
+82 0 0 149 79 0 149 79 0 166 87 0
+173 112 0 154 81 0 186 109 0 177 117 0
+196 133 0 186 141 0 103 0 0 222 172 0
+172 115 0 195 145 0 92 0 0 170 139 0
+197 127 0 165 139 0 130 20 0 179 99 0
+203 159 0 204 161 0 214 164 0 131 13 0
+231 183 0 197 147 0 255 251 255 173 116 0
+180 135 0 188 140 0 232 191 47 214 193 184
+124 91 0 139 46 0 152 142 154 140 119 130
+113 65 0 127 92 0 255 241 163 139 94 17
+36 0 0 176 148 0 255 255 255 246 237 246
+229 209 189 246 237 232 231 218 211 215 194 156
+244 227 201 243 231 215 206 188 166 213 198 158
+236 218 185 243 237 209 254 245 236 249 241 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+185 151 121 0 0 0 0 0 0 0 0 0
+94 0 0 215 132 0 253 206 0 247 216 0
+235 210 0 246 220 34 250 234 75 246 228 67
+241 219 37 246 224 130 252 242 163 254 244 156
+255 238 132 255 241 107 255 218 194 232 221 0
+147 76 0 139 67 0 169 139 0 0 0 0
+101 0 0 8 0 0 115 0 0 69 0 0
+0 0 0 169 80 0 0 0 0 29 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+24 0 0 70 0 0 182 0 0 221 126 0
+242 146 0 246 209 0 244 219 0 237 209 0
+235 190 0 255 219 0 220 241 0 71 0 0
+255 240 161 226 189 143 255 238 161 32 0 0
+76 0 0 222 153 0 228 157 0 199 161 0
+130 0 0 158 66 0 152 87 0 141 17 0
+224 159 0 227 185 0 137 104 0 161 73 0
+169 102 0 222 167 0 205 153 0 95 48 0
+254 203 0 149 87 0 160 64 0 207 162 0
+118 8 0 209 177 0 196 154 0 116 49 0
+213 159 0 174 127 0 167 65 0 178 110 0
+159 86 0 196 139 0 63 0 0 143 68 0
+151 67 0 86 0 0 123 10 0 197 127 0
+144 45 0 138 70 0 179 115 0 205 151 0
+192 142 0 192 140 0 194 126 0 150 58 0
+180 127 0 201 162 0 182 103 0 155 70 0
+189 127 0 148 68 0 214 189 0 139 53 0
+105 0 0 25 0 0 135 61 0 233 229 74
+254 234 210 165 125 6 98 68 0 46 0 0
+237 216 136 254 241 249 225 211 183 241 218 179
+230 224 197 212 184 147 235 219 176 245 237 235
+212 195 171 201 187 162 236 222 185 252 245 232
+252 242 235 249 244 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 29 0 0
+0 0 0 0 0 0 45 0 0 201 80 0
+249 195 0 241 204 0 243 217 53 244 217 0
+241 223 45 242 217 0 249 226 94 247 239 152
+251 246 147 255 248 208 255 237 114 255 226 109
+237 209 0 89 0 0 80 82 0 103 3 0
+60 103 0 0 0 0 111 0 0 180 205 0
+44 0 0 143 0 0 50 0 0 78 0 0
+30 0 0 0 0 0 177 26 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 37 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+48 0 0 181 0 0 210 0 0 226 133 0
+235 179 0 244 210 0 255 208 0 208 219 0
+90 0 0 255 229 181 243 208 174 169 131 0
+93 0 0 169 52 0 138 48 0 163 100 0
+209 174 0 195 132 0 198 164 0 204 158 0
+153 83 0 213 149 0 169 88 0 198 186 0
+154 98 0 184 123 0 138 92 0 219 180 0
+139 84 0 209 138 0 197 169 0 197 142 0
+200 149 0 177 109 0 188 154 0 214 150 0
+207 148 0 159 96 0 197 127 0 156 105 0
+207 113 0 161 129 0 209 181 0 146 102 0
+206 151 0 189 157 0 175 109 0 165 92 0
+197 157 0 146 39 0 167 112 0 157 82 0
+204 137 0 154 101 0 162 57 0 220 183 0
+200 176 112 136 109 0 244 202 222 174 174 0
+219 174 0 192 166 0 217 143 0 138 130 0
+160 97 0 111 70 0 138 67 0 117 13 0
+157 138 0 95 0 0 39 0 0 255 255 214
+240 229 215 235 217 181 240 233 219 214 190 169
+235 213 182 246 237 220 226 217 201 211 184 150
+232 226 183 249 238 216 255 243 239 247 241 228
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 0 0 0 0 0
+0 0 0 126 0 0 255 220 0 250 220 0
+241 231 68 240 216 0 242 222 30 248 223 23
+247 232 55 252 233 57 254 244 153 255 244 146
+255 241 0 191 157 0 146 65 0 82 0 0
+68 0 0 0 0 0 87 0 0 76 0 0
+173 24 0 118 118 0 111 0 0 97 0 0
+147 134 0 40 0 0 134 0 0 86 0 0
+145 1 0 100 0 0 33 0 0 135 41 0
+118 4 0 113 64 0 123 0 0 134 39 0
+140 74 0 91 0 0 73 0 0 93 0 0
+0 0 0 67 0 0 5 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 152 0 0
+213 0 0 239 176 0 244 203 0 255 212 0
+120 162 0 71 0 0 255 255 255 230 202 125
+255 210 61 0 0 0 198 160 0 156 99 0
+198 159 0 160 124 0 152 109 0 217 182 3
+235 206 145 227 183 0 191 159 0 255 225 255
+230 214 0 228 191 0 187 124 0 255 237 255
+216 183 0 211 191 0 159 68 0 232 207 174
+212 185 0 192 178 0 134 30 0 237 220 137
+217 176 0 162 121 0 147 97 0 186 101 0
+191 147 0 166 105 0 181 116 0 135 79 0
+140 80 0 167 90 0 144 92 0 176 128 0
+198 129 0 147 117 0 224 169 0 163 134 0
+133 40 0 204 137 0 161 140 0 197 139 0
+192 128 0 164 76 0 189 150 0 126 0 0
+203 160 0 103 0 0 212 185 0 144 110 0
+153 44 0 213 183 0 137 60 0 189 87 0
+89 0 0 164 54 0 22 0 0 255 255 246
+243 235 206 220 198 190 222 200 160 244 226 192
+222 206 201 210 187 147 225 211 158 254 243 233
+255 246 238 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 248 235 226 255 255 255
+196 186 159 14 0 0 0 0 0 54 0 0
+198 100 0 249 205 0 239 212 0 238 207 0
+251 230 71 247 231 35 248 231 67 252 237 62
+252 239 154 255 247 168 255 215 0 140 108 0
+27 0 0 150 0 0 0 0 0 28 0 0
+130 4 0 125 0 0 142 4 0 182 162 0
+102 0 0 117 0 0 125 131 0 154 61 0
+174 128 0 190 166 23 226 218 120 243 230 39
+248 232 54 255 240 81 255 255 62 255 249 10
+255 246 0 255 233 0 255 245 0 255 251 0
+255 236 0 253 236 0 255 219 0 249 214 0
+255 220 0 229 179 0 226 165 0 180 42 0
+156 0 0 145 0 0 82 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 220 0 0 238 96 0 246 221 0
+255 220 0 123 156 0 211 159 182 252 228 176
+246 208 141 158 134 0 117 46 0 142 81 0
+177 100 0 255 221 0 225 204 0 149 67 0
+244 228 219 220 178 0 175 172 0 100 0 0
+194 145 80 222 185 0 94 0 0 198 139 80
+219 184 0 183 156 0 158 85 0 125 35 0
+203 174 220 229 195 0 190 132 0 132 107 121
+214 177 0 225 182 0 208 192 0 154 63 0
+210 180 250 226 207 0 242 195 0 224 190 0
+209 140 0 255 255 255 223 185 0 232 186 0
+192 158 0 217 164 90 215 181 0 223 190 0
+213 170 0 203 141 0 186 99 0 139 90 0
+181 136 0 175 128 0 204 162 0 200 150 0
+161 127 0 180 112 0 173 116 0 122 0 0
+143 149 0 152 82 0 140 34 0 100 0 0
+65 0 0 166 61 0 0 0 0 255 255 245
+244 230 217 235 219 182 227 208 193 205 184 161
+230 210 157 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 252 240 227 255 255 255 204 206 181
+10 0 0 0 0 0 119 0 0 255 191 0
+246 223 0 236 222 0 236 215 0 230 199 0
+231 214 6 244 231 19 244 232 107 255 249 91
+255 210 0 209 165 0 0 0 0 148 38 0
+56 108 0 0 0 0 151 0 0 56 0 0
+108 0 0 86 0 0 131 10 0 137 48 0
+188 189 41 240 228 158 255 255 212 255 255 216
+255 254 221 255 248 197 252 240 204 253 244 164
+255 243 113 255 250 165 255 246 129 255 245 157
+255 248 59 255 252 73 255 244 1 255 243 0
+255 246 12 255 230 0 252 223 0 255 225 0
+249 228 0 255 231 0 248 227 0 255 240 0
+247 231 0 255 226 0 255 212 0 245 176 0
+238 152 0 178 79 0 124 0 0 15 0 0
+0 0 0 0 0 0 74 0 0 244 6 0
+251 226 0 255 236 0 32 41 0 255 255 255
+243 213 164 233 220 105 52 0 0 152 159 0
+175 142 0 138 99 0 208 166 0 186 138 0
+151 132 0 139 4 0 255 255 131 221 184 0
+249 221 0 170 78 0 255 255 230 254 229 0
+106 30 0 255 255 255 241 231 0 255 241 0
+126 97 0 208 154 202 255 240 0 232 201 0
+172 158 0 212 177 80 189 165 0 180 142 0
+201 154 0 178 129 0 197 177 0 192 161 0
+96 6 0 107 48 0 247 204 0 206 171 0
+144 74 0 172 103 78 187 149 154 181 122 0
+239 217 0 172 90 0 172 83 0 250 242 168
+203 166 0 225 174 0 176 109 0 151 78 0
+169 94 0 164 104 0 173 124 0 170 86 0
+122 3 0 125 24 0 170 72 0 136 56 0
+98 0 0 40 0 0 119 0 0 127 106 0
+255 245 255 209 191 166 219 204 163 248 236 208
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 240 227 255 255 255 226 221 193 10 0 0
+0 0 0 144 0 0 255 227 0 251 227 47
+249 236 83 243 231 66 249 230 81 246 228 0
+246 235 151 251 239 94 255 242 24 171 114 0
+0 0 0 0 0 0 44 0 0 0 0 0
+62 0 0 173 103 0 68 0 0 97 0 0
+169 124 0 223 203 121 246 229 153 255 255 224
+255 252 209 255 244 196 248 239 193 254 244 191
+255 249 207 255 250 200 255 255 230 255 255 174
+251 224 57 216 193 83 212 192 16 212 168 51
+160 132 0 182 104 0 169 123 0 175 123 0
+178 137 0 160 133 0 184 151 0 193 158 0
+215 177 0 245 191 0 249 210 0 255 230 0
+255 249 0 255 236 0 255 232 0 254 227 0
+250 225 0 255 229 0 241 206 0 246 148 0
+228 129 0 129 0 0 46 0 0 0 0 0
+255 152 0 251 207 0 210 210 0 174 118 141
+255 255 255 254 223 197 168 154 0 36 0 0
+144 0 0 81 0 0 205 163 0 255 251 202
+228 185 0 123 77 0 204 157 188 201 180 145
+191 165 0 168 152 0 117 22 0 142 66 0
+219 213 0 95 0 0 131 67 0 154 92 0
+133 116 0 143 43 0 123 104 0 187 146 0
+172 167 0 135 2 0 194 195 26 192 145 0
+235 216 0 102 0 0 177 166 154 207 211 0
+132 27 0 255 255 255 221 203 0 168 141 0
+164 65 0 227 222 0 206 151 0 230 193 0
+159 125 0 186 142 0 146 103 0 195 128 0
+222 190 0 197 157 0 181 105 72 214 211 101
+223 188 0 228 176 0 135 111 0 166 108 0
+142 78 0 138 0 0 171 139 0 132 52 0
+154 29 0 102 5 0 120 0 0 0 0 0
+188 149 57 255 250 228 251 246 237 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 156 137 97 0 0 0 0 0 0
+194 27 0 242 205 0 244 221 0 238 213 0
+245 218 0 243 226 5 247 229 29 245 229 2
+255 231 77 224 156 0 82 0 0 0 0 0
+167 118 0 0 0 0 8 0 0 206 80 0
+39 0 0 107 0 0 208 204 120 255 255 171
+255 252 208 254 250 220 253 241 196 244 236 200
+255 248 201 255 255 214 255 255 222 255 236 187
+220 192 160 183 198 100 82 0 0 126 66 0
+0 0 0 70 7 0 18 0 0 0 0 0
+110 0 0 0 0 0 78 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+87 0 0 147 52 0 181 148 0 248 193 0
+255 230 0 255 242 0 249 210 0 235 208 0
+255 222 0 235 180 0 255 198 0 204 100 0
+193 54 0 226 127 0 255 250 0 55 73 0
+255 216 240 255 255 255 227 206 43 93 7 0
+218 146 0 144 118 0 94 0 0 154 116 0
+121 59 0 172 124 0 193 169 0 110 0 0
+90 0 0 172 91 0 52 0 0 132 9 0
+145 73 0 131 87 0 15 0 0 221 208 5
+152 64 0 99 61 0 151 36 0 139 73 0
+140 23 0 63 0 0 128 52 0 200 188 0
+156 105 0 29 0 0 159 58 0 144 53 0
+45 0 0 131 15 0 173 114 0 122 85 0
+102 0 0 194 180 26 171 107 0 180 180 0
+166 41 0 249 255 184 228 196 0 157 143 0
+226 190 0 248 213 0 228 202 0 134 102 0
+205 133 0 199 175 0 183 165 0 179 93 0
+227 220 0 187 192 0 117 0 0 126 77 0
+130 74 0 121 0 0 141 0 0 75 0 0
+0 0 0 255 255 255 251 242 232 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+181 177 140 16 0 0 0 0 0 137 0 0
+255 244 0 243 221 0 249 234 49 250 230 57
+245 228 86 242 226 0 253 234 89 255 227 0
+191 146 0 12 0 0 0 0 0 12 0 0
+53 0 0 98 0 0 102 3 0 141 69 0
+217 210 162 255 255 228 255 250 211 249 243 202
+250 241 192 252 243 208 255 248 209 255 255 230
+218 216 173 163 164 101 84 21 0 0 0 0
+0 0 0 116 0 0 46 81 0 0 0 0
+165 118 0 111 0 0 0 0 0 0 0 0
+2 0 0 22 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 50 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 156 86 0 228 181 0 255 229 0
+251 221 0 240 208 0 241 190 0 250 220 0
+237 207 0 246 194 0 220 180 0 238 228 0
+101 49 0 255 241 255 255 245 254 156 112 0
+130 0 0 13 0 0 121 0 0 217 183 0
+167 122 0 208 149 0 0 0 0 255 255 255
+171 136 0 186 110 0 0 0 0 223 221 184
+186 193 0 96 0 0 0 0 0 205 221 165
+125 29 0 71 0 0 193 185 168 146 121 0
+141 0 0 0 0 0 178 134 79 100 84 0
+129 0 0 0 0 0 234 233 220 116 6 0
+62 0 0 36 0 0 152 103 104 86 0 0
+169 80 0 0 0 0 255 255 206 105 0 0
+180 140 0 94 0 0 172 160 0 100 0 0
+84 0 0 161 135 86 214 153 0 66 0 0
+225 179 104 213 236 0 198 144 0 242 224 0
+185 140 0 208 204 0 154 99 0 248 229 140
+147 113 0 119 0 0 107 0 0 76 0 0
+7 0 0 193 186 154 255 255 244 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 231 246 194
+40 0 0 0 0 0 145 0 0 247 211 0
+242 221 0 239 215 0 243 213 0 248 228 35
+249 230 72 252 243 98 255 201 0 152 111 0
+0 0 0 141 0 0 77 37 0 16 0 0
+50 0 0 55 0 0 241 227 159 255 255 216
+255 251 203 254 239 184 248 237 192 255 243 202
+255 255 224 226 214 176 189 206 119 60 0 0
+40 0 0 119 14 0 75 0 0 170 0 0
+75 0 0 0 0 0 196 120 0 0 0 0
+90 0 0 0 0 0 97 0 0 0 0 0
+0 0 0 53 0 0 0 0 0 84 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 33 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+163 1 0 255 204 0 252 224 0 240 203 0
+250 205 0 255 204 0 144 122 0 255 229 0
+100 129 0 232 193 149 252 229 223 238 211 50
+0 0 0 130 0 0 126 42 0 128 34 0
+179 191 0 138 10 0 13 0 0 160 106 0
+10 0 0 63 0 0 120 0 0 100 0 0
+127 0 0 69 0 0 175 0 0 23 0 0
+166 110 0 125 0 0 40 0 0 100 0 0
+157 137 0 50 0 0 0 0 0 227 194 37
+133 0 0 0 0 0 143 21 0 144 99 0
+148 28 0 0 0 0 184 123 0 118 0 0
+160 0 0 0 0 0 155 76 0 143 12 0
+5 0 0 117 0 0 120 80 0 97 0 0
+195 223 140 114 32 0 200 163 0 70 0 0
+92 0 0 85 0 0 129 27 0 206 185 96
+214 158 0 110 60 0 247 213 0 226 195 0
+180 163 0 203 123 0 206 145 0 82 0 0
+115 0 0 68 7 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 212 211 120 5 0 0
+0 0 0 193 0 0 244 190 0 255 250 49
+249 230 0 250 229 39 252 232 79 248 231 0
+255 242 24 233 189 0 0 0 0 68 0 0
+97 0 0 25 0 0 134 83 0 81 0 0
+203 178 87 255 255 194 255 249 203 250 238 160
+251 238 181 255 247 197 255 254 194 215 220 170
+110 56 0 0 0 0 135 0 0 144 0 0
+64 0 0 146 0 0 15 47 0 37 0 0
+141 63 0 39 0 0 64 0 0 198 109 0
+132 0 0 150 137 0 109 90 0 220 183 0
+184 167 0 208 199 82 238 185 0 225 197 0
+237 174 0 233 204 0 200 139 0 209 139 0
+191 145 0 188 113 0 156 117 0 107 11 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 30 0 0 153 0 0 250 207 0
+250 209 0 241 202 0 250 205 0 245 201 0
+220 208 0 189 137 17 241 188 200 255 243 170
+93 0 0 123 61 0 0 0 0 139 0 0
+0 0 0 132 0 0 197 182 0 103 0 0
+120 12 0 215 197 104 168 114 0 186 66 0
+0 0 0 255 255 232 163 132 0 65 0 0
+181 157 60 151 129 0 177 97 0 39 0 0
+170 184 96 80 0 0 0 0 0 129 63 0
+115 28 0 87 0 0 98 0 0 16 0 0
+237 251 140 84 0 0 207 234 232 82 0 0
+155 0 0 0 0 0 144 106 4 120 41 0
+0 0 0 229 203 80 125 69 0 18 0 0
+101 0 0 166 178 0 127 5 0 25 0 0
+98 0 0 253 251 222 128 59 0 72 0 0
+142 120 0 121 0 0 66 0 0 195 145 0
+114 0 0 246 253 38 157 109 0 222 169 0
+130 0 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 0 0 0 0 0
+81 0 0 255 236 0 240 220 0 245 216 0
+242 212 0 250 228 25 247 233 116 255 236 0
+233 179 0 160 127 0 110 0 0 0 0 0
+19 0 0 25 0 0 73 3 0 255 247 186
+255 255 202 254 242 179 251 240 195 255 244 190
+255 255 217 204 215 134 0 0 0 96 0 0
+99 0 0 191 40 0 129 89 0 125 0 0
+111 0 0 49 0 0 161 124 0 85 0 0
+167 41 0 208 143 0 248 219 80 241 210 124
+255 245 130 255 250 177 255 255 185 255 251 149
+255 254 207 255 250 169 255 247 0 255 250 95
+255 244 0 255 227 0 255 239 0 255 243 0
+255 232 0 255 242 0 255 230 0 255 245 0
+255 237 0 255 216 0 232 207 0 140 115 0
+99 9 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 163 0 0
+254 196 0 246 191 0 241 202 0 239 201 0
+255 213 0 83 53 0 204 152 58 251 222 184
+175 147 0 118 16 0 64 28 0 173 0 0
+101 105 0 120 0 0 147 127 0 209 237 0
+52 0 0 147 40 0 41 0 0 85 0 0
+173 100 0 79 0 0 0 0 0 172 123 0
+91 0 0 102 0 0 0 0 0 193 189 0
+119 0 0 208 93 0 0 0 0 143 0 0
+170 177 0 177 91 0 0 0 0 99 0 0
+195 187 0 86 0 0 119 0 0 197 125 0
+173 127 0 97 0 0 170 55 0 188 79 0
+34 0 0 118 0 0 113 0 0 21 0 0
+70 0 0 152 54 0 57 0 0 118 0 0
+214 191 0 114 40 0 186 116 0 130 71 0
+107 51 0 92 3 0 124 56 0 125 62 0
+175 100 0 85 0 0 114 0 0 170 195 0
+87 0 0 0 0 0 255 255 244 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 143 130 0 0 0 0 0 0 0
+252 149 0 253 237 0 250 234 43 248 231 9
+250 233 83 249 229 0 255 255 20 146 92 0
+0 0 0 20 0 0 72 0 0 33 0 0
+118 0 0 214 197 56 255 255 196 255 247 161
+249 240 186 253 242 178 255 255 239 197 203 124
+82 8 0 98 0 0 148 104 0 124 0 0
+163 0 0 97 116 0 145 0 0 82 1 0
+111 0 0 179 165 84 216 193 149 255 255 181
+255 255 218 255 251 210 255 251 193 255 249 187
+255 247 187 255 252 155 255 253 187 255 255 150
+255 228 112 255 241 98 254 234 0 250 214 25
+226 194 0 234 205 0 221 172 0 215 174 0
+237 192 0 242 193 0 255 232 0 253 201 0
+255 244 0 255 242 0 255 249 0 255 237 0
+255 255 0 255 246 0 183 170 0 136 111 0
+0 0 0 0 0 0 0 0 0 0 0 0
+146 0 0 246 171 0 244 200 0 244 202 0
+255 218 0 109 139 0 211 170 46 220 161 137
+202 149 0 13 0 0 192 106 0 69 0 0
+126 0 0 104 44 0 209 125 0 56 0 0
+97 0 0 183 164 0 157 28 0 104 10 0
+188 164 0 218 153 0 0 0 0 178 159 89
+237 209 105 177 179 0 19 0 0 111 40 0
+207 155 0 106 14 0 44 0 0 113 0 0
+84 0 0 144 151 0 120 0 0 49 0 0
+78 0 0 114 0 0 77 0 0 136 138 70
+121 0 0 0 0 0 185 191 0 108 7 0
+0 0 0 155 0 0 255 255 198 0 0 0
+181 0 0 150 87 0 150 0 0 33 0 0
+173 132 61 0 0 0 129 0 0 204 200 0
+0 0 0 252 255 38 84 0 0 127 0 0
+143 33 0 103 0 0 205 116 0 34 0 0
+123 0 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 186 0 0 0 0 0 0 207 48 0
+238 203 0 249 228 18 245 218 0 247 230 60
+249 232 27 255 254 0 221 165 0 0 0 0
+100 0 0 0 0 0 25 0 0 0 0 0
+235 216 66 255 254 168 251 234 167 249 238 160
+255 248 198 253 255 204 112 66 0 66 8 0
+167 101 0 121 0 0 158 0 0 204 134 0
+59 0 0 135 1 0 93 34 0 217 213 136
+255 255 213 255 255 209 255 245 188 255 244 192
+255 246 192 255 252 202 255 255 193 249 250 180
+215 200 131 194 159 0 127 116 0 103 0 0
+106 75 0 0 0 0 32 0 0 0 0 0
+0 0 0 20 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+31 0 0 87 0 0 135 52 0 208 153 0
+226 137 0 255 237 0 255 241 0 255 255 0
+254 234 0 142 137 0 69 24 0 0 0 0
+0 0 0 26 0 0 255 224 0 245 204 0
+246 207 0 211 204 0 188 149 65 203 139 0
+222 116 0 2 0 0 40 0 0 229 163 0
+0 0 0 97 0 0 242 248 134 162 99 0
+0 0 0 179 134 70 192 188 0 103 23 0
+13 0 0 169 101 0 221 148 0 131 88 0
+58 0 0 166 129 0 220 156 0 115 11 0
+0 0 0 248 198 0 222 199 0 54 14 0
+194 167 0 173 85 0 114 59 0 98 0 0
+202 182 0 193 131 0 78 0 0 173 131 0
+173 98 0 110 0 0 196 170 0 166 90 0
+212 112 0 96 0 0 135 32 0 125 0 0
+159 82 0 155 68 0 28 0 0 19 0 0
+209 194 61 171 100 0 56 0 0 152 18 0
+92 0 0 114 0 0 0 0 0 165 16 0
+160 42 0 179 171 0 193 184 0 146 0 0
+72 0 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 241 188
+103 0 0 0 0 0 202 29 0 235 199 0
+249 230 0 244 226 19 244 228 85 247 232 51
+255 240 61 226 184 0 0 0 0 0 0 0
+0 0 0 70 0 0 47 0 0 252 212 51
+255 255 173 244 228 128 245 228 132 255 246 150
+176 192 116 94 0 0 145 138 0 179 57 0
+164 143 0 162 56 0 151 75 0 25 0 0
+158 71 0 246 247 185 255 255 223 255 251 198
+249 237 184 251 241 193 255 255 194 255 252 211
+225 222 135 168 195 75 80 0 0 129 0 0
+39 0 0 0 0 0 168 69 0 0 0 0
+44 0 0 98 12 0 0 0 0 140 12 0
+0 0 0 0 0 0 0 0 0 0 0 0
+60 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 151 39 0 187 135 0
+255 241 0 255 227 0 255 255 0 208 196 0
+0 0 0 0 0 0 184 53 0 253 218 0
+239 192 0 255 238 0 86 0 0 255 219 203
+184 169 0 116 16 0 87 0 0 97 0 0
+233 183 0 141 71 0 170 146 0 224 168 0
+0 0 0 210 178 0 208 132 0 251 181 0
+0 0 0 211 126 0 140 71 0 237 192 0
+10 0 0 149 95 0 128 27 0 163 96 0
+151 73 0 107 0 0 181 106 0 186 156 0
+85 0 0 176 135 0 130 60 0 52 0 0
+170 140 0 184 106 0 63 0 0 216 201 138
+139 61 0 87 0 0 139 90 0 108 0 0
+122 74 0 106 0 0 219 240 4 203 172 0
+101 5 0 186 158 0 185 65 0 61 0 0
+117 0 0 125 0 0 98 0 0 199 217 0
+170 121 0 134 0 0 196 172 0 141 0 0
+89 0 0 167 33 0 91 0 0 186 198 0
+75 0 0 7 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 105 113 0
+0 0 0 76 0 0 255 212 0 240 216 0
+236 217 0 241 225 56 245 229 123 255 249 36
+190 183 0 0 0 0 23 0 0 0 0 0
+29 0 0 37 0 0 255 255 182 251 242 155
+247 234 159 246 234 140 255 255 223 190 172 0
+55 26 0 36 0 0 87 0 0 139 0 0
+157 0 0 92 0 0 111 0 0 209 190 2
+255 255 228 252 246 174 248 235 184 255 244 188
+255 255 210 240 234 207 167 138 58 94 86 0
+82 0 0 159 21 0 124 0 0 74 0 0
+173 12 0 11 0 0 0 0 0 217 112 0
+0 0 0 5 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 71 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+73 0 0 232 117 0 250 183 0 255 221 0
+255 237 0 192 200 0 33 0 0 255 232 0
+238 194 0 255 235 0 0 0 0 211 128 0
+215 163 0 85 0 0 83 0 0 35 0 0
+134 99 0 0 0 0 153 73 0 185 105 0
+174 195 0 116 0 0 167 111 0 132 75 0
+224 178 0 168 112 0 198 139 0 177 135 0
+227 172 0 222 183 0 180 121 0 197 167 0
+233 179 4 155 134 0 205 152 0 210 166 0
+63 0 0 204 140 0 164 135 0 151 2 0
+186 129 0 201 141 0 105 44 0 244 237 183
+206 163 0 162 124 0 207 152 0 197 172 0
+193 126 0 173 151 0 107 2 0 211 179 0
+69 0 0 190 106 0 177 196 0 115 0 0
+172 123 0 182 170 0 160 86 0 136 33 0
+168 49 0 128 35 0 239 229 216 0 0 0
+186 71 0 172 175 0 98 0 0 74 60 0
+24 0 0 214 195 169 255 255 240 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 193 52 0 0
+0 0 0 231 88 0 255 239 0 247 230 46
+246 230 78 242 228 47 252 233 77 255 243 0
+3 0 0 31 0 0 0 0 0 65 0 0
+3 0 0 255 223 136 246 233 103 238 216 87
+242 224 118 255 248 140 155 144 0 0 0 0
+155 0 0 131 0 0 170 38 0 142 0 0
+89 0 0 212 175 64 255 255 215 255 251 175
+243 231 176 253 243 178 255 254 196 229 218 197
+114 59 0 125 100 0 96 0 0 172 0 0
+193 140 0 57 0 0 174 70 0 113 0 0
+0 0 0 79 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 81 0 0 94 0 0
+95 0 0 147 0 0 70 0 0 116 0 0
+50 0 0 85 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 90 0 0 227 140 0
+255 214 0 244 202 0 255 225 0 240 202 0
+239 192 0 255 226 0 97 143 0 99 0 0
+209 121 0 96 0 0 0 0 0 41 0 0
+95 0 0 49 0 0 234 192 0 166 151 0
+210 137 0 207 151 0 201 216 38 207 146 0
+182 143 0 231 186 80 172 138 0 176 148 0
+216 171 49 145 136 79 175 89 0 208 154 0
+149 97 0 176 124 0 192 136 0 126 92 0
+191 120 0 167 162 26 179 106 0 185 133 0
+162 77 0 206 134 0 175 123 0 221 199 242
+152 109 0 148 77 0 139 68 0 159 106 0
+178 116 0 162 107 0 141 99 0 135 89 0
+151 111 0 131 60 0 128 83 0 193 160 0
+177 102 0 89 0 0 170 107 0 194 137 0
+127 39 0 169 69 0 131 10 0 105 0 0
+85 0 0 105 13 0 106 0 0 123 29 0
+0 0 0 255 255 255 248 244 231 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 96 98 0 0 0 0
+0 0 0 255 227 0 249 226 0 244 217 0
+243 224 78 245 230 36 255 255 37 89 0 0
+3 0 0 0 0 0 90 0 0 58 0 0
+224 162 0 255 255 198 249 236 173 252 237 145
+255 255 240 60 62 0 21 0 0 116 0 0
+110 0 0 112 0 0 100 0 0 174 120 0
+242 232 154 255 255 171 253 239 175 250 239 148
+255 254 217 228 222 163 145 120 30 127 139 0
+101 0 0 67 0 0 153 4 0 93 0 0
+97 0 0 80 0 0 0 0 0 39 0 0
+23 0 0 132 69 0 210 168 0 217 179 0
+244 232 0 245 220 0 252 227 0 255 255 0
+255 245 0 255 245 0 255 247 0 249 236 0
+255 228 0 253 212 0 250 219 0 246 226 0
+200 146 0 192 182 0 73 11 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+224 33 0 229 177 0 235 197 0 243 192 0
+238 189 0 255 213 0 143 171 0 99 0 0
+178 49 0 93 0 0 0 0 0 70 0 0
+96 0 0 116 44 0 186 139 0 191 141 0
+229 180 0 209 185 0 77 0 0 203 152 0
+203 163 0 201 162 114 188 147 0 140 69 0
+210 148 0 204 159 0 155 112 0 200 150 0
+205 167 0 153 89 0 209 154 0 221 170 0
+189 142 0 201 148 0 223 184 0 186 144 0
+199 147 0 212 165 0 165 125 0 148 69 0
+220 160 0 173 119 0 174 124 0 124 56 0
+224 180 0 148 105 0 148 75 0 205 177 0
+131 66 0 127 66 0 91 0 0 210 165 0
+163 136 0 170 115 0 172 131 0 154 99 0
+176 137 0 94 0 0 96 0 0 183 142 0
+143 8 0 93 0 0 213 193 0 204 144 0
+0 0 0 255 255 255 247 240 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 236 234 255 255 208 0 0 0 0 0 0
+217 68 0 251 224 0 245 229 0 243 225 0
+246 232 104 255 236 0 191 164 0 35 0 0
+0 0 0 48 0 0 45 0 0 255 215 0
+251 223 88 235 218 1 238 215 84 255 239 33
+122 115 0 61 0 0 103 0 0 124 0 0
+96 0 0 77 0 0 187 132 0 255 255 201
+255 249 175 250 231 154 255 242 188 255 255 196
+163 141 0 0 0 0 85 0 0 153 13 0
+175 97 12 180 142 0 125 0 0 139 8 0
+28 0 0 134 42 0 182 174 14 223 213 46
+255 255 116 255 255 147 255 243 0 250 227 0
+248 221 0 246 218 0 241 222 0 241 196 0
+245 220 0 218 196 0 245 217 0 241 218 0
+238 200 0 229 196 0 246 218 0 227 183 0
+240 212 0 255 214 0 255 246 0 255 234 0
+247 235 0 218 179 0 108 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 161 0 0 251 200 0 222 175 0
+243 193 0 251 199 0 197 214 0 71 0 0
+157 3 0 73 0 0 56 0 0 70 0 0
+29 0 0 168 62 0 181 121 0 169 118 0
+110 23 0 154 83 0 219 190 0 57 0 0
+176 185 0 114 57 0 240 191 0 105 0 0
+130 68 0 199 144 0 123 31 0 194 160 0
+103 16 0 171 94 0 172 108 0 107 38 0
+213 214 0 143 54 0 116 15 0 166 85 0
+130 76 0 236 212 0 43 0 0 212 170 0
+172 115 0 165 145 0 110 0 0 198 153 0
+128 112 0 186 118 0 233 184 0 137 14 0
+212 217 0 85 0 0 112 0 0 58 0 0
+96 0 0 128 44 0 165 103 0 154 82 0
+159 113 0 141 0 0 200 211 0 113 0 0
+86 0 0 95 0 0 170 132 0 206 177 33
+200 191 0 185 164 190 255 255 246 248 238 225
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 251 241 201 197 0 0 0 0 155 0 0
+245 210 0 253 245 76 249 232 68 249 225 0
+255 240 94 228 210 0 1 0 0 14 0 0
+37 0 0 87 0 0 168 82 0 255 255 194
+250 235 147 250 230 102 255 252 162 202 198 0
+0 0 0 133 0 0 107 0 0 140 0 0
+76 0 0 211 171 0 255 243 138 248 230 117
+247 227 145 255 241 145 223 234 153 48 0 0
+75 0 0 120 83 0 119 0 0 184 0 0
+197 130 0 80 0 0 11 0 0 157 138 0
+238 212 107 255 255 125 255 245 121 255 240 142
+249 230 0 237 200 0 250 222 0 230 197 0
+246 217 0 231 193 0 248 229 0 231 205 0
+248 206 0 241 221 0 246 195 0 252 229 0
+224 186 0 239 214 0 233 197 0 216 189 0
+252 221 0 238 203 0 245 200 0 241 211 0
+255 222 0 246 211 0 255 222 0 255 249 0
+242 215 0 46 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 220 30 0 252 221 0
+242 206 0 250 198 0 237 224 0 0 0 0
+66 0 0 67 0 0 43 0 0 189 212 0
+104 0 0 44 0 0 40 0 0 171 124 0
+160 97 0 55 0 0 214 200 0 113 0 0
+217 166 0 19 0 0 2 0 0 0 0 0
+123 0 0 44 0 0 25 0 0 9 0 0
+102 0 0 117 0 0 38 0 0 160 9 0
+44 0 0 81 0 0 57 0 0 92 0 0
+14 0 0 137 0 0 40 0 0 29 0 0
+76 0 0 81 0 0 79 0 0 45 0 0
+77 0 0 29 0 0 128 37 0 61 0 0
+149 60 0 120 65 0 128 27 0 82 0 0
+76 0 0 125 26 0 132 32 0 188 146 0
+210 178 0 120 12 0 106 0 0 71 0 0
+86 0 0 160 31 0 189 128 0 162 129 0
+255 255 255 30 37 0 255 255 255 250 242 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 244 239
+255 254 187 67 0 0 0 0 0 253 153 0
+242 223 0 244 221 0 243 215 0 246 220 0
+255 255 0 0 0 0 46 0 0 80 0 0
+35 0 0 53 0 0 255 240 4 247 226 75
+245 224 121 255 242 49 179 163 0 0 0 0
+95 0 0 90 0 0 121 0 0 67 0 0
+255 241 67 255 248 172 250 238 158 251 233 131
+255 255 208 188 182 0 82 0 0 97 0 0
+98 26 0 201 1 0 197 77 0 119 0 0
+69 0 0 152 136 0 255 255 169 255 255 116
+255 240 107 248 224 113 248 235 50 237 212 62
+255 235 58 248 226 35 231 194 0 254 240 0
+235 195 0 221 193 0 255 220 0 238 209 0
+235 189 0 255 240 0 205 155 0 255 221 0
+219 187 0 253 228 0 217 173 0 215 199 0
+248 203 0 233 204 0 232 196 0 233 209 0
+237 185 0 229 192 0 215 172 0 249 223 0
+245 189 0 235 217 0 255 226 0 151 130 0
+0 0 0 0 0 0 0 0 0 255 120 0
+246 203 0 247 194 0 254 234 0 0 0 0
+24 0 0 170 12 0 17 0 0 76 0 0
+49 0 0 134 0 0 16 0 0 40 0 0
+137 0 0 79 6 0 103 0 0 55 0 0
+0 0 0 45 0 0 35 0 0 42 0 0
+31 0 0 28 0 0 19 0 0 32 0 0
+12 0 0 0 0 0 110 0 0 39 0 0
+104 0 0 4 0 0 136 2 0 167 114 0
+105 14 0 42 0 0 165 54 0 185 121 0
+79 0 0 173 85 0 120 0 0 174 55 0
+33 0 0 173 40 0 119 0 0 78 9 0
+123 0 0 75 0 0 30 0 0 3 0 0
+78 0 0 89 0 0 112 16 0 151 94 0
+220 163 0 212 200 0 109 2 0 47 0 0
+127 19 0 105 42 0 71 0 0 124 38 0
+213 171 0 251 235 56 117 69 78 255 247 255
+255 247 238 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 252 241 228 255 255 255
+187 164 0 0 0 0 90 0 0 255 232 0
+242 213 0 247 229 0 249 233 69 255 251 3
+177 171 0 41 0 0 34 0 0 77 0 0
+86 0 0 194 113 0 255 252 172 248 228 101
+255 235 147 255 255 72 0 0 0 3 0 0
+130 0 0 123 0 0 66 0 0 255 223 35
+243 236 90 240 221 67 250 216 94 233 242 104
+143 110 0 0 0 0 137 0 0 112 0 0
+212 65 0 155 0 0 75 0 0 111 68 0
+255 255 174 255 253 137 250 236 129 252 231 76
+251 235 59 234 215 0 251 215 0 249 240 94
+230 188 0 255 241 101 252 231 20 253 219 0
+255 247 168 255 250 0 255 211 12 248 237 0
+211 189 0 232 218 0 174 174 0 198 182 0
+207 198 0 224 194 0 180 159 0 229 234 0
+255 236 0 255 245 0 235 201 0 247 230 0
+242 193 0 222 197 0 211 169 0 239 202 0
+221 167 0 249 212 0 244 203 0 255 231 0
+207 137 0 206 181 0 0 0 0 35 0 0
+255 190 0 243 195 0 255 237 0 0 0 0
+98 0 0 120 0 0 0 0 0 85 0 0
+0 0 0 0 0 0 0 0 0 48 0 0
+0 0 0 2 0 0 0 0 0 114 0 0
+103 0 0 147 0 0 0 0 0 149 0 0
+179 103 0 139 57 0 100 69 0 178 66 0
+222 171 0 166 137 0 146 95 0 255 240 0
+246 216 0 139 110 0 134 103 0 255 225 0
+255 224 0 224 230 0 118 97 0 255 250 131
+255 255 205 43 20 0 252 252 77 247 228 59
+205 220 0 190 126 0 243 196 0 249 245 0
+29 0 0 218 183 0 200 145 0 0 0 0
+10 0 0 26 0 0 121 0 0 91 4 0
+217 173 0 253 222 26 193 217 0 21 0 0
+255 255 255 255 255 255 225 245 141 41 0 0
+82 0 0 210 162 0 170 191 0 65 12 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 245 237 255 255 229
+0 0 0 0 0 0 231 107 0 255 254 0
+249 235 50 246 222 0 242 210 0 255 245 0
+16 0 0 15 0 0 72 0 0 19 0 0
+214 104 0 246 227 0 235 208 44 240 208 0
+255 247 0 123 0 0 5 0 0 118 0 0
+160 0 0 105 0 0 226 175 0 255 255 200
+252 239 151 253 242 131 255 255 206 48 0 0
+0 0 0 98 0 0 145 0 0 173 0 0
+128 0 0 61 0 0 202 171 25 255 255 161
+254 242 159 247 231 116 250 234 114 231 200 0
+248 209 0 250 237 16 223 188 0 252 213 31
+255 255 106 253 217 5 209 192 17 129 93 0
+84 33 0 55 0 0 0 0 0 74 0 0
+49 0 0 47 0 0 42 0 0 74 0 0
+114 0 0 85 0 0 86 0 0 68 0 0
+73 0 0 83 0 0 108 61 0 144 125 0
+169 150 0 255 244 0 215 192 0 255 233 0
+225 185 0 240 209 0 249 210 0 228 190 0
+224 195 0 255 210 0 234 190 0 9 0 0
+238 167 0 250 204 0 255 223 0 0 8 0
+37 0 0 132 0 0 0 0 0 68 0 0
+0 0 0 0 0 0 146 0 0 0 0 0
+100 0 0 153 0 0 112 22 0 68 0 0
+210 139 0 203 123 0 165 139 0 93 0 0
+222 217 0 250 223 40 255 243 151 36 19 0
+185 152 0 234 218 220 0 0 0 135 76 0
+180 172 170 170 132 0 98 104 0 142 110 57
+148 129 126 159 113 0 41 0 0 100 49 0
+123 61 0 98 61 0 116 83 0 118 65 0
+120 87 0 84 30 0 98 48 0 151 107 0
+95 62 0 57 0 0 162 140 0 32 0 0
+0 0 0 0 0 0 32 0 0 74 0 0
+105 31 0 234 199 0 255 250 215 14 17 0
+255 255 255 250 243 236 255 244 255 247 253 229
+161 164 0 53 0 0 239 194 0 222 208 0
+235 217 185 0 0 0 253 250 255 255 255 255
+245 235 199 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 254 241 226 255 248 252 255 239 142
+0 0 0 0 0 0 255 226 0 240 218 0
+235 197 0 234 200 0 255 222 0 206 212 0
+12 0 0 4 0 0 72 0 0 75 0 0
+255 255 0 250 237 71 251 237 149 255 242 60
+222 217 0 12 0 0 100 0 0 111 0 0
+106 0 0 201 160 0 236 210 0 240 210 0
+245 216 73 255 255 174 0 0 0 71 0 0
+124 0 0 131 0 0 172 0 0 114 0 0
+86 0 0 255 255 167 255 248 141 249 238 98
+246 215 101 236 223 23 236 196 0 254 239 108
+226 203 0 255 255 223 233 225 9 169 164 0
+82 10 0 11 0 0 3 0 0 57 0 0
+152 14 0 114 0 0 146 0 0 157 0 0
+180 24 0 156 0 0 167 187 0 180 0 0
+202 140 0 184 69 0 155 57 0 187 1 0
+165 0 0 189 8 0 171 38 0 162 0 0
+128 0 0 6 0 0 91 23 0 157 136 0
+211 164 0 255 238 0 244 209 0 208 153 0
+240 213 0 235 177 0 206 155 0 255 230 0
+233 183 0 243 201 0 255 228 0 19 42 0
+70 0 0 0 0 0 9 0 0 161 101 0
+80 60 0 139 0 0 200 138 0 161 89 0
+0 0 0 183 82 0 204 134 0 172 145 0
+136 66 0 235 223 163 223 175 0 99 114 0
+118 72 13 110 83 0 133 103 29 142 124 20
+145 130 56 204 163 147 228 211 146 227 202 189
+154 133 85 214 188 161 228 204 168 206 183 135
+177 154 121 223 198 161 255 255 239 255 241 207
+253 245 233 255 251 248 255 241 208 245 230 186
+252 237 216 255 255 237 254 241 228 237 234 193
+255 240 224 255 255 232 253 246 247 255 255 199
+255 253 197 66 18 0 0 0 0 19 0 0
+106 0 0 193 160 0 224 174 27 201 216 154
+205 150 164 255 255 255 247 239 229 253 242 240
+255 255 255 165 183 52 63 0 0 0 0 0
+255 255 0 95 61 55 81 37 0 35 21 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 250 238 227 255 255 255 152 135 0
+0 0 0 117 0 0 255 255 0 235 203 0
+248 223 0 253 241 3 244 247 0 13 0 0
+61 0 0 75 0 0 43 0 0 187 73 0
+255 255 89 242 229 49 255 239 115 231 245 0
+49 0 0 17 0 0 93 0 0 125 0 0
+97 0 0 255 255 81 249 234 12 246 231 41
+246 234 34 70 14 0 59 0 0 149 0 0
+146 0 0 175 0 0 56 0 0 96 0 0
+255 255 175 250 236 112 241 222 38 248 229 0
+235 215 33 232 200 0 242 209 0 255 249 211
+252 248 159 83 54 0 25 0 0 90 0 0
+108 0 0 188 94 0 165 63 0 180 88 0
+222 195 38 218 206 0 255 244 102 245 236 29
+248 241 43 252 238 68 255 232 181 246 242 33
+255 239 184 255 248 133 255 252 155 245 238 74
+244 236 0 245 233 17 205 150 0 197 113 0
+188 80 0 181 0 0 143 0 0 121 0 0
+41 0 0 69 0 0 138 138 0 255 247 0
+237 191 0 238 193 0 217 175 0 232 196 0
+242 191 0 243 196 0 255 228 0 95 84 0
+13 0 0 19 0 0 0 0 0 160 0 0
+145 8 0 0 0 0 217 160 0 223 187 93
+142 110 0 104 15 0 191 170 29 168 144 152
+92 79 0 141 100 0 195 170 164 222 200 150
+221 199 179 252 246 225 204 195 184 244 217 209
+230 223 208 230 207 196 202 187 152 208 190 173
+245 230 213 211 205 184 225 197 192 219 210 172
+255 248 243 255 249 243 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 125 125 0 0 0 0
+122 0 0 93 30 0 185 142 0 255 255 255
+0 19 0 214 191 201 255 253 246 248 238 231
+251 240 231 255 255 255 202 219 135 0 0 0
+64 19 0 255 246 194 255 246 214 168 191 0
+188 154 172 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 250 241 229 255 255 223 0 0 0
+0 0 0 184 104 0 255 251 0 246 234 0
+244 227 11 255 252 10 62 40 0 113 0 0
+61 0 0 107 0 0 77 0 0 255 238 0
+233 209 0 228 202 0 255 233 40 80 22 0
+70 0 0 72 0 0 108 0 0 103 0 0
+255 245 0 244 229 0 241 226 28 255 255 119
+0 0 0 33 0 0 146 0 0 129 0 0
+195 0 0 1 0 0 189 131 0 255 255 128
+246 236 91 233 216 0 241 214 38 228 203 0
+251 217 28 255 240 204 236 238 182 66 0 0
+0 0 0 140 0 0 165 0 0 198 115 0
+216 162 0 244 205 36 255 242 135 249 230 101
+254 248 145 255 253 195 255 254 185 255 250 219
+255 255 235 255 255 255 248 236 216 251 252 222
+254 251 229 245 246 209 254 255 223 255 255 255
+255 255 216 255 255 209 255 251 104 255 239 23
+255 230 5 243 221 0 200 161 0 193 116 0
+155 0 0 119 0 0 84 0 0 0 0 0
+206 164 0 255 241 0 229 185 0 247 199 0
+240 189 0 245 207 0 255 237 0 0 0 0
+59 0 0 0 0 0 0 0 0 239 137 0
+226 176 0 118 97 0 47 0 0 127 120 0
+177 142 137 199 178 133 229 215 200 231 212 187
+240 225 212 226 207 209 235 206 195 209 201 166
+204 181 165 194 182 152 206 171 147 193 179 155
+228 203 174 211 188 174 216 194 155 242 220 193
+187 176 154 227 200 164 238 221 196 254 248 235
+250 238 230 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 212 231 104
+0 0 0 104 0 0 157 107 0 202 154 42
+234 242 214 0 0 0 255 255 255 246 238 227
+246 238 224 249 238 230 255 249 255 236 245 190
+255 248 136 207 190 102 140 84 0 11 9 0
+244 192 194 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+254 242 230 252 243 236 255 250 165 0 0 0
+69 0 0 255 227 0 234 207 0 242 214 0
+234 203 0 255 248 0 1 0 0 116 0 0
+38 0 0 77 0 0 126 0 0 255 255 0
+245 230 66 255 235 40 233 243 0 50 0 0
+52 0 0 66 0 0 110 0 0 153 24 0
+246 237 0 228 207 0 255 220 0 136 148 0
+33 0 0 110 0 0 140 0 0 174 0 0
+0 0 0 184 60 0 255 235 85 240 225 63
+237 215 41 235 204 0 237 209 0 246 223 38
+255 246 209 167 169 0 0 0 0 152 0 0
+147 0 0 221 186 0 224 181 0 245 227 62
+255 251 198 249 241 146 251 244 164 255 250 215
+247 255 200 235 229 199 193 161 118 185 146 72
+160 108 0 165 55 0 156 80 0 168 0 0
+137 87 0 140 0 0 159 34 0 173 72 0
+161 102 1 213 168 97 231 211 86 254 249 116
+255 249 142 255 255 182 253 239 93 255 244 100
+233 207 0 194 151 0 193 45 0 172 0 0
+0 0 0 62 0 0 252 206 0 249 211 0
+242 195 0 245 193 0 255 245 0 0 0 0
+0 0 0 0 0 0 0 0 0 79 0 0
+79 45 0 178 164 113 219 218 177 212 203 197
+216 199 160 242 215 206 229 215 179 221 197 173
+227 222 182 216 187 150 234 221 203 220 190 173
+201 186 166 231 215 191 229 225 199 205 183 154
+214 196 156 253 238 235 212 203 175 206 185 147
+241 230 206 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 0 0 0 61 0 0 198 154 0
+255 244 255 152 173 78 206 173 177 255 255 255
+246 237 227 248 239 226 246 240 228 255 248 245
+134 101 0 6 0 0 86 0 0 164 125 0
+240 241 223 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 231 255 244 229 224 202 41 0 0 0
+190 84 0 235 204 0 239 219 4 245 229 0
+255 240 36 183 195 0 31 0 0 49 0 0
+70 0 0 45 0 0 255 218 0 247 238 0
+248 232 81 255 255 50 124 73 0 56 0 0
+5 0 0 88 0 0 86 0 0 255 233 0
+246 236 0 252 230 0 243 255 0 9 0 0
+121 0 0 152 0 0 187 0 0 0 0 0
+148 35 0 255 255 33 238 221 75 238 219 5
+235 211 28 228 208 0 248 208 164 255 255 188
+0 0 0 60 0 0 162 0 0 224 215 46
+205 159 0 254 226 106 249 242 191 247 240 146
+253 245 198 253 249 220 230 228 192 192 186 118
+141 0 0 148 0 0 165 75 0 127 0 0
+167 13 0 165 0 0 165 46 0 158 92 0
+154 8 0 132 0 0 183 51 0 139 0 0
+165 30 0 164 0 0 149 0 0 138 0 0
+155 20 0 231 222 78 243 233 70 255 255 200
+255 243 168 255 234 143 252 224 0 205 161 0
+141 0 0 115 0 0 0 0 0 255 228 0
+255 217 0 253 198 0 232 224 0 0 0 0
+0 0 0 0 0 0 0 0 0 253 249 187
+238 234 203 240 211 188 221 201 160 241 223 211
+213 200 166 219 182 160 229 227 202 201 179 152
+233 204 193 198 179 138 233 207 190 215 205 168
+247 227 222 230 226 201 222 189 154 239 236 223
+235 227 215 207 187 163 233 218 184 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 0 0 114 10 0
+220 168 0 255 255 255 0 0 0 255 255 255
+250 240 229 245 234 226 249 242 229 249 237 230
+250 242 235 249 241 232 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 250 237 226
+255 244 237 255 245 206 117 115 0 0 0 0
+241 176 0 246 224 0 240 222 51 244 229 28
+255 255 3 0 0 0 45 0 0 13 0 0
+71 0 0 202 146 0 245 223 0 232 205 0
+239 207 13 255 240 0 8 0 0 66 0 0
+37 0 0 71 0 0 228 185 0 247 227 0
+243 224 0 254 255 0 61 0 0 0 0 0
+175 0 0 148 0 0 64 0 0 170 17 0
+255 241 0 253 237 100 235 217 0 241 212 0
+247 226 4 255 233 170 237 226 101 0 0 0
+157 0 0 209 219 167 189 91 0 248 226 106
+249 239 205 247 236 144 252 240 181 255 255 247
+209 224 169 115 0 0 164 64 0 128 0 0
+153 101 0 110 0 0 140 35 0 201 200 39
+204 185 116 239 232 164 240 226 153 255 244 203
+244 241 147 247 241 150 234 228 137 219 237 139
+228 202 156 188 173 0 187 112 0 181 21 0
+157 0 0 162 0 0 134 0 0 177 152 0
+255 246 70 255 249 152 255 249 220 255 240 176
+211 203 0 170 49 0 139 0 0 0 0 0
+197 155 0 255 237 0 202 203 0 0 0 0
+0 0 0 0 0 0 197 143 82 246 228 201
+223 205 191 225 201 170 249 231 210 207 187 158
+237 220 190 186 167 150 238 214 181 238 225 209
+239 225 192 218 201 164 234 210 198 244 240 220
+213 193 164 229 217 200 250 241 229 215 196 183
+209 193 148 248 236 227 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 241 255 158 0 0 0
+149 112 0 237 188 77 191 202 56 157 127 126
+255 255 255 252 243 231 248 240 228 248 241 228
+248 238 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 241 229
+255 243 238 255 250 168 29 0 0 0 0 0
+255 230 0 247 231 0 249 234 18 245 225 0
+255 255 0 0 0 0 62 0 0 66 0 0
+0 0 0 255 233 0 249 228 0 248 231 0
+255 230 0 173 181 0 75 0 0 39 0 0
+78 0 0 80 0 0 255 254 0 236 206 0
+255 224 0 88 98 0 0 0 0 171 0 0
+157 0 0 154 0 0 36 0 0 255 255 0
+248 229 125 245 219 0 253 237 112 246 231 0
+255 235 131 188 191 77 0 0 0 169 0 0
+162 0 0 227 162 0 255 251 168 250 240 148
+247 235 200 255 253 224 235 240 185 116 86 0
+153 0 0 180 148 0 149 0 0 171 101 0
+224 191 183 252 252 198 255 255 244 255 252 216
+255 254 214 255 251 209 255 253 210 255 252 217
+255 252 206 255 254 224 255 253 213 255 254 216
+255 255 220 255 255 233 255 255 246 248 255 175
+236 229 112 198 151 0 179 86 0 161 0 0
+143 0 0 184 170 0 255 234 136 255 248 130
+255 246 230 253 244 0 177 90 0 114 0 0
+0 0 0 252 184 0 40 89 0 0 0 0
+0 0 0 0 0 0 248 186 176 228 210 179
+215 199 169 235 217 205 187 172 128 246 217 214
+232 221 197 236 207 175 241 220 210 221 201 157
+244 225 195 248 240 226 228 210 176 233 214 187
+254 247 242 237 231 218 212 188 143 245 231 214
+255 246 232 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 191 219 110
+0 0 0 144 47 0 255 255 255 0 0 0
+246 216 227 255 252 242 248 241 229 248 238 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 254 241 229
+255 255 255 233 217 93 0 0 0 92 0 0
+255 255 0 247 229 0 239 205 0 250 219 0
+207 216 0 31 0 0 55 0 0 6 0 0
+78 0 0 255 255 0 249 232 0 252 233 0
+255 249 0 21 0 0 91 0 0 60 0 0
+49 0 0 247 165 0 255 248 0 255 228 0
+255 255 4 0 0 0 69 0 0 125 0 0
+179 0 0 20 0 0 254 167 0 254 244 109
+249 236 163 247 224 19 243 218 36 255 241 165
+215 220 173 0 0 0 137 0 0 127 0 0
+255 253 0 254 247 156 251 242 196 251 242 218
+255 255 255 140 143 0 104 0 0 166 29 0
+150 0 0 183 122 80 243 238 207 255 255 230
+255 250 220 255 248 203 255 250 223 255 254 211
+255 255 232 255 255 219 255 248 180 251 227 150
+250 217 121 248 211 111 254 214 139 250 223 109
+249 219 118 254 223 134 255 240 173 255 251 220
+255 255 222 255 255 255 244 236 122 240 231 29
+153 90 0 157 0 0 120 0 0 196 170 0
+255 255 190 255 251 208 252 239 0 191 121 0
+164 0 0 43 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 253 230 193 255 240 227
+207 187 161 234 207 182 238 231 202 212 185 158
+235 219 184 238 222 193 237 213 181 251 236 202
+245 222 204 244 220 179 255 245 226 252 242 229
+213 195 161 217 194 160 253 246 227 253 243 235
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+88 104 0 0 0 0 212 175 0 250 248 195
+0 0 0 255 255 255 250 245 226 249 242 228
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 250 239 228
+255 255 255 185 165 0 0 0 0 140 0 0
+255 242 0 236 206 0 242 224 0 255 246 122
+95 108 0 63 0 0 39 0 0 47 0 0
+146 0 0 255 239 0 234 206 0 250 214 0
+173 165 0 14 0 0 130 0 0 65 0 0
+56 0 0 255 217 0 236 203 0 255 222 0
+154 180 0 44 0 0 132 0 0 194 0 0
+59 0 0 118 0 0 255 255 0 238 220 0
+236 204 0 248 231 0 255 234 178 255 255 192
+0 0 0 128 0 0 155 90 0 251 226 60
+254 253 151 249 235 150 255 251 226 249 236 151
+148 101 0 176 119 0 134 37 0 130 2 0
+245 241 198 255 255 225 255 247 209 255 246 209
+255 249 226 255 255 222 245 218 176 203 174 50
+197 124 0 135 28 0 155 0 0 136 59 0
+188 27 0 133 0 0 178 61 0 182 0 0
+164 0 0 186 48 0 186 45 0 213 118 0
+202 129 0 255 234 168 255 245 170 255 252 243
+255 255 199 208 199 0 138 30 0 137 0 0
+182 131 0 252 238 139 255 255 195 245 215 0
+201 162 0 200 0 0 66 0 0 0 0 0
+0 0 0 189 69 0 247 235 221 229 203 181
+232 214 176 226 202 176 236 221 185 226 194 168
+242 223 197 240 222 180 246 223 217 240 226 195
+255 241 227 255 247 238 235 222 196 210 187 155
+246 237 213 255 244 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 136 150 0 2 0 0 255 255 208
+181 207 0 160 99 126 255 255 255 253 241 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 246 239 231
+255 249 241 173 159 0 0 0 0 208 121 0
+251 230 0 247 228 0 248 225 0 255 253 69
+1 0 0 66 0 0 49 0 0 23 0 0
+234 142 0 248 241 66 241 224 10 255 254 0
+45 0 0 65 0 0 114 0 0 35 0 0
+116 0 0 255 255 0 247 231 0 255 255 0
+0 0 0 99 0 0 132 0 0 130 0 0
+71 0 0 252 217 0 244 219 53 250 230 5
+246 230 72 254 230 36 255 255 255 32 0 0
+65 0 0 155 102 0 231 156 0 255 255 203
+251 236 148 253 242 166 255 255 177 118 0 0
+179 23 0 106 0 0 209 154 58 255 254 232
+255 251 210 253 240 209 255 249 214 255 253 229
+217 207 118 203 115 0 187 122 0 173 0 0
+160 0 0 206 70 0 144 0 0 181 118 0
+181 18 0 169 91 0 166 72 0 198 112 0
+168 62 0 166 0 0 179 51 0 174 0 0
+132 0 0 164 0 0 196 103 0 217 146 0
+255 231 180 253 245 193 255 255 170 192 177 0
+134 0 0 144 0 0 255 244 8 255 248 234
+255 236 0 162 118 0 140 0 0 68 0 0
+0 0 0 255 202 209 228 215 170 239 216 200
+212 185 157 223 208 183 243 222 205 240 220 187
+255 246 231 235 224 192 249 223 199 255 247 232
+244 236 217 210 182 151 227 203 161 255 246 234
+253 240 234 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 33 29 0 118 42 0
+255 203 229 32 58 0 255 245 255 250 245 235
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 246 235 223 246 237 228
+255 255 222 31 0 0 0 0 0 254 187 0
+248 228 0 246 226 0 250 219 0 187 192 0
+7 0 0 85 0 0 49 0 0 0 0 0
+255 225 0 252 243 69 251 231 36 255 250 0
+0 0 0 101 0 0 118 0 0 62 0 0
+204 103 0 246 226 0 240 201 0 232 223 0
+21 0 0 87 0 0 120 0 0 123 0 0
+208 146 0 237 221 0 239 208 60 247 222 29
+247 228 45 255 255 255 64 5 0 21 0 0
+132 0 0 205 139 0 255 243 93 250 238 134
+253 238 174 255 255 210 128 11 0 154 0 0
+151 0 0 212 191 91 255 255 234 255 246 210
+254 243 200 255 250 218 255 236 185 190 148 0
+165 0 0 167 4 0 151 0 0 166 80 0
+194 156 0 232 199 160 252 247 169 255 255 220
+255 255 216 255 255 203 255 255 230 255 255 215
+254 250 191 245 249 190 228 214 128 208 195 81
+187 154 0 127 59 0 160 0 0 151 0 0
+196 0 0 247 212 6 255 239 188 255 250 157
+183 187 0 162 0 0 146 7 0 255 255 141
+250 234 156 252 247 0 169 15 0 146 0 0
+0 0 0 255 255 235 221 193 155 219 193 172
+248 236 211 250 231 207 223 207 171 252 242 225
+234 211 182 254 236 208 249 240 229 229 217 186
+207 185 137 251 237 212 255 247 242 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 0 0 0
+188 147 0 240 219 141 98 35 0 255 255 255
+251 246 233 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 252 240 227 249 240 235
+255 255 203 0 0 0 10 0 0 255 192 0
+231 206 0 233 200 0 255 229 0 136 160 0
+55 0 0 10 0 0 49 0 0 61 0 0
+255 237 0 228 193 0 235 205 0 206 202 0
+23 0 0 97 0 0 108 0 0 70 0 0
+255 226 0 252 232 0 255 230 0 148 171 0
+0 0 0 152 0 0 156 0 0 0 0 0
+255 240 0 235 218 0 237 219 54 233 211 0
+235 206 0 241 255 255 16 0 0 147 0 0
+118 0 0 255 255 119 245 231 127 247 236 120
+255 238 209 173 137 0 160 76 0 157 0 0
+174 96 0 255 255 255 247 241 192 251 244 213
+255 255 236 191 138 0 140 103 0 157 0 0
+146 0 0 180 120 27 239 250 200 255 255 245
+255 255 223 252 247 207 250 240 177 252 240 172
+254 241 212 239 223 93 249 236 200 247 237 166
+255 242 189 255 244 204 254 247 180 255 248 219
+255 254 230 255 255 226 204 204 114 148 133 0
+138 0 0 188 0 0 226 91 0 254 229 137
+255 253 180 239 254 0 121 0 0 153 63 0
+250 227 17 255 255 219 219 230 0 207 83 0
+17 0 0 255 255 228 242 233 199 225 197 176
+239 224 193 253 242 224 238 222 198 237 220 186
+255 243 234 237 226 206 217 185 150 222 200 168
+251 237 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 150 178 0
+0 0 0 255 228 190 137 164 0 75 4 0
+255 255 255 249 242 231 250 241 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 242 240
+255 255 196 0 0 0 0 0 0 255 234 0
+240 213 0 245 225 0 255 255 0 32 0 0
+11 0 0 50 0 0 115 0 0 163 0 0
+255 255 12 247 229 0 255 239 0 123 117 0
+39 0 0 59 0 0 59 0 0 164 0 0
+244 231 0 234 203 0 255 243 0 0 0 0
+110 0 0 122 0 0 141 0 0 153 0 0
+237 244 0 234 196 0 241 213 84 248 232 40
+255 255 223 15 0 0 172 0 0 88 0 0
+250 197 0 250 247 161 241 228 130 255 255 189
+169 146 0 160 0 0 169 90 0 182 94 58
+255 255 228 251 245 210 244 234 196 253 228 183
+197 183 2 147 59 0 176 0 0 169 53 0
+249 234 192 255 255 236 244 237 174 244 228 173
+247 240 198 238 223 132 248 241 206 243 233 148
+248 239 220 246 232 139 243 222 156 242 231 190
+243 218 141 255 242 206 238 206 75 246 235 166
+248 225 144 255 248 199 255 251 221 255 255 191
+211 230 0 127 0 0 139 0 0 208 0 0
+255 233 0 255 254 195 206 247 0 157 0 0
+102 0 0 255 255 39 255 226 114 209 220 0
+182 0 0 102 48 0 243 250 238 239 217 193
+251 248 233 227 212 178 248 236 215 254 239 231
+212 201 179 205 179 137 251 236 213 255 253 240
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+126 158 0 88 0 0 255 238 100 100 121 0
+231 194 231 255 253 244 248 247 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 249 238 240
+255 250 138 0 0 0 30 0 0 255 255 0
+239 221 0 243 223 0 255 255 0 61 0 0
+27 0 0 104 0 0 8 0 0 216 80 0
+251 236 0 231 203 0 255 244 0 0 0 0
+144 0 0 10 0 0 22 0 0 212 164 0
+249 235 0 255 245 0 202 208 0 0 0 0
+128 0 0 160 0 0 87 0 0 239 171 0
+242 237 0 238 222 0 243 220 31 247 221 84
+234 241 189 16 0 0 154 0 0 154 0 0
+255 254 66 245 236 130 245 227 130 255 255 167
+139 1 0 170 75 0 130 15 0 255 255 255
+250 241 200 251 244 218 242 206 114 233 204 0
+141 0 0 176 0 0 169 107 0 255 255 255
+255 253 215 253 241 204 247 240 199 241 227 148
+253 233 184 246 233 165 245 231 192 251 241 198
+233 210 113 248 239 175 236 206 59 246 235 215
+247 221 151 253 235 215 241 216 83 245 226 144
+248 220 138 245 234 136 248 222 159 248 238 119
+255 237 156 229 247 49 151 147 0 136 0 0
+158 0 0 244 188 0 255 255 163 179 183 0
+159 0 0 197 111 0 255 249 99 255 247 50
+186 67 0 16 0 0 182 170 110 255 251 243
+219 197 170 247 236 222 243 232 215 194 171 136
+223 199 163 254 246 232 255 243 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 12 0 0 230 200 48 255 255 255
+54 31 0 255 255 255 255 250 239 248 239 229
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 245 247
+255 245 112 0 0 0 44 0 0 255 255 0
+241 227 0 239 213 0 255 238 0 0 0 0
+30 0 0 75 0 0 33 0 0 229 181 0
+253 233 45 248 228 31 255 255 0 0 0 0
+122 0 0 42 0 0 59 0 0 240 190 0
+240 217 0 255 216 0 117 133 0 0 0 0
+139 0 0 168 0 0 0 0 0 255 235 0
+229 199 0 234 210 0 249 228 29 255 255 255
+76 120 0 96 0 0 83 0 0 219 128 0
+250 251 112 243 230 109 255 246 161 117 96 0
+181 49 0 150 0 0 222 191 148 250 248 219
+245 238 206 254 239 227 222 181 0 121 0 0
+210 170 0 176 102 0 255 245 238 255 251 211
+251 236 171 244 228 154 246 233 182 252 242 207
+242 233 146 248 218 180 238 225 136 253 235 116
+221 215 79 255 235 162 250 229 4 242 215 68
+242 220 0 254 220 92 233 200 0 244 219 41
+242 204 94 236 222 68 249 234 142 241 223 99
+251 227 108 248 233 138 255 255 144 137 125 0
+169 0 0 165 0 0 250 229 127 255 255 127
+189 208 0 128 0 0 255 245 0 252 235 91
+198 214 0 138 0 0 59 0 0 255 255 239
+238 228 214 224 206 178 202 184 153 245 229 207
+253 246 234 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 67 0 0 190 147 5
+239 246 197 57 14 0 255 249 255 255 249 242
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 245 247
+251 234 97 0 0 0 0 0 0 255 255 0
+228 192 0 238 204 0 238 245 0 105 0 0
+39 0 0 29 0 0 75 0 0 255 219 31
+255 247 119 247 227 55 241 239 0 7 0 0
+116 0 0 64 0 0 1 0 0 255 240 0
+233 210 0 255 255 0 0 0 0 13 0 0
+136 0 0 114 0 0 38 0 0 255 255 0
+241 223 0 246 230 33 248 231 75 235 240 208
+0 0 0 186 0 0 128 0 0 255 245 0
+247 238 155 246 230 123 253 255 174 142 8 0
+173 62 0 154 0 0 255 255 210 247 238 208
+250 242 217 243 203 0 152 65 0 205 86 0
+118 5 0 255 255 255 244 241 191 249 228 156
+254 231 189 251 241 194 231 220 127 244 217 131
+255 241 173 227 214 0 212 180 82 182 141 0
+152 110 0 129 87 0 120 62 0 103 93 0
+149 107 0 139 96 0 182 142 0 244 206 4
+241 207 51 227 192 0 254 233 161 240 210 13
+252 242 161 232 199 0 255 232 133 255 255 177
+185 164 0 181 20 0 149 0 0 255 242 0
+255 255 85 147 27 0 154 53 0 255 238 69
+255 255 0 176 58 0 101 34 0 237 235 237
+207 185 164 209 188 142 253 241 223 255 245 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 19 0 0 80 24 0
+255 213 238 203 204 0 0 2 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 247 244
+227 234 128 0 0 0 73 0 0 255 238 0
+253 221 0 251 225 0 204 203 0 39 0 0
+22 0 0 50 0 0 88 0 0 255 224 64
+243 221 39 246 207 0 196 213 0 37 0 0
+88 0 0 67 0 0 32 0 0 255 255 0
+251 227 0 255 255 0 8 0 0 54 0 0
+154 0 0 30 0 0 143 9 0 255 240 0
+238 204 0 243 211 0 251 218 6 149 167 9
+0 0 0 131 0 0 215 129 0 253 249 44
+251 235 146 255 243 148 186 201 0 144 0 0
+180 0 0 203 151 19 255 255 216 254 239 167
+255 243 200 196 147 0 180 27 0 113 0 0
+255 255 227 255 246 187 248 233 185 255 242 222
+246 223 77 245 220 80 255 247 137 252 230 57
+152 127 0 125 79 0 152 129 59 212 186 165
+250 245 188 255 255 255 255 253 229 255 255 255
+252 244 221 229 216 133 163 159 121 109 65 0
+129 112 0 220 191 175 228 195 0 255 233 133
+248 232 44 248 220 136 251 233 148 244 210 4
+250 237 96 186 172 0 145 0 0 234 130 0
+255 228 1 217 231 0 130 0 0 204 172 0
+255 255 123 166 130 0 201 28 0 122 98 0
+255 237 238 255 248 228 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 55 0 0
+164 136 0 251 202 187 255 255 186 22 18 0
+255 255 255 255 246 236 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 246 247
+245 242 117 0 0 0 121 0 0 255 255 0
+233 197 0 241 199 0 194 204 0 63 0 0
+45 0 0 53 0 0 183 37 0 250 217 0
+250 226 3 242 206 0 148 153 0 54 0 0
+83 0 0 121 0 0 48 0 0 255 255 0
+241 206 0 255 233 0 0 0 0 103 0 0
+153 0 0 0 0 0 234 173 0 255 250 0
+247 233 1 247 231 0 255 255 204 0 0 0
+52 0 0 160 0 0 255 242 52 251 237 26
+253 233 138 255 253 62 29 11 0 202 0 0
+109 0 0 255 248 221 255 246 195 253 235 181
+251 226 0 166 0 0 166 71 0 208 151 63
+255 255 168 252 233 141 246 232 128 243 219 118
+251 234 100 255 244 109 189 191 85 92 28 0
+210 174 172 255 255 255 255 255 244 252 220 201
+228 180 140 208 125 0 230 172 105 223 144 87
+223 143 76 248 187 155 255 231 216 255 255 255
+255 250 209 125 128 0 119 81 0 239 217 201
+251 231 0 243 218 29 242 215 39 246 236 112
+249 217 68 255 255 74 149 0 0 162 0 0
+236 161 0 255 255 151 133 13 0 150 0 0
+255 255 40 242 241 0 164 0 0 64 0 0
+255 255 255 249 238 224 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 0 0 0
+167 131 0 255 227 181 255 255 255 187 201 0
+131 102 112 255 255 244 250 237 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 243 230 255 255 255
+229 233 137 0 0 0 96 0 0 255 251 0
+246 216 0 255 246 0 139 158 0 33 0 0
+100 0 0 32 0 0 221 70 0 246 219 0
+242 209 0 255 237 0 77 101 0 69 0 0
+94 0 0 13 0 0 173 122 0 255 249 0
+255 235 0 211 222 0 0 0 0 103 0 0
+148 0 0 0 0 0 255 197 0 245 221 0
+245 219 0 251 222 0 255 255 200 0 0 0
+140 0 0 141 0 0 255 255 120 249 236 81
+255 239 140 177 206 0 117 0 0 179 0 0
+160 77 0 255 255 231 253 242 177 253 224 30
+191 152 0 151 0 0 221 129 0 255 255 204
+244 230 105 249 229 126 251 233 148 247 226 77
+255 236 108 191 186 37 136 84 56 255 252 0
+255 255 200 212 159 36 208 104 0 212 167 0
+234 176 34 239 211 100 247 207 167 244 231 194
+246 215 173 244 217 97 233 162 0 223 124 0
+241 178 168 255 255 255 211 217 125 63 36 0
+220 182 99 248 221 47 238 210 35 246 225 25
+255 239 180 255 233 100 184 230 0 173 0 0
+187 0 0 255 255 113 194 214 0 67 0 0
+249 229 12 255 235 28 173 151 0 34 0 0
+255 255 255 246 236 223 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 83 120 0
+106 29 0 213 199 0 0 0 0 221 216 0
+83 71 31 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 248 243 233 246 232 210 216 189 169
+235 206 87 0 0 0 53 0 0 255 253 0
+245 216 0 255 223 0 86 97 0 71 0 0
+44 0 0 24 0 0 222 126 0 245 223 0
+246 211 0 255 227 0 0 19 0 130 0 0
+76 0 0 20 0 0 199 103 0 253 234 0
+250 212 0 188 199 0 0 0 0 151 0 0
+104 0 0 128 0 0 249 213 0 242 220 0
+242 217 0 250 220 0 228 233 129 17 0 0
+128 0 0 193 0 0 255 255 142 251 232 110
+255 255 155 81 100 0 167 0 0 165 0 0
+240 214 188 249 244 160 255 247 177 234 191 0
+186 77 0 155 0 0 255 251 145 245 230 107
+244 224 62 255 236 199 247 233 119 255 245 102
+81 96 0 141 73 14 255 255 0 227 198 0
+182 66 0 235 157 0 251 229 0 255 255 255
+253 253 173 255 252 202 255 255 217 255 244 225
+255 255 255 255 253 224 252 247 174 251 216 0
+239 185 0 229 140 0 255 206 205 255 255 236
+49 65 0 254 212 169 255 244 163 236 211 5
+243 208 0 247 220 67 255 255 154 107 0 0
+135 0 0 237 151 0 255 255 131 115 102 0
+193 97 0 255 255 122 203 217 0 102 0 0
+255 239 228 251 243 230 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 235 248 198
+27 0 0 155 111 0 167 153 0 0 0 0
+247 215 211 255 249 238 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+252 247 239 233 221 187 186 163 132 223 194 170
+255 254 143 0 0 0 94 0 0 255 250 0
+233 198 0 252 217 0 141 137 0 11 0 0
+58 0 0 73 0 0 241 159 0 238 209 0
+251 228 0 255 244 0 0 0 0 125 0 0
+52 0 0 18 0 0 206 149 0 237 210 0
+254 217 0 179 191 0 0 0 0 153 0 0
+88 0 0 120 0 0 254 243 0 242 222 0
+243 225 0 255 234 0 169 197 86 44 0 0
+115 0 0 228 131 0 254 252 120 244 225 85
+255 255 55 0 0 0 172 0 0 146 0 0
+255 253 135 245 225 109 255 245 80 185 125 0
+152 0 0 166 0 0 255 255 143 247 236 140
+244 232 95 247 227 103 255 239 134 190 209 96
+184 88 0 255 250 0 215 190 0 226 132 104
+242 218 0 253 235 73 253 242 68 245 226 0
+216 155 6 219 148 0 225 163 44 236 169 104
+217 143 14 225 161 52 242 186 121 255 244 255
+255 251 223 251 223 114 217 134 0 237 173 175
+255 255 172 4 10 0 238 194 150 253 230 24
+245 220 2 247 218 140 254 233 3 164 190 0
+145 0 0 195 0 0 255 255 150 189 208 0
+135 0 0 255 255 113 244 249 77 123 0 0
+210 201 180 255 251 240 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+180 203 99 110 62 0 46 16 0 203 169 117
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 245 236 220
+227 205 180 184 165 145 246 230 219 255 244 247
+255 247 124 0 0 0 113 0 0 254 233 0
+238 200 0 255 242 0 20 64 0 29 0 0
+57 0 0 34 0 0 227 144 0 236 209 0
+239 203 0 233 241 0 0 0 0 168 0 0
+95 0 0 37 0 0 216 128 0 248 235 0
+255 240 0 121 146 0 0 0 0 123 0 0
+124 0 0 178 44 0 250 232 0 235 219 0
+243 223 0 255 235 0 130 174 24 111 0 0
+122 0 0 218 120 0 244 228 16 242 225 87
+255 255 69 112 0 0 183 0 0 152 0 0
+255 255 153 247 237 108 255 233 0 148 0 0
+174 0 0 221 174 0 245 232 42 236 216 67
+249 231 161 248 231 137 255 255 164 51 0 0
+255 255 0 241 215 0 218 114 0 245 226 0
+252 241 60 251 241 137 205 148 0 211 129 0
+230 187 130 246 227 162 247 234 218 245 231 187
+251 238 204 237 207 115 227 192 0 233 155 0
+245 190 167 255 245 255 247 224 29 208 124 0
+255 194 212 246 252 19 20 0 0 255 255 176
+241 203 0 241 218 3 254 233 87 222 235 8
+100 0 0 159 0 0 255 254 95 255 255 0
+56 0 0 255 240 71 255 254 66 128 0 0
+153 135 76 255 254 246 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 240 255 255 240 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 245 234 204 192 170 144
+199 180 158 255 246 243 255 246 234 250 243 247
+255 243 105 0 0 0 58 0 0 255 250 0
+243 205 0 255 217 0 104 98 0 46 0 0
+34 0 0 56 0 0 242 174 0 243 214 0
+243 221 0 204 213 0 43 0 0 142 0 0
+38 0 0 56 0 0 193 149 0 251 234 0
+255 235 0 58 115 0 56 0 0 113 0 0
+39 0 0 163 95 0 246 237 0 242 215 0
+243 223 0 255 240 16 86 146 0 84 0 0
+121 0 0 247 209 17 245 243 155 245 228 144
+238 250 29 99 0 0 171 0 0 175 8 0
+255 255 77 245 223 14 223 226 0 171 0 0
+144 0 0 246 219 94 246 242 110 247 232 114
+239 229 170 255 236 144 161 181 71 208 139 0
+250 218 0 216 142 0 242 193 0 244 234 50
+241 222 0 207 105 0 237 208 170 240 218 185
+231 225 163 236 199 122 237 210 113 215 189 48
+236 198 135 225 177 97 252 225 206 232 205 63
+226 175 0 221 143 0 255 247 255 255 255 196
+207 92 0 255 239 255 196 204 5 208 137 144
+250 221 0 244 217 0 244 221 0 255 243 129
+165 207 0 128 0 0 226 151 0 255 255 83
+85 0 0 245 197 54 255 255 131 164 20 0
+119 83 3 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 253 243 240 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 240 221 230 215 192 198 166 112 246 230 234
+255 244 234 239 222 191 246 236 223 253 245 247
+255 255 170 0 0 0 0 0 0 255 252 0
+234 194 0 255 250 0 23 38 0 69 0 0
+60 0 0 23 0 0 255 182 0 234 210 0
+235 198 0 211 217 0 5 0 0 162 0 0
+118 0 0 1 0 0 212 161 0 247 221 0
+255 232 0 100 121 0 0 0 0 126 0 0
+4 0 0 209 119 0 247 225 0 240 216 0
+248 227 0 255 245 76 81 127 0 104 0 0
+109 0 0 255 240 91 250 238 86 253 233 95
+204 236 0 120 0 0 178 0 0 198 90 0
+253 249 45 244 225 0 206 198 0 172 0 0
+142 0 0 251 249 33 236 215 12 240 218 99
+250 236 176 255 246 185 10 0 0 255 246 0
+219 166 0 223 140 0 255 248 168 236 230 0
+191 103 0 233 204 160 250 236 204 246 234 187
+197 151 0 168 98 0 172 119 0 185 147 118
+152 116 0 201 143 0 170 101 0 235 165 11
+246 225 171 235 208 0 203 124 0 255 233 202
+236 212 25 225 98 0 255 255 255 0 0 0
+255 255 171 244 210 0 249 234 0 250 220 19
+231 252 92 113 0 0 196 59 0 255 255 92
+77 18 0 234 138 0 255 255 157 172 51 0
+112 53 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 248 238 235 248 239 222
+206 186 146 200 179 148 253 243 240 242 235 211
+223 206 169 239 238 226 253 242 232 255 255 255
+101 35 0 52 0 0 0 0 0 255 243 0
+243 214 0 255 242 0 65 18 0 72 0 0
+55 0 0 10 0 0 253 186 0 235 208 0
+244 220 0 205 219 0 6 0 0 150 0 0
+71 0 0 0 0 0 242 164 0 227 213 0
+255 225 0 45 112 0 93 0 0 127 0 0
+38 0 0 207 137 0 247 235 0 241 223 0
+239 223 0 255 252 0 16 81 0 121 0 0
+76 0 0 255 233 31 244 223 0 255 231 113
+164 205 0 128 0 0 179 0 0 217 160 0
+243 231 0 242 220 0 181 174 0 193 0 0
+98 0 0 255 255 118 236 224 39 237 224 128
+248 230 158 169 200 0 135 0 0 255 252 0
+208 98 0 232 187 0 253 248 0 190 96 0
+233 190 146 246 229 209 239 225 158 159 121 0
+206 168 203 255 255 246 255 255 255 255 252 245
+255 255 255 255 255 255 253 249 243 184 146 3
+162 86 0 255 246 246 220 179 0 191 89 0
+255 255 255 179 71 0 255 213 218 143 181 15
+236 177 141 244 218 4 239 207 0 238 206 0
+255 255 13 83 0 0 193 0 0 255 234 0
+113 114 0 212 117 0 255 255 154 143 70 0
+102 40 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 246 245 241 238 202 207 177 156
+227 211 181 255 243 245 241 233 204 235 215 182
+254 243 232 255 255 255 232 243 213 60 15 0
+251 155 0 0 0 0 30 0 0 255 240 0
+224 189 0 255 226 0 79 69 0 53 0 0
+36 0 0 54 0 0 252 176 0 244 225 0
+245 214 0 206 214 0 62 0 0 118 0 0
+73 0 0 5 0 0 237 179 0 250 235 0
+250 217 0 115 166 0 114 0 0 161 0 0
+49 0 0 207 154 0 248 225 0 239 210 0
+245 215 0 255 245 0 18 50 0 122 0 0
+81 0 0 255 255 139 244 230 0 252 223 51
+145 171 0 124 0 0 179 0 0 236 199 0
+247 242 112 250 234 0 184 148 0 183 0 0
+152 0 0 254 255 127 236 221 92 245 237 193
+255 246 164 75 81 0 239 178 0 249 227 0
+224 113 0 247 221 0 236 225 0 196 77 0
+242 219 145 241 228 178 138 84 0 238 198 188
+255 252 192 241 219 0 248 218 0 246 221 0
+251 230 0 254 235 137 255 252 226 255 255 255
+243 245 176 125 36 0 255 246 219 187 170 0
+240 180 151 220 191 0 218 98 0 255 255 255
+126 43 0 255 247 51 254 241 17 254 235 84
+255 255 160 79 0 0 157 0 0 255 213 47
+152 171 0 161 0 0 255 248 132 206 136 0
+89 54 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 249 234
+255 249 230 217 197 171 207 177 144 243 228 220
+255 251 232 239 219 181 243 221 195 255 247 239
+255 246 236 255 255 255 66 0 0 193 118 0
+223 145 0 106 110 0 0 0 0 255 233 0
+226 178 0 255 232 0 98 88 0 36 0 0
+0 0 0 29 0 0 250 159 0 242 213 0
+241 199 0 231 226 0 31 0 0 116 0 0
+33 0 0 0 0 0 190 68 0 249 228 0
+255 219 0 129 155 0 115 0 0 128 0 0
+46 0 0 190 140 0 246 215 0 240 205 0
+243 215 0 255 253 46 5 74 0 108 0 0
+102 0 0 254 229 0 245 218 0 255 243 109
+155 190 0 119 0 0 159 0 0 244 181 0
+253 245 79 255 244 37 159 110 0 179 0 0
+161 82 0 255 255 134 248 235 115 246 234 171
+255 255 171 0 0 0 252 172 0 234 222 0
+229 132 0 248 221 0 213 125 0 234 211 32
+246 214 148 196 184 0 242 187 116 255 246 0
+247 218 0 243 200 0 225 178 0 238 202 0
+233 182 0 237 201 0 247 219 0 252 243 172
+255 251 255 139 158 0 236 183 162 249 229 130
+234 129 0 232 234 53 204 58 0 255 255 255
+38 0 0 250 211 0 241 207 0 233 202 0
+255 247 56 116 0 0 178 0 0 255 223 76
+153 170 0 168 0 0 255 237 120 175 105 0
+133 62 19 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 244 237 255 246 232
+211 184 141 230 202 188 255 244 233 255 250 237
+215 195 152 246 222 209 255 247 233 255 241 228
+255 255 255 21 0 0 194 69 0 211 162 0
+192 108 0 151 155 0 0 0 0 227 172 0
+242 209 0 255 208 0 97 112 0 66 0 0
+0 0 0 27 0 0 251 159 0 235 208 0
+250 209 0 214 221 0 6 0 0 74 0 0
+52 0 0 10 0 0 169 41 0 251 234 0
+254 216 0 151 195 0 102 0 0 157 0 0
+38 0 0 156 77 0 255 249 0 248 224 0
+247 225 0 255 247 105 82 117 0 107 0 0
+94 0 0 255 241 0 249 236 0 255 244 80
+128 178 0 120 0 0 113 0 0 236 146 0
+250 234 8 251 227 0 170 109 0 183 0 0
+211 82 0 249 248 54 245 222 98 248 234 169
+255 255 186 40 0 0 251 205 0 219 177 0
+226 156 0 252 229 0 190 86 0 246 214 52
+251 225 115 123 62 0 255 246 94 248 232 0
+240 209 0 233 190 0 239 199 0 188 155 0
+192 136 0 229 187 0 226 177 0 252 226 0
+255 245 232 255 248 202 128 55 0 255 252 171
+183 106 0 246 227 102 177 79 0 255 255 255
+36 57 0 238 187 4 255 233 0 247 223 0
+255 241 0 113 59 0 135 0 0 255 209 138
+158 175 0 189 26 0 255 247 162 184 133 0
+91 53 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 243 231 255 248 238 235 222 192 205 181 145
+231 210 189 255 245 235 255 248 238 229 214 172
+252 237 228 255 246 233 255 248 234 255 253 242
+156 205 136 73 0 0 211 160 0 184 124 0
+210 151 0 205 147 0 0 0 0 211 158 0
+243 204 0 255 215 0 146 153 0 28 0 0
+24 0 0 0 0 0 239 122 0 238 203 0
+232 198 0 255 225 0 41 90 0 113 0 0
+18 0 0 60 0 0 91 0 0 255 255 0
+244 205 0 223 230 0 0 0 0 143 0 0
+56 0 0 92 0 0 249 224 0 242 214 0
+240 210 0 255 230 0 14 101 0 123 0 0
+79 0 0 255 219 0 251 238 75 255 240 65
+149 192 0 134 0 0 107 0 0 203 134 0
+254 242 26 255 234 62 134 139 0 186 0 0
+167 18 0 255 255 31 242 232 165 246 235 160
+255 255 201 0 0 0 255 203 0 223 180 0
+228 166 0 245 223 0 202 81 0 237 220 0
+254 223 133 130 75 0 255 229 0 247 216 0
+241 211 0 229 175 0 123 114 0 186 138 161
+176 174 173 78 74 0 219 173 9 239 194 0
+248 231 0 255 254 235 133 87 0 247 178 155
+212 176 0 255 224 161 203 142 0 255 214 195
+75 109 3 212 156 0 235 206 0 248 214 0
+255 234 0 124 127 0 105 0 0 234 185 110
+170 168 0 173 0 0 255 244 162 144 129 0
+118 74 41 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 247 242 238 225 192 202 176 142 242 223 213
+254 245 237 253 243 230 255 243 229 255 245 231
+255 246 230 255 243 229 255 255 246 184 214 140
+106 0 0 167 142 0 213 129 0 223 191 0
+176 113 0 255 247 0 62 0 0 190 125 0
+242 221 0 242 201 0 196 186 0 0 0 0
+27 0 0 6 0 0 210 76 0 244 202 0
+242 209 0 250 218 0 129 160 0 84 0 0
+68 0 0 47 0 0 102 0 0 255 243 0
+245 218 0 255 254 0 3 0 0 170 0 0
+105 0 0 0 0 0 255 223 0 244 218 0
+233 199 0 255 229 0 121 166 0 82 0 0
+79 0 0 255 228 0 241 218 25 249 219 7
+211 215 0 107 0 0 134 0 0 195 145 0
+248 237 0 255 230 17 182 169 0 178 0 0
+148 0 0 255 255 68 242 229 186 243 227 170
+255 255 192 42 0 0 244 201 0 214 165 0
+212 120 0 241 232 0 171 17 0 245 233 0
+247 221 31 169 83 0 255 231 0 249 230 0
+255 217 0 122 145 5 217 141 174 255 255 255
+255 233 226 255 255 255 21 1 0 255 221 0
+239 199 0 255 246 168 169 154 0 219 157 187
+229 204 0 241 195 57 212 152 0 255 206 173
+137 156 112 188 97 0 248 228 0 234 198 0
+255 213 0 126 168 0 133 0 0 238 199 9
+177 166 0 190 41 0 255 255 170 125 43 0
+173 143 144 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 241 227
+226 206 174 202 177 148 255 246 239 255 245 233
+250 242 226 253 240 229 252 240 230 253 241 233
+252 238 217 255 251 244 228 255 228 14 0 0
+205 80 0 147 95 0 227 183 0 154 87 0
+235 205 0 178 110 0 132 131 0 79 0 0
+255 242 0 229 183 0 209 222 0 3 0 0
+17 0 0 0 0 0 182 0 0 245 208 0
+241 214 0 234 194 0 202 210 0 0 0 0
+86 0 0 99 0 0 0 0 0 255 242 0
+244 204 0 250 243 0 33 0 0 146 0 0
+92 0 0 0 0 0 255 193 0 241 213 0
+224 190 0 246 199 0 180 211 38 107 0 0
+73 0 0 223 158 0 250 240 51 248 234 90
+236 231 0 97 0 0 128 0 0 173 30 0
+248 244 0 230 199 0 206 207 0 150 0 0
+157 0 0 247 249 0 243 227 172 241 234 170
+255 243 158 32 56 0 234 152 0 219 184 0
+226 150 0 233 208 0 200 104 0 255 251 102
+255 247 146 116 51 0 253 220 0 234 185 0
+255 248 74 75 64 0 254 212 190 255 254 243
+212 194 100 255 247 246 110 123 0 198 147 0
+246 205 0 249 224 0 162 118 0 198 123 35
+237 218 0 245 190 114 208 182 0 255 197 154
+126 158 108 201 122 15 255 239 0 253 227 0
+255 234 0 76 130 0 118 0 0 247 191 0
+190 139 0 194 64 0 255 255 176 95 0 0
+221 201 184 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 239 218 188 178 141
+207 175 152 246 240 237 251 240 227 253 239 225
+244 237 226 252 241 234 254 243 233 237 220 183
+246 237 223 255 255 255 30 0 0 227 153 0
+182 126 0 221 180 0 164 102 0 227 185 0
+142 83 0 191 170 0 204 167 0 0 0 0
+255 238 0 228 187 0 232 233 0 31 0 0
+98 0 0 0 0 0 99 0 0 248 203 0
+234 200 0 237 210 0 244 243 0 6 0 0
+79 0 0 0 0 0 22 0 0 255 199 0
+227 198 0 255 254 0 29 0 0 104 0 0
+89 0 0 0 0 0 173 93 0 233 202 0
+222 185 0 238 206 0 203 231 153 23 0 0
+119 0 0 207 146 0 239 224 0 236 211 0
+254 255 118 68 0 0 174 0 0 70 0 0
+254 254 0 237 216 0 220 224 0 145 0 0
+152 0 0 249 254 33 228 199 0 232 210 65
+251 224 140 92 138 47 172 55 0 235 207 0
+201 116 0 249 218 0 173 76 0 254 244 150
+255 255 255 84 46 0 225 165 0 228 182 0
+255 244 56 183 208 177 26 0 0 113 81 0
+182 115 141 255 233 0 98 113 0 201 123 0
+250 230 0 202 186 0 143 87 0 235 165 51
+232 197 0 234 183 0 221 158 0 255 226 213
+109 119 11 170 85 0 249 228 0 236 201 0
+255 236 0 55 112 0 134 0 0 253 190 0
+137 94 0 224 94 0 255 255 163 16 0 0
+249 242 221 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 246 234 209 195 169 133 238 219 206
+255 244 245 246 239 207 224 207 182 252 241 233
+250 241 232 245 235 207 234 215 188 243 238 228
+255 249 233 195 229 199 132 0 0 237 176 0
+141 104 0 224 157 0 107 65 0 208 168 0
+212 145 0 215 172 0 255 225 0 0 0 0
+255 233 0 224 188 0 255 248 0 0 0 0
+0 0 0 0 0 0 54 0 0 244 162 0
+243 215 0 228 199 0 255 221 0 15 0 0
+26 0 0 25 0 0 85 0 0 191 123 0
+245 216 0 254 219 0 115 136 0 27 0 0
+132 0 0 8 0 0 122 0 0 255 248 0
+226 200 0 232 199 0 255 244 118 52 0 0
+120 0 0 158 4 0 251 250 0 238 219 26
+253 234 0 8 0 0 173 0 0 48 0 0
+255 255 0 233 212 0 231 221 0 176 23 0
+141 0 0 216 183 0 235 220 25 233 213 83
+239 218 119 207 235 207 16 0 0 241 225 0
+196 65 0 238 193 0 183 158 0 250 209 136
+255 248 245 150 177 0 170 77 0 236 187 0
+234 213 0 255 249 255 237 245 200 207 202 197
+255 238 168 255 229 0 53 23 0 248 204 0
+250 222 0 225 221 0 0 0 0 242 212 0
+191 178 0 252 200 50 187 131 0 255 228 200
+54 108 0 223 141 107 246 224 0 249 222 0
+255 241 0 9 79 0 170 0 0 255 229 0
+147 34 0 238 165 0 255 255 173 40 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+223 202 162 201 176 143 244 223 208 255 250 237
+240 227 202 225 205 182 248 246 238 253 240 231
+240 233 212 240 225 203 248 240 232 254 246 238
+254 250 241 74 16 0 221 148 0 174 123 0
+223 159 0 151 144 0 243 204 0 160 124 0
+199 128 0 215 186 0 255 193 0 0 0 0
+239 199 0 237 197 0 255 221 0 23 0 0
+0 0 0 0 0 0 0 0 0 226 118 0
+243 218 0 221 184 0 255 236 0 0 10 0
+84 0 0 5 0 0 91 0 0 110 0 0
+247 242 0 237 197 0 208 223 0 0 0 0
+142 0 0 63 0 0 0 0 0 255 251 0
+227 193 0 222 185 0 255 243 0 0 0 0
+128 0 0 120 0 0 255 255 0 230 208 0
+248 220 4 119 156 0 143 0 0 84 0 0
+238 193 0 238 227 0 255 238 12 130 96 0
+149 0 0 181 69 0 244 246 75 233 209 52
+229 209 0 255 229 246 12 112 0 172 60 0
+227 201 0 197 89 0 228 232 0 215 89 0
+255 241 184 255 250 135 33 0 0 136 37 0
+233 196 0 246 224 0 251 230 172 255 244 185
+242 202 0 186 196 0 43 0 0 255 255 0
+219 191 0 208 161 0 72 0 0 255 234 0
+141 140 0 255 232 0 181 115 0 255 246 197
+19 0 0 231 188 172 239 210 0 237 205 0
+255 245 0 0 8 0 171 0 0 255 245 0
+100 0 0 250 216 91 237 255 144 42 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 217 198 164
+209 181 166 255 240 236 253 244 224 226 201 167
+241 218 206 246 244 234 253 241 232 241 229 192
+238 223 204 255 240 233 250 241 230 255 255 255
+46 17 0 185 86 0 165 101 0 220 158 0
+194 168 0 176 83 0 173 140 0 221 171 0
+147 136 0 169 86 0 216 161 0 122 136 0
+149 20 0 235 224 0 245 183 0 132 169 0
+14 0 0 0 0 0 0 0 0 189 0 0
+251 237 0 227 200 0 231 179 0 138 200 0
+82 0 0 18 0 0 83 0 0 22 0 0
+240 196 0 246 221 0 253 242 0 19 31 0
+163 0 0 0 0 0 0 0 0 255 201 0
+233 204 0 227 191 0 251 203 0 87 143 0
+66 0 0 71 0 0 255 216 0 231 214 0
+234 204 0 187 184 0 40 0 0 118 0 0
+168 122 0 252 233 0 222 196 0 212 208 0
+146 0 0 117 0 0 247 244 0 231 210 26
+221 196 0 242 216 191 226 238 209 0 0 0
+248 208 0 153 64 0 233 194 0 188 114 0
+213 107 0 248 238 196 239 241 193 155 172 0
+55 0 0 198 139 0 182 131 0 176 146 0
+118 72 0 65 0 0 252 241 0 230 194 0
+229 203 0 58 0 0 209 173 3 255 251 0
+106 58 0 255 255 12 92 0 0 255 255 221
+36 0 0 253 222 79 244 217 0 250 219 0
+255 255 79 0 0 0 216 0 0 251 255 0
+103 0 0 255 255 127 164 181 42 90 33 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 223 199 170 204 184 156
+255 251 245 242 227 211 229 204 159 255 239 234
+255 246 237 255 249 239 240 220 185 247 227 198
+255 247 234 250 239 230 255 249 236 247 255 255
+146 0 0 199 144 0 215 154 0 158 127 0
+198 123 0 170 158 0 231 175 0 223 188 0
+181 92 0 177 152 0 220 159 0 242 222 0
+0 0 0 255 232 0 237 200 0 255 253 0
+0 0 0 0 0 0 54 0 0 64 0 0
+255 217 0 230 193 0 239 209 0 218 222 0
+13 0 0 19 0 0 54 0 0 0 0 0
+180 61 0 243 221 0 238 186 0 153 193 0
+25 0 0 79 0 0 0 0 0 196 62 0
+238 213 0 229 203 0 243 203 0 197 212 65
+0 0 0 95 0 0 255 159 0 230 211 0
+188 142 0 254 233 0 89 82 0 75 0 0
+0 0 0 255 213 0 247 236 0 236 207 0
+157 142 0 59 0 0 249 214 0 247 224 43
+250 242 181 223 200 0 255 232 206 20 107 0
+180 44 0 223 199 0 212 103 0 205 167 0
+196 107 0 212 147 0 255 233 153 255 242 208
+208 216 157 163 153 99 143 117 50 136 94 0
+229 199 148 255 233 0 240 207 0 219 202 0
+96 39 0 34 0 0 255 255 69 253 237 0
+126 0 0 225 243 0 163 11 0 228 253 47
+106 0 0 244 237 0 234 206 0 233 197 0
+255 248 36 41 0 0 240 141 0 200 218 0
+168 0 0 255 255 189 144 127 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 210 186 151 255 242 245
+224 211 160 228 201 170 255 246 240 255 248 237
+253 243 229 234 205 161 252 239 232 255 246 232
+255 243 228 254 241 229 255 255 255 27 0 0
+201 102 0 150 35 0 240 212 0 176 91 0
+228 201 0 146 103 0 209 147 0 195 171 0
+221 168 0 227 204 0 126 64 0 230 177 0
+0 0 0 200 106 0 254 219 0 255 204 0
+100 132 0 0 0 0 3 0 0 0 0 0
+254 180 0 230 205 0 212 171 0 255 255 0
+30 0 0 13 0 0 46 0 0 82 0 0
+73 0 0 255 233 0 245 219 0 228 232 0
+0 0 0 162 0 0 0 0 0 43 0 0
+255 247 0 215 172 0 210 177 0 255 247 255
+0 62 0 90 0 0 149 0 0 231 221 0
+230 205 0 228 169 0 219 199 0 0 0 0
+61 0 0 78 0 0 252 243 0 236 212 70
+226 243 0 90 0 0 149 0 0 253 235 81
+233 204 0 245 218 60 218 196 0 255 255 186
+0 0 0 94 0 0 221 172 0 210 129 0
+185 158 0 179 96 0 180 92 0 227 156 0
+238 217 139 247 209 120 238 207 48 249 229 0
+228 200 0 231 181 0 171 179 0 122 0 0
+0 0 0 252 240 173 237 201 0 206 206 0
+209 119 0 167 163 0 153 69 0 222 221 0
+179 108 0 243 224 0 223 196 0 236 196 0
+251 254 97 65 0 0 248 154 0 145 123 0
+166 70 0 243 255 52 63 0 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+194 170 132 233 211 196 255 248 237 216 188 147
+243 221 202 255 244 234 255 248 237 238 223 181
+233 209 180 253 242 227 253 241 233 255 243 227
+255 244 229 255 242 238 247 255 205 107 0 0
+155 112 0 135 95 0 197 157 0 173 81 0
+199 167 0 227 182 0 197 138 0 181 125 0
+184 114 0 172 133 0 198 151 0 237 197 0
+179 169 0 0 0 0 253 231 0 251 205 0
+207 222 0 0 0 0 36 0 0 15 0 0
+239 146 0 225 200 0 234 208 0 237 188 0
+94 152 0 21 0 0 67 0 0 50 0 0
+0 0 0 255 246 0 225 198 0 255 243 0
+0 0 0 101 0 0 110 0 0 0 0 0
+255 229 0 239 219 0 242 223 0 233 203 173
+198 212 74 56 0 0 108 0 0 249 194 0
+199 179 0 220 191 0 253 241 0 105 0 0
+124 0 0 0 0 0 255 208 0 230 205 0
+243 197 0 153 185 0 134 0 0 166 49 0
+255 255 179 235 205 0 247 227 190 233 195 62
+251 246 171 0 50 0 70 0 0 218 128 0
+158 71 0 211 124 0 203 173 0 210 143 0
+210 151 0 203 184 0 199 135 0 184 152 0
+210 149 0 166 151 0 77 0 0 0 0 0
+171 111 52 255 232 51 255 231 0 79 72 0
+255 243 0 31 0 0 255 252 55 67 94 0
+255 205 0 238 211 0 243 217 0 252 209 0
+157 196 0 108 0 0 254 255 26 109 0 0
+255 221 0 202 168 0 5 0 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+237 218 204 253 242 231 215 194 148 245 222 214
+255 249 240 255 249 241 241 222 187 244 226 208
+255 245 241 255 250 235 252 240 227 255 243 226
+255 246 232 255 255 255 83 116 0 121 0 0
+251 181 0 173 155 0 202 145 0 142 118 0
+216 138 0 215 181 0 168 103 0 228 174 0
+167 164 0 235 159 0 136 132 0 202 145 0
+234 158 0 0 0 0 251 194 0 224 204 0
+255 230 0 0 0 0 0 0 0 28 0 0
+136 0 0 243 227 0 220 180 0 242 213 0
+217 221 0 23 0 0 46 0 0 36 0 0
+22 0 0 191 95 0 255 232 0 248 206 0
+194 216 0 0 0 0 91 0 0 0 0 0
+178 0 0 255 242 0 212 179 0 212 167 0
+255 255 255 0 0 0 113 0 0 164 0 0
+232 230 0 205 171 0 236 193 0 199 211 0
+116 0 0 44 0 0 47 0 0 255 253 0
+239 203 0 255 244 0 92 0 0 114 0 0
+217 166 0 255 253 126 234 205 29 243 234 177
+238 196 107 255 255 255 151 177 0 0 0 0
+95 0 0 131 38 0 154 51 0 163 104 0
+159 109 0 199 164 0 98 0 0 116 0 0
+25 0 0 12 0 0 27 0 0 255 240 233
+255 240 217 254 226 0 144 148 0 109 0 0
+251 255 0 107 0 0 255 255 31 33 0 0
+255 255 0 228 196 0 216 179 0 255 212 0
+21 64 0 200 0 0 207 230 0 97 0 0
+255 255 0 126 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 254 231 211 182 147 237 218 202 255 251 241
+254 244 231 237 223 187 245 216 202 255 251 239
+254 240 232 247 236 206 250 234 217 253 242 229
+255 255 255 171 190 115 84 0 0 175 137 0
+187 117 0 138 81 0 231 204 0 189 127 0
+169 150 0 174 94 0 156 74 0 223 201 0
+142 73 0 221 168 0 189 166 0 154 79 0
+196 118 0 193 170 0 140 0 0 225 208 0
+254 200 0 104 155 0 0 0 0 28 0 0
+72 0 0 251 190 0 242 214 0 217 186 0
+248 195 0 157 199 0 0 0 0 122 0 0
+0 0 0 11 0 0 253 227 0 223 183 0
+255 240 0 0 0 0 49 0 0 0 0 0
+0 0 0 221 136 0 241 211 0 218 192 0
+255 217 96 79 152 0 112 0 0 65 0 0
+188 136 0 237 220 0 168 150 0 247 203 0
+119 97 0 120 0 0 0 0 0 251 188 0
+239 214 0 222 194 0 216 220 0 85 0 0
+68 0 0 245 212 0 255 245 118 229 201 0
+239 232 154 226 210 51 247 224 167 227 229 97
+137 154 0 0 0 0 0 0 0 0 0 0
+28 0 0 0 0 0 0 0 0 0 0 0
+131 30 0 186 163 44 255 255 177 243 219 35
+234 201 0 238 229 0 82 0 0 255 233 0
+88 84 0 234 182 0 187 184 0 176 89 0
+247 222 0 225 196 0 240 197 0 238 231 0
+0 0 0 255 167 0 129 67 0 112 0 0
+255 255 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+211 184 131 247 235 232 253 242 236 255 247 235
+216 198 154 236 213 189 255 246 238 255 244 237
+236 222 191 241 220 198 250 241 232 254 241 230
+255 255 255 0 0 0 175 33 0 192 128 0
+209 169 0 172 143 0 110 27 0 244 215 0
+135 92 0 236 189 0 137 104 0 166 94 0
+212 186 0 144 65 0 192 111 0 192 115 0
+153 111 0 198 31 0 0 0 0 255 221 0
+227 186 0 255 242 0 0 0 0 0 0 0
+0 0 0 241 132 0 223 177 0 223 200 0
+227 192 0 255 222 0 0 0 0 25 0 0
+22 0 0 70 0 0 205 125 0 244 224 0
+244 195 0 187 224 0 0 0 0 117 0 0
+0 0 0 68 0 0 241 221 0 232 205 0
+224 206 0 251 219 205 0 0 0 118 0 0
+224 110 0 170 163 0 195 115 0 179 156 0
+247 242 0 157 67 0 94 0 0 0 0 0
+197 118 0 237 192 0 231 214 80 216 202 0
+79 0 0 77 0 0 197 119 0 255 246 84
+243 235 72 224 197 0 227 210 0 232 212 54
+255 222 151 255 242 63 226 230 181 230 214 132
+187 181 0 204 175 62 190 178 0 255 238 180
+255 255 167 250 216 75 242 227 44 234 202 0
+250 227 0 11 0 0 226 171 0 249 234 0
+0 0 0 255 253 0 0 0 0 255 229 0
+210 168 0 226 177 0 248 207 0 102 126 0
+59 0 0 255 248 0 0 0 0 236 201 0
+124 127 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+240 229 217 252 246 236 252 245 239 226 206 167
+241 226 212 251 245 240 251 242 233 236 221 185
+234 227 207 253 248 238 244 236 228 255 244 233
+238 255 251 108 0 0 102 17 0 234 200 0
+182 118 0 197 186 0 181 155 0 158 79 0
+154 93 0 182 143 0 186 144 0 176 76 0
+208 178 0 206 143 0 187 151 0 178 63 0
+164 69 0 210 140 0 140 93 0 158 84 0
+227 201 0 255 246 0 0 0 0 0 0 0
+0 0 0 132 0 0 235 184 0 220 203 0
+216 165 0 255 237 0 39 48 0 0 0 0
+62 0 0 73 0 0 15 0 0 241 194 0
+230 207 0 241 206 0 125 184 0 1 0 0
+108 0 0 0 0 0 255 206 0 219 194 0
+208 171 0 237 200 0 113 158 0 0 0 0
+136 0 0 214 141 0 189 180 0 189 108 0
+180 119 0 243 231 0 144 0 0 15 0 0
+0 0 0 211 140 0 221 181 0 227 211 0
+237 241 0 67 0 0 30 0 0 139 6 0
+255 238 0 246 238 0 229 208 38 227 192 0
+233 209 97 245 220 81 234 202 17 242 237 172
+247 213 103 241 216 162 252 243 186 235 210 107
+240 214 125 244 221 0 241 211 0 187 208 0
+74 0 0 185 86 0 255 255 0 0 0 0
+222 233 0 99 73 0 162 36 0 255 247 0
+204 166 0 221 167 0 255 224 0 0 0 0
+192 0 0 204 249 0 62 0 0 255 255 0
+0 0 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 249 241 246 235 221 220 203 170 248 229 218
+251 244 237 249 239 229 234 215 174 249 240 235
+249 238 230 253 244 228 247 238 228 255 255 255
+52 74 0 178 81 0 216 197 0 105 17 0
+243 201 0 158 121 0 232 189 0 211 176 0
+190 175 0 169 104 0 218 181 0 120 111 0
+151 45 0 186 150 0 131 0 0 184 128 0
+181 141 0 123 19 0 233 141 0 0 0 0
+228 132 0 241 201 0 203 193 0 0 0 0
+0 0 0 0 0 0 190 0 0 205 205 0
+230 203 0 218 170 0 234 246 0 0 0 0
+0 0 0 81 0 0 0 0 0 172 26 0
+251 238 0 230 207 0 255 249 0 0 0 0
+76 0 0 61 0 0 59 0 0 250 220 0
+218 192 0 208 167 0 255 239 238 63 90 0
+79 0 0 116 0 0 240 224 0 148 94 0
+237 202 0 213 181 0 255 248 0 46 0 0
+0 0 0 0 0 0 202 61 0 194 160 0
+236 226 0 219 232 148 191 140 0 96 0 0
+73 0 0 114 0 0 224 224 0 241 217 0
+227 223 40 243 214 70 228 198 0 248 234 171
+243 221 0 198 162 0 245 204 55 250 230 0
+219 217 0 204 190 0 103 14 0 154 0 0
+250 190 0 255 255 0 0 0 0 139 0 0
+178 145 0 81 0 0 250 220 0 233 211 0
+198 155 0 223 180 0 203 182 0 26 0 0
+253 153 0 0 0 0 239 159 0 210 187 0
+0 0 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 245 229 220 198 161 244 229 218 255 246 240
+233 224 195 223 202 161 252 241 238 246 238 226
+244 237 228 249 239 225 242 233 230 255 255 255
+98 15 0 120 0 0 226 207 0 179 147 0
+97 6 0 164 60 0 175 133 0 147 101 0
+177 134 0 140 85 0 95 44 0 197 124 0
+142 104 0 148 28 0 129 31 0 201 148 0
+137 0 0 161 62 0 190 122 0 242 194 0
+0 0 0 255 242 0 231 211 0 168 171 0
+0 0 0 44 0 0 0 0 0 242 173 0
+211 173 0 238 208 0 255 206 0 0 0 0
+0 0 0 79 0 0 58 0 0 0 0 0
+255 210 0 223 188 0 240 185 0 173 225 0
+0 0 0 112 0 0 0 0 0 184 86 0
+229 197 0 199 168 0 198 151 0 255 255 134
+0 0 0 148 0 0 68 0 0 220 202 0
+195 141 0 183 138 0 233 206 0 240 199 0
+165 124 0 0 0 0 0 0 0 84 0 0
+181 98 0 163 132 0 231 224 0 238 239 0
+194 178 0 118 34 0 65 0 0 121 0 0
+120 0 0 172 137 0 180 139 0 201 169 34
+206 165 0 165 125 0 150 111 0 109 40 0
+99 0 0 110 0 0 243 152 0 199 196 0
+222 163 0 0 0 0 154 81 0 174 161 0
+0 0 0 255 255 0 238 210 0 215 185 0
+227 179 0 244 213 0 0 0 0 184 37 0
+255 255 0 0 0 0 255 255 60 0 0 0
+233 201 185 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+222 203 167 251 238 232 255 248 239 239 229 204
+232 217 197 249 241 236 250 240 231 245 239 229
+247 237 226 245 238 225 251 243 233 205 215 208
+134 31 0 186 172 0 150 85 0 210 182 0
+215 172 0 153 143 0 195 122 0 146 90 0
+223 207 0 111 0 0 169 119 0 189 122 0
+189 103 0 68 0 0 186 69 0 154 73 0
+164 68 0 180 84 0 197 80 0 20 0 0
+60 50 0 118 0 0 215 188 0 255 248 0
+0 0 0 27 0 0 53 0 0 221 75 0
+246 220 0 186 166 0 228 196 0 249 250 0
+74 39 0 0 0 0 15 0 0 0 0 0
+73 0 0 252 248 0 228 179 0 255 205 0
+34 66 0 0 0 0 96 0 0 0 0 0
+220 103 0 208 175 0 222 186 0 246 213 0
+218 232 0 0 0 0 39 0 0 86 0 0
+191 217 0 192 127 0 158 105 0 218 175 0
+232 212 0 252 216 0 38 0 0 0 0 0
+0 0 0 155 17 0 122 7 0 255 213 0
+215 199 0 255 244 12 206 174 0 200 157 0
+182 102 0 157 89 0 104 0 0 132 4 0
+126 34 0 139 30 0 157 63 0 208 135 0
+229 210 0 246 226 0 220 200 0 109 0 0
+0 0 0 154 113 0 203 197 0 129 89 0
+191 101 0 240 221 0 227 187 0 213 165 0
+243 196 0 218 205 0 0 0 0 255 231 0
+24 38 0 217 127 0 82 126 0 0 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 239 227 255 248 239 244 231 206 234 220 195
+248 237 232 248 240 229 247 237 225 250 237 229
+245 237 226 250 240 227 255 249 255 88 117 0
+181 72 0 225 183 0 148 100 0 143 89 0
+182 97 0 141 101 0 195 183 0 159 120 0
+181 133 0 188 157 0 121 17 0 148 58 0
+152 29 0 179 55 0 183 119 0 202 98 0
+110 0 0 63 0 0 123 135 110 214 218 190
+255 228 221 17 76 0 238 179 0 228 187 0
+187 223 0 0 0 0 0 0 0 0 0 0
+231 167 0 235 195 0 217 191 0 236 181 0
+239 227 0 0 0 0 84 0 0 39 0 0
+0 0 0 228 116 0 229 214 0 226 192 0
+251 234 0 0 0 0 0 0 0 0 0 0
+0 0 0 255 204 0 244 215 0 215 175 0
+255 233 134 191 222 0 0 0 0 75 0 0
+119 0 0 183 141 0 156 114 0 192 159 0
+175 113 0 168 127 0 238 173 0 177 163 0
+42 0 0 0 0 0 0 0 0 0 0 0
+73 0 0 211 163 0 230 185 0 255 237 0
+255 245 0 255 231 0 230 214 0 229 208 0
+249 237 0 237 203 0 255 220 0 219 149 0
+159 121 0 98 0 0 0 0 0 78 0 0
+203 170 0 242 176 0 0 0 0 79 0 0
+255 255 0 214 170 0 236 197 0 213 169 0
+249 213 0 0 0 0 157 6 0 170 177 0
+0 0 0 255 255 0 0 0 0 250 208 187
+255 255 241 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 244 227 210 169 233 212 202 248 240 234
+244 238 226 248 239 227 247 237 227 246 238 228
+252 239 230 254 246 237 251 254 224 0 0 0
+187 125 0 134 61 0 249 224 0 168 92 0
+104 61 0 245 200 0 167 109 0 169 84 0
+212 190 0 144 0 0 207 167 0 146 68 0
+121 0 0 182 113 0 165 17 0 0 0 0
+204 226 224 203 214 193 251 234 211 191 179 154
+194 172 152 255 229 235 44 11 0 237 191 0
+255 211 0 24 67 0 0 0 0 0 0 0
+130 0 0 245 189 0 218 195 0 213 178 0
+255 211 0 98 150 0 0 0 0 53 0 0
+53 0 0 0 0 0 227 94 0 242 220 0
+203 166 0 255 210 0 0 0 0 9 0 0
+0 0 0 107 0 0 225 208 0 225 174 0
+218 174 0 255 230 125 248 255 53 0 0 0
+23 0 0 121 0 0 166 104 0 163 109 0
+190 189 0 194 128 0 226 185 0 143 103 0
+238 221 0 168 119 0 152 0 0 0 0 0
+28 0 0 0 0 0 0 0 0 23 0 0
+102 0 0 100 0 0 159 114 0 135 28 0
+120 111 0 21 0 0 7 0 0 0 0 0
+44 0 0 96 0 0 199 204 0 130 133 0
+246 202 0 0 0 0 201 175 0 253 236 0
+235 208 0 218 176 0 212 159 0 255 255 0
+0 0 0 50 0 0 255 255 0 0 0 0
+237 150 0 24 66 0 179 127 130 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+226 204 174 246 231 223 250 248 234 245 236 225
+248 238 227 246 238 229 249 236 227 250 243 229
+244 237 228 255 250 247 161 192 134 110 0 0
+238 222 0 163 27 0 158 136 0 215 168 0
+203 170 0 200 152 0 162 87 0 144 132 0
+81 0 0 206 176 0 116 0 0 192 108 0
+150 37 0 69 0 0 112 99 89 244 255 231
+210 181 150 224 205 172 186 156 144 204 192 154
+202 182 162 220 205 178 239 216 223 36 72 0
+211 150 0 255 233 0 94 90 0 0 0 0
+29 0 0 40 0 0 255 249 0 216 189 0
+209 169 0 255 247 0 0 0 0 0 0 0
+138 0 0 0 0 0 0 0 0 255 229 0
+193 142 0 234 193 0 184 158 0 0 0 0
+0 0 0 0 0 0 171 34 0 255 255 0
+232 197 0 221 182 0 236 176 0 255 255 38
+2 9 0 0 0 0 43 0 0 202 81 0
+201 118 0 151 134 0 182 212 0 156 41 0
+123 78 0 161 145 0 210 175 0 213 198 0
+209 182 0 149 14 0 60 48 0 130 0 0
+68 6 0 20 0 0 4 0 0 40 0 0
+76 0 0 147 132 0 78 0 0 202 172 0
+255 236 0 163 181 0 130 37 0 131 3 0
+0 0 0 216 171 0 255 229 0 234 213 0
+217 181 0 210 155 0 255 218 0 120 86 0
+0 0 0 235 124 0 11 0 0 187 89 0
+254 255 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 236 229 250 241 229 247 241 229 248 239 229
+248 241 229 251 242 227 244 236 225 245 238 225
+250 239 231 255 255 255 79 29 0 108 7 0
+163 54 0 106 132 0 172 128 0 164 85 0
+104 3 0 178 121 0 187 153 0 191 59 0
+116 74 0 203 95 0 128 23 0 70 0 0
+136 159 153 223 212 210 215 187 158 231 219 192
+191 162 140 205 173 148 222 218 198 222 194 159
+202 187 164 203 194 165 217 183 166 255 231 236
+71 86 0 237 142 0 255 255 0 54 0 0
+0 0 0 60 0 0 140 0 0 216 208 0
+224 185 0 216 176 0 252 245 0 54 80 0
+0 0 0 12 0 0 0 0 0 16 0 0
+255 255 0 213 195 0 255 212 0 139 136 0
+0 0 0 21 0 0 0 0 0 94 0 0
+255 229 0 229 200 0 233 197 0 234 191 0
+255 233 0 194 197 0 0 0 0 0 0 0
+60 0 0 192 0 0 93 0 0 197 108 0
+179 99 0 96 57 0 191 159 0 143 126 0
+144 124 0 175 123 0 168 151 0 199 184 0
+203 172 0 175 150 0 211 176 0 180 174 0
+207 188 0 203 178 0 144 124 0 197 208 0
+114 0 0 140 49 0 0 0 0 113 0 0
+228 166 0 255 225 0 206 180 0 211 166 0
+213 166 0 252 211 0 228 180 0 0 0 0
+255 211 0 180 168 0 0 0 0 255 255 0
+0 0 0 255 254 242 255 252 240 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 240 231 248 239 228 245 238 226 252 237 228
+250 241 228 250 239 228 253 240 233 249 238 229
+249 241 232 255 255 255 49 0 0 188 75 0
+172 147 0 180 124 0 222 172 0 135 122 0
+225 192 0 101 69 0 120 0 0 225 182 0
+87 0 0 69 0 0 151 174 148 201 215 200
+241 209 175 209 190 166 192 179 150 210 193 157
+205 199 175 217 189 151 231 223 219 218 184 163
+239 235 220 217 196 170 239 218 199 208 204 175
+255 249 255 8 53 0 189 81 0 219 222 0
+0 0 0 10 0 0 0 0 0 211 66 0
+237 234 0 210 154 0 213 185 0 255 239 0
+0 0 0 0 0 0 0 0 0 0 0 0
+159 34 0 237 214 0 199 145 0 240 227 0
+206 167 0 0 0 0 0 0 0 0 0 0
+76 0 0 255 226 0 233 207 0 211 167 0
+234 205 0 240 192 0 252 234 0 193 193 0
+0 0 0 0 0 0 0 0 0 94 0 0
+126 0 0 160 46 0 202 179 0 135 58 0
+149 160 0 186 119 0 129 105 0 116 22 0
+149 118 0 143 126 0 170 88 0 160 104 0
+132 74 0 170 142 0 199 151 0 135 15 0
+0 0 0 0 0 0 232 184 0 255 243 0
+243 232 0 204 167 0 228 189 0 183 151 0
+245 210 0 205 158 0 0 0 0 255 175 0
+112 82 0 0 0 0 255 236 0 0 0 0
+221 188 164 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 243 230 255 244 232 253 245 230 248 237 228
+245 242 229 245 238 224 245 236 227 246 237 225
+255 255 255 190 213 182 116 0 0 176 123 0
+102 0 0 202 202 0 140 48 0 155 111 0
+150 92 0 238 178 0 88 0 0 148 10 0
+25 0 0 199 213 220 255 221 201 217 214 196
+220 197 173 214 189 170 250 230 220 186 173 132
+222 187 176 224 226 199 218 185 170 192 168 139
+201 188 152 203 179 153 199 183 143 201 169 146
+239 226 202 255 240 251 126 162 125 210 123 0
+229 234 0 0 0 0 39 0 0 0 0 0
+141 0 0 245 255 0 201 171 0 218 177 0
+255 241 0 0 0 0 0 0 0 0 0 0
+0 0 0 26 0 0 255 255 0 189 125 0
+241 217 0 206 185 0 0 0 0 0 0 0
+0 0 0 56 0 0 226 111 0 255 251 0
+217 184 0 232 204 0 225 192 0 230 173 0
+255 247 0 204 194 0 83 57 0 0 5 0
+0 0 0 0 0 0 0 0 0 159 0 0
+143 0 0 108 0 0 118 0 0 194 148 0
+137 53 0 160 0 0 0 0 0 83 0 0
+0 0 0 0 0 0 0 0 0 105 42 0
+238 225 0 255 220 0 223 203 0 215 193 0
+212 147 0 202 172 0 189 121 0 255 235 0
+156 62 0 0 0 0 175 0 0 163 114 0
+0 0 0 255 9 0 0 0 0 224 176 167
+255 255 255 251 242 229 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 237 228 249 237 224 248 237 229 245 238 226
+248 238 228 245 238 229 249 236 225 245 237 227
+255 255 255 107 128 0 107 0 0 215 171 0
+156 164 0 120 0 0 194 122 0 216 150 0
+28 0 0 209 104 0 0 0 0 91 89 30
+255 255 255 181 167 142 231 210 183 194 177 160
+210 190 163 215 196 187 230 225 200 244 233 226
+228 221 204 209 192 153 218 186 178 229 222 190
+224 205 179 223 204 189 231 211 194 180 184 158
+233 203 182 195 178 154 243 202 194 119 158 117
+206 106 0 236 215 0 0 6 0 0 0 0
+0 0 0 198 58 0 227 229 0 185 133 0
+212 184 0 232 219 0 79 83 0 0 0 0
+0 0 0 0 0 0 59 0 0 255 251 0
+188 127 0 169 105 0 225 215 0 87 24 0
+0 0 0 0 0 0 0 0 0 168 0 0
+233 198 0 235 199 0 192 159 0 234 193 0
+238 201 0 214 182 0 242 201 0 255 231 0
+242 208 0 151 140 0 111 98 0 60 65 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 27 0 0 111 73 0 118 119 0
+174 152 0 208 191 0 255 248 0 229 205 0
+241 199 0 192 154 0 231 209 0 209 136 0
+169 156 0 240 185 0 198 166 0 144 43 0
+0 0 0 255 159 0 231 235 0 0 0 0
+255 75 0 88 15 0 127 107 104 255 255 255
+251 239 226 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 241 230 247 236 226 248 241 228 247 237 227
+243 238 228 249 239 230 252 242 229 254 242 229
+255 255 255 7 0 0 147 90 0 204 145 0
+190 131 0 170 136 0 54 0 0 211 107 0
+38 0 0 0 0 0 224 223 169 213 195 171
+216 192 165 224 210 189 215 199 171 232 216 202
+207 190 156 234 219 197 217 198 174 219 189 168
+210 196 167 221 192 186 216 216 178 197 181 152
+224 195 170 226 218 183 223 217 194 194 167 145
+196 193 168 243 208 190 203 193 171 255 215 215
+161 192 98 106 52 0 250 225 0 69 38 0
+0 0 0 0 0 0 222 123 0 240 208 0
+200 166 0 217 157 0 255 237 0 36 45 0
+0 0 0 0 0 0 0 0 0 29 0 0
+216 150 0 221 210 0 201 153 0 216 174 0
+134 133 0 0 0 0 0 0 0 0 0 0
+44 0 0 208 69 0 224 186 0 235 202 0
+208 191 0 215 169 0 194 161 0 238 184 0
+239 203 0 244 203 0 246 199 0 244 213 0
+255 250 0 248 227 0 255 253 0 255 225 0
+255 240 0 255 252 0 242 185 0 255 235 0
+241 194 0 202 152 0 213 173 0 213 178 0
+196 143 0 204 188 0 224 152 0 183 136 0
+255 244 0 191 126 0 0 0 0 0 0 0
+212 172 0 185 172 0 0 0 0 255 12 0
+0 0 0 109 91 27 255 255 255 255 245 230
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 241 228 252 241 227 250 243 230 250 241 226
+245 237 229 249 240 228 248 240 229 249 241 231
+255 255 255 89 0 0 222 152 0 143 74 0
+115 0 0 229 174 0 137 42 0 82 0 0
+96 123 80 255 252 211 204 184 157 218 211 192
+190 169 139 240 223 215 229 203 187 247 242 224
+223 196 180 229 231 210 240 227 222 239 231 208
+223 221 203 234 219 205 245 241 229 247 240 234
+221 218 190 254 246 242 209 192 163 223 209 197
+218 203 185 203 189 154 214 192 169 214 190 167
+228 224 198 254 232 232 76 101 0 205 161 0
+214 178 0 0 0 0 0 0 0 65 0 0
+242 192 0 236 205 0 207 177 0 230 168 0
+131 98 0 0 0 0 0 0 0 0 0 0
+0 0 0 130 0 0 183 166 0 240 186 0
+162 99 0 218 212 0 88 0 0 0 0 0
+0 0 0 0 0 0 86 0 0 219 129 0
+248 179 0 212 185 0 218 192 0 190 150 0
+217 177 0 175 134 0 214 177 0 205 140 0
+211 180 0 187 142 0 201 153 0 202 149 0
+206 157 0 226 165 0 197 151 0 234 202 0
+204 143 0 146 140 0 218 174 0 222 188 0
+193 130 0 240 203 0 218 163 0 186 168 0
+94 0 0 0 0 0 118 0 0 229 182 0
+168 74 0 0 0 0 207 0 0 0 0 0
+247 222 204 255 255 255 255 244 231 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 241 230 253 243 231 253 247 231 252 239 228
+248 238 226 246 238 228 246 236 226 250 240 235
+255 255 225 95 0 0 152 75 0 173 55 0
+197 132 0 116 0 0 12 0 0 220 227 217
+221 204 178 206 181 159 224 202 181 220 209 189
+192 183 151 248 235 230 201 178 141 250 234 232
+251 245 235 249 242 230 248 238 229 248 240 231
+251 239 231 248 243 232 249 239 227 248 236 228
+250 241 231 249 244 229 239 218 204 222 210 184
+198 170 152 236 216 191 192 178 159 217 190 163
+210 194 161 202 177 158 250 216 213 164 183 153
+134 87 0 220 154 0 0 0 0 0 0 0
+0 0 0 255 214 0 207 204 0 213 177 0
+250 214 0 208 198 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 166 133 0
+250 215 0 126 103 0 236 176 0 135 37 0
+49 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 172 24 0 161 94 0 248 159 0
+221 183 0 188 150 0 188 156 0 200 157 0
+148 105 0 178 148 0 216 176 0 168 138 0
+219 175 0 185 145 0 230 161 0 209 188 0
+212 151 0 225 223 0 208 165 0 255 184 0
+202 157 0 204 95 0 0 0 0 0 0 0
+0 0 0 231 68 0 227 213 0 0 0 0
+0 0 0 10 0 0 0 0 0 255 234 204
+255 255 255 255 244 230 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 243 235 250 239 226 250 241 229 255 244 232
+245 236 227 252 242 232 249 237 228 248 240 229
+255 255 255 53 0 0 139 23 0 145 0 0
+75 0 0 121 120 62 228 244 234 237 208 171
+231 219 213 225 218 201 242 216 196 254 249 240
+254 242 229 248 242 235 253 245 233 247 240 231
+248 240 229 251 237 227 248 239 225 249 238 227
+245 237 229 249 238 229 249 242 229 245 238 225
+246 238 226 249 239 227 248 242 233 229 228 211
+243 228 209 215 196 166 211 195 164 184 164 158
+213 195 167 234 219 214 202 185 144 233 212 202
+213 203 197 165 171 106 151 65 0 157 59 0
+0 0 0 0 0 0 171 11 0 255 247 0
+183 133 0 162 160 0 185 174 0 115 77 0
+0 0 0 0 0 0 0 0 0 0 0 0
+150 8 0 197 117 0 223 203 0 163 123 0
+134 121 0 255 168 0 25 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+71 0 0 135 18 0 154 75 0 230 150 0
+181 111 0 210 157 0 234 164 0 224 174 0
+242 162 0 225 169 0 255 197 0 237 207 0
+174 115 0 128 83 0 147 0 0 0 0 0
+0 0 0 0 0 0 7 0 0 182 140 0
+251 97 0 52 31 0 0 0 0 0 0 0
+0 0 0 93 52 0 255 226 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+251 243 229 248 239 229 247 239 231 247 239 227
+246 240 227 246 240 227 254 240 231 253 245 231
+255 251 250 164 196 160 65 90 0 152 163 142
+200 192 171 253 239 225 220 214 188 238 214 206
+253 252 237 242 234 215 244 235 225 250 241 232
+243 238 229 247 239 227 252 241 231 247 240 227
+250 240 228 247 241 229 248 237 228 248 242 228
+247 238 229 248 238 226 248 241 228 247 241 229
+247 241 227 246 238 230 248 240 228 240 231 204
+250 233 226 195 184 140 198 165 142 246 216 205
+195 196 162 209 176 157 210 187 164 227 218 191
+192 168 154 235 194 179 237 240 219 150 169 91
+149 113 0 48 0 0 0 0 0 76 0 0
+255 188 0 247 222 0 129 89 0 214 195 0
+247 160 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 55 0 0 213 134 0
+199 141 0 210 201 0 206 152 0 184 97 0
+186 76 0 43 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 11 0 0
+127 0 0 210 206 0 255 214 0 167 93 0
+0 0 0 0 0 0 0 0 0 0 0 0
+220 188 166 255 255 255 255 250 241 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+253 242 234 250 243 228 246 242 230 253 243 230
+250 243 233 250 243 231 253 243 230 253 247 232
+254 242 233 251 246 225 239 215 209 247 231 211
+237 222 214 255 248 245 255 247 237 250 246 237
+248 236 226 254 242 235 248 243 230 250 240 231
+248 238 228 250 242 231 251 243 230 252 244 233
+247 240 228 250 240 225 248 241 232 249 241 228
+245 236 224 249 237 229 248 241 228 249 241 227
+251 243 231 248 243 229 233 217 191 247 232 226
+241 235 212 224 198 177 238 230 210 208 188 159
+196 179 150 212 192 169 198 184 160 221 193 171
+203 185 166 223 192 159 194 172 161 255 228 230
+224 207 172 202 209 64 165 123 0 0 0 0
+0 0 0 85 0 0 238 201 0 198 182 0
+243 191 0 176 111 0 165 180 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+55 0 0 24 0 0 254 201 0 206 167 0
+214 167 0 92 26 0 246 185 0 180 132 0
+122 0 0 48 0 0 132 0 0 10 0 0
+29 0 0 79 0 0 0 0 0 12 0 0
+0 0 0 49 0 0 24 0 0 95 0 0
+122 0 0 165 162 0 255 215 0 255 234 0
+115 91 0 157 31 0 0 0 0 0 0 0
+0 0 0 0 0 0 209 164 160 255 255 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 242 229 250 242 230 252 244 230 252 242 230
+251 243 230 248 239 228 250 239 230 249 243 229
+252 239 232 251 246 233 255 248 241 253 244 235
+254 248 234 253 243 231 254 243 234 249 239 228
+250 242 230 246 241 229 251 243 229 252 240 233
+248 240 232 247 243 230 249 243 230 247 239 228
+250 240 227 248 241 230 248 239 229 248 239 228
+247 237 229 244 241 228 249 241 229 251 242 234
+244 234 212 224 204 168 255 249 250 241 231 211
+222 197 174 255 250 253 243 237 219 233 209 188
+227 223 200 200 174 143 198 172 150 218 187 160
+212 190 168 199 180 154 210 181 146 231 208 205
+207 171 137 223 202 203 221 202 183 232 214 162
+138 142 0 0 0 0 0 0 0 142 0 0
+194 157 0 255 188 0 220 193 0 234 197 0
+213 180 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+90 0 0 134 44 0 200 181 0 182 104 0
+159 36 0 198 186 0 220 213 0 178 155 0
+250 119 0 181 182 0 235 158 0 212 144 0
+233 195 0 247 225 0 214 181 0 207 186 0
+92 78 0 131 83 0 54 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 243 232 252 243 230 251 240 230 255 243 233
+253 241 231 251 242 231 248 240 230 251 241 234
+250 241 234 250 245 228 253 241 231 249 241 228
+246 235 227 252 244 234 250 243 231 247 243 231
+249 242 227 251 242 231 252 243 230 243 236 226
+249 240 230 250 243 232 251 243 230 250 241 231
+250 245 230 245 237 227 247 237 230 248 241 228
+248 240 227 251 244 232 251 243 236 230 219 179
+224 201 181 255 249 245 226 211 183 227 208 189
+255 254 241 220 202 172 239 210 192 234 228 200
+220 189 149 233 215 200 244 224 211 196 184 144
+208 184 166 248 233 211 207 199 171 204 174 152
+232 218 191 204 191 163 207 193 155 212 193 169
+253 209 210 219 216 136 212 204 89 71 67 0
+0 0 0 0 0 0 82 0 0 133 50 0
+255 199 0 251 197 0 210 172 0 198 182 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0 0
+24 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+243 236 227 252 241 228 249 240 228 250 242 228
+250 241 226 246 239 226 252 238 228 247 240 229
+249 240 230 251 243 227 247 239 231 247 240 227
+252 241 229 250 240 232 250 239 230 250 241 229
+252 242 227 250 242 231 247 241 225 248 239 230
+245 241 229 249 240 231 249 236 227 244 239 229
+247 238 227 245 237 228 249 239 230 248 241 228
+248 241 231 247 240 228 247 243 227 239 226 217
+253 249 240 226 213 173 243 226 225 255 248 244
+221 208 158 246 229 221 227 213 185 223 198 169
+255 246 247 246 246 226 203 178 147 242 232 215
+226 210 184 200 180 158 204 181 152 205 189 175
+209 206 173 202 163 148 224 194 171 202 190 151
+200 176 154 236 217 188 255 250 255 255 255 239
+255 255 164 223 217 188 87 124 0 71 55 0
+0 0 0 0 0 0 110 0 0 112 62 0
+186 99 0 208 197 0 234 179 0 128 25 0
+164 51 0 3 0 0 35 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 145 112 27 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 239 228 242 235 224 247 241 228 249 240 229
+243 233 225 243 237 225 252 241 228 248 239 227
+251 238 231 251 244 229 246 240 229 249 243 228
+247 240 228 246 240 228 252 243 230 250 243 231
+250 243 227 251 243 231 249 242 228 243 237 227
+246 239 230 248 243 229 245 237 228 249 241 232
+251 241 230 245 242 230 247 239 228 249 240 229
+250 240 228 245 237 229 247 241 231 252 247 237
+221 213 176 251 237 222 250 245 235 248 241 230
+252 235 223 206 193 161 222 192 175 255 255 255
+224 214 193 206 181 129 253 236 228 246 241 228
+221 202 166 217 192 171 229 215 206 248 229 207
+191 177 157 212 190 158 218 204 186 212 191 156
+254 240 230 250 244 234 255 245 235 250 244 237
+253 245 242 255 246 245 255 255 255 255 255 255
+250 250 197 215 211 159 173 193 165 121 113 0
+88 29 0 59 0 0 0 0 0 0 0 0
+20 0 0 0 0 0 139 56 0 51 0 0
+63 0 0 0 0 0 74 10 0 0 0 0
+0 0 0 42 0 0 0 0 0 41 0 0
+0 0 0 158 121 70 180 177 129 196 180 120
+255 251 226 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+252 241 232 248 237 226 248 243 232 244 235 224
+250 242 229 249 241 228 252 241 230 241 237 227
+253 239 232 250 240 227 243 237 228 246 237 225
+252 241 228 251 240 231 252 243 230 248 239 229
+247 240 228 250 240 229 246 240 228 250 237 230
+243 237 227 246 237 228 244 234 222 247 238 228
+247 238 224 244 236 229 247 237 232 245 240 221
+238 217 198 248 242 235 247 242 236 218 201 167
+252 239 234 253 241 228 250 241 233 249 241 236
+217 196 158 243 224 222 255 255 255 219 215 163
+222 194 180 251 238 233 238 231 215 200 174 141
+225 200 174 254 250 251 223 201 166 224 201 181
+255 247 232 202 186 155 226 197 178 255 252 240
+250 243 231 246 239 229 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 227 255 248 200 255 255 211 255 255 240
+255 255 219 252 229 192 217 217 179 232 235 189
+215 229 205 255 242 209 222 234 216 217 213 187
+240 233 183 251 237 189 246 239 202 255 255 255
+255 255 246 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+245 238 227 249 241 227 252 240 232 248 237 224
+244 238 228 246 241 230 250 238 229 248 240 230
+244 237 227 249 241 228 244 238 230 248 239 224
+247 239 228 249 236 232 253 245 232 251 243 231
+246 239 225 246 238 230 249 243 227 248 239 232
+247 241 229 249 243 232 245 237 226 249 240 233
+247 238 227 249 242 234 248 241 226 231 212 184
+250 242 236 251 246 238 222 205 168 249 233 212
+235 226 192 250 233 224 253 245 235 247 242 224
+252 240 217 243 238 222 222 201 177 230 211 190
+255 248 243 224 219 197 200 175 145 249 233 222
+255 252 244 214 190 161 247 232 220 246 234 211
+194 170 144 246 232 213 255 249 238 255 248 237
+251 246 227 246 238 227 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 254 245 241 254 250 239 255 251 240
+255 249 240 255 249 243 255 251 240 255 250 239
+255 251 236 255 245 239 255 251 239 255 248 238
+255 247 241 255 250 242 255 249 239 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 242 229 251 242 231 246 240 229 252 238 228
+252 245 228 253 240 229 250 242 232 242 234 222
+247 240 232 248 240 226 251 244 233 253 240 228
+247 241 228 248 236 230 247 244 232 251 239 231
+249 243 227 252 242 232 247 239 228 248 237 227
+247 236 227 248 242 231 251 243 230 247 237 228
+253 245 239 232 221 179 220 204 180 255 242 240
+247 238 223 215 202 161 255 242 240 231 224 161
+245 216 195 248 246 227 240 213 192 255 247 246
+250 245 220 200 175 133 224 197 190 255 255 243
+205 191 159 206 178 150 255 247 243 249 244 226
+233 218 178 248 235 224 215 193 164 204 177 144
+252 231 232 254 253 237 255 247 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 240 231 251 242 229 249 239 231 247 241 228
+245 236 224 249 239 228 247 236 227 248 243 231
+248 238 230 247 242 231 251 241 230 250 240 228
+250 241 226 247 238 231 250 242 230 247 239 229
+252 246 228 248 238 229 249 246 228 252 240 231
+246 240 231 248 241 231 249 241 229 251 243 239
+224 213 179 242 229 218 252 243 242 253 247 234
+235 226 204 255 240 228 226 214 174 255 244 241
+253 249 220 232 203 177 255 251 246 253 244 219
+209 177 151 251 232 228 255 254 241 208 187 143
+243 219 203 255 250 242 244 235 202 255 244 236
+255 251 236 208 183 147 230 203 190 255 247 236
+255 250 237 253 244 231 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 244 230 250 238 226 250 244 231 251 240 230
+248 241 229 249 241 228 251 240 231 253 241 232
+251 240 230 249 244 227 247 240 232 252 241 228
+247 236 225 249 241 232 249 240 230 246 238 227
+247 239 226 252 244 232 247 239 225 251 240 231
+250 242 230 250 246 234 251 241 235 229 217 181
+242 225 207 254 246 242 253 246 232 255 250 237
+252 242 215 236 213 179 255 247 250 232 223 185
+230 203 170 255 253 245 250 241 226 234 218 182
+255 245 238 245 233 205 210 185 154 253 233 219
+255 255 242 244 229 203 248 229 219 242 231 202
+211 185 144 235 211 198 255 255 255 255 248 232
+255 245 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 242 232 251 241 227 248 240 228 246 237 226
+248 239 229 251 241 228 250 238 227 251 240 231
+249 240 231 248 244 227 247 238 227 254 241 232
+247 240 227 247 240 230 251 239 230 247 242 231
+252 241 227 251 243 235 249 246 229 254 243 237
+251 246 232 212 190 157 255 248 242 253 248 245
+230 211 181 248 226 204 246 227 206 231 206 179
+255 255 255 234 224 194 230 197 172 255 251 247
+239 219 185 255 245 234 254 246 232 236 229 199
+241 219 198 255 255 255 255 249 236 243 241 215
+255 248 238 233 218 183 199 173 144 255 249 243
+255 249 239 255 244 228 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+251 241 231 252 243 231 251 242 231 249 237 228
+248 237 224 247 237 227 251 240 227 248 244 230
+251 237 231 249 242 228 248 239 228 247 236 225
+249 245 232 253 241 234 253 244 232 248 239 229
+248 242 228 247 237 229 247 241 227 251 242 233
+252 242 233 244 240 227 225 207 175 235 218 202
+255 251 248 233 223 184 252 229 224 243 236 206
+237 207 183 255 248 241 239 229 187 243 213 208
+255 255 245 255 246 232 255 246 233 255 255 255
+246 233 200 226 204 173 255 240 232 255 249 235
+250 236 214 247 240 220 239 226 193 204 172 148
+236 212 202 255 255 244 255 246 234 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 239 227 250 243 228 246 241 229 248 240 229
+248 243 230 249 240 228 249 238 230 247 243 231
+251 238 230 248 240 229 248 240 232 249 240 227
+246 238 227 248 238 235 248 240 230 248 240 231
+248 240 226 252 242 232 250 243 236 239 228 195
+219 193 168 250 237 235 252 246 234 226 218 184
+245 226 219 226 214 180 222 194 177 255 255 255
+215 200 151 235 210 198 255 255 244 225 201 166
+241 228 215 255 249 236 241 232 207 240 219 193
+255 255 255 248 229 203 255 245 237 253 248 237
+208 185 145 205 172 148 255 240 235 255 250 237
+254 245 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 243 231 246 243 227 248 241 231 252 244 232
+248 237 225 247 242 228 247 238 227 248 238 227
+252 240 231 246 240 227 248 241 227 250 240 228
+248 240 228 249 241 231 249 241 231 249 242 231
+245 240 225 251 243 236 235 229 189 228 209 198
+250 247 241 255 250 238 228 211 177 239 224 207
+232 228 190 236 215 209 255 255 255 219 207 171
+233 208 205 252 245 239 221 191 162 255 250 243
+253 248 237 252 242 221 250 239 233 255 255 255
+228 218 169 240 223 211 242 239 234 198 183 145
+235 213 199 255 249 243 252 246 234 251 243 230
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 243 230 252 242 232 246 240 227 248 238 228
+247 240 230 251 244 231 252 240 231 246 240 231
+250 242 230 245 238 227 246 236 229 248 239 228
+249 241 229 245 236 224 245 235 226 249 241 231
+251 244 234 234 227 196 230 204 189 253 248 243
+255 248 241 222 201 159 254 233 232 225 213 180
+255 231 225 241 237 217 216 200 153 240 223 220
+244 237 215 225 199 156 249 238 239 249 243 224
+227 206 186 255 248 239 252 242 218 226 211 180
+246 226 220 228 220 197 206 180 144 236 216 206
+255 253 240 254 247 232 245 241 230 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 241 230 248 237 223 245 239 229 245 235 224
+252 241 230 250 241 231 248 238 229 244 240 226
+252 240 233 246 240 227 253 245 236 246 236 227
+247 241 228 244 236 228 244 238 229 252 248 239
+236 222 187 237 220 205 254 254 245 235 230 205
+217 193 162 254 242 231 225 211 172 239 219 209
+247 248 221 217 192 174 249 237 233 240 233 207
+223 203 168 255 245 242 249 246 229 222 205 162
+250 234 229 251 246 233 213 187 156 240 228 219
+227 218 180 198 168 141 240 216 207 255 255 240
+253 244 235 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 241 232 246 234 227 247 243 232 244 237 226
+251 240 227 252 244 232 247 238 227 250 242 231
+249 240 233 246 240 223 248 238 229 248 240 227
+250 244 229 248 239 233 251 246 239 228 215 178
+242 230 219 252 246 241 242 236 211 225 202 168
+255 242 236 228 217 178 254 239 237 244 238 229
+228 207 161 253 244 245 233 229 207 223 191 169
+255 249 249 247 240 215 227 202 183 255 255 255
+237 239 211 218 195 165 240 232 216 219 206 181
+215 184 156 253 247 243 255 247 236 251 244 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 239 228 251 244 231 252 241 230 248 240 231
+250 241 229 252 244 227 247 234 226 248 243 229
+250 240 231 249 241 228 248 241 231 252 240 231
+250 245 230 249 240 234 230 219 188 238 216 209
+253 248 237 246 233 220 228 207 187 248 244 222
+226 206 177 255 242 243 238 231 193 220 193 168
+255 254 246 234 221 186 235 214 185 255 255 255
+232 219 193 221 199 161 255 255 255 221 207 182
+232 207 170 249 240 230 205 182 137 214 187 165
+255 255 242 255 248 237 255 244 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 239 230 251 241 229 247 239 229 247 239 228
+252 243 231 252 244 230 247 234 223 248 241 230
+248 237 227 244 237 228 244 237 229 248 238 227
+248 240 232 232 219 193 242 228 213 255 255 255
+232 221 190 228 209 177 255 247 244 229 213 165
+253 238 236 242 232 201 251 226 213 255 255 255
+228 215 178 245 221 207 255 255 255 228 218 169
+237 210 205 255 255 244 222 207 172 246 229 213
+247 236 207 200 176 144 240 220 209 255 248 242
+255 248 231 255 243 230 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 243 230 249 242 228 249 243 231 251 243 231
+251 242 230 251 240 230 251 245 233 249 242 230
+247 236 231 250 245 227 249 240 234 251 243 231
+250 242 232 252 246 239 255 251 245 229 218 178
+239 218 203 255 248 238 255 250 230 255 245 238
+239 227 189 248 229 216 255 249 228 240 220 183
+244 218 195 255 254 243 227 206 173 236 212 181
+255 248 234 232 220 180 255 235 226 217 209 176
+198 171 114 244 227 215 255 255 243 255 245 233
+255 245 235 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 243 230 251 242 230 246 241 231 250 238 226
+253 246 232 252 243 234 248 237 230 251 240 228
+249 238 231 250 246 233 252 241 225 250 242 228
+255 246 233 255 248 234 227 215 187 246 222 208
+255 252 238 250 234 207 255 249 241 251 239 222
+250 236 218 255 253 246 228 206 155 245 227 226
+255 255 246 225 202 155 229 212 197 255 255 255
+235 225 191 255 236 230 218 207 163 223 190 172
+247 229 219 255 253 239 255 245 236 255 247 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 238 230 251 242 230 250 242 230 253 242 230
+253 244 231 249 242 231 250 240 228 251 243 232
+250 243 237 247 236 207 237 212 188 255 247 234
+255 253 243 222 202 164 238 216 198 255 251 241
+255 249 236 255 249 240 242 225 184 255 249 237
+255 251 242 234 212 178 255 244 241 255 251 237
+228 208 172 255 242 237 255 252 242 255 250 236
+254 242 226 224 207 177 219 190 164 255 252 246
+255 253 237 255 247 234 255 245 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 242 229 249 243 230 251 243 229 251 244 229
+251 241 231 250 243 231 251 241 232 253 244 238
+239 227 197 229 204 175 255 254 246 255 245 232
+255 245 230 254 236 234 255 251 240 255 248 235
+252 243 218 230 209 172 255 248 238 249 241 228
+236 212 187 255 254 243 255 245 227 224 208 165
+255 249 249 244 237 193 255 237 230 251 247 223
+208 183 139 222 196 175 255 253 247 255 248 234
+255 245 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 241 230 255 245 233 254 247 235 253 241 233
+250 245 234 251 243 232 250 241 236 222 207 169
+227 201 172 255 255 246 255 247 240 255 242 227
+255 246 231 255 246 238 255 251 240 245 236 216
+232 205 167 254 239 230 255 249 234 255 241 225
+255 250 238 245 237 210 217 188 163 252 235 222
+231 210 173 254 235 223 252 239 210 207 179 148
+236 211 198 255 251 240 255 250 234 255 247 235
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 252 243 228 251 241 229 250 243 230
+246 238 226 248 241 231 251 242 228 242 226 210
+255 251 245 255 251 233 242 221 189 255 247 235
+255 247 235 255 248 240 248 238 220 225 200 168
+255 252 246 255 248 231 255 247 234 255 247 237
+255 248 236 222 197 174 253 240 220 227 203 164
+255 249 246 238 228 200 199 182 140 243 221 211
+255 249 240 255 248 231 255 243 233 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 245 243 229 250 236 228
+250 242 231 252 245 231 255 245 234 255 250 237
+255 244 240 233 219 172 254 242 238 255 248 234
+255 253 245 229 208 168 228 203 171 255 251 251
+249 237 195 249 232 219 255 254 242 255 244 230
+255 247 236 249 242 211 231 201 186 255 255 255
+238 231 197 200 172 141 236 200 179 255 255 246
+254 245 230 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 242 230
+252 245 229 255 246 233 255 243 228 255 248 238
+238 226 193 253 237 228 255 250 242 255 251 242
+231 211 165 246 226 213 255 249 247 228 207 169
+255 237 232 255 251 240 227 207 172 255 255 255
+252 243 225 226 205 169 255 255 247 232 224 196
+207 178 134 247 232 217 255 248 245 255 249 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 235 255 247 236 255 245 232 255 246 234
+255 246 239 255 251 235 255 244 229 222 205 159
+244 220 213 247 237 228 225 200 150 244 224 222
+255 248 220 225 205 165 255 252 245 229 215 166
+220 192 165 255 255 255 212 189 156 201 178 149
+248 228 215 255 255 242 255 246 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 245 232 255 245 231 255 246 232 255 243 229
+255 246 234 255 249 236 237 216 184 248 231 214
+252 244 222 213 185 152 236 215 200 255 246 228
+234 212 180 255 246 247 226 216 180 235 213 191
+255 247 243 223 199 163 214 191 160 255 237 228
+255 254 239 255 245 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 243 232 255 246 234
+255 245 236 255 246 230 255 247 245 253 248 224
+210 179 128 255 243 244 255 248 237 223 205 176
+255 251 246 241 226 190 248 229 217 253 243 224
+205 196 158 222 188 167 255 255 255 255 248 238
+255 245 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 246 233 255 245 232
+255 243 230 255 252 240 241 226 193 213 180 153
+255 248 240 255 250 239 252 241 223 255 253 242
+224 205 168 253 228 220 254 246 226 206 176 134
+225 194 171 255 254 245 255 248 236 255 245 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 235 254 240 221 220 192 161 255 238 230
+254 246 233 255 248 242 255 250 237 218 190 151
+255 251 249 254 248 228 203 178 140 246 223 216
+255 255 246 255 247 234 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 243 234 249 243 223 254 249 237 255 249 237
+255 247 238 245 232 198 211 187 160 255 243 236
+246 238 215 211 189 148 226 200 177 255 250 243
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 249 242 226 253 242 235 255 243 234
+242 235 216 214 186 164 255 245 242 251 248 228
+201 174 137 237 217 205 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 248 241 230 253 244 235
+247 241 220 255 255 255 251 249 236 195 176 133
+240 214 201 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 252 243 229
+255 249 240 230 222 197 206 178 144 218 195 171
+255 255 244 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+234 226 212 200 174 136 225 203 188 255 255 255
+250 242 230 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 232 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm
new file mode 100644
index 000000000..468b839aa
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm
new file mode 100644
index 000000000..c07b78a82
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm
new file mode 100644
index 000000000..bf4a94710
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/readme.txt b/src/boost/libs/gil/test/extension/io/images/pnm/readme.txt
new file mode 100644
index 000000000..7a9ab2cb7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+Please send me an email to retrieve the test files at chhenning **at** gmail.com. \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm
new file mode 100644
index 000000000..9299261ac
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW b/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW
new file mode 100644
index 000000000..433d9c31a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/raw/readme.txt b/src/boost/libs/gil/test/extension/io/images/raw/readme.txt
new file mode 100644
index 000000000..7436b5493
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/raw/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+Images are taken from http://www.rawsamples.ch/index_en.php \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/readme.md b/src/boost/libs/gil/test/extension/io/images/readme.md
new file mode 100644
index 000000000..cefddf5b3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/readme.md
@@ -0,0 +1,3 @@
+For copyright reasons the complete is available here:
+
+https://github.com/chhenning/gil_io_images \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga
new file mode 100644
index 000000000..e957723c9
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga
new file mode 100644
index 000000000..98988a751
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga
new file mode 100644
index 000000000..410043fac
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga
new file mode 100644
index 000000000..e5cab05c0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga
new file mode 100644
index 000000000..a54645541
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga
new file mode 100644
index 000000000..1fa4c636e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga
new file mode 100644
index 000000000..fb38dc48b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga
new file mode 100644
index 000000000..65e807408
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt b/src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt
new file mode 100644
index 000000000..b4ec88cb3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+taken from http://www.fileformat.info/format/tga/sample/index.htm
diff --git a/src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt b/src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt
new file mode 100644
index 000000000..9d49c13c4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt
@@ -0,0 +1,7 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+files can be found at ftp://ftp.graphicsmagick.org/pub/tiff-samples/
+
+if not available please ask me at chhenning **at** gmail.com \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt b/src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt
new file mode 100644
index 000000000..9bc367e69
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt
@@ -0,0 +1,7 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+taken from http://www.remotesensing.org/libtiff/images.html
+
+if not available please ask me at chhenning **at** gmail.com \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/tiff/test.tif b/src/boost/libs/gil/test/extension/io/images/tiff/test.tif
new file mode 100644
index 000000000..78ae4d3e2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/tiff/test.tif
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/Jamfile b/src/boost/libs/gil/test/extension/io/jpeg/Jamfile
new file mode 100644
index 000000000..50590fbde
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/Jamfile
@@ -0,0 +1,29 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using libjpeg : : : : true ; # work around bug on master
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ [ ac.check-library /libjpeg//libjpeg : <library>/libjpeg//libjpeg : <build>no ]
+ ;
+
+
+run jpeg_test.cpp ;
+run jpeg_read_test.cpp ;
+run jpeg_write_test.cpp ;
+
+run jpeg_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp
new file mode 100644
index 000000000..241b51bc6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_old_read_dimensions()
+{
+ gil::point_t dim = gil::jpeg_read_dimensions(jpeg_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::jpeg_read_image(jpeg_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::jpeg_read_and_convert_image(jpeg_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::jpeg_read_view(jpeg_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::jpeg_read_and_convert_view(jpeg_filename, gil::view(img));
+}
+
+void test_old_write_view()
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ auto b = gil::rgb8_pixel_t(0, 0, 255);
+ auto g = gil::rgb8_pixel_t(0, 255, 0);
+ gil::jpeg_write_view(jpeg_out + "old_write_test.jpg", create_mandel_view(320, 240, b, g));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::jpeg_read_image(jpeg_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::jpeg_write_view(jpeg_out + "old_dynamic_image_test.jpg", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp
new file mode 100644
index 000000000..c63621148
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+#include <cmath>
+#include <sstream>
+#include <string>
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(jpeg_filename, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+
+ BOOST_TEST_EQ(backend._info._num_components, 3);
+ BOOST_TEST_EQ(backend._info._color_space, JCS_YCbCr);
+
+ BOOST_TEST_EQ(backend._info._data_precision, 8);
+}
+
+void test_read_pixel_density()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(jpeg_in + "EddDawson/36dpi.jpg", gil::jpeg_tag());
+
+ gil::rgb8_image_t img;
+ gil::read_image(jpeg_in + "EddDawson/36dpi.jpg", img, gil::jpeg_tag());
+
+ gil::image_write_info<gil::jpeg_tag> write_settings;
+ write_settings.set_pixel_dimensions(backend._info._width, backend._info._height, backend._info._pixel_width_mm, backend._info._pixel_height_mm);
+
+ std::stringstream in_memory(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(in_memory, gil::view(img), write_settings);
+
+ using backend2_t = gil::get_reader_backend<std::stringstream, gil::jpeg_tag>::type;
+ backend2_t backend2 = gil::read_image_info(in_memory, gil::jpeg_tag());
+
+ // Because of rounding the two results differ slightly.
+ if (std::abs(backend._info._pixel_width_mm - backend2._info._pixel_width_mm) > 10.0 || std::abs(backend._info._pixel_height_mm - backend2._info._pixel_height_mm) > 10.0)
+ {
+ BOOST_TEST_EQ(0, 1);
+ }
+}
+
+void test_read_reference_images()
+{
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+ read_image(jpeg_filename, img, gil::jpeg_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "rgb8_test.jpg", gil::view(img), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_dct_method_read()
+{
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+
+ gil::image_read_settings<gil::jpeg_tag> settings;
+ settings._dct_method = gil::jpeg_dct_method::fast;
+
+ gil::read_image(jpeg_filename, img, settings);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "fast_dct_read_test.jpg", gil::view(img), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_read_reference_images_image_iterator()
+{
+ test_scanline_reader<gil::rgb8_image_t, gil::jpeg_tag>(jpeg_filename.c_str());
+}
+
+int main()
+{
+ test_read_header();
+ test_read_pixel_density();
+ test_read_reference_images();
+ test_dct_method_read();
+ test_read_reference_images_image_iterator();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp
new file mode 100644
index 000000000..be7628180
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp
@@ -0,0 +1,274 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_FILESYSTEM_VERSION 3
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_image_info()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(jpeg_filename, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE *, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ using backend_t = gil::get_reader_backend<fs::path, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(fs::path(jpeg_filename), gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(jpeg_filename, img, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+ gil::rgb8_image_t img;
+ gil::read_image(file, img, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ gil::rgb8_image_t img;
+ gil::image_read_settings<gil::jpeg_tag> settings(gil::point_t(0, 0), gil::point_t(10, 10), gil::jpeg_dct_method::slow);
+ gil::read_image(jpeg_filename, img, settings);
+
+ BOOST_TEST_EQ(img.width(), 10u);
+ BOOST_TEST_EQ(img.height(), 10u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(jpeg_filename, img, gil::jpeg_tag());
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::jpeg_tag());
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_view(jpeg_filename, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_view(in, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_view(file, gil::view(img), gil::jpeg_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(jpeg_filename, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(in, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(file, gil::view(img), gil::jpeg_tag());
+ }
+}
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write_view()
+{
+ auto const b = gil::rgb8_pixel_t(0, 0, 255);
+ auto const g = gil::rgb8_pixel_t(0, 255, 0);
+ {
+ std::string filename(jpeg_out + "write_test_string.jpg");
+
+ gil::write_view(filename, create_mandel_view(320, 240, b, g), gil::jpeg_tag());
+ }
+ {
+ std::string filename(jpeg_out + "write_test_ofstream.jpg");
+ std::ofstream out(filename.c_str(), std::ios::binary);
+
+ gil::write_view(out, create_mandel_view(320, 240, b, g), gil::jpeg_tag());
+ }
+ {
+ std::string filename(jpeg_out + "write_test_file.jpg");
+ FILE *file = fopen(filename.c_str(), "wb");
+
+ gil::write_view(file, create_mandel_view(320, 240, b, g), gil::jpeg_tag());
+ }
+ {
+ std::string filename(jpeg_out + "write_test_info.jpg");
+ FILE *file = fopen(filename.c_str(), "wb");
+
+ gil::image_write_info<gil::jpeg_tag> info;
+ gil::write_view(file, create_mandel_view(320, 240, b, g), info);
+ }
+}
+#endif //BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::jpeg_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::jpeg_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::jpeg_tag());
+
+ // 5. Write out image.
+ std::string filename(jpeg_out + "stream_test.jpg");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, gil::view(dst), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(jpeg_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::jpeg_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::jpeg_tag>(jpeg_filename,
+ gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgb8_image_t, gil::jpeg_tag>(jpeg_filename,
+ gil::point_t(43, 24), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(jpeg_filename.c_str(), image, gil::jpeg_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "old_dynamic_image_test.jpg", gil::view(image), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp
new file mode 100644
index 000000000..32994dc73
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp
@@ -0,0 +1,81 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write_gray8()
+{
+ gil::write_view(jpeg_out + "gray8_test.jpg", create_mandel_view(200, 200,
+ gil::gray8_pixel_t(0), gil::gray8_pixel_t(255)), gil::jpeg_tag());
+}
+
+void test_write_rgb8()
+{
+ gil::write_view(jpeg_out + "rgb8_test.jpg", create_mandel_view(200, 200,
+ gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)), gil::jpeg_tag());
+}
+
+void test_write_cmyk8()
+{
+ gil::write_view(jpeg_out + "cmyk8_test.jpg", create_mandel_view(200, 200,
+ gil::cmyk8_pixel_t(0, 0, 255, 127), gil::cmyk8_pixel_t(0, 255, 0, 127)), gil::jpeg_tag());
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_dct_method_write_test()
+{
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+
+ gil::read_image(jpeg_filename, img, gil::jpeg_tag());
+ gil::image_write_info<gil::jpeg_tag> info;
+ info._dct_method = gil::jpeg_dct_method::fast;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "fast_dct_write_test.jpg", gil::view(img), info);
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_rgb_color_space_write_test()
+{
+ color_space_write_test<gil::jpeg_tag>(
+ jpeg_out + "rgb_color_space_test.jpg",
+ jpeg_out + "bgr_color_space_test.jpg");
+}
+
+int main()
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ test_write_gray8();
+ test_write_rgb8();
+ test_write_cmyk8();
+#endif
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ test_dct_method_write_test();
+#endif
+
+ test_rgb_color_space_write_test();
+
+ return boost::report_errors();
+}
+
+
diff --git a/src/boost/libs/gil/test/extension/io/mandel_view.hpp b/src/boost/libs/gil/test/extension/io/mandel_view.hpp
new file mode 100644
index 000000000..e2477f416
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/mandel_view.hpp
@@ -0,0 +1,103 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_MANDEL_VIEW_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_MANDEL_VIEW_HPP
+
+#include <boost/gil.hpp>
+
+#include <cmath>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+// Models a Unary Function
+template <typename P> // Models PixelValueConcept
+struct mandelbrot_fn
+{
+ using point_t = gil::point_t;
+ using const_t = mandelbrot_fn;
+ using value_type = P;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable = false;
+
+ value_type in_color_;
+ value_type out_color_;
+ point_t img_size_;
+ static const int MAX_ITER = 100; // max number of iterations
+
+ mandelbrot_fn() = default;
+ mandelbrot_fn(gil::point_t const& sz, value_type const& in_color, value_type const& out_color)
+ : in_color_(in_color), out_color_(out_color), img_size_(sz)
+ {
+ }
+
+ std::ptrdiff_t width()
+ {
+ return img_size_.x;
+ }
+ std::ptrdiff_t height()
+ {
+ return img_size_.y;
+ }
+
+ result_type operator()(gil::point_t const& p) const
+ {
+ // normalize the coords to (-2..1, -1.5..1.5)
+ // (actually make y -1.0..2 so it is asymmetric, so we can verify some view factory methods)
+ gil::point<double> const n{
+ static_cast<double>(p.x) / static_cast<double>(img_size_.x) * 3 - 2,
+ static_cast<double>(p.y) / static_cast<double>(img_size_.y) * 3 - 1.0f}; //1.5f}
+ double t = get_num_iter(n);
+ t = std::pow(t, 0.2);
+
+ value_type ret;
+ for (std::size_t k = 0; k < gil::num_channels<P>::value; ++k)
+ ret[k] =
+ (typename gil::channel_type<P>::type)(in_color_[k] * t + out_color_[k] * (1 - t));
+ return ret;
+ }
+
+ private:
+ double get_num_iter(boost::gil::point<double> const& p) const
+ {
+ gil::point<double> z(0, 0);
+ for (int i = 0; i < MAX_ITER; ++i)
+ {
+ z = gil::point<double>(z.x * z.x - z.y * z.y + p.x, 2 * z.x * z.y + p.y);
+ if (z.x * z.x + z.y * z.y > 4)
+ return i / (double)MAX_ITER;
+ }
+ return 0;
+ }
+};
+
+template <typename Pixel>
+struct mandel_view
+{
+ using deref_t = mandelbrot_fn<Pixel>;
+ using locator_t = gil::virtual_2d_locator<deref_t, false>;
+ using my_virt_view_t = gil::image_view<locator_t>;
+ using type = my_virt_view_t;
+};
+
+template <typename Pixel>
+auto create_mandel_view(unsigned int width, unsigned int height, Pixel const& in, Pixel const& out)
+ -> typename mandel_view<Pixel>::type
+{
+ using view_t = typename mandel_view<Pixel>::type;
+ using deref_t = typename mandel_view<Pixel>::deref_t;
+ using locator_t = typename mandel_view<Pixel>::locator_t;
+
+ gil::point_t dims(width, height);
+ return view_t(dims, locator_t(gil::point_t(0, 0), gil::point_t(1, 1), deref_t(dims, in, out)));
+}
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_MANDEL_VIEW_HPP
diff --git a/src/boost/libs/gil/test/extension/io/paths.hpp b/src/boost/libs/gil/test/extension/io/paths.hpp
new file mode 100644
index 000000000..9726afccc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/paths.hpp
@@ -0,0 +1,69 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_PATHS_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_PATHS_HPP
+
+// Disable warning: conversion to 'std::atomic<int>::__integral_type {aka int}' from 'long int' may alter its value
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wshorten-64-to-32"
+#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/filesystem.hpp>
+
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic pop
+#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
+#pragma GCC diagnostic pop
+#endif
+
+#include <string>
+
+// `base` holds the path to ../.., i.e. the directory containing `images`
+static const std::string base =
+ (boost::filesystem::absolute(boost::filesystem::path(__FILE__)).parent_path().string()) + "/";
+
+static const std::string bmp_in = base + "images/bmp/";
+static const std::string bmp_out = base + "output/";
+
+static const std::string jpeg_in = base + "images/jpeg/";
+static const std::string jpeg_out = base + "output/";
+
+static const std::string png_base_in = base + "images/png/";
+static const std::string png_in = png_base_in + "PngSuite/";
+static const std::string png_out = base + "output/";
+
+static const std::string pnm_in = base + "images/pnm/";
+static const std::string pnm_out = base + "output/";
+
+static const std::string raw_in = base + "images/raw/";
+
+static const std::string targa_in = base + "images/targa/";
+static const std::string targa_out = base + "output/";
+
+static const std::string tiff_in = base + "images/tiff/";
+static const std::string tiff_out = base + "output/";
+static const std::string tiff_in_GM = tiff_in + "graphicmagick/";
+
+static const std::string bmp_filename(bmp_in + "test.bmp");
+static const std::string jpeg_filename(jpeg_in + "test.jpg");
+static const std::string png_filename(png_base_in + "test.png");
+static const std::string pnm_filename(pnm_in + "rgb.pnm");
+static const std::string raw_filename(raw_in + "RAW_CANON_D30_SRGB.CRW");
+static const std::string targa_filename(targa_in + "24BPP_compressed.tga");
+static const std::string tiff_filename(tiff_in + "test.tif");
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_PATHS_HPP
diff --git a/src/boost/libs/gil/test/extension/io/png/Jamfile b/src/boost/libs/gil/test/extension/io/png/Jamfile
new file mode 100644
index 000000000..a7e8fbdb9
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/Jamfile
@@ -0,0 +1,32 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using zlib ;
+using libpng : : : : true ;
+
+# TODO: Download PNG test suite images and build with BOOST_GIL_IO_USE_PNG_FILEFORMAT_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ [ ac.check-library /zlib//zlib : <library>/zlib//zlib : <build>no ]
+ [ ac.check-library /libpng//libpng : <library>/libpng//libpng : <build>no ]
+ ;
+
+run png_test.cpp ;
+run png_file_format_test.cpp ;
+run png_read_test.cpp ;
+
+run png_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp
new file mode 100644
index 000000000..cda7fffde
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_GIL_IO_ENABLE_GRAY_ALPHA
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace fs = boost::filesystem;
+
+#ifdef BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+
+// Test will loop through the "in" folder to read and convert
+// the png's to rgb8_image_t's. Which then will be written in
+// the "out" folder.
+//
+// The file name structure is as followed:
+//
+// g04i2c08.png
+// || |||+---- bit-depth
+// || ||+----- color-type (descriptive)
+// || |+------ color-type (numerical)
+// || +------- interlaced or non-interlaced
+// |+--------- parameter of test (in this case gamma-value)
+// +---------- test feature (in this case gamma)
+
+void test_file_format()
+{
+ std::string in(png_in + "PngSuite\\");
+ fs::path in_path = fs::system_complete(fs::path(in));
+
+ if (fs::is_directory(in_path))
+ {
+ fs::directory_iterator end_iter;
+ for (fs::directory_iterator dir_itr(in_path); dir_itr != end_iter; ++dir_itr)
+ {
+ if (fs::is_regular(dir_itr->status()) && (fs::extension(dir_itr->path()) == ".PNG"))
+ {
+ gil::rgb8_image_t img;
+ std::string filename = in + dir_itr->path().leaf().string();
+ gil::read_and_convert_image(filename, img, gil::png_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(png_out + fs::basename(dir_itr->path()) + ".png",
+ gil::view(img), gil::png_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ }
+ }
+ }
+}
+
+int main()
+{
+ test_file_format();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/png/png_old_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_old_test.cpp
new file mode 100644
index 000000000..869f749e0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_old_test.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_old_read_dimensions()
+{
+ gil::point_t dim = gil::png_read_dimensions(png_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgba8_image_t img;
+ gil::png_read_image(png_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::png_read_and_convert_image(png_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgba8_image_t img(1000, 600);
+ gil::png_read_view(png_filename, view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::png_read_and_convert_view(png_filename, view(img));
+}
+
+void test_old_write_view()
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::png_write_view(
+ png_out + "old_write_view_test.png",
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::png_read_image(png_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::png_write_view(png_out + "old_dynamic_image_test.png", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/png/png_read_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_read_test.cpp
new file mode 100644
index 000000000..5b51cf548
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_read_test.cpp
@@ -0,0 +1,764 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_GIL_IO_ENABLE_GRAY_ALPHA
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fs = boost::filesystem;
+
+using gray_alpha8_pixel_t = gil::pixel<std::uint8_t, gil::gray_alpha_layout_t>;
+using gray_alpha8c_pixel_t = gil::pixel<std::uint8_t, gil::gray_alpha_layout_t> const;
+using gray_alpha8_image_t= gil::image<gray_alpha8_pixel_t, false>;
+
+using gray_alpha16_pixel_t = gil::pixel<std::uint16_t, gil::gray_alpha_layout_t>;
+using gray_alpha16c_pixel_t = gil::pixel<std::uint16_t, gil::gray_alpha_layout_t> const;
+using gray_alpha16_image_t = gil::image<gray_alpha16_pixel_t, false>;
+
+template <typename Image>
+void test_file(std::string filename)
+{
+ Image src, dst;
+
+ gil::image_read_settings<gil::png_tag> settings;
+ settings._read_file_gamma = true;
+ settings._read_transparency_data = true;
+
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_in + filename, settings);
+
+ gil::read_image(png_in + filename, src, settings);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::image_write_info<gil::png_tag> write_info;
+ write_info._file_gamma = backend._info._file_gamma;
+
+ gil::write_view(png_out + filename, view(src), write_info);
+ gil::read_image(png_out + filename, dst, settings);
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(src), gil::const_view(dst)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+template <typename Image>
+void test_png_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::png_tag>(std::string(png_in + filename).c_str());
+}
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_filename, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+
+ BOOST_TEST_EQ(backend._info._num_channels, 4);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGBA);
+
+ BOOST_TEST_EQ(backend._info._interlace_method, PNG_INTERLACE_NONE);
+ BOOST_TEST_EQ(backend._info._compression_method, PNG_COMPRESSION_TYPE_BASE);
+ BOOST_TEST_EQ(backend._info._filter_method, PNG_FILTER_TYPE_BASE);
+
+ BOOST_TEST_EQ(backend._info._file_gamma, 1);
+}
+
+void test_read_pixel_per_meter()
+{
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_base_in + "EddDawson/36dpi.png", settings);
+
+ BOOST_TEST_EQ(backend._info._pixels_per_meter, png_uint_32(1417));
+}
+
+void test_read_with_trns_chunk_color_type_0()
+{
+ // PNG 1.2: For color type 0 (grayscale), the tRNS chunk contains a single gray level value,
+ // stored in the format:
+ //
+ // Gray: 2 bytes, range 0 .. (2^bitdepth)-1
+ {
+ auto const png_path = png_in + "tbbn0g04.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 4);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_GRAY);
+
+ gray_alpha8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gray_alpha8c_pixel_t(255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gray_alpha8c_pixel_t(221, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gray_alpha8c_pixel_t(204, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gray_alpha8c_pixel_t(238, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gray_alpha8c_pixel_t(221, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gray_alpha8c_pixel_t(255, 0));
+ }
+ {
+ auto const png_path = png_in + "tbwn0g16.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 16);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_GRAY);
+
+ gray_alpha16_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gray_alpha16c_pixel_t(65535, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gray_alpha16c_pixel_t(58339, 65535));
+ BOOST_TEST_EQ(const_view(img)[79], gray_alpha16c_pixel_t(51657, 65535));
+ BOOST_TEST_EQ(const_view(img)[975], gray_alpha16c_pixel_t(62965, 65535));
+ BOOST_TEST_EQ(const_view(img)[976], gray_alpha16c_pixel_t(58339, 65535));
+ BOOST_TEST_EQ(const_view(img).back(), gray_alpha16c_pixel_t(65535, 0));
+ }
+}
+
+void test_read_with_trns_chunk_color_type_2()
+{
+ // PNG 1.2: For color type 2 (truecolor), the tRNS chunk contains a single RGB color value,
+ // stored in the format:
+ //
+ // Red: 2 bytes, range 0 .. (2^bitdepth)-1
+ // Green: 2 bytes, range 0 .. (2^bitdepth)-1
+ // Blue: 2 bytes, range 0 .. (2^bitdepth)-1
+ {
+ auto const png_path = png_in + "tbbn2c16.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 16);
+ BOOST_TEST_EQ(backend._info._num_channels, 3u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGB);
+
+ gil::rgba16_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba16c_pixel_t(51657, 51657, 51657, 65535));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba16c_pixel_t(62965, 62965, 62965, 65535));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ }
+ {
+ auto const png_path = png_in + "tbgn2c16.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 16);
+ BOOST_TEST_EQ(backend._info._num_channels, 3u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGB);
+
+ gil::rgba16_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba16c_pixel_t(51657, 51657, 51657, 65535));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba16c_pixel_t(62965, 62965, 62965, 65535));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ }
+ {
+ auto const png_path = png_in + "tbrn2c08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 3u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGB);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(245, 245, 245, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+}
+
+void test_read_with_trns_chunk_color_type_3()
+{
+ // PNG 1.2: For color type 3 (indexed color), the tRNS chunk contains a series of one-byte
+ // alpha values, corresponding to entries in the PLTE chunk:
+ //
+ // Alpha for palette index 0: 1 byte
+ // Alpha for palette index 1: 1 byte
+ // ...etc...
+ {
+ auto const png_path = png_in + "tbbn3p08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(246, 246, 246, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+ {
+ auto const png_path = png_in + "tbgn3p08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(246, 246, 246, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+ {
+ auto const png_path = png_in + "tp1n3p08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(246, 246, 246, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+ {
+ auto const png_path = png_in + "tm3n3p02.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 2);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(0, 0, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[16], gil::rgba8c_pixel_t(0, 0, 255, 85));
+ BOOST_TEST_EQ(const_view(img)[511], gil::rgba8c_pixel_t(0, 0, 255, 85));
+ BOOST_TEST_EQ(const_view(img)[1007], gil::rgba8c_pixel_t(0, 0, 255, 170));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(0, 0, 255, 255));
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+#ifdef BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+void test_basic_format()
+{
+ // Basic format test files (non-interlaced)
+
+ // BASN0g01 - black & white
+ test_file<gil::gray1_image_t>("BASN0G01.PNG");
+ test_png_scanline_reader<gil::gray1_image_t>("BASN0G01.PNG");
+
+ // BASN0g02 - 2 bit (4 level) grayscale
+ test_file<gil::gray2_image_t>("BASN0G02.PNG");
+ test_png_scanline_reader<gil::gray2_image_t>("BASN0G02.PNG");
+
+ // BASN0g04 - 4 bit (16 level) grayscale
+ test_file<gil::gray4_image_t>("BASN0G04.PNG");
+ test_png_scanline_reader<gil::gray4_image_t>("BASN0G04.PNG");
+
+ // BASN0g08 - 8 bit (256 level) grayscale
+ test_file<gil::gray8_image_t>("BASN0G08.PNG");
+ test_png_scanline_reader<gil::gray8_image_t>("BASN0G08.PNG");
+
+ // BASN0g16 - 16 bit (64k level) grayscale
+ test_file<gil::gray16_image_t>("BASN0G16.PNG");
+ test_png_scanline_reader<gil::gray16_image_t>("BASN0G16.PNG");
+
+ // BASN2c08 - 3x8 bits gil::rgb color
+ test_file<gil::rgb8_image_t>("BASN2C08.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN2C08.PNG");
+
+ // BASN2c16 - 3x16 bits gil::rgb color
+ test_file<gil::rgb16_image_t>("BASN2C16.PNG");
+ test_png_scanline_reader<gil::rgb16_image_t>("BASN2C16.PNG");
+
+ // BASN3p01 - 1 bit (2 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P01.PNG");
+
+ // BASN3p02 - 2 bit (4 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P02.PNG");
+
+ // BASN3p04 - 4 bit (16 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P04.PNG");
+
+ // BASN3p08 - 8 bit (256 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P08.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P08.PNG");
+
+ // BASN4a08 - 8 bit grayscale + 8 bit alpha-channel
+ test_file<gil::gray_alpha8_image_t>("BASN4A08.PNG");
+ test_png_scanline_reader<gil::gray_alpha8_image_t>("BASN4A08.PNG");
+
+ // BASN4a16 - 16 bit grayscale + 16 bit alpha-channel
+ test_file<gil::gray_alpha16_image_t>("BASN4A16.PNG");
+ test_png_scanline_reader<gil::gray_alpha16_image_t>("BASN4A16.PNG");
+
+ // BASN6a08 - 3x8 bits gil::rgb color + 8 bit alpha-channel
+ test_file<gil::rgba8_image_t>("BASN6A08.PNG");
+ test_png_scanline_reader<gil::rgba8_image_t>("BASN6A08.PNG");
+
+ // BASN6a16 - 3x16 bits gil::rgb color + 16 bit alpha-channel
+ test_file<gil::rgba16_image_t>("BASN6A16.PNG");
+ test_png_scanline_reader<gil::rgba16_image_t>("BASN6A16.PNG");
+}
+
+void test_basic_format_interlaced()
+{
+ // Basic format test files (Adam-7 interlaced)
+
+ // BASI0g01 - black & white
+ test_file<gil::gray1_image_t>("BASI0G01.PNG");
+
+ // BASI0g02 - 2 bit (4 level) grayscale
+ test_file<gil::gray2_image_t>("BASI0G02.PNG");
+
+ // BASI0g04 - 4 bit (16 level) grayscale
+ test_file<gil::gray4_image_t>("BASI0G04.PNG");
+
+ // BASI0g08 - 8 bit (256 level) grayscale
+ test_file<gil::gray8_image_t>("BASI0G08.PNG");
+
+ // BASI0g16 - 16 bit (64k level) grayscale
+ test_file<gil::gray16_image_t>("BASI0G16.PNG");
+
+ // BASI2c08 - 3x8 bits gil::rgb color
+ test_file<gil::rgb8_image_t>("BASI2C08.PNG");
+
+ // BASI2c16 - 3x16 bits gil::rgb color
+ test_file<gil::rgb16_image_t>("BASI2C16.PNG");
+
+ // BASI3p01 - 1 bit (2 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P01.PNG");
+
+ // BASI3p02 - 2 bit (4 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P02.PNG");
+
+ // BASI3p04 - 4 bit (16 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P04.PNG");
+
+ // BASI3p08 - 8 bit (256 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P08.PNG");
+
+ // BASI4a08 - 8 bit grayscale + 8 bit alpha-channel
+ test_file<gil::gray_alpha8_image_t>("BASI4A08.PNG");
+
+ // BASI4a16 - 16 bit grayscale + 16 bit alpha-channel
+ test_file<gil::gray_alpha16_image_t>("BASI4A16.PNG");
+
+ // BASI6a08 - 3x8 bits gil::rgb color + 8 bit alpha-channel
+ test_file<gil::rgba8_image_t>("BASI6A08.PNG");
+
+ // BASI6a16 - 3x16 bits gil::rgb color + 16 bit alpha-channel
+ test_file<gil::rgba16_image_t>("BASI6A16.PNG");
+}
+
+void test_odd_sizes()
+{
+ // S01I3P01 - 1x1 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S01I3P01.PNG");
+
+ // S01N3P01 - 1x1 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S01N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S01N3P01.PNG");
+
+ // S02I3P01 - 2x2 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S02I3P01.PNG");
+
+ // S02N3P01 - 2x2 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S02N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S02N3P01.PNG");
+
+ // S03I3P01 - 3x3 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S03I3P01.PNG");
+
+ // S03N3P01 - 3x3 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S03N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S03N3P01.PNG");
+
+ // S04I3P01 - 4x4 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S04I3P01.PNG");
+
+ // S04N3P01 - 4x4 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S04N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S04N3P01.PNG");
+
+ // S05I3P02 - 5x5 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S05I3P02.PNG");
+
+ // S05N3P02 - 5x5 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S05N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S05N3P02.PNG");
+
+ // S06I3P02 - 6x6 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S06I3P02.PNG");
+
+ // S06N3P02 - 6x6 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S06N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S06N3P02.PNG");
+
+ // S07I3P02 - 7x7 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S07I3P02.PNG");
+
+ // S07N3P02 - 7x7 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S07N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S07N3P02.PNG");
+
+ // S08I3P02 - 8x8 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S08I3P02.PNG");
+
+ // S08N3P02 - 8x8 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S08N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S08N3P02.PNG");
+
+ // S09I3P02 - 9x9 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S09I3P02.PNG");
+
+ // S09N3P02 - 9x9 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S09N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S09N3P02.PNG");
+
+ // S32I3P04 - 32x32 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S32I3P04.PNG");
+
+ // S32N3P04 - 32x32 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S32N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S32N3P04.PNG");
+
+ // S33I3P04 - 33x33 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S33I3P04.PNG");
+
+ // S33N3P04 - 33x33 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S33N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S33N3P04.PNG");
+
+ // S34I3P04 - 34x34 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S34I3P04.PNG");
+
+ // S34N3P04 - 34x34 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S34N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S34N3P04.PNG");
+
+ // S35I3P04 - 35x35 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S35I3P04.PNG");
+
+ // S35N3P04 - 35x35 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S35N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S35N3P04.PNG");
+
+ // S36I3P04 - 36x36 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S36I3P04.PNG");
+
+ // S36N3P04 - 36x36 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S36N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S36N3P04.PNG");
+
+ // S37I3P04 - 37x37 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S37I3P04.PNG");
+
+ // S37N3P04 - 37x37 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S37N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S37N3P04.PNG");
+
+ // S38I3P04 - 38x38 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S38I3P04.PNG");
+
+ // S38N3P04 - 38x38 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S38N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S38N3P04.PNG");
+
+ // S39I3P04 - 39x39 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S39I3P04.PNG");
+
+ // S39N3P04 - 39x39 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S39N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S39N3P04.PNG");
+
+ // S40I3P04 - 40x40 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S40I3P04.PNG");
+
+ // S40N3P04 - 40x40 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S40N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S40N3P04.PNG");
+}
+
+void test_background()
+{
+ // BGAI4A08 - 8 bit grayscale, alpha, no background chunk, interlaced
+ test_file<gil::gray_alpha8_image_t>("BGAI4A08.PNG");
+
+ // BGAI4A16 - 16 bit grayscale, alpha, no background chunk, interlaced
+ test_file<gil::gray_alpha16_image_t>("BGAI4A16.PNG");
+
+ // BGAN6A08 - 3x8 bits gil::rgb color, alpha, no background chunk
+ test_file<gil::rgba8_image_t>("BGAN6A08.PNG");
+
+ // BGAN6A16 - 3x16 bits gil::rgb color, alpha, no background chunk
+ test_file<gil::rgba16_image_t>("BGAN6A16.PNG");
+
+ // BGBN4A08 - 8 bit grayscale, alpha, black background chunk
+ test_file<gil::gray_alpha8_image_t>("BGBN4A08.PNG");
+
+ // BGGN4A16 - 16 bit grayscale, alpha, gray background chunk
+ test_file<gil::gray_alpha16_image_t>("BGGN4A16.PNG");
+
+ // BGWN6A08 - 3x8 bits gil::rgb color, alpha, white background chunk
+ test_file<gil::rgba8_image_t>("BGWN6A08.PNG");
+
+ // BGYN6A16 - 3x16 bits gil::rgb color, alpha, yellow background chunk
+ test_file<gil::rgba16_image_t>("BGYN6A16.PNG");
+}
+
+void test_transparency()
+{
+ // TBBN1G04 - transparent, black background chunk
+ // file missing
+ //test_file<gil::gray_alpha8_image_t>("TBBN1G04.PNG" );
+
+ // TBBN2C16 - transparent, blue background chunk
+ test_file<gil::rgba16_image_t>("TBBN2C16.PNG");
+
+ // TBBN3P08 - transparent, black background chunk
+ test_file<gil::rgba8_image_t>("TBBN3P08.PNG");
+
+ // TBGN2C16 - transparent, green background chunk
+ test_file<gil::rgba16_image_t>("TBGN2C16.PNG");
+
+ // TBGN3P08 - transparent, light-gray background chunk
+ test_file<gil::rgba8_image_t>("TBGN3P08.PNG");
+
+ // TBRN2C08 - transparent, red background chunk
+ test_file<gil::rgba8_image_t>("TBRN2C08.PNG");
+
+ // TBWN1G16 - transparent, white background chunk
+ test_file<gil::gray_alpha16_image_t>("TBWN0G16.PNG");
+
+ // TBWN3P08 - transparent, white background chunk
+ test_file<gil::rgba8_image_t>("TBWN3P08.PNG");
+
+ // TBYN3P08 - transparent, yellow background chunk
+ test_file<gil::rgba8_image_t>("TBYN3P08.PNG");
+
+ // TP0N1G08 - not transparent for reference (logo on gray)
+ test_file<gil::gray8_image_t>("TP0N0G08.PNG");
+
+ // TP0N2C08 - not transparent for reference (logo on gray)
+ test_file<gil::rgb8_image_t>("TP0N2C08.PNG");
+
+ // TP0N3P08 - not transparent for reference (logo on gray)
+ test_file<gil::rgb8_image_t>("TP0N3P08.PNG");
+
+ // TP1N3P08 - transparent, but no background chunk
+ test_file<gil::rgba8_image_t>("TP1N3P08.PNG");
+}
+
+void test_gamma()
+{
+ // G03N0G16 - grayscale, file-gamma = 0.35
+ test_file<gil::gray16_image_t>("G03N0G16.PNG");
+
+ // G03N2C08 - color, file-gamma = 0.35
+ test_file<gil::rgb8_image_t>("G03N2C08.PNG");
+
+ // G03N3P04 - paletted, file-gamma = 0.35
+ test_file<gil::rgb8_image_t>("G03N3P04.PNG");
+
+ // G04N0G16 - grayscale, file-gamma = 0.45
+ test_file<gil::gray16_image_t>("G04N0G16.PNG");
+
+ // G04N2C08 - color, file-gamma = 0.45
+ test_file<gil::rgb8_image_t>("G04N2C08.PNG");
+
+ // G04N3P04 - paletted, file-gamma = 0.45
+ test_file<gil::rgb8_image_t>("G04N3P04.PNG");
+
+ // G05N0G16 - grayscale, file-gamma = 0.55
+ test_file<gil::gray16_image_t>("G05N0G16.PNG");
+
+ // G05N2C08 - color, file-gamma = 0.55
+ test_file<gil::rgb8_image_t>("G05N2C08.PNG");
+
+ // G05N3P04 - paletted, file-gamma = 0.55
+ test_file<gil::rgb8_image_t>("G05N3P04.PNG");
+
+ // G07N0G16 - grayscale, file-gamma = 0.70
+ test_file<gil::gray16_image_t>("G07N0G16.PNG");
+
+ // G07N2C08 - color, file-gamma = 0.70
+ test_file<gil::rgb8_image_t>("G07N2C08.PNG");
+
+ // G07N3P04 - paletted, file-gamma = 0.70
+ test_file<gil::rgb8_image_t>("G07N3P04.PNG");
+
+ // G10N0G16 - grayscale, file-gamma = 1.00
+ test_file<gil::gray16_image_t>("G10N0G16.PNG");
+
+ // G10N2C08 - color, file-gamma = 1.00
+ test_file<gil::rgb8_image_t>("G10N2C08.PNG");
+
+ // G10N3P04 - paletted, file-gamma = 1.00
+ test_file<gil::rgb8_image_t>("G10N3P04.PNG");
+
+ // G25N0G16 - grayscale, file-gamma = 2.50
+ test_file<gil::gray16_image_t>("G25N0G16.PNG");
+
+ // G25N2C08 - color, file-gamma = 2.50
+ test_file<gil::rgb8_image_t>("G25N2C08.PNG");
+
+ // G25N3P04 - paletted, file-gamma = 2.50
+ test_file<gil::rgb8_image_t>("G25N3P04.PNG");
+}
+#endif // BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+
+void test_corrupted_png_read()
+{
+// taken from https://github.com/boostorg/gil/issues/401#issue-518615480
+// author: https://github.com/misos1
+
+ std::initializer_list<unsigned char> corrupt_png = {
+ 0x89, 'P', 'N', 'G', 0x0D, 0x0A, 0x1A, 0x0A,
+ 0x00, 0x00, 0x00, 0x0D,
+ 'I', 'H', 'D', 'R',
+ 0x00, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0x05, 0xA9,
+ 0x08, 0x02, 0x00, 0x00, 0x00,
+ 0x68, 0x1B, 0xF7, 0x46,
+ 0x00, 0x00, 0x00, 0x00,
+ 'I', 'D', 'A', 'T',
+ 0x35, 0xAF, 0x06, 0x1E,
+ 0x00, 0x00, 0x00, 0x00,
+ 'I', 'E', 'N', 'D',
+ 0xAE, 0x42, 0x60, 0x82
+ };
+
+ std::stringstream ss(
+ std::string(corrupt_png.begin(), corrupt_png.end()),
+ std::ios_base::in | std::ios_base::binary);
+ boost::gil::rgb8_image_t img;
+
+ // TODO: Replace with BOOST_ERROR below with BOOST_TEST_THROWS
+ try
+ {
+ boost::gil::read_image(ss, img, boost::gil::png_tag{});
+ }
+ catch (std::ios_base::failure& exception)
+ {
+ // the exception message is "png is invalid: iostream error"
+ // is the error portable throughout stdlib implementations,
+ // or is it native to this one?
+ // the description passd is "png_is_invalid"
+ // the exact error message is thus not checked
+ return;
+ }
+
+ BOOST_ERROR("no exception was thrown, which is an error");
+}
+
+int main()
+{
+ test_read_header();
+ test_corrupted_png_read();
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ test_read_pixel_per_meter();
+ test_read_with_trns_chunk_color_type_0();
+ test_read_with_trns_chunk_color_type_2();
+ test_read_with_trns_chunk_color_type_3();
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+#ifdef BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+ test_basic_format();
+ test_basic_format_interlaced();
+ test_odd_sizes();
+ test_background();
+ test_transparency();
+ test_gamma();
+#endif
+
+ return boost::report_errors();
+}
+
diff --git a/src/boost/libs/gil/test/extension/io/png/png_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_test.cpp
new file mode 100644
index 000000000..937c4bbe0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_test.cpp
@@ -0,0 +1,302 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+//#define BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED
+//#define BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_filename, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(png_filename, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgba8_image_t img;
+ gil::read_image(file, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(png_filename, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ gil::rgba8_image_t img;
+ gil::read_and_convert_image(png_filename, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(png_filename, view(img), gil::png_tag());
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(in, view(img), gil::png_tag());
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(file, view(img), gil::png_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(png_filename, view(img), gil::png_tag());
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(in, view(img), gil::png_tag());
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(file, view(img), gil::png_tag());
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write_view()
+{
+ {
+ std::string filename(png_out + "write_test_string.png");
+
+ gil::write_view(
+ filename,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+ {
+ std::string filename(png_out + "write_test_string_bgr.png");
+
+ gil::write_view(
+ filename,
+ create_mandel_view(320, 240, gil::bgr8_pixel_t(255, 0, 0), gil::bgr8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+ {
+ std::string filename(png_out + "write_test_ofstream.png");
+ std::ofstream out(filename.c_str(), std::ios::out | std::ios::binary);
+
+ gil::write_view(
+ out,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+ {
+ std::string filename(png_out + "write_test_file.png");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::write_view(
+ file,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+
+ {
+ std::string filename(png_out + "write_test_info.png");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::image_write_info<gil::png_tag> info;
+ gil::write_view(
+ file,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ info);
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::png_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, view(img), gil::png_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgba8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::png_tag());
+
+ // 5. Write out image.
+ std::string filename(png_out + "stream_test.png");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, view(dst), gil::png_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(png_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+ std::istream in(&in_buf);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::png_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgba8_image_t, gil::png_tag>(
+ png_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgba8_image_t, gil::png_tag>(
+ png_filename, gil::point_t(135, 95), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::read_image(png_filename.c_str(), image, gil::png_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(png_out + "dynamic_image_test.png", gil::view(image), gil::png_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/png/png_write_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_write_test.cpp
new file mode 100644
index 000000000..85f1541af
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_write_test.cpp
@@ -0,0 +1,33 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_GIL_IO_ENABLE_GRAY_ALPHA
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::png_tag>(
+ png_out + "rgb_color_space_test.png", png_out + "bgr_color_space_test.png");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/pnm/Jamfile b/src/boost/libs/gil/test/extension/io/pnm/Jamfile
new file mode 100644
index 000000000..ab8d62441
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/Jamfile
@@ -0,0 +1,26 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+# TODO: Download PNM test suite images and build with BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ ;
+
+run pnm_test.cpp ;
+run pnm_read_test.cpp ;
+run pnm_write_test.cpp ;
+
+run pnm_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp
new file mode 100644
index 000000000..21e07fe3e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::pnm_read_dimensions(pnm_filename);
+ BOOST_TEST_EQ(dim.x, 256);
+ BOOST_TEST_EQ(dim.y, 256);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::pnm_read_image(pnm_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 256);
+ BOOST_TEST_EQ(img.height(), 256);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::pnm_read_and_convert_image(pnm_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 256);
+ BOOST_TEST_EQ(img.height(), 256);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(256, 256);
+ gil::pnm_read_view(pnm_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(256, 256);
+ gil::pnm_read_and_convert_view(pnm_filename, gil::view(img));
+}
+
+void test_old_write_view()
+{
+ std::string filename(pnm_out + "test5.pnm");
+ gil::gray8_image_t img(256, 256);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::pnm_write_view(filename, gil::view(img));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types =
+ mp11::mp_list<gil::gray8_image_t, gil::gray16_image_t, gil::rgb8_image_t, gil::gray1_image_t>;
+
+ gil::any_image<my_img_types> image;
+
+ gil::pnm_read_image(pnm_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::pnm_write_view(pnm_out + "old_dynamic_image_test.pnm", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp
new file mode 100644
index 000000000..6f90a29ce
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp
@@ -0,0 +1,124 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+namespace gil = boost::gil;
+
+template <typename Image>
+void write(Image& img, std::string const& file_name)
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(pnm_out + file_name, gil::view(img), gil::pnm_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+template <typename Image>
+void test_pnm_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::pnm_tag>(std::string(pnm_in + filename).c_str());
+}
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(pnm_filename, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._type, gil::pnm_image_type::color_bin_t::value);
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ BOOST_TEST_EQ(backend._info._max_value, 255u);
+}
+
+#ifdef BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+void test_read_reference_images()
+{
+ // p1.pnm
+ {
+ gil::gray8_image_t img;
+ gil::read_image(pnm_in + "p1.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p1.pnm");
+ test_pnm_scanline_reader<gil::gray8_image_t>("p1.pnm");
+ }
+ // p2.pnm
+ {
+ gil::gray8_image_t img;
+ gil::read_image(pnm_in + "p2.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p2.pnm");
+ test_pnm_scanline_reader<gil::gray8_image_t>("p2.pnm");
+ }
+ // p3.pnm
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_in + "p3.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 256u);
+ BOOST_TEST_EQ(view(img).height(), 256u);
+
+ write(img, "p3.pnm");
+ test_pnm_scanline_reader<rgb8_image_t>("p3.pnm");
+ }
+ // p4.pnm
+ {
+ gil::gray1_image_t img;
+ gil::read_image(pnm_in + "p4.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p4.pnm");
+ test_pnm_scanline_reader<gil::gray1_image_t>("p4.pnm");
+ }
+ // p5.pnm
+ {
+ gil::gray8_image_t img;
+ gil::read_image(pnm_in + "p5.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p5.pnm");
+ test_pnm_scanline_reader<gil::gray8_image_t>("p5.pnm");
+ }
+ // p6.pnm
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_in + "p6.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 256u);
+ BOOST_TEST_EQ(view(img).height(), 256u);
+
+ write(img, "p6.pnm");
+ test_pnm_scanline_reader<gil::rgb8_image_t>("p6.pnm");
+ }
+}
+#endif // BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+
+int main()
+{
+ test_read_header();
+
+#ifdef BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+ test_read_reference_images();
+#endif
+
+ return boost::report_errors();
+}
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp
new file mode 100644
index 000000000..2e398343e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp
@@ -0,0 +1,240 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(pnm_filename, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_filename, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_image(file, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(pnm_filename, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(256, 256);
+ gil::read_view(pnm_filename, gil::view(img), gil::pnm_tag());
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(256, 256);
+ gil::read_view(in, gil::view(img), gil::pnm_tag());
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(256, 256);
+ gil::read_view(file, gil::view(img), gil::pnm_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(256, 256);
+ gil::read_and_convert_view(pnm_filename, gil::view(img), gil::pnm_tag());
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(256, 256);
+ gil::read_and_convert_view(in, gil::view(img), gil::pnm_tag());
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(256, 256);
+
+ gil::read_and_convert_view(file, gil::view(img), gil::pnm_tag());
+ }
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::pnm_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::pnm_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::pnm_tag());
+
+ // 5. Write out image.
+ std::string filename(pnm_out + "stream_test.pnm");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, gil::view(dst), gil::pnm_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(pnm_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::pnm_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::pnm_tag>(
+ pnm_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgb8_image_t, gil::pnm_tag>(
+ pnm_filename, gil::point_t(103, 103), gil::point_t(50, 50));
+}
+
+void test_dynamic_image_test()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::gray1_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+
+ gil::read_image(pnm_filename.c_str(), image, gil::pnm_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(pnm_out + "dynamic_image_test.pnm", gil::view(image), gil::pnm_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image_test();
+
+ return boost::report_errors();
+}
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp
new file mode 100644
index 000000000..c6b166b02
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp
@@ -0,0 +1,60 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write()
+{
+ mandel_view<gil::rgb8_pixel_t>::type v =
+ create_mandel_view(200, 200, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0));
+
+ // test writing all supported image types
+ {
+ using gray1_image_t = gil::bit_aligned_image1_type<1, gil::gray_layout_t>::type;
+ gray1_image_t dst(200, 200);
+ gil::copy_and_convert_pixels(v, gil::view(dst));
+
+ gil::write_view(pnm_out + "p4_write_test.pnm", gil::view(dst), gil::pnm_tag());
+ }
+ {
+ gil::gray8_image_t dst(200, 200);
+ gil::copy_and_convert_pixels(v, gil::view(dst));
+
+ gil::write_view(pnm_out + "p5_write_test.pnm", gil::view(dst), gil::pnm_tag());
+ }
+ {
+ gil::write_view(pnm_out + "p6_write_test.pnm", v, gil::pnm_tag());
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::pnm_tag>(
+ pnm_out + "rgb_color_space_test.pnm", pnm_out + "bgr_color_space_test.pnm");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ test_write();
+#endif
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/raw/Jamfile b/src/boost/libs/gil/test/extension/io/raw/Jamfile
new file mode 100644
index 000000000..c0e1a5896
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/raw/Jamfile
@@ -0,0 +1,24 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+lib libraw : : <name>raw ;
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ <library>libraw
+ ;
+
+run raw_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/raw/raw_test.cpp b/src/boost/libs/gil/test/extension/io/raw/raw_test.cpp
new file mode 100644
index 000000000..029eef07f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/raw/raw_test.cpp
@@ -0,0 +1,127 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_FILESYSTEM_VERSION 3
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/raw.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_image_info_using_string()
+{
+ {
+ /// raw_tag reader's can only constructed with char*, std::string, and LibRaw object
+
+ using backend_t = gil::get_reader_backend<char const *, gil::raw_tag>::type;
+ backend_t b = gil::make_reader_backend(raw_filename.c_str(),
+ gil::image_read_settings<gil::raw_tag>());
+ backend_t backend = gil::read_image_info(raw_filename, gil::raw_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 2176);
+ BOOST_TEST_EQ(backend._info._height, 1448);
+ }
+ {
+ fs::path my_path(raw_filename);
+ using backend_t = gil::get_reader_backend<fs::path, gil::raw_tag>::type;
+ backend_t backend = gil::read_image_info(my_path, gil::raw_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 2176);
+ BOOST_TEST_EQ(backend._info._height, 1448);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(raw_filename, img, gil::raw_tag());
+
+ BOOST_TEST_EQ(img.width(), 2176);
+ BOOST_TEST_EQ(img.height(), 1448);
+ }
+
+ {
+ fs::path my_path(raw_filename);
+ gil::rgb8_image_t img;
+ gil::read_image(my_path, img, gil::raw_tag());
+
+ BOOST_TEST_EQ(img.width(), 2176);
+ BOOST_TEST_EQ(img.height(), 1448);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(raw_filename, img, gil::raw_tag());
+
+ BOOST_TEST_EQ(img.width(), 2176);
+ BOOST_TEST_EQ(img.height(), 1448);
+}
+
+void test_read_view()
+{
+ gil::rgb8_image_t img(2176, 1448);
+ gil::read_view(raw_filename, gil::view(img), gil::raw_tag());
+}
+
+void test_read_and_convert_view()
+{
+ gil::rgb8_image_t img(2176, 1448);
+ gil::read_and_convert_view(raw_filename, gil::view(img), gil::raw_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::raw_tag>(raw_filename, gil::point_t(0, 0), gil::point_t(127, 1));
+ run_subimage_test<gil::rgb8_image_t, gil::raw_tag>(raw_filename, gil::point_t(39, 7), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(raw_filename.c_str(), image, gil::raw_tag());
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ //test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/scanline_read_test.hpp b/src/boost/libs/gil/test/extension/io/scanline_read_test.hpp
new file mode 100644
index 000000000..ae10c7f10
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/scanline_read_test.hpp
@@ -0,0 +1,61 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_IO_TEST_SCANLINE_READ_TEST_HPP
+#define BOOST_GIL_IO_TEST_SCANLINE_READ_TEST_HPP
+
+#include <boost/gil.hpp>
+
+#include "cmp_view.hpp"
+
+template< typename Image
+ , typename FormatTag
+ >
+void test_scanline_reader( const char* file_name )
+{
+ using namespace boost::gil;
+
+ // read image using scanline_read_iterator
+ using reader_t = scanline_reader
+ <
+ typename get_read_device<char const*, FormatTag>::type,
+ FormatTag
+ >;
+
+ reader_t reader = make_scanline_reader( file_name, FormatTag() );
+
+ Image dst( reader._info._width, reader._info._height );
+
+ using iterator_t = typename reader_t::iterator_t;
+
+ iterator_t it = reader.begin();
+ iterator_t end = reader.end();
+
+ for( int row = 0; it != end; ++it, ++row )
+ {
+ copy_pixels( interleaved_view( reader._info._width
+ , 1
+ , ( typename Image::view_t::x_iterator ) *it
+ , reader._scanline_length
+ )
+ , subimage_view( view( dst )
+ , 0
+ , row
+ , reader._info._width
+ , 1
+ )
+ );
+ }
+
+ //compare
+ Image img;
+ read_image( file_name, img, FormatTag() );
+
+ cmp_view( view( dst ), view( img ) );
+}
+
+#endif // BOOST_GIL_IO_TEST_SCANLINE_READ_TEST_HPP
diff --git a/src/boost/libs/gil/test/extension/io/simple_all_formats.cpp b/src/boost/libs/gil/test/extension/io/simple_all_formats.cpp
new file mode 100644
index 000000000..2acdb39fe
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/simple_all_formats.cpp
@@ -0,0 +1,94 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/io/png.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace fs = boost::filesystem;
+
+// Test will include all format's headers and load and write some images.
+// This test is more of a compilation test.
+
+void test_bmp()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_filename, img, gil::bmp_tag());
+
+ fs::create_directories(fs::path(bmp_out));
+ gil::write_view(bmp_out + "simple_all_format.bmp", gil::view(img), gil::bmp_tag());
+}
+
+void test_jpeg()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(jpeg_filename, img, gil::jpeg_tag());
+ fs::create_directories(fs::path(jpeg_out));
+ gil::write_view(jpeg_out + "simple_all_format.jpg", gil::view(img), gil::jpeg_tag());
+}
+
+void test_png()
+{
+ gil::rgba8_image_t img;
+ gil::read_image(png_filename, img, gil::png_tag());
+ fs::create_directories(fs::path(png_out));
+ gil::write_view(png_out + "simple_all_format.png", gil::view(img), gil::png_tag());
+}
+
+void test_pnm()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_filename, img, gil::pnm_tag());
+
+ fs::create_directories(fs::path(pnm_out));
+ gil::write_view(pnm_out + "simple_all_format.pnm", gil::view(img), gil::pnm_tag());
+}
+
+void test_targa()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(targa_filename, img, gil::targa_tag());
+
+ fs::create_directories(fs::path(targa_out));
+ gil::write_view(targa_out + "simple_all_format.tga", gil::view(img), gil::targa_tag());
+}
+
+void test_tiff()
+{
+ gil::rgba8_image_t img;
+ gil::read_image(tiff_filename, img, gil::tiff_tag());
+
+ fs::create_directories(fs::path(tiff_out));
+ gil::write_view(tiff_out + "simple_all_format.tif", gil::view(img), gil::tiff_tag());
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ test_bmp();
+ test_jpeg();
+ test_png();
+ test_pnm();
+ // TODO: test_raw()
+ test_targa();
+ test_tiff();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/subimage_test.hpp b/src/boost/libs/gil/test/extension/io/subimage_test.hpp
new file mode 100644
index 000000000..1b320b2a7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/subimage_test.hpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_IO_TEST_SUBIMAGE_TEST_HPP
+#define BOOST_GIL_IO_TEST_SUBIMAGE_TEST_HPP
+
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+template <typename Image, typename Format>
+void run_subimage_test(
+ std::string const& filename, boost::gil::point_t const& top_left, boost::gil::point_t const& dimension)
+{
+ Image original, subimage;
+ boost::gil::read_image(filename, original, Format{});
+ boost::gil::image_read_settings<Format> settings(top_left, dimension);
+ boost::gil::read_image(filename, subimage, settings);
+ BOOST_TEST(boost::gil::equal_pixels(
+ boost::gil::const_view(subimage),
+ boost::gil::subimage_view(boost::gil::const_view(original), top_left, dimension)));
+}
+
+#endif // BOOST_GIL_IO_TEST_SUBIMAGE_TEST_HPP
diff --git a/src/boost/libs/gil/test/extension/io/targa/Jamfile b/src/boost/libs/gil/test/extension/io/targa/Jamfile
new file mode 100644
index 000000000..ac35f88c3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/Jamfile
@@ -0,0 +1,22 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+project
+ : requirements
+ <library>/boost/filesystem//boost_filesystem
+ ;
+
+run targa_test.cpp ;
+run targa_read_test.cpp ;
+run targa_write_test.cpp ;
+
+run targa_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp
new file mode 100644
index 000000000..cfb7aa9a7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp
@@ -0,0 +1,92 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/targa/old.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/mp11.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::targa_read_dimensions(targa_filename);
+
+ BOOST_TEST_EQ(dim.x, 124);
+ BOOST_TEST_EQ(dim.y, 124);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::targa_read_image(targa_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::targa_read_and_convert_image(targa_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(124, 124);
+ gil::targa_read_view(targa_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(124, 124);
+ gil::targa_read_and_convert_view(targa_filename, gil::view(img));
+}
+
+void test_old_write_view()
+{
+ targa_write_view(
+ targa_out + "old_write_view_test.tga",
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)));
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::targa_read_image(targa_filename.c_str(), image);
+
+ targa_write_view(targa_out + "old_dynamic_image_test.tga", gil::view(image));
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp
new file mode 100644
index 000000000..c585271b4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp
@@ -0,0 +1,213 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+template <typename Image>
+void test_targa_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::targa_tag>(std::string(targa_in + filename).c_str());
+}
+
+template <typename Image>
+void write(Image& img, std::string const& file_name)
+{
+ gil::write_view(targa_out + file_name, gil::view(img), gil::targa_tag());
+}
+
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(targa_filename, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._header_size, 18);
+ BOOST_TEST_EQ(backend._info._offset, 18);
+ BOOST_TEST_EQ(backend._info._color_map_type, 0);
+ BOOST_TEST_EQ(backend._info._image_type, 10);
+ BOOST_TEST_EQ(backend._info._color_map_start, 0);
+ BOOST_TEST_EQ(backend._info._color_map_length, 0);
+ BOOST_TEST_EQ(backend._info._color_map_depth, 0);
+ BOOST_TEST_EQ(backend._info._x_origin, 0);
+ BOOST_TEST_EQ(backend._info._y_origin, 0);
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ BOOST_TEST_EQ(backend._info._bits_per_pixel, 24);
+ BOOST_TEST_EQ(backend._info._descriptor, 0);
+}
+
+void test_read_reference_images()
+{
+ // 24BPP_compressed.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_compressed.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_compressed_out.tga");
+ }
+ // 24BPP_uncompressed.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_uncompressed.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_uncompressed_out.tga");
+
+ test_targa_scanline_reader<gil::bgr8_image_t>("24BPP_uncompressed.tga");
+ }
+ // 32BPP_compressed.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_compressed.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_compressed_out.tga");
+ }
+ // 32BPP_uncompressed.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_uncompressed.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_uncompressed_out.tga");
+
+ test_targa_scanline_reader<gil::bgra8_image_t>("32BPP_uncompressed.tga");
+ }
+ // 24BPP_compressed_ul_origin.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_compressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_compressed_ul_origin_out.tga");
+ }
+ // 24BPP_uncompressed_ul_origin.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_uncompressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_uncompressed_ul_origin_out.tga");
+ }
+ // 32BPP_compressed_ul_origin.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_compressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_compressed_ul_origin_out.tga");
+ }
+ // 32BPP_uncompressed_ul_origin.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_uncompressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_uncompressed_ul_origin_out.tga");
+ }
+}
+
+void test_partial_image()
+{
+ std::string const filename(targa_in + "24BPP_compressed.tga");
+
+ gil::rgb8_image_t img;
+ gil::read_image(
+ filename, img,
+ gil::image_read_settings<gil::targa_tag>(gil::point_t(0, 0), gil::point_t(50, 50)));
+
+ gil::write_view(targa_out + "targa_partial.tga", gil::view(img), gil::targa_tag());
+}
+
+int main()
+{
+ test_read_header();
+ test_read_reference_images();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_test.cpp
new file mode 100644
index 000000000..bb1d98935
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_test.cpp
@@ -0,0 +1,283 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(targa_filename, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+ {
+ fs::path my_path(targa_filename);
+
+ using backend_t = gil::get_reader_backend<fs::path, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(my_path, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_filename, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_image(file, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ read_and_convert_image(targa_filename, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(124, 124);
+ gil::read_view(targa_filename, gil::view(img), gil::targa_tag());
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_view(in, gil::view(img), gil::targa_tag());
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_view(file, gil::view(img), gil::targa_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(124, 124);
+ gil::read_and_convert_view(targa_filename, gil::view(img), gil::targa_tag());
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_and_convert_view(in, gil::view(img), gil::targa_tag());
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_and_convert_view(file, gil::view(img), gil::targa_tag());
+ }
+}
+
+void test_write_view()
+{
+ {
+ std::string filename(png_out + "write_test_string.tga");
+
+ gil::rgb8_image_t img;
+ gil::write_view(
+ filename,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ std::string filename(targa_out + "write_test_ofstream.tga");
+ std::ofstream out(filename.c_str(), std::ios::out | std::ios::binary);
+
+ gil::write_view(
+ out,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ std::string filename(targa_out + "write_test_file.tga");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::write_view(
+ file,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ std::string filename(targa_out + "write_test_info.tga");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::image_write_info<gil::targa_tag> info;
+ gil::write_view(
+ file,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ info);
+ }
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::targa_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::targa_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::targa_tag());
+
+ // 5. Write out image.
+ std::string filename(targa_out + "stream_test.tga");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+ gil::write_view(out, gil::view(dst), gil::targa_tag());
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(targa_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::targa_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::targa_tag>(
+ targa_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ // FIXME: not working
+ // run_subimage_test<gil::gray8_image_t, gil::targa_tag>(
+ // targa_filename, gil::point_t(39, 7), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(targa_filename.c_str(), image, gil::targa_tag());
+ gil::write_view(targa_out + "dynamic_image_test.tga", gil::view(image), gil::targa_tag());
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp
new file mode 100644
index 000000000..c57ea71af
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/io/typedefs.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+void test_write()
+{
+ // test writing all supported image types
+ {
+ gil::write_view(
+ targa_out + "rgb8_test.tga",
+ create_mandel_view(200, 200, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ gil::write_view(
+ targa_out + "rgba8_test.tga",
+ create_mandel_view(
+ 200, 200, gil::rgba8_pixel_t(0, 0, 255, 0), gil::rgba8_pixel_t(0, 255, 0, 0)),
+ gil::targa_tag());
+ }
+}
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::targa_tag>(
+ targa_out + "rgb_color_space_test.tga", targa_out + "bgr_color_space_test.tga");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+ test_write();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/tiff/Jamfile b/src/boost/libs/gil/test/extension/io/tiff/Jamfile
new file mode 100644
index 000000000..f92036797
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/Jamfile
@@ -0,0 +1,54 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using libtiff : : : : true ;
+lib libtiffxx : : <name>tiffxx ;
+
+# TODO: Download TIFF test suite images and build with BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ <library>libtiffxx
+ [ ac.check-library /libtiff//libtiff : <library>/libtiff//libtiff : <build>no ]
+ ;
+
+run tiff_file_format_test.cpp ;
+run tiff_subimage_test.cpp ;
+run tiff_test.cpp ;
+run tiff_tiled_float_test.cpp ;
+run tiff_tiled_minisblack_test_1-10.cpp ;
+run tiff_tiled_minisblack_test_11-20.cpp ;
+run tiff_tiled_minisblack_test_21-31_32-64.cpp ;
+run tiff_tiled_minisblack_write_test_1-10.cpp ;
+run tiff_tiled_minisblack_write_test_11-20.cpp ;
+run tiff_tiled_minisblack_write_test_21-31_32-64.cpp ;
+run tiff_tiled_palette_test_1-8.cpp ;
+run tiff_tiled_palette_test_8-16.cpp ;
+run tiff_tiled_palette_write_test_1-8.cpp ;
+run tiff_tiled_palette_write_test_8-16.cpp ;
+run tiff_tiled_rgb_contig_test_1-10.cpp ;
+run tiff_tiled_rgb_contig_test_11-20.cpp ;
+run tiff_tiled_rgb_contig_test_21-31_32_64.cpp ;
+run tiff_tiled_rgb_contig_write_test_1-10.cpp ;
+run tiff_tiled_rgb_contig_write_test_11-20.cpp ;
+run tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp ;
+run tiff_tiled_rgb_planar_test_1-10.cpp ;
+run tiff_tiled_rgb_planar_test_11-20.cpp ;
+run tiff_tiled_rgb_planar_test_21-31_32_64.cpp ;
+run tiff_tiled_test.cpp ;
+run tiff_write_test.cpp ;
+
+run tiff_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp
new file mode 100644
index 000000000..4264312f7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp
@@ -0,0 +1,637 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
+template <typename Image>
+void test_tiff_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::tiff_tag>(filename.c_str());
+}
+
+// 73x43 2-bit minisblack gray image
+void test_two_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-02.tif");
+
+ using image_t = gil::bit_aligned_image1_type<2, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test4.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-04.tif 73x43 4-bit minisblack gray image
+void test_four_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-04.tif");
+
+ using image_t = gil::bit_aligned_image1_type<4, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test5.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-06.tif 73x43 6-bit minisblack gray image
+void test_six_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-06.tif");
+
+ using image_t = gil::bit_aligned_image1_type<6, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test6.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-08.tif 73x43 8-bit minisblack gray image
+void test_eight_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-08.tif");
+
+ using image_t = gray8_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test7.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-10.tif 73x43 10-bit minisblack gray image
+void test_ten_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-10.tif");
+
+ using image_t = gil::bit_aligned_image1_type<10, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test8.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-12.tif 73x43 12-bit minisblack gray image
+void test_twelve_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-12.tif");
+
+ using image_t = gil::bit_aligned_image1_type<12, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test9.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-14.tif 73x43 14-bit minisblack gray image
+void test_fourteen_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-14.tif");
+
+ using image_t = gil::bit_aligned_image1_type<14, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test10.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-16.tif 73x43 16-bit minisblack gray image
+void test_sixteen_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-16.tif");
+
+ using image_t = gray16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test11.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-24.tif 73x43 24-bit minisblack gray image
+void test_twentyfour_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-24.tif");
+
+ using image_t = gil::bit_aligned_image1_type<24, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test12.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-32.tif 73x43 32-bit minisblack gray image
+void test_thirtytwo_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-32.tif");
+
+ using image_t = gray32_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test13.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-02.tif 73x43 4-entry colormapped image
+void test_four_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-02.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test14.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-04.tif 73x43 16-entry colormapped image
+void test_sixteen_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-04.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test15.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-08.tif 73x43 256-entry colormapped image
+void test_twohundred_twenty_five_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-08.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test16.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-16.tif 73x43 65536-entry colormapped image
+void test_sixtyfive_thousand_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-16.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test17.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-02.tif 73x43 2-bit contiguous RGB image
+void test_two_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-02.tif");
+
+ using image_t = gil::bit_aligned_image3_type<2, 2, 2, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test18.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-04.tif 73x43 4-bit contiguous RGB image
+void test_four_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-04.tif");
+
+ using image_t = gil::bit_aligned_image3_type<4, 4, 4, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test19.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-08.tif 73x43 8-bit contiguous RGB image
+void test_eight_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-08.tif");
+
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test20.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-10.tif 73x43 10-bit contiguous RGB image
+void test_ten_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-10.tif");
+
+ using image_t = gil::bit_aligned_image3_type<10, 10, 10, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test21.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-12.tif 73x43 12-bit contiguous RGB image
+void test_twelve_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-12.tif");
+
+ using image_t = gil::bit_aligned_image3_type<12, 12, 12, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test22.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-14.tif 73x43 14-bit contiguous RGB image
+void test_fourteen_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-14.tif");
+
+ using image_t = gil::bit_aligned_image3_type<14, 14, 14, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test23.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-16.tif 73x43 16-bit contiguous RGB image
+void test_sixteen_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-16.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test24.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-24.tif 73x43 24-bit contiguous RGB image
+void test_twenty_four_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-24.tif");
+
+ using image_t = gil::bit_aligned_image3_type<24, 24, 24, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test25.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-32.tif 73x43 32-bit contiguous RGB image
+void test_thirty_two_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-32.tif");
+
+ using image_t = gil::rgb32_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test26.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-02.tif 73x43 2-bit seperated RGB image
+void test_two_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-02.tif");
+
+ using image_t = gil::bit_aligned_image3_type<2, 2, 2, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test27.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-04.tif 73x43 4-bit seperated RGB image
+void test_four_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-04.tif");
+
+ using image_t = gil::bit_aligned_image3_type<4, 4, 4, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test28.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-08.tif 73x43 8-bit seperated RGB image
+void test_eight_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-08.tif");
+
+ using image_t = gil::rgb8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test29.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-10.tif 73x43 10-bit seperated RGB image
+void test_ten_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-10.tif");
+
+ using image_t = gil::bit_aligned_image3_type<10, 10, 10, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test30.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-12.tif 73x43 12-bit seperated RGB image
+void test_twelve_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-12.tif");
+
+ using image_t = gil::bit_aligned_image3_type<12, 12, 12, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test31.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-14.tif 73x43 14-bit seperated RGB image
+void test_fourteen_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-14.tif");
+
+ using image_t = gil::bit_aligned_image3_type<14, 14, 14, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test32.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-16.tif 73x43 16-bit seperated RGB image
+void test_sixteen_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-16.tif");
+
+ using image_t = gil::rgb16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test33.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-24.tif 73x43 24-bit seperated RGB image
+void test_twenty_four_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-24.tif");
+
+ using image_t = gil::bit_aligned_image3_type<24, 24, 24, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test34.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-32.tif 73x43 32-bit seperated RGB image
+void test_thirty_two_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-32.tif");
+
+ using image_t = gil::rgb32_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test35.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-contig-08.tif 73x43 8-bit contiguous CMYK image
+void test_eight_bit_contiguous_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-contig-08.tif");
+
+ using image_t = gil::cmyk8_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test36.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-contig-16.tif 73x43 16-bit contiguous CMYK image
+void test_sixteen_bit_contiguous_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-contig-16.tif");
+
+ using image_t = gil::cmyk16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test37.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-planar-08.tif 73x43 8-bit separated CMYK image
+void test_eight_bit_separated_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-planar-08.tif");
+
+ using image_t = gil::cmyk8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test38.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-planar-16.tif 73x43 16-bit separated CMYK image
+void test_sixteen_bit_separated_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-planar-16.tif");
+
+ using image_t = gil::cmyk16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test39.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+#endif // BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+void test_tiger_separated_strip_contig_08()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-contig-08.tif");
+
+ using image_t = gil::cmyk8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test40.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_tiger_separated_strip_contig_16()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-contig-16.tif");
+
+ using image_t = gil::cmyk16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test41.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_tiger_separated_strip_planar_08()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-planar-08.tif");
+
+ using image_t = gil::cmyk8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test42.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_tiger_separated_strip_planar_16()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-planar-16.tif");
+
+ using image_t = gil::cmyk16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test43.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES }
+}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+int main()
+{
+#ifdef BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
+ test_two_bit_minisblack_gray_image();
+ test_four_bit_minisblack_gray_image();
+ test_six_bit_minisblack_gray_image();
+ test_eight_bit_minisblack_gray_image();
+ test_ten_bit_minisblack_gray_image();
+ test_twelve_bit_minisblack_gray_image();
+ test_fourteen_bit_minisblack_gray_image();
+ test_sixteen_bit_minisblack_gray_image();
+ test_twentyfour_bit_minisblack_gray_image();
+ test_thirtytwo_bit_minisblack_gray_image();
+ test_four_entry_colormapped_image();
+ test_sixteen_entry_colormapped_image();
+ test_twohundred_twenty_five_entry_colormapped_image();
+ test_sixtyfive_thousand_entry_colormapped_image();
+ test_two_bit_contiguous_rgb_image();
+ test_four_bit_contiguous_rgb_image();
+ test_eight_bit_contiguous_rgb_image();
+ test_ten_bit_contiguous_rgb_image();
+ test_twelve_bit_contiguous_rgb_image();
+ test_fourteen_bit_contiguous_rgb_image();
+ test_sixteen_bit_contiguous_rgb_image();
+ test_twenty_four_bit_contiguous_rgb_image();
+ test_thirty_two_bit_contiguous_rgb_image();
+ test_two_bit_seperated_rgb_image();
+ test_four_bit_seperated_rgb_image();
+ test_eight_bit_seperated_rgb_image();
+ test_ten_bit_seperated_rgb_image();
+ test_twelve_bit_seperated_rgb_image();
+ test_fourteen_bit_seperated_rgb_image();
+ test_sixteen_bit_seperated_rgb_image();
+ test_twenty_four_bit_seperated_rgb_image();
+ test_thirty_two_bit_seperated_rgb_image();
+ test_eight_bit_contiguous_cmyk_image();
+ test_sixteen_bit_contiguous_cmyk_image();
+ test_eight_bit_separated_cmyk_image();
+ test_sixteen_bit_separated_cmyk_image();
+#endif
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+ test_tiger_separated_strip_contig_08();
+ test_tiger_separated_strip_contig_16();
+ test_tiger_separated_strip_planar_08();
+ test_tiger_separated_strip_planar_16();
+#endif
+
+#if defined(BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES) || defined(BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES)
+ return boost::report_errors();
+#endif
+}
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp
new file mode 100644
index 000000000..326a75c18
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp
@@ -0,0 +1,93 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+// This test file will only test the old library's interface.
+// It's more of a compile time test than a runtime test.
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::tiff_read_dimensions(tiff_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgba8_image_t img;
+ gil::tiff_read_image(tiff_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::tiff_read_and_convert_image(tiff_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgba8_image_t img(1000, 600);
+ gil::tiff_read_view(tiff_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::tiff_read_and_convert_view(tiff_filename, gil::view(img));
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgba8_image_t,
+ gil::gray1_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::tiff_read_image(tiff_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::tiff_write_view(tiff_out + "old_dynamic_image_test.tif", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp
new file mode 100644
index 000000000..062525dad
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp
@@ -0,0 +1,128 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#define BOOST_GIL_TEST_NAME_SUBIMAGE_TEST(n, data) \
+ BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_CAT(test_, BOOST_PP_CAT(data, _)), n), bit_bit_aligned)
+
+#define BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST(z, n, data) \
+ void BOOST_GIL_TEST_NAME_SUBIMAGE_TEST(n, data) () \
+ { \
+ std::string filename_strip(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string filename_tile(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-tile-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img1, img2, img3; \
+ gil::point_t top_left(10, 10); \
+ gil::point_t dim(32, 32); \
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim); \
+ gil::read_image(filename_strip, img1, settings); \
+ gil::read_image(filename_tile, img2, settings); \
+ gil::read_image(filename_strip, img3, gil::tiff_tag()); \
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2))); \
+ BOOST_TEST(gil::equal_pixels( \
+ gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim))); \
+ }
+
+#define BOOST_GIL_TEST_CALL_SUBIMAGE_TEST(z, n, data) \
+ BOOST_GIL_TEST_NAME_SUBIMAGE_TEST(n, data);
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST, minisblack)
+BOOST_PP_REPEAT_FROM_TO(9, 16, BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST, minisblack)
+BOOST_PP_REPEAT_FROM_TO(17, 27, BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST, minisblack)
+// TODO: there is a bug somewhere when the number of bits is 27 up to 31.
+
+void test_subimage_test_8()
+{
+ gil::gray8_image_t img1, img2, img3;
+ gil::point_t top_left(10, 10);
+ gil::point_t dim(32, 32);
+
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim);
+
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-08.tif", img1, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-tile-08.tif", img2, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-08.tif", img3, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2)));
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim)));
+}
+
+void test_subimage_test_16()
+{
+ gil::gray16_image_t img1, img2, img3;
+ gil::point_t top_left(10, 10);
+ gil::point_t dim(32, 32);
+
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim);
+
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-16.tif", img1, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-tile-16.tif", img2, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-16.tif", img3, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2)));
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim)));
+}
+
+void test_subimage_test_32()
+{
+ using gray32_pixel_t = gil::pixel<unsigned int, gil::gray_layout_t>;
+ gil::image<gray32_pixel_t, false> img1, img2, img3;
+
+ gil::point_t top_left(10, 10);
+ gil::point_t dim(32, 32);
+
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim);
+
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-32.tif", img1, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-tile-32.tif", img2, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-32.tif", img3, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2)));
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim)));
+}
+
+int main()
+{
+ test_subimage_test_8();
+ test_subimage_test_16();
+ test_subimage_test_32();
+
+ BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_CALL_SUBIMAGE_TEST, minisblack)
+ BOOST_PP_REPEAT_FROM_TO(9, 16, BOOST_GIL_TEST_CALL_SUBIMAGE_TEST, minisblack)
+ BOOST_PP_REPEAT_FROM_TO(17, 27, BOOST_GIL_TEST_CALL_SUBIMAGE_TEST, minisblack)
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp
new file mode 100644
index 000000000..f0c9d9972
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp
@@ -0,0 +1,306 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_FILESYSTEM_VERSION 3
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/mp11.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_image_info()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(tiff_filename, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ fs::path my_path(tiff_filename);
+
+ using backend_t = gil::get_reader_backend<fs::path, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(my_path, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(tiff_filename, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgba8_image_t img;
+ gil::read_image(file, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(tiff_filename, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_and_convert_image_2()
+{
+ gil::gray8_image_t img;
+ gil::read_and_convert_image(tiff_filename, img, gil::tiff_tag());
+
+ gil::rgba8_image_t img2;
+ gil::read_image(tiff_filename, img2, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(
+ gil::const_view(img),
+ gil::color_converted_view<gil::gray8_pixel_t>(gil::const_view(img2))));
+}
+
+void test_read_view()
+{
+ {
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(tiff_filename, gil::view(img), gil::tiff_tag());
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(in, gil::view(img), gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(file, gil::view(img), gil::tiff_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(tiff_filename, gil::view(img), gil::tiff_tag());
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(in, gil::view(img), gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(file, gil::view(img), gil::tiff_tag());
+ }
+}
+
+void test_write_view()
+{
+ auto const b = gil::rgb8_pixel_t(0, 0, 255);
+ auto const g = gil::rgb8_pixel_t(0, 255, 0);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ {
+ std::string filename(tiff_out + "write_test_string.tif");
+
+ gil::write_view(filename, create_mandel_view(320, 240, b, g), gil::tiff_tag());
+ }
+ {
+ std::string filename(tiff_out + "write_test_ofstream.tif");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+
+ gil::write_view(out, create_mandel_view(320, 240, b, g), gil::tiff_tag());
+ }
+ {
+ std::string filename(tiff_out + "write_test_tiff.tif");
+ TIFF* file = TIFFOpen(filename.c_str(), "w");
+
+ gil::write_view(file, create_mandel_view(320, 240, b, g), gil::tiff_tag());
+ }
+ {
+ std::string filename(tiff_out + "write_test_info.tif");
+
+ gil::image_write_info<gil::tiff_tag> info;
+ gil::write_view(filename, create_mandel_view(320, 240, b, g), info);
+ }
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::tiff_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::tiff_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgba8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::tiff_tag());
+
+ // 5. Write out image.
+ std::string filename(tiff_out + "stream_test.tif");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, gil::view(dst), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(tiff_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+ std::istream in(&in_buf);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::tiff_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgba8_image_t, gil::tiff_tag>(
+ tiff_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgba8_image_t, gil::tiff_tag>(
+ tiff_filename, gil::point_t(50, 50), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ // FIXME: This test has been disabled for now because of compilation issues with MSVC10.
+
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t,
+ gil::gray1_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::read_image(tiff_filename.c_str(), image, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "dynamic_image_test.tif", gil::view(image), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_and_convert_image_2();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp
new file mode 100644
index 000000000..c5236de96
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp
@@ -0,0 +1,111 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+void test_read_minisblack_float_tile_and_strip32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-float-strip-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-float-tile-32.tif");
+
+ gil::gray32f_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_minisblack_float_tile_and_strip64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-float-strip-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-float-tile-64.tif");
+
+ // FIXME: boost/gil/extension/io/tiff/detail/is_allowed.hpp:229:49: error: ambiguous partial specializations of 'Format_Type
+ // discovered during https://github.com/boostorg/gil/issues/461
+ //gil::gray64f_image_t img_strip, img_tile;
+ //gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ //gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+ //BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip_planar32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-planar-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-planar-32.tif");
+
+ gil::rgb32f_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip_contig32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-contig-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-contig-32.tif");
+
+ gil::rgb32f_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip_contig64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-contig-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-contig-64.tif");
+
+ // FIXME: boost/gil/extension/io/tiff/detail/is_allowed.hpp:229:49: error: ambiguous partial specializations of 'Format_Type
+ // discovered during https://github.com/boostorg/gil/issues/461
+ //gil::rgb64f_image_t img_strip, img_tile;
+ //gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ //gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+ //BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-planar-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-planar-64.tif");
+
+ // FIXME: boost/gil/extension/io/tiff/detail/is_allowed.hpp:229:49: error: ambiguous partial specializations of 'Format_Type
+ // discovered during https://github.com/boostorg/gil/issues/461
+ //gil::rgb64f_image_t img_strip, img_tile;
+ //gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ //gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+ //BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_minisblack_float_tile_and_strip32();
+ test_read_minisblack_float_tile_and_strip64();
+ test_read_rgb_float_tile_and_strip_planar32();
+ test_read_rgb_float_tile_and_strip_contig32();
+ test_read_rgb_float_tile_and_strip_contig64();
+ test_read_rgb_float_tile_and_strip64();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp
new file mode 100644
index 000000000..9311b4c6e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp
@@ -0,0 +1,47 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack)
+BOOST_PP_REPEAT_FROM_TO(9, 11, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_read_tile_and_compare_with_minisblack_strip_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-08.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-08.tif");
+
+ gil::gray8_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_minisblack_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp
new file mode 100644
index 000000000..2ae10db91
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack )
+BOOST_PP_REPEAT_FROM_TO(17, 21, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack )
+
+void test_read_tile_and_compare_with_minisblack_strip_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-16.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-16.tif");
+
+ gil::gray16_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_minisblack_strip_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp
new file mode 100644
index 000000000..cc166bcf2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp
@@ -0,0 +1,64 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(21, 32, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack )
+
+void test_read_tile_and_compare_with_minisblack_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-32.tif");
+
+ using gray32_pixel_t = gil::pixel<unsigned int, gil::gray_layout_t>;
+ gil::image<gray32_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true);
+}
+
+void test_read_tile_and_compare_with_minisblack_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-64.tif");
+
+ using gray64_pixel_t = gil::pixel<std::uint64_t, gil::gray_layout_t>;
+ gil::image<gray64_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true);
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_minisblack_strip_32();
+ test_read_tile_and_compare_with_minisblack_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp
new file mode 100644
index 000000000..d069d28c2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp
@@ -0,0 +1,56 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8 , GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+BOOST_PP_REPEAT_FROM_TO(9, 11, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_write_minisblack_tile_and_compare_with_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-08.tif");
+
+ gil::gray8_image_t img_strip, img_saved;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_minisblack_tile_and_compare_with_8.tif", gil::view(img_strip), info);
+ gil::read_image(
+ tiff_out + "write_minisblack_tile_and_compare_with_8.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_minisblack_tile_and_compare_with_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp
new file mode 100644
index 000000000..f49f3b8b8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_write_minisblack_tile_and_compare_with_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-16.tif");
+
+ gil::gray16_image_t img_strip, img_saved;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "write_minisblack_tile_and_compare_with_16.tif", gil::view(img_strip), info);
+ gil::read_image(tiff_out + "write_minisblack_tile_and_compare_with_16.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true);
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_minisblack_tile_and_compare_with_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp
new file mode 100644
index 000000000..ff457bc45
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp
@@ -0,0 +1,79 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(21, 32, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_write_tile_and_compare_with_minisblack_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-32.tif");
+
+ using gray32_pixel_t = gil::pixel<unsigned int, gil::gray_layout_t>;
+ gil::image<gray32_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_minisblack_tile_and_compare_with_32.tif", gil::view(img_strip), info);
+ gil::read_image(tiff_out + "write_minisblack_tile_and_compare_with_32.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_write_tile_and_compare_with_minisblack_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-64.tif");
+
+ using gray64_pixel_t = gil::pixel<std::uint64_t, gil::gray_layout_t>;
+ gil::image<gray64_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ write_view(tiff_out + "write_minisblack_tile_and_compare_with_64.tif", gil::view(img_strip), info);
+ gil::read_image(tiff_out + "write_minisblack_tile_and_compare_with_64.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_minisblack_strip_32();
+ test_write_tile_and_compare_with_minisblack_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp
new file mode 100644
index 000000000..c6cb6d1f6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(1, 9, GENERATE_TILE_STRIP_COMPARISON_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp
new file mode 100644
index 000000000..5610b9689
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(9, 17, GENERATE_TILE_STRIP_COMPARISON_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp
new file mode 100644
index 000000000..e5b01296a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(1, 9, GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp
new file mode 100644
index 000000000..345b79dc6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(9, 17, GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp
new file mode 100644
index 000000000..201a799dd
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp
@@ -0,0 +1,114 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_READ_MACROS_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_READ_MACROS_HPP
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff/read.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+
+// TODO: Rename macros to use BOOST_GIL_ prefix. See https://github.com/boostorg/gil/issues/410 ~mloskot
+// TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+#define BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB(n, data) \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(read_tile_and_compare_with_, BOOST_PP_TUPLE_ELEM(2, 0, data)), \
+ BOOST_PP_TUPLE_ELEM(2, 1, data)), \
+ _strip_), \
+ n), \
+ bit_bit_aligned)
+
+#define BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB(z, n, data) \
+ void BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB(n, data)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename_strip( \
+ tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, data)) + \
+ "-strip-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, data)) + "-"); \
+ std::string filename_tile( \
+ tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, data)) + \
+ "-tile-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, data)) + "-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::bit_aligned_image3_type<n, n, n, gil::rgb_layout_t>::type img_strip, img_tile; \
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag()); \
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true); \
+ }
+
+// Special case for minisblack images
+#define BOOST_GIL_TEST_NAME_TILE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK(n, data) \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_CAT(read_tile_and_compare_with_, data), _strip_), n), \
+ bit_bit_aligned)
+
+#define BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK(z, n, data) \
+ void BOOST_GIL_TEST_NAME_TILE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK(n, data)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename_strip(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string filename_tile(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-tile-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img_strip, img_tile; \
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag()); \
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true); \
+ }
+
+// Special case for palette images
+#define BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_PALETTE(n, data) \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_CAT(read_tile_and_compare_with_, data), _strip_), n), \
+ bit)
+
+#define BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_PALETTE(z, n, data) \
+ void BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_PALETTE(n, data)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename_strip(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string filename_tile(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-tile-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::rgb16_image_t img_strip, img_tile; \
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag()); \
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true); \
+ }
+
+#define BOOST_GIL_TEST_CALL_TILE_STRIP_COMPARISON_PALETTE(z, n, data) \
+ BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_PALETTE(n, data);
+
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_READ_MACROS_HPP
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp
new file mode 100644
index 000000000..8f9e09f90
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+BOOST_PP_REPEAT_FROM_TO(9, 11, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+
+void test_read_tile_and_compare_with_rgb_contig_strip_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-08.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-08.tif");
+
+ gil::rgb8_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_contig_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp
new file mode 100644
index 000000000..f82139194
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, contig) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+
+void test_read_tile_and_compare_with_rgb_contig_strip_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-16.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-16.tif");
+
+ gil::rgb16_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_contig_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp
new file mode 100644
index 000000000..13f6a71f5
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, planar) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(21, 32, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+
+void test_read_tile_and_compare_with_rgb_contig_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-32.tif");
+
+ using rgb32_pixel_t = gil::pixel<unsigned int, gil::rgb_layout_t>;
+ gil::image<rgb32_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_tile_and_compare_with_rgb_contig_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-64.tif");
+
+ using rgb64_pixel_t = gil::pixel<std::uint64_t, gil::rgb_layout_t>;
+ gil::image<rgb64_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_contig_strip_32();
+ test_read_tile_and_compare_with_rgb_contig_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp
new file mode 100644
index 000000000..222d036ae
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+BOOST_PP_REPEAT_FROM_TO(9, 11, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+
+void test_write_tile_and_compare_with_rgb_strip_contig_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-08.tif");
+
+ gil::rgb8_image_t img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_8.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_8.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true);
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_rgb_strip_contig_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp
new file mode 100644
index 000000000..257d75811
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+
+void test_write_tile_and_compare_with_rgb_strip_contig_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-16.tif");
+
+ gil::rgb16_image_t img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_16.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_16.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_rgb_strip_contig_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp
new file mode 100644
index 000000000..54ff02819
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp
@@ -0,0 +1,86 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(21, 31, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+
+void test_write_tile_and_compare_with_rgb_strip_contig_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-32.tif");
+
+ using rgb32_pixel_t = gil::pixel<unsigned int, gil::rgb_layout_t>;
+ gil::image<rgb32_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_32.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_32.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_write_tile_and_compare_with_rgb_strip_contig_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-64.tif");
+
+ using rgb64_pixel_t = gil::pixel<std::uint64_t, gil::rgb_layout_t>;
+ gil::image<rgb64_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_64.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_64.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_rgb_strip_contig_32();
+ test_write_tile_and_compare_with_rgb_strip_contig_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp
new file mode 100644
index 000000000..ba54b1647
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, planar) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(1, 8, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+BOOST_PP_REPEAT_FROM_TO(9, 11, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+
+void test_read_tile_and_compare_with_rgb_planar_strip_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-08.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-08.tif");
+
+ gil::rgb8_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_planar_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp
new file mode 100644
index 000000000..69438c8ff
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+
+void test_read_tile_and_compare_with_rgb_planar_strip_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-16.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-16.tif");
+
+ gil::rgb16_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_planar_strip_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp
new file mode 100644
index 000000000..bc5b02f8a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, planar) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(21, 32, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+
+void test_read_tile_and_compare_with_rgb_planar_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-32.tif");
+
+ using rgb32_pixel_t = gil::pixel<unsigned int, gil::rgb_layout_t>;
+ gil::image<rgb32_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_tile_and_compare_with_rgb_planar_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-64.tif");
+
+ using rgb64_pixel_t = gil::pixel<std::uint64_t, gil::rgb_layout_t>;
+ gil::image<rgb64_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_planar_strip_32();
+ test_read_tile_and_compare_with_rgb_planar_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp
new file mode 100644
index 000000000..6a29d1c7a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp
@@ -0,0 +1,84 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+void test_read_info_tile_minisblack_float()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-minisblack-float-tile-16.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_minisblack()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-minisblack-tile-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_palette()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-palette-tile-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_rgb()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-rgb-tile-contig-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_planar()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-rgb-tile-planar-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+int main()
+{
+ test_read_info_tile_minisblack_float();
+ test_read_info_tile_minisblack();
+ test_read_info_tile_palette();
+ test_read_info_tile_rgb();
+ test_read_info_tile_planar();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp
new file mode 100644
index 000000000..2e3fd1147
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp
@@ -0,0 +1,177 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_WRITE_MACROS_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_WRITE_MACROS_HPP
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+
+// TODO: Rename macros to use BOOST_GIL_ prefix. See https://github.com/boostorg/gil/issues/410 ~mloskot
+// TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_RGB(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_rgb_tile_and_compare_with_, data), _strip_), n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-contig-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename += padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image3_type<n, n, n, gil::rgb_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ gil::write_view(tiff_out + filename, gil::view(img_strip), info); \
+ gil::read_image(tiff_out + filename, img_saved, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true); \
+ }
+
+// Special case for minisblack images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_minisblack_tile_and_compare_with_, data), _strip_), \
+ n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ gil::write_view(tiff_out + filename, gil::view(img_strip), info); \
+ gil::read_image(tiff_out + filename, img_saved, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true); \
+ }
+
+// Special case for palette images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_palette_tile_and_compare_with_, data), _strip_), n), \
+ bit)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::rgb16_image_t img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ gil::write_view(tiff_out + filename, gil::view(img_strip), info); \
+ gil::read_image(tiff_out + filename, img_saved, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true); \
+ }
+
+#else
+
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_RGB(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_rgb_tile_and_compare_with_, data), _strip_), n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-contig-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename += padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image3_type<n, n, n, gil::rgb_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ }
+
+// Special case for minisblack images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK(z, n, data) \
+ voidBOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_minisblack_tile_and_compare_with_, data), _strip_), \
+ n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ }
+
+// Special case for palette images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_palette_tile_and_compare_with_, data), _strip_), n), \
+ bit)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::rgb16_image_t img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ }
+
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_WRITE_MACROS_HPP
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp
new file mode 100644
index 000000000..0f97a6e17
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+#include <boost/gil/io/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::tiff_tag>(
+ tiff_out + "rgb_color_space_test.tif", tiff_out + "bgr_color_space_test.tif");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/CMakeLists.txt b/src/boost/libs/gil/test/extension/numeric/CMakeLists.txt
new file mode 100644
index 000000000..4702c52c8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/CMakeLists.txt
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2017 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/numeric")
+
+foreach(_name
+ channel_numeric_operations
+ convolve
+ convolve_2d
+ convolve_cols
+ convolve_rows
+ extend_boundary
+ kernel
+ kernel_fixed
+ matrix3x2
+ pixel_numeric_operations
+ pixel_numeric_operations_float
+ resample)
+ set(_test t_ext_numeric_${_name})
+ set(_target test_ext_numeric_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/extension/numeric/Jamfile b/src/boost/libs/gil/test/extension/numeric/Jamfile
new file mode 100644
index 000000000..9662357c4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/Jamfile
@@ -0,0 +1,28 @@
+# Boost.GIL (Generic Image Library) - Numeric tests
+#
+# Copyright (c) 2013 Christian Henning
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+alias headers : [ generate_self_contained_headers extension/numeric ] ;
+
+compile-fail kernel_1d_fixed_even_size_fail.cpp ;
+
+run channel_numeric_operations.cpp ;
+run convolve.cpp ;
+run convolve_2d.cpp ;
+run convolve_cols.cpp ;
+run convolve_rows.cpp ;
+run extend_boundary.cpp ;
+run kernel.cpp ;
+run kernel_fixed.cpp ;
+run matrix3x2.cpp ;
+run pixel_numeric_operations.cpp ;
+run pixel_numeric_operations_float.cpp ;
+run resample.cpp ;
+
diff --git a/src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp b/src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp
new file mode 100644
index 000000000..4f75cbbc6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp
@@ -0,0 +1,484 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/channel_numeric_operations.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+#include "core/channel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_plus_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_plus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_integer_same_types{});
+ }
+};
+
+struct test_plus_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_plus_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel1_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_plus_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel2_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_integer_mixed_types{});
+ }
+};
+
+struct test_plus_integer_signed_types_with_overflow
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ // Signed integer overflow is UB, so just check addition does not yield mathematically
+ // expected value but is constrained by the range of representable values for given type.
+
+ auto const max_value = gil::channel_traits<channel_t>::max_value();
+ gil::channel_plus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_NE(f(max_value, 1), std::int64_t(max_value) + 1);
+ BOOST_TEST_NE(f(max_value, max_value), std::int64_t(max_value) + max_value);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_signed_types>(test_plus_integer_signed_types_with_overflow{});
+ }
+};
+
+struct test_plus_integer_unsigned_types_with_wraparound
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ // The C Standard, 6.2.5, paragraph 9 [ISO/IEC 9899:2011], states:
+ // A computation involving unsigned operands can never overflow, because a result that
+ // cannot be represented by the resulting unsigned integer type is reduced modulo the number
+ // that is one greater than the largest value that can be represented by the resulting type.
+
+ auto const max_value = gil::channel_traits<channel_t>::max_value();
+ auto const min_value = gil::channel_traits<channel_t>::min_value();
+ gil::channel_plus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(max_value, 1), min_value);
+ BOOST_TEST_EQ(f(max_value, max_value), max_value - 1);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_unsigned_types>(test_plus_integer_unsigned_types_with_wraparound{});
+ }
+};
+
+struct test_minus_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_minus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_integer_same_types{});
+ }
+};
+
+struct test_minus_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_minus_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel1_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_minus_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel2_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_integer_mixed_types{});
+ }
+};
+
+struct test_multiplies_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_multiplies_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_integer_same_types{});
+ }
+};
+
+struct test_multiplies_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_multiplies_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel1_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_multiplies_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel2_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_integer_mixed_types{});
+ }
+};
+
+struct test_divides_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_divides_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_integer_same_types{});
+ }
+};
+
+struct test_divides_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_divides_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel1_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_divides_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel2_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_integer_mixed_types{});
+ }
+};
+
+struct test_plus_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_plus_scalar_t<channel_t, int, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_scalar_integer_same_types{});
+ }
+};
+
+struct test_plus_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t;
+ gil::channel_plus_scalar_t<channel_t, int, channel_result_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_result_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_result_t(127));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_minus_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_minus_scalar_t<channel_t, int, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_scalar_integer_same_types{});
+ }
+};
+
+struct test_minus_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t;
+ gil::channel_minus_scalar_t<channel_t, int, std::uint8_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_result_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_result_t(73));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_multiplies_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_multiplies_scalar_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_scalar_integer_same_types{});
+ }
+};
+
+struct test_multiplies_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t;
+ gil::channel_multiplies_scalar_t<channel_t, int, channel_result_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_result_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_result_t(8));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_divides_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_divides_scalar_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_scalar_integer_same_types{});
+ }
+};
+
+struct test_divides_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_divides_scalar_t<channel_t, int, channel_result_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_halves_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_halves_t<channel_t> f;
+ {
+ channel_t c(0);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ {
+ channel_t c(2);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(1));
+ }
+ {
+ channel_t c(4);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(2));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_halves_integer_same_types{});
+ }
+};
+
+struct test_zeros_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_zeros_t<channel_t> f;
+ {
+ channel_t c(0);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ {
+ channel_t c(2);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ {
+ channel_t c(4);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_zeros_integer_same_types{});
+ }
+};
+
+struct test_assigns_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_assigns_t<channel_t, channel_t> f;
+ {
+ channel_t c1(10);
+ channel_t c2(20);
+ f(c1, c2);
+ BOOST_TEST_EQ(c2, c1);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_assigns_integer_same_types{});
+ }
+};
+
+int main()
+{
+ test_plus_integer_same_types::run();
+ test_plus_integer_mixed_types::run();
+ test_plus_integer_signed_types_with_overflow::run();
+ test_plus_integer_unsigned_types_with_wraparound::run();
+
+ test_minus_integer_same_types::run();
+ test_minus_integer_mixed_types::run();
+
+ test_multiplies_integer_same_types::run();
+ test_multiplies_integer_mixed_types::run();
+
+ test_divides_integer_same_types::run();
+ test_divides_integer_mixed_types::run();
+
+ test_plus_scalar_integer_same_types::run();
+ test_plus_scalar_integer_mixed_types::run();
+
+ test_minus_scalar_integer_same_types::run();
+ test_minus_scalar_integer_mixed_types::run();
+
+ test_multiplies_scalar_integer_same_types::run();
+ test_multiplies_scalar_integer_mixed_types::run();
+
+ test_divides_scalar_integer_same_types::run();
+ test_divides_scalar_integer_mixed_types::run();
+
+ test_halves_integer_same_types::run();
+ test_zeros_integer_same_types::run();
+ test_assigns_integer_same_types::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve.cpp b/src/boost/libs/gil/test/extension/numeric/convolve.cpp
new file mode 100644
index 000000000..7fe008ea0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve.cpp
@@ -0,0 +1,121 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_fixture.hpp"
+#include "core/test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_image_1x1_kernel_1x1_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ image_t img_out(img);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({1});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+
+ // 1x1 kernel reduces convolution to multiplication
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_1x1_identity{});
+ }
+};
+
+struct test_image_1x1_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<Image>(1, 1, 7);
+ image_t img_out(img);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_3x3_identity{});
+ }
+};
+
+struct test_image_3x3_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const img = fixture::generate_image<image_t>(3, 3, fixture::random_value<channel_t>{});
+ image_t img_out(img);
+
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img), gil::const_view(img_out)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_3x3_kernel_3x3_identity{});
+ }
+};
+
+struct test_image_5x5_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const img = fixture::generate_image<image_t>(5, 5, fixture::random_value<channel_t>{});
+ image_t img_out(img);
+
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+ // TODO: Test different boundary options
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img), gil::const_view(img_out)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_5x5_kernel_3x3_identity{});
+ }
+};
+
+int main()
+{
+ test_image_1x1_kernel_1x1_identity::run();
+ test_image_1x1_kernel_3x3_identity::run();
+ test_image_3x3_kernel_3x3_identity::run();
+ test_image_5x5_kernel_3x3_identity::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp b/src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp
new file mode 100644
index 000000000..fbfce5f96
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstddef>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+std::uint8_t output[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 0, 56, 85, 141, 85, 56, 0, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+void test_convolve_2d_with_normalized_mean_filter()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(img), 9);
+
+ gil::image<gil::gray8_pixel_t> temp_img(src_view.width(), src_view.height());
+ typename gil::image<gil::gray8_pixel_t>::view_t temp_view = view(temp_img);
+ gil::gray8_view_t dst_view(temp_view);
+
+ std::vector<float> v(9, 1.0f / 9.0f);
+ gil::detail::kernel_2d<float> kernel(v.begin(), v.size(), 1, 1);
+
+ gil::detail::convolve_2d(src_view, kernel, dst_view);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(output), 9);
+
+ BOOST_TEST(gil::equal_pixels(out_view, dst_view));
+}
+
+int main()
+{
+ test_convolve_2d_with_normalized_mean_filter();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp b/src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp
new file mode 100644
index 000000000..c9e5576db
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_image_1x1_kernel_1x1_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({1});
+ gil::convolve_cols<pixel_t>(const_view(img), kernel, view(img_out));
+
+ // 1x1 kernel reduces convolution to multiplication
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_1x1_identity{});
+ }
+};
+
+struct test_image_1x1_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::convolve_cols<pixel_t>(const_view(img), kernel, view(img_out));
+
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_3x3_identity{});
+ }
+};
+
+int main()
+{
+ test_image_1x1_kernel_1x1_identity::run();
+ test_image_1x1_kernel_3x3_identity::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp b/src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp
new file mode 100644
index 000000000..d9b735479
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_image_1x1_kernel_1x1_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({1});
+ gil::convolve_rows<pixel_t>(const_view(img), kernel, view(img_out));
+
+ // 1x1 kernel reduces convolution to multiplication
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_1x1_identity{});
+ }
+};
+
+struct test_image_1x1_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::convolve_rows<pixel_t>(const_view(img), kernel, view(img_out));
+
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_3x3_identity{});
+ }
+};
+
+int main()
+{
+ test_image_1x1_kernel_1x1_identity::run();
+ test_image_1x1_kernel_3x3_identity::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp b/src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp
new file mode 100644
index 000000000..f432ad69b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp
@@ -0,0 +1,252 @@
+//
+// Copyright 2019 Pranam Lashkari <plashkari628@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/algorithm.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 0, 0, 0, 0, 0, 0, 0, 32,
+ 11, 0, 255, 0, 0, 0, 255, 0, 31,
+ 12, 0, 0, 255, 0, 255, 0, 0, 30,
+ 13, 0, 0, 0, 255, 0, 0, 0, 29,
+ 14, 0, 0, 255, 0, 255, 0, 0, 28,
+ 15, 0, 255, 0, 0, 0, 255, 0, 27,
+ 16, 0, 0, 0, 0, 0, 0, 0, 26,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25
+};
+
+std::uint8_t row_output_constant[] =
+{
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 0, 0, 0, 0, 0, 0, 0, 32,
+ 11, 0, 255, 0, 0, 0, 255, 0, 31,
+ 12, 0, 0, 255, 0, 255, 0, 0, 30,
+ 13, 0, 0, 0, 255, 0, 0, 0, 29,
+ 14, 0, 0, 255, 0, 255, 0, 0, 28,
+ 15, 0, 255, 0, 0, 0, 255, 0, 27,
+ 16, 0, 0, 0, 0, 0, 0, 0, 26,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25
+};
+
+std::uint8_t row_output_zero[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 0, 0, 0, 0, 0, 0, 0, 32,
+ 11, 0, 255, 0, 0, 0, 255, 0, 31,
+ 12, 0, 0, 255, 0, 255, 0, 0, 30,
+ 13, 0, 0, 0, 255, 0, 0, 0, 29,
+ 14, 0, 0, 255, 0, 255, 0, 0, 28,
+ 15, 0, 255, 0, 0, 0, 255, 0, 27,
+ 16, 0, 0, 0, 0, 0, 0, 0, 26,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+std::uint8_t col_output_constant[] =
+{
+ 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9,
+ 10, 10, 0, 0, 0, 0, 0, 0, 0, 32, 32,
+ 11, 11, 0, 255, 0, 0, 0, 255, 0, 31, 31,
+ 12, 12, 0, 0, 255, 0, 255, 0, 0, 30, 30,
+ 13, 13, 0, 0, 0, 255, 0, 0, 0, 29, 29,
+ 14, 14, 0, 0, 255, 0, 255, 0, 0, 28, 28,
+ 15, 15, 0, 255, 0, 0, 0, 255, 0, 27, 27,
+ 16, 16, 0, 0, 0, 0, 0, 0, 0, 26, 26,
+ 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25
+};
+
+std::uint8_t col_output_zero[] =
+{
+ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0,
+ 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,
+ 0, 0, 11, 0, 255, 0, 0, 0, 255, 0, 31, 0, 0,
+ 0, 0, 12, 0, 0, 255, 0, 255, 0, 0, 30, 0, 0,
+ 0, 0, 13, 0, 0, 0, 255, 0, 0, 0, 29, 0, 0,
+ 0, 0, 14, 0, 0, 255, 0, 255, 0, 0, 28, 0, 0,
+ 0, 0, 15, 0, 255, 0, 0, 0, 255, 0, 27, 0, 0,
+ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0,
+ 0, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0
+};
+
+std::uint8_t boundary_output_constant[] =
+{
+ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9,
+ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9,
+ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9,
+ 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32,
+ 11, 11, 11, 0, 255, 0, 0, 0, 255, 0, 31, 31, 31,
+ 12, 12, 12, 0, 0, 255, 0, 255, 0, 0, 30, 30, 30,
+ 13, 13, 13, 0, 0, 0, 255, 0, 0, 0, 29, 29, 29,
+ 14, 14, 14, 0, 0, 255, 0, 255, 0, 0, 28, 28, 28,
+ 15, 15, 15, 0, 255, 0, 0, 0, 255, 0, 27, 27, 27,
+ 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26,
+ 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25,
+ 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25,
+ 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25
+};
+
+std::uint8_t boundary_output_zero[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0,
+ 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,
+ 0, 0, 11, 0, 255, 0, 0, 0, 255, 0, 31, 0, 0,
+ 0, 0, 12, 0, 0, 255, 0, 255, 0, 0, 30, 0, 0,
+ 0, 0, 13, 0, 0, 0, 255, 0, 0, 0, 29, 0, 0,
+ 0, 0, 14, 0, 0, 255, 0, 255, 0, 0, 28, 0, 0,
+ 0, 0, 15, 0, 255, 0, 0, 0, 255, 0, 27, 0, 0,
+ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0,
+ 0, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+void test_extend_row_with_constant()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 13, reinterpret_cast<const gil::gray8_pixel_t *>(row_output_constant), 9);
+
+ auto output = gil::extend_row(src_view, 2, gil::boundary_option::extend_constant);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_row_with_zero()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 15, reinterpret_cast<const gil::gray8_pixel_t *>(row_output_zero), 9);
+
+ auto output = gil::extend_row(src_view, 3, gil::boundary_option::extend_zero);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_row_with_padded()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ auto src_sub_view = gil::subimage_view(src_view, 0, 1, 9, 7);
+
+ auto output = gil::extend_row(src_sub_view, 1, gil::boundary_option::extend_padded);
+
+ BOOST_TEST(gil::equal_pixels(src_view, gil::view(output)));
+}
+
+void test_extend_col_with_constant()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(11, 9, reinterpret_cast<const gil::gray8_pixel_t *>(col_output_constant), 11);
+
+ auto output = gil::extend_col(src_view, 1, gil::boundary_option::extend_constant);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_col_with_zero()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(13, 9, reinterpret_cast<const gil::gray8_pixel_t *>(col_output_zero), 13);
+
+ auto output = gil::extend_col(src_view, 2, gil::boundary_option::extend_zero);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_col_with_padded()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ auto src_sub_view = gil::subimage_view(src_view, 1, 0, 7, 9);
+
+ auto output = gil::extend_col(src_sub_view, 1, gil::boundary_option::extend_padded);
+
+ BOOST_TEST(gil::equal_pixels(src_view, gil::view(output)));
+}
+
+void test_extend_img_with_constant()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(13, 13, reinterpret_cast<const gil::gray8_pixel_t *>(boundary_output_constant), 13);
+
+ auto output = gil::extend_boundary(src_view, 2, gil::boundary_option::extend_constant);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_img_with_zero()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(13, 13, reinterpret_cast<const gil::gray8_pixel_t *>(boundary_output_zero), 13);
+
+ auto output = gil::extend_boundary(src_view, 2, gil::boundary_option::extend_zero);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_img_with_padded()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ auto src_sub_view = gil::subimage_view(src_view, 1, 1, 7, 7);
+
+ auto output = gil::extend_boundary(src_sub_view, 1, gil::boundary_option::extend_padded);
+
+ BOOST_TEST(gil::equal_pixels(src_view, gil::view(output)));
+}
+
+int main()
+{
+ test_extend_row_with_constant();
+ test_extend_row_with_zero();
+ test_extend_row_with_padded();
+ test_extend_col_with_constant();
+ test_extend_col_with_zero();
+ test_extend_col_with_padded();
+ test_extend_img_with_constant();
+ test_extend_img_with_zero();
+ test_extend_img_with_padded();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/kernel.cpp b/src/boost/libs/gil/test/extension/numeric/kernel.cpp
new file mode 100644
index 000000000..c60e570a6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/kernel.cpp
@@ -0,0 +1,174 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_DISABLE_ASSERTS 1 // kernel_1d_adaptor assertions are too strict
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <vector>
+
+namespace gil = boost::gil;
+
+void test_kernel_1d_default_constructor()
+{
+ gil::kernel_1d<int> k;
+ BOOST_TEST_EQ(k.center(), 0);
+ BOOST_TEST_EQ(k.left_size(), 0);
+ BOOST_TEST_EQ(static_cast<int>(k.right_size()), -1);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 0);
+}
+
+void test_kernel_2d_default_constructor()
+{
+ gil::detail::kernel_2d<int> k;
+ BOOST_TEST_EQ(k.center_y(), 0);
+ BOOST_TEST_EQ(k.center_x(), 0);
+
+ //BOOST_TEST_EQ(k.left_size(), 0);
+ //BOOST_TEST_EQ(k.right_size(), -1);
+ BOOST_TEST_EQ(k.upper_size(), 0);
+ BOOST_TEST_EQ(static_cast<int>(k.lower_size()), -1);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 0);
+}
+
+void test_kernel_1d_parameterized_constructor()
+{
+ gil::kernel_1d<int> k(9, 4);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_parameterized_constructor()
+{
+ gil::detail::kernel_2d<int> k(9, 4, 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_parameterized_constructor_with_iterator()
+{
+ std::vector<int> v(9);
+ gil::kernel_1d<int> k(v.cbegin(), v.size(), 4);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_parameterized_constructor_with_iterator()
+{
+ std::vector<int> v(81);
+ gil::detail::kernel_2d<int> k(v.cbegin(), v.size(), 4, 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_copy_constructor()
+{
+ gil::kernel_1d<int> d(9, 4);
+ gil::kernel_1d<int> k(d);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_copy_constructor()
+{
+ gil::detail::kernel_2d<int> d(9, 4, 4);
+ gil::detail::kernel_2d<int> k(d);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_assignment_operator()
+{
+ gil::kernel_1d<int> d(9, 4);
+ gil::kernel_1d<int> k;
+ k = d;
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_assignment_operator()
+{
+ gil::detail::kernel_2d<int> d(9, 4, 4);
+ gil::detail::kernel_2d<int> k;
+ k = d;
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_reverse_kernel()
+{
+ gil::kernel_1d<int> d(12, 4);
+ BOOST_TEST_EQ(d.center(), 4);
+ auto k = gil::reverse_kernel(d);
+ BOOST_TEST_EQ(k.center(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+int main()
+{
+ test_kernel_1d_default_constructor();
+ test_kernel_2d_default_constructor();
+ test_kernel_1d_parameterized_constructor();
+ test_kernel_2d_parameterized_constructor();
+ test_kernel_1d_parameterized_constructor_with_iterator();
+ test_kernel_2d_parameterized_constructor_with_iterator();
+ test_kernel_1d_copy_constructor();
+ test_kernel_2d_copy_constructor();
+ test_kernel_1d_assignment_operator();
+ test_kernel_2d_assignment_operator();
+ test_kernel_1d_reverse_kernel();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp b/src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp
new file mode 100644
index 000000000..a8be85fcd
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp
@@ -0,0 +1,16 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/numeric/kernel.hpp>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ gil::kernel_1d_fixed<int, 0> k0;
+ gil::kernel_1d_fixed<int, 4> k4;
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp b/src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp
new file mode 100644
index 000000000..cfd075eaf
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp
@@ -0,0 +1,183 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_DISABLE_ASSERTS 1 // kernel_1d_adaptor assertions are too strict
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <vector>
+
+namespace gil = boost::gil;
+
+void test_kernel_1d_fixed_default_constructor()
+{
+ gil::kernel_1d_fixed<int, 9> k;
+ BOOST_TEST_EQ(k.center(), 0);
+ BOOST_TEST_EQ(k.left_size(), 0);
+ BOOST_TEST_EQ(k.right_size(), 8); // TODO: Why not 0 or -1 if not set?
+ // std::array interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_fixed_default_constructor()
+{
+ gil::detail::kernel_2d_fixed<int, 9> k;
+ BOOST_TEST_EQ(k.center_x(), 0);
+ BOOST_TEST_EQ(k.center_y(), 0);
+ BOOST_TEST_EQ(k.left_size(), 0);
+ BOOST_TEST_EQ(k.right_size(), 8); // TODO: Why not 0 or -1 if not set?
+ BOOST_TEST_EQ(k.upper_size(), 0);
+ BOOST_TEST_EQ(k.lower_size(), 8);
+ // std::array interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_fixed_parameterized_constructor()
+{
+ gil::kernel_1d_fixed<int, 9> k(4);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_fixed_parameterized_constructor()
+{
+ gil::detail::kernel_2d_fixed<int, 9> k(4, 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_fixed_parameterized_constructor_with_iterator()
+{
+ // FIXME: The constructor should throw if v.size() < k.size()
+ std::vector<int> v(9);
+ gil::kernel_1d_fixed<int, 9> k(v.cbegin(), 4);
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_fixed_parameterized_constructor_with_iterator()
+{
+// // FIXME: The constructor should throw if v.size() < k.size()
+ std::array<int, 81> v;
+ gil::detail::kernel_2d_fixed<int, 9> k(v.cbegin(), 4, 4);
+ BOOST_TEST_EQ((gil::detail::kernel_2d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_fixed_copy_constructor()
+{
+ gil::kernel_1d_fixed<int, 9> d(4);
+ gil::kernel_1d_fixed<int, 9> k(d);
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_fixed_copy_constructor()
+{
+ gil::detail::kernel_2d_fixed<int, 9> d(4, 4);
+ gil::detail::kernel_2d_fixed<int, 9> k(d);
+ BOOST_TEST_EQ((gil::detail::kernel_2d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_fixed_assignment_operator()
+{
+ gil::kernel_1d_fixed<int, 9> d(4);
+ gil::kernel_1d_fixed<int, 9> k;
+ k = d;
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_fixed_assignment_operator()
+{
+ gil::detail::kernel_2d_fixed<int, 9> d(4, 4);
+ gil::detail::kernel_2d_fixed<int, 9> k;
+ k = d;
+ BOOST_TEST_EQ((gil::detail::kernel_2d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_fixed_reverse_kernel()
+{
+ std::array<int, 3> values = {{1, 2, 3}};
+ gil::kernel_1d_fixed<int, 3> k(values.begin(), 1);
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 3>::static_size), 3);
+ BOOST_TEST_ALL_EQ(k.begin(), k.end(), values.begin(), values.end());
+
+ std::array<int, 3> values_rev = {{3, 2, 1}};
+ auto const k_rev = gil::reverse_kernel(k);
+ BOOST_TEST_ALL_EQ(k_rev.begin(), k_rev.end(), values_rev.begin(), values_rev.end());
+}
+
+int main()
+{
+ test_kernel_1d_fixed_default_constructor();
+ test_kernel_2d_fixed_default_constructor();
+ test_kernel_1d_fixed_parameterized_constructor();
+ test_kernel_2d_fixed_parameterized_constructor();
+ test_kernel_1d_fixed_parameterized_constructor_with_iterator();
+ test_kernel_2d_fixed_parameterized_constructor_with_iterator();
+ test_kernel_1d_fixed_copy_constructor();
+ test_kernel_2d_fixed_copy_constructor();
+ test_kernel_1d_fixed_assignment_operator();
+ test_kernel_2d_fixed_assignment_operator();
+ test_kernel_1d_fixed_reverse_kernel();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp b/src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp
new file mode 100644
index 000000000..f1c19cd04
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp
@@ -0,0 +1,191 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/affine.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+namespace {
+constexpr double HALF_PI = 1.57079632679489661923;
+}
+
+void test_matrix3x2_default_constructor()
+{
+ gil::matrix3x2<int> m1;
+ BOOST_TEST_EQ(m1.a, 1);
+ BOOST_TEST_EQ(m1.b, 0);
+ BOOST_TEST_EQ(m1.c, 0);
+ BOOST_TEST_EQ(m1.d, 1);
+ BOOST_TEST_EQ(m1.e, 0);
+ BOOST_TEST_EQ(m1.f, 0);
+}
+
+void test_matrix3x2_parameterized_constructor()
+{
+ gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
+ BOOST_TEST_EQ(m1.a, 1);
+ BOOST_TEST_EQ(m1.b, 2);
+ BOOST_TEST_EQ(m1.c, 3);
+ BOOST_TEST_EQ(m1.d, 4);
+ BOOST_TEST_EQ(m1.e, 5);
+ BOOST_TEST_EQ(m1.f, 6);
+}
+
+void test_matrix3x2_copy_constructor()
+{
+ gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
+ gil::matrix3x2<int> m2(m1);
+ BOOST_TEST_EQ(m2.a, 1);
+ BOOST_TEST_EQ(m2.b, 2);
+ BOOST_TEST_EQ(m2.c, 3);
+ BOOST_TEST_EQ(m2.d, 4);
+ BOOST_TEST_EQ(m2.e, 5);
+ BOOST_TEST_EQ(m2.f, 6);
+}
+
+void test_matrix3x2_assignment_operator()
+{
+ gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
+ gil::matrix3x2<int> m2;
+ m2 = m1;
+ BOOST_TEST_EQ(m2.a, 1);
+ BOOST_TEST_EQ(m2.b, 2);
+ BOOST_TEST_EQ(m2.c, 3);
+ BOOST_TEST_EQ(m2.d, 4);
+ BOOST_TEST_EQ(m2.e, 5);
+ BOOST_TEST_EQ(m2.f, 6);
+}
+
+void test_matrix3x2_multiplication_assignment()
+{
+ gil::matrix3x2<int> m1;
+ gil::matrix3x2<int> m2;
+ m2 *= m1;
+ BOOST_TEST_EQ(m2.a, 1);
+ BOOST_TEST_EQ(m2.b, 0);
+ BOOST_TEST_EQ(m2.c, 0);
+ BOOST_TEST_EQ(m2.d, 1);
+ BOOST_TEST_EQ(m2.e, 0);
+ BOOST_TEST_EQ(m2.f, 0);
+
+ gil::matrix3x2<int> m3(0, 0, 0, 0, 0, 0);
+ m2 *= m3;
+ BOOST_TEST_EQ(m2.a, 0);
+ BOOST_TEST_EQ(m2.b, 0);
+ BOOST_TEST_EQ(m2.c, 0);
+ BOOST_TEST_EQ(m2.d, 0);
+ BOOST_TEST_EQ(m2.e, 0);
+ BOOST_TEST_EQ(m2.f, 0);
+}
+
+void test_matrix3x2_matrix3x2_multiplication()
+{
+ gil::matrix3x2<int> m1;
+ gil::matrix3x2<int> m2(0, 0, 0, 0, 0, 0);
+ gil::matrix3x2<int> m3;
+ m3 = m1 * m2;
+ BOOST_TEST_EQ(m3.a, 0);
+ BOOST_TEST_EQ(m3.b, 0);
+ BOOST_TEST_EQ(m3.c, 0);
+ BOOST_TEST_EQ(m3.d, 0);
+ BOOST_TEST_EQ(m3.e, 0);
+ BOOST_TEST_EQ(m3.f, 0);
+}
+
+void test_matrix3x2_vector_multiplication()
+{
+ gil::matrix3x2<int> m1;
+ gil::point<int> v1{2, 4};
+
+ gil::point<int> v2 = v1 * m1;
+ BOOST_TEST_EQ(v2.x, 2);
+ BOOST_TEST_EQ(v2.y, 4);
+
+ gil::point<int> v3 = gil::transform(m1, v1);
+ BOOST_TEST_EQ(v3.x, 2);
+ BOOST_TEST_EQ(v3.y, 4);
+}
+
+void test_matrix3x2_get_rotate()
+{
+ auto m1 = gil::matrix3x2<double>::get_rotate(HALF_PI);
+ BOOST_GIL_TEST_IS_CLOSE(m1.a, std::cos(HALF_PI), 0.03);
+ BOOST_TEST_EQ(m1.b, 1);
+ BOOST_TEST_EQ(m1.c, -1);
+ BOOST_GIL_TEST_IS_CLOSE(m1.d, std::cos(HALF_PI), 0.03);
+ BOOST_TEST_EQ(m1.e, 0);
+ BOOST_TEST_EQ(m1.f, 0);
+}
+
+void test_matrix3x2_get_scale()
+{
+ gil::matrix3x2<int> m1;
+ m1 = gil::matrix3x2<int>::get_scale(2);
+ BOOST_TEST_EQ(m1.a, 2);
+ BOOST_TEST_EQ(m1.b, 0);
+ BOOST_TEST_EQ(m1.c, 0);
+ BOOST_TEST_EQ(m1.d, 2);
+ BOOST_TEST_EQ(m1.e, 0);
+ BOOST_TEST_EQ(m1.f, 0);
+ m1 = gil::matrix3x2<int>::get_scale(2, 4);
+ BOOST_TEST_EQ(m1.a, 2);
+ BOOST_TEST_EQ(m1.d, 4);
+ m1 = gil::matrix3x2<int>::get_scale(gil::point<int>{4, 8});
+ BOOST_TEST_EQ(m1.a, 4);
+ BOOST_TEST_EQ(m1.d, 8);
+}
+
+void test_matrix3x2_get_translate()
+{
+ gil::matrix3x2<int> m1;
+ m1 = gil::matrix3x2<int>::get_translate(2, 4);
+ BOOST_TEST_EQ(m1.a, 1);
+ BOOST_TEST_EQ(m1.b, 0);
+ BOOST_TEST_EQ(m1.c, 0);
+ BOOST_TEST_EQ(m1.d, 1);
+ BOOST_TEST_EQ(m1.e, 2);
+ BOOST_TEST_EQ(m1.f, 4);
+ m1 = gil::matrix3x2<int>::get_translate(gil::point<int>{4, 8});
+ BOOST_TEST_EQ(m1.e, 4);
+ BOOST_TEST_EQ(m1.f, 8);
+}
+
+void test_matrix3x2_transform()
+{
+ gil::matrix3x2<int> m1;
+ gil::point<int> v1{2, 4};
+ gil::point<int> v2 = gil::transform(m1, v1);
+ BOOST_TEST_EQ(v2.x, 2);
+ BOOST_TEST_EQ(v2.y, 4);
+}
+
+int main()
+{
+ test_matrix3x2_default_constructor();
+ test_matrix3x2_parameterized_constructor();
+ test_matrix3x2_copy_constructor();
+ test_matrix3x2_assignment_operator();
+ test_matrix3x2_multiplication_assignment();
+ test_matrix3x2_matrix3x2_multiplication();
+ test_matrix3x2_vector_multiplication();
+ test_matrix3x2_get_rotate();
+ test_matrix3x2_get_scale();
+ test_matrix3x2_get_translate();
+ test_matrix3x2_transform();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp
new file mode 100644
index 000000000..5f18ebfbb
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp
@@ -0,0 +1,343 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/pixel_numeric_operations.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+#include "core/test_fixture.hpp" // random_value
+#include "core/pixel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_plus_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_plus_t<pixel_t, pixel_t, pixel_t> f;
+ {
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, p0), p0);
+ }
+ {
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ pixel_t r2;
+ gil::static_fill(r2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p1, p1), r2);
+ }
+ {
+ // Generates pixels with consecutive channel values: {1} or {1,2,3} or {1,2,3,4} etc.
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ auto const r = f(p, p);
+ BOOST_TEST_NE(r, p);
+ BOOST_TEST_EQ(gil::at_c<0>(r), (gil::at_c<0>(p) + gil::at_c<0>(p)));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_plus_integer_same_types{});
+ }
+};
+
+struct test_minus_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_minus_t<pixel_t, pixel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, p0), p0);
+ {
+ pixel_t p1, p2;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ pixel_t r1;
+ gil::static_fill(r1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p2, p1), r1);
+ }
+ {
+ // Generates pixels with consecutive channel values: {1} or {1,2,3} or {1,2,3,4} etc.
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ BOOST_TEST_EQ(f(p, p), p0);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_minus_integer_same_types{});
+ }
+};
+
+struct test_pixel_multiplies_scalar_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_multiplies_scalar_t<pixel_t, channel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, 0), p0);
+
+ {
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p1, 0), p0);
+ BOOST_TEST_EQ(f(p1, 1), p1);
+ }
+ {
+ // Generates pixels with consecutive channel values: {1} or {1,2,3} or {1,2,3,4} etc.
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+
+ // check first channel value is doubled
+ auto const r = f(p, 2);
+ BOOST_TEST_NE(r, p);
+ BOOST_TEST_EQ(gil::at_c<0>(r), (gil::at_c<0>(p) * 2));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_multiplies_scalar_integer_same_types{});
+ }
+};
+
+struct test_pixel_multiply_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_multiply_t<pixel_t, pixel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, p0), p0);
+
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p1, p1), p1);
+
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p1, p2), p2);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_multiply_integer_same_types{});
+ }
+};
+
+struct test_pixel_divides_scalar_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_divides_scalar_t<pixel_t, channel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, 1), p0);
+
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p1, 1), p1);
+
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p2, 2), p1);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_divides_scalar_integer_same_types{});
+ }
+};
+
+struct test_pixel_divide_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_divide_t<pixel_t, pixel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p0, p1), p0);
+ BOOST_TEST_EQ(f(p1, p1), p1);
+
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p2, p1), p2);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_divide_integer_same_types{});
+ }
+};
+
+struct test_pixel_halves_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_halves_t<pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+
+ {
+ auto p = p0;
+ BOOST_TEST_EQ(f(p), p0);
+ }
+ {
+ auto p = p1;
+ BOOST_TEST_EQ(f(p), p0); // truncates toward Zero
+ }
+ {
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p2), p1);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_halves_integer_same_types{});
+ }
+};
+
+struct test_pixel_zeros_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_zeros_t<pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ {
+ auto p = p0;
+ BOOST_TEST_EQ(f(p), p0);
+ }
+ {
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ BOOST_TEST_EQ(f(p), p0);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_zeros_integer_same_types{});
+ }
+};
+
+struct test_zero_channels_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ {
+ auto p = p0;
+ gil::zero_channels(p);
+ BOOST_TEST_EQ(p, p0);
+ }
+ {
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ gil::zero_channels(p);
+ BOOST_TEST_EQ(p, p0);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_zero_channels_integer_same_types{});
+ }
+};
+
+struct test_pixel_assigns_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_assigns_t<pixel_t, pixel_t> f;
+
+ {
+ pixel_t p0, r;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ f(p0, r);
+ BOOST_TEST_EQ(p0, r);
+ }
+ {
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p, r;
+ gil::static_generate(p, [&g]() { return g(); });
+ f(p, r);
+ BOOST_TEST_EQ(p, r);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_assigns_integer_same_types{});
+ }
+};
+int main()
+{
+ test_plus_integer_same_types::run();
+ test_minus_integer_same_types::run();
+ test_pixel_multiplies_scalar_integer_same_types::run();
+ test_pixel_multiply_integer_same_types::run();
+ test_pixel_divides_scalar_integer_same_types::run();
+ test_pixel_divide_integer_same_types::run();
+ test_pixel_halves_integer_same_types::run();
+ test_pixel_zeros_integer_same_types::run();
+ test_zero_channels_integer_same_types::run();
+ test_pixel_assigns_integer_same_types::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp
new file mode 100644
index 000000000..79caa7a75
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp
@@ -0,0 +1,97 @@
+//
+// Copyright 2013 Krzysztof Czainski
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+void test_plus()
+{
+ gil::rgb8_pixel_t a(10, 20, 30);
+ gil::bgr8_pixel_t b(30, 20, 10);
+
+ gil::pixel_plus_t<gil::rgb8_pixel_t, gil::bgr8_pixel_t, gil::rgb8_pixel_t> op;
+ gil::rgb8_pixel_t c = op(a, b);
+
+ BOOST_TEST_EQ(get_color(c, gil::red_t()), 20);
+ BOOST_TEST_EQ(get_color(c, gil::green_t()), 40);
+ BOOST_TEST_EQ(get_color(c, gil::blue_t()), 60);
+
+ gil::pixel_plus_t<gil::rgb8_pixel_t, gil::bgr8_pixel_t, gil::bgr8_pixel_t> op2;
+ gil::bgr8_pixel_t d = op2(a, b);
+
+ BOOST_TEST_EQ(get_color(d, gil::red_t()), 20);
+ BOOST_TEST_EQ(get_color(d, gil::green_t()), 40);
+ BOOST_TEST_EQ(get_color(d, gil::blue_t()), 60);
+}
+
+void test_multiply()
+{
+ gil::rgb32f_pixel_t a(1.f, 2.f, 3.f);
+ gil::bgr32f_pixel_t b(2.f, 2.f, 2.f);
+
+ gil::pixel_multiply_t<
+ gil::rgb32f_pixel_t, gil::bgr32f_pixel_t, gil::rgb32f_pixel_t>
+ op;
+ gil::rgb32f_pixel_t c = op(a, b);
+
+ float epsilon = 1e-6f;
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::red_t()), 2.f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::green_t()), 4.f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::blue_t()), 6.f, epsilon);
+}
+
+void test_divide()
+{
+ // integer
+ {
+ gil::rgb8_pixel_t a(10, 20, 30);
+ gil::bgr8_pixel_t b(2, 2, 2);
+
+ gil::pixel_divide_t<gil::rgb8_pixel_t, gil::bgr8_pixel_t, gil::rgb8_pixel_t> op;
+ gil::rgb32f_pixel_t c = op(a, b);
+
+ BOOST_TEST_EQ(get_color(c, gil::red_t()), 5);
+ BOOST_TEST_EQ(get_color(c, gil::green_t()), 10);
+ BOOST_TEST_EQ(get_color(c, gil::blue_t()), 15);
+ }
+
+ // float
+ {
+ gil::rgb32f_pixel_t a(1.f, 2.f, 3.f);
+ gil::bgr32f_pixel_t b(2.f, 2.f, 2.f);
+
+ gil::pixel_divide_t<gil::rgb32f_pixel_t, gil::bgr32f_pixel_t, gil::rgb32f_pixel_t> op;
+ gil::rgb32f_pixel_t c = op(a, b);
+
+ float epsilon = 1e-6f;
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::red_t()), 0.5f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::green_t()), 1.f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::blue_t()), 1.5f, epsilon);
+ }
+}
+
+int main()
+{
+ test_plus();
+ test_multiply();
+ test_divide();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/resample.cpp b/src/boost/libs/gil/test/extension/numeric/resample.cpp
new file mode 100644
index 000000000..fa8616253
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/resample.cpp
@@ -0,0 +1,103 @@
+//
+// Copyright 2013 Krzysztof Czainski
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+template <class F, class I>
+struct test_map_fn
+{
+ using point_t = gil::point<F>;
+ using result_type = point_t;
+ result_type operator()(gil::point<I> const &src) const
+ {
+ F x = static_cast<F>(src.x) - 0.5;
+ F y = static_cast<F>(src.y) - 0.5;
+ return {x, y};
+ }
+};
+
+namespace boost { namespace gil {
+
+// NOTE: I suggest this could be the default behavior:
+
+template <typename T>
+struct mapping_traits;
+
+template <class F, class I>
+struct mapping_traits<test_map_fn<F, I>>
+{
+ using result_type = typename test_map_fn<F, I>::result_type;
+};
+
+template <class F, class I>
+inline point<F> transform(test_map_fn<F, I> const &mf, point<I> const &src)
+{
+ return mf(src);
+}
+
+}} // namespace boost::gil
+
+void test_bilinear_sampler_test()
+{
+ // R G B
+ // G W R
+ // B R G
+ gil::rgb8_image_t img(3, 3);
+ gil::rgb8_view_t v = view(img);
+ v(0, 0) = v(1, 2) = v(2, 1) = gil::rgb8_pixel_t(128, 0, 0);
+ v(0, 1) = v(1, 0) = v(2, 2) = gil::rgb8_pixel_t(0, 128, 0);
+ v(0, 2) = v(2, 0) = gil::rgb8_pixel_t(0, 0, 128);
+ v(1, 1) = gil::rgb8_pixel_t(128, 128, 128);
+
+ gil::rgb8_image_t dims(4, 4);
+ gil::rgb8c_view_t dv = gil::const_view(dims);
+
+ test_map_fn<double, gil::rgb8_image_t::coord_t> mf;
+
+ gil::resample_pixels(gil::const_view(img), gil::view(dims), mf, gil::bilinear_sampler());
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(128, 0, 0), dv(0, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(0, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 64, 64), dv(0, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 0, 128), dv(0, 3));
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(1, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 96, 32), dv(1, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 64), dv(1, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 0, 64), dv(1, 3));
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 64, 64), dv(2, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 64), dv(2, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(96, 64, 32), dv(2, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(2, 3));
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 0, 128), dv(3, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 0, 64), dv(3, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(3, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 128, 0), dv(3, 3));
+}
+
+int main()
+{
+ test_bilinear_sampler_test();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/test_fixture.hpp b/src/boost/libs/gil/test/extension/numeric/test_fixture.hpp
new file mode 100644
index 000000000..bfd5cf6f2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/test_fixture.hpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+#include <boost/assert.hpp>
+
+#include <initializer_list>
+#include <type_traits>
+
+namespace boost { namespace gil {
+
+namespace test { namespace fixture {
+
+template <typename T>
+auto create_kernel(std::initializer_list<T> const& values)
+ -> gil::kernel_1d<T>
+{
+ static_assert(std::is_arithmetic<T>::value,
+ "kernel value type should be integral or floating-point type");
+ BOOST_ASSERT_MSG((values.size() - 1) % 2 == 0, "expected odd number of kernel values");
+ gil::kernel_1d<T> kernel(values.begin(), values.size(), (values.size() - 1) / 2);
+ return kernel;
+}
+
+}}}} // namespace boost::gil::test::fixture
diff --git a/src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt b/src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt
new file mode 100644
index 000000000..70df68db4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2017 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/toolbox")
+
+foreach(_name
+ channel_type
+ channel_view
+ color_convert_cmyka
+ color_convert_gray
+ color_convert_gray_alpha
+ color_convert_hsl
+ color_convert_hsv
+ color_convert_lab
+ color_convert_luminance
+ color_convert_xyz
+ get_num_bits
+ get_pixel_type
+ is_bit_aligned
+ is_homogeneous
+ pixel_bit_size
+ subchroma_image)
+ set(_test t_ext_toolbox_${_name})
+ set(_target test_ext_toolbox_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name})
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+# FIXME: https://github.com/boostorg/gil/issues/235
+foreach(_name
+ indexed_image)
+ set(_test t_ext_toolbox_${_name})
+ set(_target test_ext_toolbox_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name})
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/extension/toolbox/Jamfile b/src/boost/libs/gil/test/extension/toolbox/Jamfile
new file mode 100644
index 000000000..a68af63f3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/Jamfile
@@ -0,0 +1,33 @@
+# Boost.GIL (Generic Image Library) - Toolbox tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2012-202 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+alias headers : [ generate_self_contained_headers extension/toolbox ] ;
+
+compile channel_type.cpp ;
+compile get_num_bits.cpp ;
+compile get_pixel_type.cpp ;
+compile is_bit_aligned.cpp ;
+compile is_homogeneous.cpp ;
+compile pixel_bit_size.cpp ;
+
+run channel_view.cpp ;
+run color_convert_cmyka.cpp ;
+run color_convert_gray.cpp ;
+run color_convert_gray_alpha.cpp ;
+run color_convert_hsl.cpp ;
+run color_convert_hsv.cpp ;
+run color_convert_lab.cpp ;
+run color_convert_luminance.cpp ;
+run color_convert_xyz.cpp ;
+run indexed_image.cpp ;
+
+# TODO: Add subchroma_image.cpp after fixing run-time failure,
+# for details see https://github.com/boostorg/gil/pull/164
+#run subchroma_image.cpp ;
diff --git a/src/boost/libs/gil/test/extension/toolbox/channel_type.cpp b/src/boost/libs/gil/test/extension/toolbox/channel_type.cpp
new file mode 100644
index 000000000..ac615dd69
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/channel_type.cpp
@@ -0,0 +1,42 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/detail/is_channel_integral.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_channel_type()
+{
+ static_assert(std::is_same
+ <
+ unsigned char,
+ gil::channel_type<gil::rgb8_pixel_t>::type
+ >::value, "");
+
+ // float32_t is a scoped_channel_value object
+ static_assert(std::is_same
+ <
+ gil::float32_t,
+ gil::channel_type<gil::rgba32f_pixel_t>::type
+ >::value, "");
+
+ // channel_type for bit_aligned images doesn't work with standard gil.
+ using image_t = gil::bit_aligned_image4_type<4, 4, 4, 4, gil::rgb_layout_t>::type;
+ using channel_t = gil::channel_type<image_t::view_t::reference>::type;
+ static_assert(gil::detail::is_channel_integral<channel_t>::value, "");
+}
+
+int main()
+{
+ test_channel_type();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/channel_view.cpp b/src/boost/libs/gil/test/extension/toolbox/channel_view.cpp
new file mode 100644
index 000000000..e29de6d4b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/channel_view.cpp
@@ -0,0 +1,44 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_view.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_channel_view()
+{
+ using kth_channel_view_t
+ = gil::kth_channel_view_type<0, gil::rgb8_view_t::const_t>::type;
+ using channel_view_t
+ = gil::channel_view_type<gil::red_t, gil::rgb8_view_t::const_t>::type;
+
+ static_assert(std::is_same
+ <
+ kth_channel_view_t,
+ channel_view_t
+ >::value,
+ "");
+
+ gil::rgb8_image_t img(100, 100);
+ kth_channel_view_t const kth0 = gil::kth_channel_view<0>(gil::const_view(img));
+ BOOST_TEST_EQ(kth0.num_channels(), 1u);
+
+ channel_view_t const red = gil::channel_view<gil::red_t>(gil::const_view(img));
+ BOOST_TEST_EQ(red.num_channels(), 1u);
+}
+
+int main()
+{
+ test_channel_view();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp
new file mode 100644
index 000000000..1e7ff7cae
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp
@@ -0,0 +1,32 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/cmyka.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+void test_cmyka_to_rgba()
+{
+ gil::cmyka8_pixel_t a(10, 20, 30, 40, 50);
+ gil::rgba8_pixel_t b;
+ gil::color_convert(a, b);
+
+ // TODO: no rgba to cmyka conversion implemented
+ //gil::cmyka8_pixel_t c;
+ //gil::color_convert( b, c );
+ //BOOST_ASSERT(gil::at_c<0>(a) == gil::at_c<0>(c));
+}
+
+int main()
+{
+ test_cmyka_to_rgba();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp
new file mode 100644
index 000000000..e06b5d873
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_converters/gray_to_rgba.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_gray_to_rgba()
+{
+ gil::gray8_pixel_t a(45);
+ gil::rgba8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::rgba8_pixel_t(45, 45, 45, 255));
+}
+
+int main()
+{
+ test_gray_to_rgba();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp
new file mode 100644
index 000000000..ac5b1662a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_gray_alpha_to_gray()
+{
+ gil::gray_alpha8_pixel_t a(10, 20);
+ gil::gray8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::gray8_pixel_t(1));
+}
+
+void test_gray_alpha_to_rgb()
+{
+ gil::gray_alpha8_pixel_t a(10, 20);
+ gil::rgb8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::rgb8_pixel_t(1, 1, 1));
+}
+
+void test_gray_alpha_to_rgba()
+{
+ gil::gray_alpha8_pixel_t a(10, 20);
+ gil::rgba8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::rgba8_pixel_t(10, 10, 10, 20));
+}
+
+int main()
+{
+ test_gray_alpha_to_gray();
+ test_gray_alpha_to_rgb();
+ test_gray_alpha_to_rgba();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp
new file mode 100644
index 000000000..33c5c1962
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp
@@ -0,0 +1,87 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/hsl.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_to_hsl()
+{
+ gil::rgb8_pixel_t p{128, 0, 128};
+ gil::hsl32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ BOOST_TEST_GT(gil::get_color(h, gil::hsl_color_space::hue_t()), 0.8); // 0.83333331
+ BOOST_TEST_EQ(gil::get_color(h, gil::hsl_color_space::saturation_t()), 1.0); // 1.00000000
+ BOOST_TEST_GT(gil::get_color(h, gil::hsl_color_space::lightness_t()), 0.25); // 0.25098040
+}
+
+void test_hsl_to_rgb()
+{
+ gil::rgb8_pixel_t p(64, 0, 64);
+ gil::hsl32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ gil::rgb8_pixel_t b;
+ gil::color_convert(h, b);
+ BOOST_TEST_EQ(b, p);
+}
+
+void test_image_assign_hsl()
+{
+ std::ptrdiff_t const w = 320;
+ std::ptrdiff_t const h = 240;
+ gil::hsl32f_image_t hsl_img(w, h);
+
+ for (std::ptrdiff_t y = 0; y < h; y++)
+ {
+ gil::hsl32f_view_t::x_iterator hsl_x_it = view(hsl_img).row_begin(y);
+ float v = static_cast<float>(h - y) / h;
+ for (std::ptrdiff_t x = 0; x < w; x++)
+ {
+ float const hue = (x + 1.f) / w;
+ gil::hsl32f_pixel_t const p(hue, 1.0, v);
+ hsl_x_it[x] = p;
+ BOOST_TEST_EQ(gil::view(hsl_img)(x, y), p);
+ }
+ }
+}
+
+void test_copy_pixels_rgb_to_hsl()
+{
+ gil::rgb8_image_t rgb_img(320, 240);
+ gil::rgb8_pixel_t rgb_pix(64, 32, 64);
+ gil::fill_pixels(view(rgb_img), rgb_pix);
+ gil::hsl32f_image_t hsl_img(view(rgb_img).dimensions());
+ gil::copy_pixels(gil::color_converted_view<gil::hsl32f_pixel_t>(view(rgb_img)), view(hsl_img));
+
+ auto view = gil::view(hsl_img);
+ for (auto it = view.begin(), end = view.end(); it != end; ++it)
+ {
+ gil::rgb8_pixel_t p;
+ gil::color_convert(*it, p);
+ BOOST_TEST_EQ(p, rgb_pix);
+ }
+}
+
+int main()
+{
+ test_rgb_to_hsl();
+ test_hsl_to_rgb();
+ test_image_assign_hsl();
+ test_copy_pixels_rgb_to_hsl();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp
new file mode 100644
index 000000000..175a7d989
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp
@@ -0,0 +1,95 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/hsv.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <iostream>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_to_hsv()
+{
+ gil::rgb8_pixel_t p{128, 0, 128};
+ gil::hsv32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ BOOST_TEST_GT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.80); // 0.83333331
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.85);
+ BOOST_TEST_GE(gil::get_color(h, gil::hsv_color_space::saturation_t()), 1.0); // 1.00000000
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::saturation_t()), 1.1);
+ BOOST_TEST_GE(gil::get_color(h, gil::hsv_color_space::value_t()), 0.50); // 0.50196081
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::value_t()), 0.51);
+}
+
+void test_hsv_to_rgb()
+{
+ gil::rgb8_pixel_t p(128, 0, 128);
+ gil::hsv32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ gil::rgb8_pixel_t b;
+ gil::color_convert(h, b);
+ BOOST_TEST_EQ(b, gil::rgb8_pixel_t(128, 0, 128));
+}
+
+
+void test_image_assign_hsv()
+{
+ std::ptrdiff_t const w = 320;
+ std::ptrdiff_t const h = 240;
+ gil::hsv32f_image_t hsv_img(w, h);
+
+ for (std::ptrdiff_t y = 0; y < h; y++)
+ {
+ gil::hsv32f_view_t::x_iterator hsv_x_it = view(hsv_img).row_begin(y);
+ float v = static_cast<float>(h - y) / h;
+ for (std::ptrdiff_t x = 0; x < w; x++)
+ {
+ float const hue = (x + 1.f) / w;
+ gil::hsv32f_pixel_t const p(hue, 1.0, v);
+ hsv_x_it[x] = p;
+ BOOST_TEST_EQ(gil::view(hsv_img)(x, y), p);
+ }
+ }
+}
+
+void test_copy_pixels_rgb_to_hsv()
+{
+ gil::rgb8_image_t rgb_img(320, 240);
+ gil::rgb8_pixel_t rgb_pix(64, 32, 64);
+ gil::fill_pixels(view(rgb_img), rgb_pix);
+ gil::hsv32f_image_t hsv_img(view(rgb_img).dimensions());
+ gil::copy_pixels(gil::color_converted_view<gil::hsv32f_pixel_t>(view(rgb_img)), view(hsv_img));
+
+ auto view = gil::view(hsv_img);
+ for (auto it = view.begin(), end = view.end(); it != end; ++it)
+ {
+ auto h = *it;
+ BOOST_TEST_GT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.80); // 0.8333333
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.85);
+ BOOST_TEST_GE(gil::get_color(h, gil::hsv_color_space::saturation_t()), 0.5); // 0.5000000
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::saturation_t()), 0.51);
+ BOOST_TEST_GT(gil::get_color(h, gil::hsv_color_space::value_t()), 0.25); // 0.25
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::value_t()), 0.26);
+ }
+}
+
+int main()
+{
+ test_rgb_to_hsv();
+ test_hsv_to_rgb();
+ test_image_assign_hsv();
+ test_copy_pixels_rgb_to_hsv();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp
new file mode 100644
index 000000000..0bd2f31dc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp
@@ -0,0 +1,140 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/lab.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b) BOOST_TEST_LT(std::fabs((a) - (b)), (0.0005f))
+
+void test_lab_to_xyz()
+{
+ {
+ gil::lab32f_pixel_t lab_pixel(40.366198f, 53.354489f, 26.117702f);
+ gil::xyz32f_pixel_t xyz_pixel;
+ gil::color_convert(lab_pixel, xyz_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[0]), 0.197823f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[1]), 0.114731f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[2]), 0.048848f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(50, 0, 0);
+ gil::xyz32f_pixel_t xyz_pixel;
+ gil::color_convert(lab_pixel, xyz_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[0]), 0.175064f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[1]), 0.184187f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[2]), 0.200548f);
+ }
+}
+
+void test_xyz_to_lab()
+{
+ gil::lab32f_pixel_t lab_pixel;
+ gil::xyz32f_pixel_t xyz_pixel(0.085703f, 0.064716f, 0.147082f);
+ gil::color_convert(xyz_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 30.572438f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 23.4674f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), -22.322275f);
+}
+
+void test_rgb_to_lab()
+{
+ {
+ gil::rgb32f_pixel_t rgb_pixel(0.75f, 0.5f, 0.25f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 58.7767f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 18.5851f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 43.7975f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(1.f, 0.f, 0.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 53.2408f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 80.0925f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 67.2032f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(0.f, 1.f, 0.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 87.7347f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), -86.1827f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 83.1793f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(0.f, 0.f, 1.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 32.2970f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 79.1875f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), -107.8602f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(1.f, 1.f, 1.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 100.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 0.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 0.f);
+ }
+}
+
+void test_lab_to_rgb()
+{
+ {
+ gil::lab32f_pixel_t lab_pixel(75.f, 20.f, 40.f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.943240f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.663990f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.437893f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(100.f, 0.f, 0.f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 1.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 1.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 1.f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(56.8140f, -42.3665f, 10.6728f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.099999f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.605568f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.456662f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(50.5874f, 4.0347f, 50.5456f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.582705f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.454891f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.1f);
+ }
+}
+
+int main()
+{
+ test_lab_to_xyz();
+ test_xyz_to_lab();
+ test_rgb_to_lab();
+ test_lab_to_rgb();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp
new file mode 100644
index 000000000..36851b6e3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp
@@ -0,0 +1,38 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_converters/rgb_to_luminance.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+struct double_zero { static double apply() { return 0.0; } };
+struct double_one { static double apply() { return 1.0; } };
+
+using gray64f_pixel_t = gil::pixel<double, gil::gray_layout_t>;
+using rgb64f_pixel_t = gil::pixel<double, gil::rgb_layout_t>;
+
+void test_rgb_to_luminance()
+{
+ rgb64f_pixel_t a(10, 20, 30);
+ gray64f_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, b);
+}
+
+int main()
+{
+ test_rgb_to_luminance();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp
new file mode 100644
index 000000000..8121822d9
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp
@@ -0,0 +1,219 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/xyz.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <limits>
+
+#ifndef BOOST_GIL_TEST_DEBUG_OSTREAM
+#include <iostream>
+#define BOOST_GIL_TEST_DEBUG_OSTREAM std::cout
+#endif
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+const float SKEW = 0.0001f;
+
+void test_rgb32f_xyz32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb32f_pixel_t p32f(.934351f, 0.785446f, .105858f), p32f_b;
+ gil::color_convert(p32f, xyz32f);
+ gil::color_convert(xyz32f, p32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f_b[0] << " "
+ << p32f_b[1] << " "
+ << p32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(p32f[0] - p32f_b[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - p32f_b[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - p32f_b[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[0] - 0.562669), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[1] - 0.597462), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[2] - 0.096050), SKEW);
+}
+
+void test_rgb32f_xyz32f_2()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb32f_pixel_t p32f(.694617f, 0.173810f, 0.218710f), p32f_b;
+ gil::color_convert(p32f, xyz32f);
+ gil::color_convert(xyz32f, p32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f_b[0] << " "
+ << p32f_b[1] << " "
+ << p32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(p32f[0] - p32f_b[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - p32f_b[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - p32f_b[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[0] - 0.197823), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[1] - 0.114731), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[2] - 0.048848), SKEW);
+}
+
+void test_xyz32f_rgb32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f(.332634f, .436288f, .109853f), xyz32f_b;
+ gil::rgb32f_pixel_t p32f;
+ gil::color_convert(xyz32f, p32f);
+ gil::color_convert(p32f, xyz32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f_b[0] << " "
+ << xyz32f_b[1] << " "
+ << xyz32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(xyz32f_b[0] - xyz32f[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[1] - xyz32f[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[2] - xyz32f[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[0] - 0.628242), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - 0.735771), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - 0.236473), SKEW);
+}
+
+void test_xyz32f_rgb32f_2()
+{
+ gil::xyz32f_pixel_t xyz32f(.375155f, .352705f, .260025f), xyz32f_b;
+ gil::rgb32f_pixel_t p32f;
+ gil::color_convert(xyz32f, p32f);
+ gil::color_convert(p32f, xyz32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f_b[0] << " "
+ << xyz32f_b[1] << " "
+ << xyz32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(xyz32f_b[0] - xyz32f[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[1] - xyz32f[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[2] - xyz32f[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[0] - 0.763580), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - 0.591622), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - 0.510392), SKEW);
+}
+
+void test_rgb8u_xyz32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb8_pixel_t p8u(177, 44, 56), p8u_b;
+ gil::color_convert(p8u, xyz32f);
+ gil::color_convert(xyz32f, p8u_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << static_cast<int>(p8u[0]) << " "
+ << static_cast<int>(p8u[1]) << " "
+ << static_cast<int>(p8u[2]) << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << static_cast<int>(p8u_b[0]) << " "
+ << static_cast<int>(p8u_b[1]) << " "
+ << static_cast<int>(p8u_b[2])
+ << '\n';
+
+ BOOST_TEST_EQ(p8u[0], p8u_b[0]);
+ BOOST_TEST_EQ(p8u[1], p8u_b[1]);
+ BOOST_TEST_EQ(p8u[2], p8u_b[2]);
+}
+
+void test_rgb8u_xyz32f_2()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb8_pixel_t p8u(72, 90, 165), p8u_b;
+ gil::color_convert(p8u, xyz32f);
+ gil::color_convert(xyz32f, p8u_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << static_cast<int>(p8u[0]) << " "
+ << static_cast<int>(p8u[1]) << " "
+ << static_cast<int>(p8u[2]) << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << static_cast<int>(p8u_b[0]) << " "
+ << static_cast<int>(p8u_b[1]) << " "
+ << static_cast<int>(p8u_b[2])
+ << '\n';
+
+ BOOST_TEST_EQ(p8u[0], p8u_b[0]);
+ BOOST_TEST_EQ(p8u[1], p8u_b[1]);
+ BOOST_TEST_EQ(p8u[2], p8u_b[2]);
+}
+
+void test_rgb16u_xyz32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb16_pixel_t p16u(12564, 20657, 200), p16u_b;
+ gil::color_convert(p16u, xyz32f);
+ gil::color_convert(xyz32f, p16u_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << static_cast<int>(p16u[0]) << " "
+ << static_cast<int>(p16u[1]) << " "
+ << static_cast<int>(p16u[2]) << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << static_cast<int>(p16u_b[0]) << " "
+ << static_cast<int>(p16u_b[1]) << " "
+ << static_cast<int>(p16u_b[2])
+ << '\n';
+
+ BOOST_TEST_EQ(p16u[0], p16u_b[0]);
+ BOOST_TEST_EQ(p16u[1], p16u_b[1]);
+ BOOST_TEST_EQ(p16u[2], p16u_b[2]);
+}
+
+int main()
+{
+ test_rgb32f_xyz32f_1();
+ test_rgb32f_xyz32f_2();
+ test_xyz32f_rgb32f_1();
+ test_xyz32f_rgb32f_2();
+ test_rgb8u_xyz32f_1();
+ test_rgb8u_xyz32f_2();
+ test_rgb16u_xyz32f_1();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp b/src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp
new file mode 100644
index 000000000..84234eb83
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp
@@ -0,0 +1,41 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp>
+
+namespace gil = boost::gil;
+
+void test_get_num_bits()
+{
+ using image_t = gil::bit_aligned_image4_type<4, 4, 4, 4, gil::rgb_layout_t>::type;
+
+ using channel_t = gil::channel_type<image_t::view_t::reference>::type;
+ static_assert(gil::get_num_bits<channel_t>::value == 4, "");
+
+ using const_channel_t = gil::channel_type<image_t::const_view_t::reference>::type;
+ static_assert(gil::get_num_bits<const_channel_t>::value == 4, "");
+
+ using bits_t = gil::packed_channel_value<23>;
+ static_assert(gil::get_num_bits<bits_t>::value == 23, "");
+ static_assert(gil::get_num_bits<bits_t const>::value == 23, "");
+
+ static_assert(gil::get_num_bits<unsigned char >::value == 8, "");
+ static_assert(gil::get_num_bits<unsigned char const>::value == 8, "");
+
+ using gray8_channel_t = gil::channel_type<gil::gray8_image_t::view_t::value_type>::type;
+ static_assert(gil::get_num_bits<gray8_channel_t>::value == 8, "");
+
+ using rgba32_channel_t = gil::channel_type<gil::rgba32_image_t::view_t::value_type>::type;
+ static_assert(gil::get_num_bits<rgba32_channel_t>::value == 32, "");
+}
+
+int main()
+{
+ test_get_num_bits();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp b/src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp
new file mode 100644
index 000000000..720197b1f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp
@@ -0,0 +1,39 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/get_pixel_type.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_bit_aligned_image()
+{
+ using image_t = gil::bit_aligned_image3_type<4, 15, 4, gil::rgb_layout_t>::type;
+ static_assert(std::is_same
+ <
+ gil::get_pixel_type<image_t::view_t>::type,
+ image_t::view_t::reference
+ >::value, "");
+}
+
+void test_rgb8_image()
+{
+ using image_t = gil::rgb8_image_t;
+ static_assert(std::is_same
+ <
+ gil::get_pixel_type<image_t::view_t>::type,
+ image_t::view_t::value_type
+ >::value, "");
+}
+
+int main()
+{
+ test_bit_aligned_image();
+ test_rgb8_image();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp b/src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp
new file mode 100644
index 000000000..5e78fa23f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp
@@ -0,0 +1,154 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/image_types/indexed_image.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_index_image()
+{
+ auto const pixel_generator = []() -> gil::rgb8_pixel_t {
+ static int i = 0;
+ i = (i > 255) ? 0 : (i + 1);
+ auto const i8 = static_cast<std::uint8_t>(i);
+ return gil::rgb8_pixel_t(i8, i8, i8);
+ };
+
+ {
+ gil::indexed_image<std::uint8_t, gil::rgb8_pixel_t> img(640, 480);
+ gil::fill_pixels(gil::view(img), gil::rgb8_pixel_t(255, 0, 0));
+
+ gil::rgb8_pixel_t const p = *gil::view(img).xy_at(10, 10);
+ BOOST_TEST_EQ(p[0], 255);
+ }
+ {
+ using image_t = gil::indexed_image<gil::gray8_pixel_t, gil::rgb8_pixel_t>;
+ image_t img(640, 480, 256);
+
+ gil::generate_pixels(img.get_indices_view(), []() -> gil::gray8_pixel_t {
+ static int i = 0;
+ i = (i > 255) ? 0 : (i + 1);
+ auto const i8 = static_cast<std::uint8_t>(i);
+ return gil::gray8_pixel_t(i8);
+ });
+ gil::generate_pixels(img.get_palette_view(), pixel_generator);
+
+ gil::gray8_pixel_t index{0};
+ index = *img.get_indices_view().xy_at(0, 0); // verify values along first row
+ BOOST_TEST_EQ(static_cast<int>(index), (0 + 1));
+ index = *img.get_indices_view().xy_at(128, 0);
+ BOOST_TEST_EQ(static_cast<int>(index), (128 + 1));
+ // verify wrapping of value by the pixels generator above
+ index = *img.get_indices_view().xy_at(255, 0);
+ BOOST_TEST_EQ(static_cast<int>(index), 0);
+
+ // access via member function
+ gil::rgb8_pixel_t const pixel1 = *img.get_palette_view().xy_at(index, 0);
+ BOOST_TEST_EQ(pixel1[0], pixel1[1]);
+ BOOST_TEST_EQ(pixel1[1], pixel1[2]);
+
+ // access via free function
+ gil::rgb8_pixel_t const pixel2 = *gil::view(img).xy_at(10, 1);
+ BOOST_TEST_EQ(pixel2[0], pixel2[1]);
+ BOOST_TEST_EQ(pixel2[1], pixel2[2]);
+ }
+ {
+ using image_t = gil::indexed_image<gil::gray8_pixel_t, gil::rgb8_pixel_t>;
+ image_t img(640, 480, 256);
+
+ gil::generate_pixels(img.get_indices_view(), []() -> uint8_t
+ {
+ static int i = 0;
+ i = (i > 255) ? 0 : (i + 1);
+ return static_cast<std::uint8_t>(i);
+ });
+ gil::generate_pixels(img.get_palette_view(), pixel_generator);
+
+ std::uint8_t index = *img.get_indices_view().xy_at(128, 0);
+ BOOST_TEST_EQ(static_cast<int>(index), (128 + 1));
+
+ gil::rgb8_pixel_t const pixel1 = *img.get_palette_view().xy_at(index, 0);
+ BOOST_TEST_EQ(pixel1[0], pixel1[1]);
+ BOOST_TEST_EQ(pixel1[1], pixel1[2]);
+
+ gil::rgb8_pixel_t const pixel2 = *view(img).xy_at(10, 1);
+ BOOST_TEST_EQ(pixel2[0], pixel2[1]);
+ BOOST_TEST_EQ(pixel2[1], pixel2[2]);
+ }
+ {
+ using image_t = gil::indexed_image<std::uint8_t, gil::rgb8_pixel_t>;
+ image_t img(640, 480, 256);
+
+ for (image_t::y_coord_t y = 0; y < gil::view(img).height(); ++y)
+ {
+ image_t::view_t::x_iterator it = gil::view(img).row_begin(y);
+ for (image_t::x_coord_t x = 0; x < gil::view(img).width(); ++x)
+ {
+ gil::rgb8_pixel_t p = *it;
+ boost::ignore_unused(p);
+ it++;
+ }
+ }
+
+ // TODO: No checks? ~mloskot
+ }
+}
+
+void test_index_image_view()
+{
+ // generate some data
+ std::size_t const width = 640;
+ std::size_t const height = 480;
+ std::size_t const num_colors = 3;
+ std::uint8_t const index = 2;
+
+ // indices
+ std::vector<std::uint8_t> indices(width * height, index);
+
+ // colors
+ std::vector<gil::rgb8_pixel_t> palette(num_colors);
+ palette[0] = gil::rgb8_pixel_t(10, 20, 30);
+ palette[1] = gil::rgb8_pixel_t(40, 50, 60);
+ palette[2] = gil::rgb8_pixel_t(70, 80, 90);
+
+ // create image views from raw memory
+ auto indices_view = gil::interleaved_view(width, height,
+ (gil::gray8_image_t::view_t::x_iterator) indices.data(),
+ width); // row size in bytes
+
+ auto palette_view = gil::interleaved_view(100, 1,
+ (gil::rgb8_image_t::view_t::x_iterator) palette.data(),
+ num_colors * 3); // row size in bytes
+
+ auto ii_view = gil::view(indices_view, palette_view);
+
+ auto p = ii_view(gil::point_t(0, 0));
+ auto q = *ii_view.at(gil::point_t(0, 0));
+
+ BOOST_TEST_EQ(gil::get_color(p, gil::red_t()), 70);
+ BOOST_TEST_EQ(gil::get_color(p, gil::green_t()), 80);
+ BOOST_TEST_EQ(gil::get_color(p, gil::blue_t()), 90);
+
+ BOOST_TEST_EQ(gil::get_color(q, gil::red_t()), 70);
+ BOOST_TEST_EQ(gil::get_color(q, gil::green_t()), 80);
+ BOOST_TEST_EQ(gil::get_color(q, gil::blue_t()), 90);
+}
+
+int main()
+{
+ test_index_image();
+ test_index_image_view();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp b/src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp
new file mode 100644
index 000000000..2c4cd9c79
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp
@@ -0,0 +1,24 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+
+namespace gil = boost::gil;
+
+void test_is_bit_aligned()
+{
+ using image_t = gil::bit_aligned_image1_type< 4, gil::gray_layout_t>::type;
+ static_assert(gil::is_bit_aligned<image_t::view_t::value_type>::value, "");
+}
+
+int main()
+{
+ test_is_bit_aligned();
+}
+
diff --git a/src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp b/src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp
new file mode 100644
index 000000000..09615fe2f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp
@@ -0,0 +1,26 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp>
+
+namespace gil = boost::gil;
+
+void test_is_homogeneous()
+{
+ static_assert(gil::is_homogeneous<gil::rgb8_pixel_t>::value, "");
+ static_assert(gil::is_homogeneous<gil::cmyk16c_planar_ref_t>::value, "");
+
+ using image_t = gil::bit_aligned_image1_type< 4, gil::gray_layout_t>::type;
+ static_assert(gil::is_homogeneous<image_t::view_t::reference>::value, "");
+}
+
+int main()
+{
+ test_is_homogeneous();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp b/src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp
new file mode 100644
index 000000000..bbd8e3920
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp
@@ -0,0 +1,26 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp>
+
+namespace gil = boost::gil;
+
+void test_pixel_bit_size()
+{
+ using image_t = gil::bit_aligned_image5_type
+ <
+ 16, 16, 16, 8, 8, gil::devicen_layout_t<5>
+ >::type;
+ static_assert(gil::pixel_bit_size<image_t::view_t::reference>::value == 64, "");
+}
+
+int main()
+{
+ test_pixel_bit_size();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp b/src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp
new file mode 100644
index 000000000..1ec43fcbf
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/ycbcr.hpp>
+#include <boost/gil/extension/toolbox/image_types/subchroma_image.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/mp11.hpp>
+
+#include <vector>
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_subchroma_image()
+{
+ {
+ gil::ycbcr_601_8_pixel_t a(10, 20, 30);
+ gil::rgb8_pixel_t b;
+ gil::bgr8_pixel_t c;
+
+ gil::color_convert(a, b);
+ gil::color_convert(a, c);
+ BOOST_TEST(gil::static_equal(b, c));
+
+ gil::color_convert(b, a);
+ }
+ {
+ gil::ycbcr_709_8_pixel_t a(10, 20, 30);
+ gil::rgb8_pixel_t b;
+ gil::bgr8_pixel_t c;
+
+ gil::color_convert(a, b);
+ gil::color_convert(a, c);
+ BOOST_TEST(gil::static_equal(b, c));
+
+ gil::color_convert(b, a);
+ }
+
+ {
+ using pixel_t = gil::rgb8_pixel_t;
+ using image_t = gil::subchroma_image<pixel_t>;
+ image_t img(320, 240);
+ gil::fill_pixels(view(img), pixel_t(10, 20, 30));
+
+ // TODO: Add BOOST_TEST checkpoints
+ }
+ {
+ using pixel_t = gil::rgb8_pixel_t;
+
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 4, 4>> a(640, 480);
+ static_assert(a.ss_X == 1 && a.ss_Y == 1, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 4, 0>> b(640, 480);
+ static_assert(b.ss_X == 1 && b.ss_Y == 2, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 2, 2>> c(640, 480);
+ static_assert(c.ss_X == 2 && c.ss_Y == 1, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 2, 0>> d(640, 480);
+ static_assert(d.ss_X == 2 && d.ss_Y == 2, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 1, 1>> e(640, 480);
+ static_assert(e.ss_X == 4 && e.ss_Y == 1, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 1, 0>> f(640, 480);
+ static_assert(f.ss_X == 4 && f.ss_Y == 2, "");
+
+ gil::fill_pixels(view(a), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(b), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(c), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(d), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(e), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(f), pixel_t(10, 20, 30));
+
+ // TODO: Add BOOST_TEST checkpoints
+ }
+ {
+ using pixel_t = gil::ycbcr_601_8_pixel_t;
+ using factors_t = mp11::mp_list_c<int, 4, 2, 2>;
+ using image_t = gil::subchroma_image<pixel_t, factors_t>;
+
+ std::size_t const y_width = 320;
+ std::size_t const y_height = 240;
+
+ std::size_t image_size = (y_width * y_height)
+ + (y_width / image_t::ss_X) * (y_height / image_t::ss_Y)
+ + (y_width / image_t::ss_X) * (y_height / image_t::ss_Y);
+
+ std::vector<unsigned char> data(image_size); // TODO: Initialize? --mloskot
+
+ image_t::view_t v = gil::subchroma_view<pixel_t, factors_t>(y_width, y_height, &data.front());
+ //gil::rgb8_pixel_t p; // TODO: Why RGB?? --mloskot
+ //p = *v.xy_at(0, 0);
+ auto p = *v.xy_at(0, 0);
+
+ // TODO: Add BOOST_TEST checkpoints
+ }
+}
+
+int main()
+{
+ test_subchroma_image();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/header/CMakeLists.txt b/src/boost/libs/gil/test/header/CMakeLists.txt
new file mode 100644
index 000000000..61af9cf81
--- /dev/null
+++ b/src/boost/libs/gil/test/header/CMakeLists.txt
@@ -0,0 +1,106 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+
+# List headers in order: concepts, core, io, extensions
+file(GLOB_RECURSE _hpp_concepts RELATIVE
+ "${CMAKE_SOURCE_DIR}/include/boost/gil"
+ "${CMAKE_SOURCE_DIR}/include/boost/gil/concepts/*.hpp")
+list(APPEND _headers ${_hpp_concepts})
+
+file(GLOB _hpp_core RELATIVE
+ "${CMAKE_SOURCE_DIR}/include/boost/gil"
+ "${CMAKE_SOURCE_DIR}/include/boost/gil/*.hpp")
+list(APPEND _headers ${_hpp_core})
+
+list(APPEND _ext_dirs extension/dynamic_image/)
+if(BOOST_GIL_ENABLE_EXT_NUMERIC)
+ list(APPEND _ext_dirs extension/numeric)
+endif()
+if(BOOST_GIL_ENABLE_EXT_TOOLBOX)
+ list(APPEND _ext_dirs extension/toolbox)
+endif()
+if(BOOST_GIL_ENABLE_EXT_IO)
+ list(APPEND _ext_dirs io)
+ list(APPEND _ext_dirs extension/io)
+endif()
+
+foreach(_dir ${_ext_dirs})
+ file(GLOB_RECURSE _hpp RELATIVE
+ "${CMAKE_SOURCE_DIR}/include/boost/gil"
+ "${CMAKE_SOURCE_DIR}/include/boost/gil/${_dir}/*.hpp")
+ list(APPEND _headers ${_hpp})
+endforeach()
+
+if(NOT BOOST_GIL_ENABLE_EXT_IO_RAW)
+ list(FILTER _headers EXCLUDE REGEX "\\/raw[\\.\\/]")
+endif()
+
+#-----------------------------------------------------------------------------
+# Target: test_headers_self_contained
+# Bundles all targets of self-contained header tests,
+# functional equivalent to self-contained header tests defined in Jamfile.
+#-----------------------------------------------------------------------------
+message(STATUS "Boost.GIL: Configuring self-contained header tests for all headers")
+add_custom_target(test_headers_self_contained)
+
+file(READ ${CMAKE_CURRENT_LIST_DIR}/main.cpp _main_content)
+
+foreach(_header ${_headers})
+ string(REPLACE ".hpp" "" _target ${_header})
+ string(REPLACE "/" "-" _target ${_target})
+ set(_cpp ${CMAKE_BINARY_DIR}/test/headers/${_target}.cpp)
+ set(_target test_header_${_target})
+
+ string(REPLACE "BOOST_GIL_TEST_HEADER" "${_header}" _content "${_main_content}")
+ file(WRITE ${_cpp} "${_content}")
+ unset(_content)
+
+ add_executable(${_target})
+
+ target_sources(${_target}
+ PRIVATE
+ ${_cpp}
+ ${CMAKE_SOURCE_DIR}/include/boost/gil/${_header})
+ unset(_cpp)
+
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+
+ add_dependencies(test_headers_self_contained ${_target})
+
+ unset(_target)
+endforeach()
+
+#-----------------------------------------------------------------------------
+# Target: test_headers_all_in_one
+# Verifies compilation of all headers included in one translation unit.
+# An extra advantage is that such translation unit can be analysed with clang-tidy, etc.
+#-----------------------------------------------------------------------------
+message(STATUS "Boost.GIL: Configuring all-in-one headers test for all headers")
+
+set(_cpp ${CMAKE_BINARY_DIR}/test/headers/test_headers_all_in_one.cpp)
+file(WRITE ${_cpp} "// All headers included in one translation unit\n")
+foreach(_header ${_headers})
+ file(APPEND ${_cpp} "#include <boost/gil/${_header}>\n")
+endforeach()
+unset(_headers)
+file(APPEND ${_cpp} "int main() { return 0; }\n")
+
+add_executable(test_headers_all_in_one)
+
+target_sources(test_headers_all_in_one PRIVATE ${_cpp})
+unset(_cpp)
+
+target_link_libraries(test_headers_all_in_one
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
diff --git a/src/boost/libs/gil/test/header/main.cpp b/src/boost/libs/gil/test/header/main.cpp
new file mode 100644
index 000000000..1466f825c
--- /dev/null
+++ b/src/boost/libs/gil/test/header/main.cpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+// Copyright (c) 2007-2015 Andrey Semashev
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file contains a test boilerplate for checking that every public header
+// is self-contained and does not have any missing #include-s.
+
+#define BOOST_GIL_TEST_INCLUDE_HEADER() <boost/gil/BOOST_GIL_TEST_HEADER>
+
+#include BOOST_GIL_TEST_INCLUDE_HEADER()
+
+int main()
+{
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/legacy/CMakeLists.txt b/src/boost/libs/gil/test/legacy/CMakeLists.txt
new file mode 100644
index 000000000..de870c968
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/CMakeLists.txt
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+# *** IMPORTANT MAINTENANCE RULES ***
+# These are GIL's original, comprehensive, all-in-one test suites.
+# * Keep as reference.
+# * Do NOT extend.
+# * Do NOT refactor.
+# * Modify only if absolutely necessary (a bug found in the tests).
+# See the accompanying README.md
+#
+message(STATUS "Boost.GIL: Configuring tests in test/legacy")
+
+foreach(_name
+ channel
+ pixel
+ pixel_iterator)
+ set(_test t_legacy_${_name})
+ set(_target test_legacy_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp error_if.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+# Add extra source files accompanying image.cpp
+foreach(_name
+ image)
+ set(_test t_legacy_${_name})
+ set(_target test_legacy_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE
+ ${_name}.cpp
+ error_if.cpp
+ sample_image.cpp)
+
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target}
+ ${CMAKE_CURRENT_SOURCE_DIR}/gil_reference_checksums.txt)
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/legacy/Jamfile b/src/boost/libs/gil/test/legacy/Jamfile
new file mode 100644
index 000000000..048ab8c49
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/Jamfile
@@ -0,0 +1,26 @@
+# Boost.GIL (Generic Image Library) - legacy tests
+#
+# Copyright (c) 2007-2015 Andrey Semashev
+# Copyright (c) 2008 Lubomir Bourdev, Hailin Jin
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+#
+# *** IMPORTANT MAINTENANCE RULES ***
+# These are GIL's original, comprehensive, all-in-one test suites.
+# * Keep as reference.
+# * Do NOT extend.
+# * Do NOT refactor.
+# * Modify only if absolutely necessary (a bug found in the tests).
+# See the accompanying README.md
+
+import testing ;
+
+run image.cpp sample_image.cpp error_if.cpp : : gil_reference_checksums.txt ;
+run channel.cpp error_if.cpp ;
+run pixel.cpp error_if.cpp ;
+run pixel_iterator.cpp error_if.cpp ;
+
+alias perf : [ run performance.cpp ] ;
+explicit perf ;
diff --git a/src/boost/libs/gil/test/legacy/README.md b/src/boost/libs/gil/test/legacy/README.md
new file mode 100644
index 000000000..76bc42828
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/README.md
@@ -0,0 +1,16 @@
+# Boost.GIL Legacy Tests
+
+These are GIL's original, comprehensive, all-in-one test suits.
+
+Rules of maintenance:
+
+* Run the legacy tests as part of CI builds and regression tests.
+* Keep as reference.
+* Do NOT extend.
+* Do NOT refactor.
+* Modify ONLY if absolutely necessary (a bug found in the tests).
+
+Add new test suites, with new test cases, even if their
+functional coverage is the same as of the legacy tests.
+
+See [CONTRIBUTING.md](../../CONTRIBUTING.md).
diff --git a/src/boost/libs/gil/test/legacy/channel.cpp b/src/boost/libs/gil/test/legacy/channel.cpp
new file mode 100644
index 000000000..b4225d20e
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/channel.cpp
@@ -0,0 +1,408 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/channel_algorithm.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cstdint>
+#include <exception>
+#include <iostream>
+#include <type_traits>
+
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#elif BOOST_GCC >= 40700
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#elif BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+using namespace boost::gil;
+using namespace std;
+
+void error_if(bool);
+
+auto c8_min = channel_traits<uint8_t>::min_value();
+auto c8_max = channel_traits<uint8_t>::max_value();
+auto c8s_min = channel_traits<int8_t>::min_value();
+auto c8s_max = channel_traits<int8_t>::max_value();
+auto c16_min = channel_traits<uint16_t>::min_value();
+auto c16_max = channel_traits<uint16_t>::max_value();
+auto c16s_min = channel_traits<int16_t>::min_value();
+auto c16s_max = channel_traits<int16_t>::max_value();
+auto c32_min = channel_traits<uint32_t>::min_value();
+auto c32_max = channel_traits<uint32_t>::max_value();
+auto c32s_min = channel_traits<int32_t>::min_value();
+auto c32s_max = channel_traits<int32_t>::max_value();
+auto c32f_min = channel_traits<float32_t>::min_value();
+auto c32f_max = channel_traits<float32_t>::max_value();
+
+
+template <typename ChannelTestCore>
+struct do_test : public ChannelTestCore {
+ using channel_t = typename ChannelTestCore::channel_t;
+ using channel_value_t = typename channel_traits<channel_t>::value_type;
+
+ do_test() : ChannelTestCore() {
+ error_if(this->_min_v != channel_traits<channel_t>::min_value());
+ error_if(this->_max_v != channel_traits<channel_t>::max_value());
+ }
+
+ void test_all() {
+ test_channel_invert();
+ test_channel_convert();
+ test_channel_multiply();
+ test_channel_math();
+ }
+
+ void test_mutable(std::false_type) {}
+ void test_mutable(std::true_type) {
+ channel_value_t mv=this->_min_v;
+ ++this->_min_v; this->_min_v++;
+ --this->_min_v; this->_min_v--;
+ error_if(mv!=this->_min_v);
+
+ this->_min_v+=1;
+ this->_min_v-=1;
+ error_if(mv!=this->_min_v);
+
+ this->_min_v*=1;
+ this->_min_v/=1;
+ error_if(mv!=this->_min_v);
+
+ this->_min_v = 1; // assignable to scalar
+ this->_min_v = mv; // and to value type
+
+ // test swap
+ channel_value_t v1=this->_min_v;
+ channel_value_t v2=this->_max_v;
+ swap(this->_min_v, this->_max_v);
+
+ channel_value_t v3=this->_min_v;
+ channel_value_t v4=this->_max_v;
+ error_if(v1!=v4 || v2!=v3);
+ }
+
+ void test_channel_math() {
+ error_if(this->_min_v >= this->_max_v);
+ error_if(this->_max_v <= this->_min_v);
+ error_if(this->_min_v > this->_max_v);
+ error_if(this->_max_v < this->_min_v);
+ error_if(this->_max_v == this->_min_v);
+ error_if(!(this->_max_v != this->_min_v));
+
+ error_if(this->_min_v * 1 != this->_min_v);
+ error_if(this->_min_v / 1 != this->_min_v);
+
+ error_if((this->_min_v + 1) + 1 != (this->_min_v + 2));
+ error_if((this->_max_v - 1) - 1 != (this->_max_v - 2));
+
+ error_if(this->_min_v != 1 && this->_min_v==1); // comparable to integral
+
+
+ test_mutable(std::integral_constant<bool, channel_traits<channel_t>::is_mutable>());
+ }
+
+
+ void test_channel_invert() {
+ error_if(channel_invert(this->_min_v) != this->_max_v);
+ error_if(channel_invert(this->_max_v) != this->_min_v);
+ }
+
+ void test_channel_multiply() {
+ error_if(channel_multiply(this->_min_v, this->_min_v) != this->_min_v);
+ error_if(channel_multiply(this->_max_v, this->_max_v) != this->_max_v);
+ error_if(channel_multiply(this->_max_v, this->_min_v) != this->_min_v);
+ }
+
+ void test_channel_convert() {
+ channel_value_t v_min, v_max;
+
+ v_min=channel_convert<channel_t>(c8_min);
+ v_max=channel_convert<channel_t>(c8_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c8s_min);
+ v_max=channel_convert<channel_t>(c8s_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c16_min);
+ v_max=channel_convert<channel_t>(c16_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c16s_min);
+ v_max=channel_convert<channel_t>(c16s_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c32_min);
+ v_max=channel_convert<channel_t>(c32_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c32s_min);
+ v_max=channel_convert<channel_t>(c32s_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c32f_min);
+ v_max=channel_convert<channel_t>(c32f_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+ }
+};
+
+// Different core classes depending on the different types of channels - channel values, references and subbyte references
+// The cores ensure there are two members, _min_v and _max_v initialized with the minimum and maximum channel value.
+// The different channel types have different ways to initialize them, thus require different cores
+
+// For channel values simply initialize the value directly
+template <typename ChannelValue>
+class value_core {
+protected:
+ using channel_t = ChannelValue;
+ channel_t _min_v;
+ channel_t _max_v;
+
+ value_core()
+ : _min_v(channel_traits<ChannelValue>::min_value())
+ , _max_v(channel_traits<ChannelValue>::max_value())
+ {
+ boost::function_requires<ChannelValueConcept<ChannelValue> >();
+ }
+};
+
+// For channel references we need to have separate channel values
+template <typename ChannelRef>
+class reference_core : public value_core<typename channel_traits<ChannelRef>::value_type>
+{
+ using parent_t = value_core<typename channel_traits<ChannelRef>::value_type>;
+
+protected:
+ using channel_t = ChannelRef;
+ channel_t _min_v;
+ channel_t _max_v;
+
+ reference_core()
+ : parent_t()
+ , _min_v(parent_t::_min_v)
+ , _max_v(parent_t::_max_v)
+ {
+ boost::function_requires<ChannelConcept<ChannelRef> >();
+ }
+};
+
+// For subbyte channel references we need to store the bit buffers somewhere
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+class packed_reference_core {
+protected:
+ using channel_t = ChannelSubbyteRef;
+ using integer_t = typename channel_t::integer_t;
+ channel_t _min_v, _max_v;
+
+ integer_t _min_buf, _max_buf;
+
+ packed_reference_core() : _min_v(&_min_buf), _max_v(&_max_buf) {
+ ChannelMutableRef b1(&_min_buf), b2(&_max_buf);
+ b1 = channel_traits<channel_t>::min_value();
+ b2 = channel_traits<channel_t>::max_value();
+
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef> >();
+ }
+};
+
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+class packed_dynamic_reference_core {
+protected:
+ using channel_t = ChannelSubbyteRef;
+ channel_t _min_v, _max_v;
+
+ typename channel_t::integer_t _min_buf, _max_buf;
+
+ packed_dynamic_reference_core(int first_bit1=1, int first_bit2=2) : _min_v(&_min_buf,first_bit1), _max_v(&_max_buf,first_bit2) {
+ ChannelMutableRef b1(&_min_buf,1), b2(&_max_buf,2);
+ b1 = channel_traits<channel_t>::min_value();
+ b2 = channel_traits<channel_t>::max_value();
+
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef> >();
+ }
+};
+
+
+template <typename ChannelValue>
+void test_channel_value() {
+ do_test<value_core<ChannelValue> >().test_all();
+}
+
+template <typename ChannelRef>
+void test_channel_reference() {
+ do_test<reference_core<ChannelRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef>
+void test_packed_channel_reference() {
+ do_test<packed_reference_core<ChannelSubbyteRef,ChannelSubbyteRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef, typename MutableRef>
+void test_const_packed_channel_reference() {
+ do_test<packed_reference_core<ChannelSubbyteRef,MutableRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef>
+void test_packed_dynamic_channel_reference() {
+ do_test<packed_dynamic_reference_core<ChannelSubbyteRef,ChannelSubbyteRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef, typename MutableRef>
+void test_const_packed_dynamic_channel_reference() {
+ do_test<packed_dynamic_reference_core<ChannelSubbyteRef,MutableRef> >().test_all();
+}
+
+template <typename ChannelValue>
+void test_channel_value_impl() {
+ test_channel_value<ChannelValue>();
+ test_channel_reference<ChannelValue&>();
+ test_channel_reference<const ChannelValue&>();
+}
+
+/////////////////////////////////////////////////////////
+///
+/// A channel archetype - to test the minimum requirements of the concept
+///
+/////////////////////////////////////////////////////////
+
+struct channel_value_archetype;
+struct channel_archetype {
+ // equality comparable
+ friend bool operator==(const channel_archetype&,const channel_archetype&) { return true; }
+ friend bool operator!=(const channel_archetype&,const channel_archetype&) { return false; }
+ // less-than comparable
+ friend bool operator<(const channel_archetype&,const channel_archetype&) { return false; }
+ // convertible to a scalar
+ operator std::uint8_t() const { return 0; }
+
+
+ channel_archetype& operator++() { return *this; }
+ channel_archetype& operator--() { return *this; }
+ channel_archetype operator++(int) { return *this; }
+ channel_archetype operator--(int) { return *this; }
+
+ template <typename Scalar> channel_archetype operator+=(Scalar) { return *this; }
+ template <typename Scalar> channel_archetype operator-=(Scalar) { return *this; }
+ template <typename Scalar> channel_archetype operator*=(Scalar) { return *this; }
+ template <typename Scalar> channel_archetype operator/=(Scalar) { return *this; }
+
+ using value_type = channel_value_archetype;
+ using reference = channel_archetype;
+ using const_reference = channel_archetype const;
+ using pointer = channel_value_archetype *;
+ using const_pointer = channel_value_archetype const*;
+ static constexpr bool is_mutable=true;
+
+ static value_type min_value();
+ static value_type max_value();
+};
+
+
+struct channel_value_archetype : public channel_archetype {
+ channel_value_archetype() {} // default constructible
+ channel_value_archetype(const channel_value_archetype&) {} // copy constructible
+ channel_value_archetype& operator=(const channel_value_archetype&){return *this;} // assignable
+ channel_value_archetype(std::uint8_t) {}
+};
+
+channel_value_archetype channel_archetype::min_value() { return channel_value_archetype(); }
+channel_value_archetype channel_archetype::max_value() { return channel_value_archetype(); }
+
+
+void test_packed_channel_reference()
+{
+ using channel16_0_5_reference_t = packed_channel_reference<std::uint16_t, 0, 5, true>;
+ using channel16_5_6_reference_t = packed_channel_reference<std::uint16_t, 5, 6, true>;
+ using channel16_11_5_reference_t = packed_channel_reference<std::uint16_t, 11, 5, true>;
+
+ std::uint16_t data=0;
+ channel16_0_5_reference_t channel1(&data);
+ channel16_5_6_reference_t channel2(&data);
+ channel16_11_5_reference_t channel3(&data);
+
+ channel1=channel_traits<channel16_0_5_reference_t>::max_value();
+ channel2=channel_traits<channel16_5_6_reference_t>::max_value();
+ channel3=channel_traits<channel16_11_5_reference_t>::max_value();
+ error_if(data!=65535);
+
+ test_packed_channel_reference<channel16_0_5_reference_t>();
+ test_packed_channel_reference<channel16_5_6_reference_t>();
+ test_packed_channel_reference<channel16_11_5_reference_t>();
+}
+
+void test_packed_dynamic_channel_reference()
+{
+ using channel16_5_reference_t = packed_dynamic_channel_reference<std::uint16_t, 5, true>;
+ using channel16_6_reference_t = packed_dynamic_channel_reference<std::uint16_t, 6, true>;
+
+ std::uint16_t data=0;
+ channel16_5_reference_t channel1(&data,0);
+ channel16_6_reference_t channel2(&data,5);
+ channel16_5_reference_t channel3(&data,11);
+
+ channel1=channel_traits<channel16_5_reference_t>::max_value();
+ channel2=channel_traits<channel16_6_reference_t>::max_value();
+ channel3=channel_traits<channel16_5_reference_t>::max_value();
+ error_if(data!=65535);
+
+ test_packed_dynamic_channel_reference<channel16_5_reference_t>();
+}
+
+void test_channel() {
+ test_channel_value_impl<uint8_t>();
+ test_channel_value_impl<int8_t>();
+ test_channel_value_impl<uint16_t>();
+ test_channel_value_impl<int16_t>();
+ test_channel_value_impl<uint32_t>();
+ test_channel_value_impl<int16_t>();
+
+ test_channel_value_impl<float32_t>();
+
+ test_packed_channel_reference();
+ test_packed_dynamic_channel_reference();
+
+ // Do only compile-time tests for the archetype (because asserts like val1<val2 fail)
+ boost::function_requires<MutableChannelConcept<channel_archetype> >();
+
+ do_test<value_core<channel_value_archetype> >();
+ do_test<reference_core<channel_archetype> >();
+ do_test<reference_core<const channel_archetype&> >();
+}
+
+int main()
+{
+ try
+ {
+ test_channel();
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
+
+// TODO:
+// - provide algorithm performance overloads for scoped channel and packed channels
+// - Update concepts and documentation
+// - What to do about pointer types?!
+// - Performance!!
+// - is channel_convert the same as native?
+// - is operator++ on float32_t the same as native? How about if operator++ is defined in scoped_channel to do _value++?
diff --git a/src/boost/libs/gil/test/legacy/error_if.cpp b/src/boost/libs/gil/test/legacy/error_if.cpp
new file mode 100644
index 000000000..532d9062c
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/error_if.cpp
@@ -0,0 +1,13 @@
+// Copyright 2008 Lubomir Bourdev and Hailin Jin
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <exception>
+
+void error_if(bool condition) {
+ if (condition)
+ throw std::exception();
+}
+
diff --git a/src/boost/libs/gil/test/legacy/gil_reference_checksums.txt b/src/boost/libs/gil/test/legacy/gil_reference_checksums.txt
new file mode 100644
index 000000000..ca123231d
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/gil_reference_checksums.txt
@@ -0,0 +1,125 @@
+bgr121_basic_red_x 7f6e24e7
+bgr121_basic_white_x e4aaa1d3
+bgr121_histogram_histogram ca580192
+bgr121_views_0th_k_channel daa9f7e3
+bgr121_views_90ccw c64d6d20
+bgr121_views_90cw 8565efd8
+bgr121_views_cropped 43305e15
+bgr121_views_flipped_lr 2d68e448
+bgr121_views_flipped_ud 8f7f7d00
+bgr121_views_gray8 bbabe219
+bgr121_views_my_gray8 3086d22f
+bgr121_views_original 7e5bb87d
+bgr121_views_rot180 68f37202
+bgr121_views_subsampled ac6ca178
+bgr121_views_transpose da2ff80
+bgr8_basic_red_x 7f6e24e7
+bgr8_basic_white_x e4aaa1d3
+bgr8_histogram_histogram badcdd58
+bgr8_views_0th_k_channel 4638e58d
+bgr8_views_0th_n_channel 4638e58d
+bgr8_views_90ccw 8c4980e5
+bgr8_views_90cw e4c69665
+bgr8_views_cropped ff56b05e
+bgr8_views_flipped_lr 63849267
+bgr8_views_flipped_ud c4dcc848
+bgr8_views_gray8 3817178f
+bgr8_views_my_gray8 b33a27b9
+bgr8_views_original 423f1dde
+bgr8_views_rot180 150f1206
+bgr8_views_subsampled 92439ee7
+bgr8_views_transpose c9a890a0
+color_converted_0th_k_channel 3817178f
+color_converted_0th_n_channel 3817178f
+color_converted_90ccw dc403b3
+color_converted_90cw c6fc34de
+color_converted_cropped 666252a
+color_converted_flipped_lr 7ab2d721
+color_converted_flipped_ud 8ad49b3
+color_converted_gray8 3817178f
+color_converted_my_gray8 3817178f
+color_converted_original 3817178f
+color_converted_rot180 b5d0763b
+color_converted_subsampled 28286169
+color_converted_transpose 366b8392
+dynamic_ 423f1dde
+dynamic_fliplr 63849267
+dynamic_flipud c4dcc848
+dynamic_subimage a974d099
+dynamic_subimage_subsampled180rot 4055263a
+gray8_basic_red_x ab461c6a
+gray8_basic_white_x be81c274
+gray8_histogram_histogram badcdd58
+gray8_views_0th_k_channel 3817178f
+gray8_views_0th_n_channel 3817178f
+gray8_views_90ccw dc403b3
+gray8_views_90cw c6fc34de
+gray8_views_cropped 666252a
+gray8_views_flipped_lr 7ab2d721
+gray8_views_flipped_ud 8ad49b3
+gray8_views_gray8 3817178f
+gray8_views_my_gray8 3817178f
+gray8_views_original 3817178f
+gray8_views_rot180 b5d0763b
+gray8_views_subsampled 28286169
+gray8_views_transpose 366b8392
+mandelLuminosityGradient 4ebf3906
+planarrgb8_basic_red_x 7f6e24e7
+planarrgb8_basic_white_x e4aaa1d3
+planarrgb8_histogram_histogram badcdd58
+planarrgb8_views_0th_k_channel 1f48996f
+planarrgb8_views_0th_n_channel 1f48996f
+planarrgb8_views_90ccw 8c4980e5
+planarrgb8_views_90cw e4c69665
+planarrgb8_views_cropped ff56b05e
+planarrgb8_views_flipped_lr 63849267
+planarrgb8_views_flipped_ud c4dcc848
+planarrgb8_views_gray8 3817178f
+planarrgb8_views_my_gray8 b33a27b9
+planarrgb8_views_original 423f1dde
+planarrgb8_views_rot180 150f1206
+planarrgb8_views_subsampled 92439ee7
+planarrgb8_views_transpose c9a890a0
+rgb8_basic_red_x 7f6e24e7
+rgb8_basic_white_x e4aaa1d3
+rgb8_histogram_histogram badcdd58
+rgb8_views_0th_k_channel 1f48996f
+rgb8_views_0th_n_channel 1f48996f
+rgb8_views_90ccw 8c4980e5
+rgb8_views_90cw e4c69665
+rgb8_views_cropped ff56b05e
+rgb8_views_flipped_lr 63849267
+rgb8_views_flipped_ud c4dcc848
+rgb8_views_gray8 3817178f
+rgb8_views_my_gray8 b33a27b9
+rgb8_views_original 423f1dde
+rgb8_views_rot180 150f1206
+rgb8_views_subsampled 92439ee7
+rgb8_views_transpose c9a890a0
+subsampled_0th_k_channel 2c19afc1
+subsampled_0th_n_channel 2c19afc1
+subsampled_90ccw d4649279
+subsampled_90cw e74f0f0e
+subsampled_cropped a5f07581
+subsampled_flipped_lr 8f22df7
+subsampled_flipped_ud 26383f1d
+subsampled_gray8 c95e3def
+subsampled_my_gray8 91ea1379
+subsampled_original 64cf9a6b
+subsampled_rot180 6059029b
+subsampled_subsampled 59aef23b
+subsampled_transpose ec4b368a
+virtual_0th_k_channel 79bca658
+virtual_0th_n_channel 79bca658
+virtual_90ccw 965db1f7
+virtual_90cw a81d80e3
+virtual_cropped ffb4af2c
+virtual_flipped_lr 9d1478c2
+virtual_flipped_ud 18dc9b78
+virtual_gray8 962f6f6f
+virtual_histogram 8deb06eb
+virtual_my_gray8 150bb50d
+virtual_original 927686d4
+virtual_rot180 4dee193e
+virtual_subsampled e99b8073
+virtual_transpose 923e345f
diff --git a/src/boost/libs/gil/test/legacy/image.cpp b/src/boost/libs/gil/test/legacy/image.cpp
new file mode 100644
index 000000000..67b5e0a6a
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/image.cpp
@@ -0,0 +1,612 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef _MSC_VER
+#pragma warning(disable : 4244) // conversion from 'gil::image<V,Alloc>::coord_t' to 'int', possible loss of data (visual studio compiler doesn't realize that the two types are the same)
+#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated
+#pragma warning(disable : 4701) // potentially uninitialized local variable 'result' used in boost/crc.hpp
+#endif
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/crc.hpp>
+#include <boost/mp11.hpp>
+
+#include <ios>
+#include <iostream>
+#include <fstream>
+#include <map>
+#include <stdexcept>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+using namespace boost::gil;
+using namespace std;
+using namespace boost;
+
+extern rgb8c_planar_view_t sample_view;
+void error_if(bool condition);
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4127) //conditional expression is constant
+#endif
+
+// When BOOST_GIL_GENERATE_REFERENCE_DATA is defined, the reference data is generated and saved.
+// When it is undefined, regression tests are checked against it
+//#define BOOST_GIL_GENERATE_REFERENCE_DATA
+
+////////////////////////////////////////////////////
+///
+/// Some algorithms to use in testing
+///
+////////////////////////////////////////////////////
+
+template <typename GrayView, typename R>
+void gray_image_hist(GrayView const& img_view, R& hist)
+{
+ for (auto it = img_view.begin(); it != img_view.end(); ++it)
+ ++hist[*it];
+
+ // Alternatively, prefer the algorithm with lambda
+ // for_each_pixel(img_view, [&hist](gray8_pixel_t const& pixel) {
+ // ++hist[pixel];
+ // });
+}
+
+template <typename V, typename R>
+void get_hist(const V& img_view, R& hist) {
+ gray_image_hist(color_converted_view<gray8_pixel_t>(img_view), hist);
+}
+
+// testing custom color conversion
+template <typename C1, typename C2>
+struct my_color_converter_impl : public default_color_converter_impl<C1,C2> {};
+template <typename C1>
+struct my_color_converter_impl<C1,gray_t> {
+ template <typename P1, typename P2>
+ void operator()(const P1& src, P2& dst) const {
+ default_color_converter_impl<C1,gray_t>()(src,dst);
+ get_color(dst,gray_color_t())=channel_invert(get_color(dst,gray_color_t()));
+ }
+};
+
+struct my_color_converter {
+ template <typename SrcP,typename DstP>
+ void operator()(const SrcP& src,DstP& dst) const {
+ using src_cs_t = typename color_space_type<SrcP>::type;
+ using dst_cs_t = typename color_space_type<DstP>::type;
+ my_color_converter_impl<src_cs_t,dst_cs_t>()(src,dst);
+ }
+};
+
+/// Models a Unary Function
+/// \tparam P models PixelValueConcept
+template <typename P>
+struct mandelbrot_fn
+{
+ using point_t = boost::gil::point_t;
+ using const_t = mandelbrot_fn<P>;
+ using value_type = P;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable = false;
+
+ value_type _in_color,_out_color;
+ point_t _img_size;
+ static const int MAX_ITER=100; // max number of iterations
+
+ mandelbrot_fn() {}
+ mandelbrot_fn(const point_t& sz, const value_type& in_color, const value_type& out_color) : _in_color(in_color), _out_color(out_color), _img_size(sz) {}
+
+ result_type operator()(const point_t& p) const {
+ // normalize the coords to (-2..1, -1.5..1.5)
+ // (actually make y -1.0..2 so it is asymmetric, so we can verify some view factory methods)
+ double t=get_num_iter(point<double>(p.x/(double)_img_size.x*3-2, p.y/(double)_img_size.y*3-1.0f));//1.5f));
+ t=pow(t,0.2);
+
+ value_type ret;
+ for (std::size_t k=0; k<num_channels<P>::value; ++k)
+ ret[k]=(typename channel_type<value_type>::type)(_in_color[k]*t + _out_color[k]*(1-t));
+ return ret;
+ }
+
+private:
+ double get_num_iter(const point<double>& p) const {
+ point<double> Z(0,0);
+ for (int i=0; i<MAX_ITER; ++i) {
+ Z = point<double>(Z.x*Z.x - Z.y*Z.y + p.x, 2*Z.x*Z.y + p.y);
+ if (Z.x*Z.x + Z.y*Z.y > 4)
+ return i/(double)MAX_ITER;
+ }
+ return 0;
+ }
+};
+
+template <typename T>
+void x_gradient(const T& src, const gray8s_view_t& dst) {
+ for (int y=0; y<src.height(); ++y) {
+ typename T::x_iterator src_it = src.row_begin(y);
+ gray8s_view_t::x_iterator dst_it = dst.row_begin(y);
+
+ for (int x=1; x<src.width()-1; ++x)
+ dst_it[x] = (src_it[x+1] - src_it[x-1]) / 2;
+ }
+}
+
+// A quick test whether a view is homogeneous
+
+template <typename Pixel>
+struct pixel_is_homogeneous : public std::true_type {};
+
+template <typename P, typename C, typename L>
+struct pixel_is_homogeneous<packed_pixel<P,C,L> > : public std::false_type {};
+
+template <typename View>
+struct view_is_homogeneous : public pixel_is_homogeneous<typename View::value_type> {};
+
+////////////////////////////////////////////////////
+///
+/// Tests image view transformations and algorithms
+///
+////////////////////////////////////////////////////
+class image_test {
+public:
+ virtual void initialize() {}
+ virtual void finalize() {}
+ virtual ~image_test() {}
+
+ void run();
+protected:
+ virtual void check_view_impl(const rgb8c_view_t& view, const string& name)=0;
+ template <typename View>
+ void check_view(const View& img_view, const string& name) {
+ rgb8_image_t rgb_img(img_view.dimensions());
+ copy_and_convert_pixels(img_view,view(rgb_img));
+ check_view_impl(const_view(rgb_img), name);
+ }
+private:
+ template <typename Img> void basic_test(const string& prefix);
+ template <typename View> void view_transformations_test(const View& img_view, const string& prefix);
+ template <typename View> void homogeneous_view_transformations_test(const View& img_view, const string& prefix, std::true_type);
+ template <typename View> void homogeneous_view_transformations_test(const View& img_view, const string& prefix, std::false_type)
+ {
+ boost::ignore_unused(img_view);
+ boost::ignore_unused(prefix);
+ }
+ template <typename View> void histogram_test(const View& img_view, const string& prefix);
+ void virtual_view_test();
+ void packed_image_test();
+ void dynamic_image_test();
+ template <typename Img> void image_all_test(const string& prefix);
+};
+
+// testing image iterators, clone, fill, locators, color convert
+template <typename Img>
+void image_test::basic_test(const string& prefix) {
+ using View = typename Img::view_t;
+
+ // make a 20x20 image
+ Img img(typename View::point_t(20,20));
+ const View& img_view=view(img);
+
+ // fill it with red
+ rgb8_pixel_t red8(255,0,0), green8(0,255,0), blue8(0,0,255), white8(255,255,255);
+ typename View::value_type red,green,blue,white;
+ color_convert(red8,red);
+ default_color_converter()(red8,red);
+ red=color_convert_deref_fn<rgb8_ref_t,typename Img::view_t::value_type>()(red8);
+
+ color_convert(green8,green);
+ color_convert(blue8,blue);
+ color_convert(white8,white);
+ fill(img_view.begin(),img_view.end(),red);
+
+ color_convert(red8,img_view[0]);
+
+ // pointer to first pixel of second row
+ typename View::reference rt=img_view.at(0,0)[img_view.width()];
+ typename View::x_iterator ptr=&rt;
+ typename View::reference rt2=*(img_view.at(0,0)+img_view.width());
+ typename View::x_iterator ptr2=&rt2;
+ error_if(ptr!=ptr2);
+ error_if(img_view.x_at(0,0)+10!=10+img_view.x_at(0,0));
+
+ // draw a blue line along the diagonal
+ typename View::xy_locator loc=img_view.xy_at(0,img_view.height()-1);
+ for (int y=0; y<img_view.height(); ++y) {
+ *loc=blue;
+ ++loc.x();
+ loc.y()--;
+ }
+
+ // draw a green dotted line along the main diagonal with step of 3
+ loc=img_view.xy_at(img_view.width()-1,img_view.height()-1);
+ while (loc.x()>=img_view.x_at(0,0)) {
+ *loc=green;
+ loc-=typename View::point_t(3,3);
+ }
+
+ // Clone and make every red pixel white
+ Img imgWhite(img);
+ for (typename View::iterator it=view(imgWhite).end(); (it-1)!=view(imgWhite).begin(); --it) {
+ if (*(it-1)==red)
+ *(it-1)=white;
+ }
+
+ check_view(img_view,prefix+"red_x");
+ check_view(view(imgWhite),prefix+"white_x");
+}
+
+template <typename View>
+void image_test::histogram_test(const View& img_view, const string& prefix) {
+// vector<int> histogram(255,0);
+// get_hist(cropped,histogram.begin());
+ unsigned char histogram[256];
+ fill(histogram,histogram+256,0);
+ get_hist(img_view,histogram);
+ gray8c_view_t hist_view=interleaved_view(256,1,(const gray8_pixel_t*)histogram,256);
+ check_view(hist_view,prefix+"histogram");
+}
+
+template <typename View>
+void image_test::view_transformations_test(const View& img_view, const string& prefix) {
+ check_view(img_view,prefix+"original");
+
+ check_view(subimage_view(img_view, iround(img_view.dimensions()/4), iround(img_view.dimensions()/2)),prefix+"cropped");
+ check_view(color_converted_view<gray8_pixel_t>(img_view),prefix+"gray8");
+ check_view(color_converted_view<gray8_pixel_t>(img_view,my_color_converter()),prefix+"my_gray8");
+ check_view(transposed_view(img_view),prefix+"transpose");
+ check_view(rotated180_view(img_view),prefix+"rot180");
+ check_view(rotated90cw_view(img_view),prefix+"90cw");
+ check_view(rotated90ccw_view(img_view),prefix+"90ccw");
+ check_view(flipped_up_down_view(img_view),prefix+"flipped_ud");
+ check_view(flipped_left_right_view(img_view),prefix+"flipped_lr");
+ check_view(subsampled_view(img_view,typename View::point_t(2,1)),prefix+"subsampled");
+ check_view(kth_channel_view<0>(img_view),prefix+"0th_k_channel");
+ homogeneous_view_transformations_test(img_view, prefix, view_is_homogeneous<View>());
+}
+
+template <typename View>
+void image_test::homogeneous_view_transformations_test(const View& img_view, const string& prefix, std::true_type) {
+ check_view(nth_channel_view(img_view,0),prefix+"0th_n_channel");
+}
+
+void image_test::virtual_view_test()
+{
+ using deref_t = mandelbrot_fn<rgb8_pixel_t>;
+ using point_t = deref_t::point_t;
+ using locator_t = virtual_2d_locator<deref_t, false>;
+ using my_virt_view_t = image_view<locator_t>;
+
+ boost::function_requires<PixelLocatorConcept<locator_t> >();
+ gil_function_requires<StepIteratorConcept<locator_t::x_iterator> >();
+
+ point_t dims(200,200);
+ my_virt_view_t mandel(dims, locator_t(point_t(0,0), point_t(1,1), deref_t(dims, rgb8_pixel_t(255,0,255), rgb8_pixel_t(0,255,0))));
+
+ gray8s_image_t img(dims);
+ fill_pixels(view(img),0); // our x_gradient algorithm doesn't change the first & last column, so make sure they are 0
+ x_gradient(color_converted_view<gray8_pixel_t>(mandel), view(img));
+ check_view(color_converted_view<gray8_pixel_t>(const_view(img)), "mandelLuminosityGradient");
+
+ view_transformations_test(mandel,"virtual_");
+ histogram_test(mandel,"virtual_");
+}
+
+// Test alignment and packed images
+void image_test::packed_image_test()
+{
+ using bgr131_image_t = bit_aligned_image3_type<1,3,1, bgr_layout_t>::type;
+ using bgr131_pixel_t = bgr131_image_t::value_type;
+ bgr131_pixel_t fill_val(1,3,1);
+
+ bgr131_image_t bgr131_img(3,10);
+ fill_pixels(view(bgr131_img), fill_val);
+
+ bgr131_image_t bgr131a_img(3,10,1);
+ copy_pixels(const_view(bgr131_img), view(bgr131a_img));
+
+ bgr131_image_t bgr131b_img(3,10,4);
+ copy_pixels(const_view(bgr131_img), view(bgr131b_img));
+
+ error_if(bgr131_img!=bgr131a_img || bgr131a_img!=bgr131b_img);
+}
+
+void image_test::dynamic_image_test()
+{
+ using any_image_t = any_image
+ <
+ mp11::mp_list
+ <
+ gray8_image_t,
+ bgr8_image_t,
+ argb8_image_t,
+ rgb8_image_t,
+ rgb8_planar_image_t
+ >
+ >;
+ rgb8_planar_image_t img(sample_view.dimensions());
+ copy_pixels(sample_view, view(img));
+ any_image_t any_img=any_image_t(img);
+
+ check_view(view(any_img), "dynamic_");
+ check_view(flipped_left_right_view(view(any_img)), "dynamic_fliplr");
+ check_view(flipped_up_down_view(view(any_img)), "dynamic_flipud");
+
+ any_image_t::view_t subimageView=subimage_view(view(any_img),0,0,10,15);
+
+ check_view(subimageView, "dynamic_subimage");
+ check_view(subsampled_view(rotated180_view(view(any_img)), 2,1), "dynamic_subimage_subsampled180rot");
+}
+
+template <typename Img>
+void image_test::image_all_test(const string& prefix) {
+ basic_test<Img>(prefix+"basic_");
+
+ Img img;
+ img.recreate(sample_view.dimensions());
+ copy_and_convert_pixels(sample_view,view(img));
+
+ view_transformations_test(view(img), prefix+"views_");
+
+ histogram_test(const_view(img),prefix+"histogram_");
+}
+
+void image_test::run() {
+ initialize();
+
+ image_all_test<bgr8_image_t>("bgr8_");
+ image_all_test<rgb8_image_t>("rgb8_");
+ image_all_test<rgb8_planar_image_t>("planarrgb8_");
+ image_all_test<gray8_image_t>("gray8_");
+
+// FIXME: https://github.com/boostorg/gil/issues/447
+// Disable bgc121_image_t drawing as work around for a mysterious bug
+// revealing itself when using MSVC 64-bit optimized build.
+#if !(defined(NDEBUG) && defined (_MSC_VER) && defined(_WIN64))
+ using bgr121_ref_t = bit_aligned_pixel_reference
+ <
+ boost::uint8_t,
+ mp11::mp_list_c<int, 1, 2, 1>,
+ bgr_layout_t,
+ true
+ > const;
+ using bgr121_image_t = image<bgr121_ref_t, false>;
+ image_all_test<bgr121_image_t>("bgr121_");
+#endif
+
+ // TODO: Remove?
+ view_transformations_test(subsampled_view(sample_view, point_t(1,2)), "subsampled_");
+ view_transformations_test(color_converted_view<gray8_pixel_t>(sample_view),"color_converted_");
+
+ virtual_view_test();
+ packed_image_test();
+ dynamic_image_test();
+
+ finalize();
+}
+
+////////////////////////////////////////////////////
+///
+/// Performs or generates image tests using checksums
+///
+////////////////////////////////////////////////////
+
+class checksum_image_mgr : public image_test
+{
+protected:
+ using crc_map_t = map<string, boost::crc_32_type::value_type>;
+ crc_map_t _crc_map;
+};
+
+////////////////////////////////////////////////////
+///
+/// Performs image tests by comparing image pixel checksums against a reference
+///
+////////////////////////////////////////////////////
+
+class checksum_image_test : public checksum_image_mgr {
+public:
+ checksum_image_test(const char* filename) : _filename(filename) {}
+private:
+ const char* _filename;
+ void initialize() override;
+ void check_view_impl(const rgb8c_view_t& v, const string& name) override;
+};
+
+// Load the checksums from the reference file and create the start image
+void checksum_image_test::initialize() {
+ boost::crc_32_type::value_type crc_result;
+ fstream checksum_ref(_filename,ios::in);
+ while (true) {
+ string crc_name;
+ checksum_ref >> crc_name >> std::hex >> crc_result;
+ if(checksum_ref.fail()) break;
+ if (!crc_name.empty() && crc_name[0] == '#')
+ {
+ crc_result = 0; // skip test case
+ crc_name = crc_name.substr(1);
+ }
+ _crc_map[crc_name]=crc_result;
+ }
+ checksum_ref.close();
+}
+
+// Create a checksum for the given view and compare it with the reference checksum. Throw exception if different
+void checksum_image_test::check_view_impl(const rgb8c_view_t& img_view, const string& name) {
+ boost::crc_32_type checksum_acumulator;
+ checksum_acumulator.process_bytes(img_view.row_begin(0),img_view.size()*3);
+ unsigned int const crc_expect = _crc_map[name];
+ if (crc_expect == 0)
+ {
+ cerr << "Skipping checksum check for " << name << " (crc=0)" << endl;
+ return;
+ }
+
+ boost::crc_32_type::value_type const crc = checksum_acumulator.checksum();
+ if (crc==crc_expect) {
+ cerr << "Checking checksum for " << name << " (crc=" << std::hex << crc << ")" << endl;
+ }
+ else {
+ cerr << "Checksum error in " << name
+ << " (crc=" << std::hex << crc << " != " << std::hex << crc_expect << ")" << endl;
+ error_if(true);
+ }
+}
+
+////////////////////////////////////////////////////
+///
+/// Generates a set of reference checksums to compare against
+///
+////////////////////////////////////////////////////
+
+class checksum_image_generate : public checksum_image_mgr {
+public:
+ checksum_image_generate(const char* filename) : _filename(filename) {}
+private:
+ const char* _filename;
+ void check_view_impl(const rgb8c_view_t& img_view, const string& name) override;
+ void finalize() override;
+};
+
+// Add the checksum of the given view to the map of checksums
+void checksum_image_generate::check_view_impl(const rgb8c_view_t& img_view, const string& name) {
+ boost::crc_32_type result;
+ result.process_bytes(img_view.row_begin(0),img_view.size()*3);
+ cerr << "Generating checksum for " << name << endl;
+ _crc_map[name] = result.checksum();
+}
+
+// Save the checksums into the reference file
+void checksum_image_generate::finalize() {
+ fstream checksum_ref(_filename,ios::out);
+ for (crc_map_t::const_iterator it=_crc_map.begin(); it!=_crc_map.end(); ++it) {
+ checksum_ref << it->first << " " << std::hex << it->second << "\r\n";
+ }
+ checksum_ref.close();
+}
+
+////////////////////////////////////////////////////
+///
+/// Performs or generates image tests using image I/O
+///
+////////////////////////////////////////////////////
+
+extern const string in_dir;
+extern const string out_dir;
+extern const string ref_dir;
+
+const string in_dir=""; // directory of source images
+const string out_dir=in_dir+"image-out/"; // directory where to write output
+const string ref_dir=in_dir+"image-ref/"; // reference directory to compare written with actual output
+
+void static_checks() {
+ gil_function_requires<ImageConcept<rgb8_image_t> >();
+
+ static_assert(view_is_basic<rgb8_step_view_t>::value, "");
+ static_assert(view_is_basic<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(view_is_basic<rgb8_planar_view_t>::value, "");
+
+ static_assert(view_is_step_in_x<rgb8_step_view_t>::value, "");
+ static_assert(view_is_step_in_x<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(!view_is_step_in_x<rgb8_planar_view_t>::value, "");
+
+ static_assert(!is_planar<rgb8_step_view_t>::value, "");
+ static_assert(is_planar<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(is_planar<rgb8_planar_view_t>::value, "");
+
+ static_assert(view_is_mutable<rgb8_step_view_t>::value, "");
+ static_assert(!view_is_mutable<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(view_is_mutable<rgb8_planar_view_t>::value, "");
+
+ static_assert(std::is_same
+ <
+ derived_view_type<cmyk8c_planar_step_view_t>::type,
+ cmyk8c_planar_step_view_t
+ >::value, "");
+ static_assert(std::is_same
+ <
+ derived_view_type
+ <
+ cmyk8c_planar_step_view_t, std::uint16_t, rgb_layout_t
+ >::type,
+ rgb16c_planar_step_view_t
+ >::value, "");
+ static_assert(std::is_same
+ <
+ derived_view_type
+ <
+ cmyk8c_planar_step_view_t, use_default, rgb_layout_t, std::false_type, use_default, std::false_type
+ >::type,
+ rgb8c_step_view_t
+ >::value, "");
+
+ // test view get raw data (mostly compile-time test)
+ {
+ rgb8_image_t rgb8(100,100);
+ unsigned char* data=interleaved_view_get_raw_data(view(rgb8));
+ const unsigned char* cdata=interleaved_view_get_raw_data(const_view(rgb8));
+ error_if(data!=cdata);
+ }
+
+ {
+ rgb16s_planar_image_t rgb8(100,100);
+ short* data=planar_view_get_raw_data(view(rgb8),1);
+ const short* cdata=planar_view_get_raw_data(const_view(rgb8),1);
+ error_if(data!=cdata);
+ }
+}
+
+using image_test_t = checksum_image_test;
+using image_generate_t = checksum_image_generate;
+
+#ifdef BOOST_GIL_GENERATE_REFERENCE_DATA
+using image_mgr_t = image_generate_t;
+#else
+using image_mgr_t = image_test_t;
+#endif
+
+void test_image(const char* ref_checksum) {
+ image_mgr_t mgr(ref_checksum);
+
+ cerr << "Reading checksums from " << ref_checksum << endl;
+ mgr.run();
+ static_checks();
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ throw std::runtime_error("No file with reference checksums specified");
+
+ std::string local_name = argv[1];
+ std::ifstream file_is_there(local_name.c_str());
+ if (!file_is_there)
+ throw std::runtime_error("Unable to open gil_reference_checksums.txt");
+
+ test_image(local_name.c_str());
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/gil/test/legacy/performance.cpp b/src/boost/libs/gil/test/legacy/performance.cpp
new file mode 100644
index 000000000..31a35de15
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/performance.cpp
@@ -0,0 +1,520 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstddef>
+#include <ctime>
+#include <iostream>
+
+// GIL performance test suite
+//
+// Available tests:
+// fill_pixels() on rgb8_image_t with rgb8_pixel_t
+// fill_pixels() on rgb8_planar_image_t with rgb8_pixel_t
+// fill_pixels() on rgb8_image_t with bgr8_pixel_t
+// fill_pixels() on rgb8_planar_image_t with bgr8_pixel_t
+// for_each_pixel() on rgb8_image_t
+// for_each_pixel() on rgb8_planar_t
+// copy_pixels() between rgb8_image_t and rgb8_image_t
+// copy_pixels() between rgb8_image_t and bgr8_image_t
+// copy_pixels() between rgb8_planar_image_t and rgb8_planar_image_t
+// copy_pixels() between rgb8_image_t and rgb8_planar_image_t
+// copy_pixels() between rgb8_planar_image_t and rgb8_image_t
+// transform_pixels() between rgb8_image_t and rgb8_image_t
+// transform_pixels() between rgb8_planar_image_t and rgb8_planar_image_t
+// transform_pixels() between rgb8_planar_image_t and rgb8_image_t
+// transform_pixels() between rgb8_image_t and rgb8_planar_image_t
+
+using namespace boost::gil;
+
+// returns time in milliseconds per call
+template <typename Op>
+double measure_time(Op op, std::size_t num_loops) {
+ clock_t begin=clock();
+ for (std::size_t ii=0; ii<num_loops; ++ii) op();
+ return double(clock()-begin)/double(num_loops);
+}
+
+// image dimension
+std::size_t width=1000, height=400;
+
+// macros for standard GIL views
+#define RGB_VIEW(T) image_view<memory_based_2d_locator<memory_based_step_iterator<pixel<T,rgb_layout_t>*>>>
+#define BGR_VIEW(T) image_view<memory_based_2d_locator<memory_based_step_iterator<pixel<T,bgr_layout_t>*>>>
+#define RGB_PLANAR_VIEW(T) image_view<memory_based_2d_locator<memory_based_step_iterator<planar_pixel_iterator<T*,rgb_t>>>>
+
+template <typename View, typename P>
+struct fill_gil_t {
+ View _v;
+ P _p;
+ fill_gil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {fill_pixels(_v,_p);}
+};
+template <typename View, typename P> struct fill_nongil_t;
+template <typename T, typename P>
+struct fill_nongil_t<RGB_VIEW(T), P>
+{
+ using View = RGB_VIEW(T);
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ T* first=(T*)_v.row_begin(0);
+ T* last=first+_v.size()*3;
+ while(first!=last) {
+ first[0]=boost::gil::at_c<0>(_p);
+ first[1]=boost::gil::at_c<1>(_p);
+ first[2]=boost::gil::at_c<2>(_p);
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct fill_nongil_t<RGB_VIEW(T1), pixel<T2,bgr_layout_t>>
+{
+ using View = RGB_VIEW(T1);
+ using P = pixel<T2, bgr_layout_t>;
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ T1* first=(T1*)_v.row_begin(0);
+ T1* last=first+_v.size()*3;
+ while(first!=last) {
+ first[0]=boost::gil::at_c<2>(_p);
+ first[1]=boost::gil::at_c<1>(_p);
+ first[2]=boost::gil::at_c<0>(_p);
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct fill_nongil_t<RGB_PLANAR_VIEW(T1), pixel<T2,rgb_layout_t>>
+{
+ using View = RGB_PLANAR_VIEW(T1);
+ using P = pixel<T2, rgb_layout_t>;
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ std::size_t size=_v.size();
+ T1* first;
+ first=(T1*)boost::gil::at_c<0>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<0>(_p));
+ first=(T1*)boost::gil::at_c<1>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<1>(_p));
+ first=(T1*)boost::gil::at_c<2>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<2>(_p));
+ }
+};
+
+template <typename T1, typename T2>
+struct fill_nongil_t<RGB_PLANAR_VIEW(T1), pixel<T2,bgr_layout_t>>
+{
+ using View = RGB_PLANAR_VIEW(T1);
+ using P = pixel<T2,bgr_layout_t>;
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ std::size_t size=_v.size();
+ T1* first;
+ first=(T1*)boost::gil::at_c<0>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<2>(_p));
+ first=(T1*)boost::gil::at_c<1>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<1>(_p));
+ first=(T1*)boost::gil::at_c<2>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<1>(_p));
+ }
+};
+
+template <typename View, typename P>
+void test_fill(std::size_t trials) {
+ image<typename View::value_type, is_planar<View>::value> im(width,height);
+ std::cout << "GIL: "<< measure_time(fill_gil_t<View,P>(view(im),P()),trials) << std::endl;
+ std::cout << "Non-GIL: "<< measure_time(fill_nongil_t<View,P>(view(im),P()),trials) << std::endl;
+};
+
+template <typename T>
+struct rgb_fr_t {
+ void operator()(pixel<T,rgb_layout_t>& p) const {p[0]=0;p[1]=1;p[2]=2;}
+ void operator()(const planar_pixel_reference<T&,rgb_t>& p) const {p[0]=0;p[1]=1;p[2]=2;}
+};
+template <typename View, typename F>
+struct for_each_gil_t {
+ View _v;
+ F _f;
+ for_each_gil_t(const View& v_in,const F& f_in) : _v(v_in), _f(f_in) {}
+ void operator()() const {for_each_pixel(_v,_f);}
+};
+template <typename View, typename F> struct for_each_nongil_t;
+template <typename T, typename T2>
+struct for_each_nongil_t<RGB_VIEW(T), rgb_fr_t<T2>>
+{
+ using View = RGB_VIEW(T);
+ using F = rgb_fr_t<T2>;
+ View _v;
+ F _f;
+ for_each_nongil_t(const View& v_in,const F& f_in) : _v(v_in), _f(f_in) {}
+ void operator()() const {
+ T* first=(T*)_v.row_begin(0);
+ T* last=first+_v.size()*3;
+ while(first!=last) {
+ first[0]=0;
+ first[1]=1;
+ first[2]=2;
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct for_each_nongil_t<RGB_PLANAR_VIEW(T1), rgb_fr_t<T2>>
+{
+ using View = RGB_PLANAR_VIEW(T1);
+ using F = rgb_fr_t<T2>;
+ View _v;
+ F _f;
+ for_each_nongil_t(const View& v_in,const F& f_in) : _v(v_in), _f(f_in) {}
+ void operator()() const {
+ T1 *first0, *first1, *first2, *last0;
+ first0=(T1*)boost::gil::at_c<0>(_v.row_begin(0));
+ first1=(T1*)boost::gil::at_c<1>(_v.row_begin(0));
+ first2=(T1*)boost::gil::at_c<2>(_v.row_begin(0));
+ last0=first0+_v.size();
+ while(first0!=last0) {
+ *first0++=0;
+ *first1++=1;
+ *first2++=2;
+ }
+ }
+};
+
+template <typename View, typename F>
+void test_for_each(std::size_t trials) {
+ image<typename View::value_type, is_planar<View>::value> im(width,height);
+ std::cout << "GIL: "<<measure_time(for_each_gil_t<View,F>(view(im),F()),trials) << std::endl;
+ std::cout << "Non-GIL: "<<measure_time(for_each_nongil_t<View,F>(view(im),F()),trials) << std::endl;
+}
+
+// copy
+template <typename View1, typename View2>
+struct copy_gil_t {
+ View1 _v1;
+ View2 _v2;
+ copy_gil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {copy_pixels(_v1,_v2);}
+};
+template <typename View1, typename View2> struct copy_nongil_t;
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_VIEW(T1),RGB_VIEW(T2)>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ T2* first2=(T2*)_v2.row_begin(0);
+ std::copy(first1,last1,first2);
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_VIEW(T1),BGR_VIEW(T2)>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = BGR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ T2* first2=(T2*)_v2.row_begin(0);
+ while(first1!=last1) {
+ first2[2]=first1[0];
+ first2[1]=first1[1];
+ first2[0]=first1[2];
+ first1+=3; first2+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_PLANAR_VIEW(T1),RGB_PLANAR_VIEW(T2)>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ std::size_t size=_v1.size();
+ T1* first10=(T1*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T1* first11=(T1*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T1* first12=(T1*)boost::gil::at_c<2>(_v1.row_begin(0));
+ T2* first20=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T2* first21=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T2* first22=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ std::copy(first10,first10+size,first20);
+ std::copy(first11,first11+size,first21);
+ std::copy(first12,first12+size,first22);
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_VIEW(T1),RGB_PLANAR_VIEW(T2)>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first=(T1*)_v1.row_begin(0);
+ T1* last=first+_v1.size()*3;
+ T2* first0=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T2* first1=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T2* first2=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ while(first!=last) {
+ *first0++=first[0];
+ *first1++=first[1];
+ *first2++=first[2];
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_PLANAR_VIEW(T1),RGB_VIEW(T2)>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first=(T1*)_v2.row_begin(0);
+ T1* last=first+_v2.size()*3;
+ T2* first0=(T2*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T2* first1=(T2*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T2* first2=(T2*)boost::gil::at_c<2>(_v1.row_begin(0));
+ while(first!=last) {
+ first[0]=*first0++;
+ first[1]=*first1++;
+ first[2]=*first2++;
+ first+=3;
+ }
+ }
+};
+template <typename View1, typename View2>
+void test_copy(std::size_t trials) {
+ image<typename View1::value_type, is_planar<View1>::value> im1(width,height);
+ image<typename View2::value_type, is_planar<View2>::value> im2(width,height);
+ std::cout << "GIL: " <<measure_time(copy_gil_t<View1,View2>(view(im1),view(im2)),trials) << std::endl;
+ std::cout << "Non-GIL: "<<measure_time(copy_nongil_t<View1,View2>(view(im1),view(im2)),trials) << std::endl;
+}
+
+// transform()
+template <typename T,typename Pixel>
+struct bgr_to_rgb_t {
+ pixel<T,rgb_layout_t> operator()(const Pixel& p) const {
+ return pixel<T,rgb_layout_t>(T(get_color(p,blue_t())*0.1f),
+ T(get_color(p,green_t())*0.2f),
+ T(get_color(p,red_t())*0.3f));
+ }
+};
+template <typename View1, typename View2, typename F>
+struct transform_gil_t {
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_gil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {transform_pixels(_v1,_v2,_f);}
+};
+template <typename View1, typename View2, typename F> struct transform_nongil_t;
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_VIEW(T1),RGB_VIEW(T2),F>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T2* first2=(T1*)_v2.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ while(first1!=last1) {
+ first2[0]=T2(first1[2]*0.1f);
+ first2[1]=T2(first1[1]*0.2f);
+ first2[2]=T2(first1[0]*0.3f);
+ first1+=3; first2+=3;
+ }
+ }
+};
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_PLANAR_VIEW(T1),RGB_PLANAR_VIEW(T2),F>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first10=(T1*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T1* first11=(T1*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T1* first12=(T1*)boost::gil::at_c<2>(_v1.row_begin(0));
+ T1* first20=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T1* first21=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T1* first22=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ T1* last10=first10+_v1.size();
+ while(first10!=last10) {
+ *first20++=T2(*first12++*0.1f);
+ *first21++=T2(*first11++*0.2f);
+ *first22++=T2(*first10++*0.3f);
+ }
+ }
+};
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_VIEW(T1),RGB_PLANAR_VIEW(T2),F>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ T1* first20=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T1* first21=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T1* first22=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ while(first1!=last1) {
+ *first20++=T2(first1[2]*0.1f);
+ *first21++=T2(first1[1]*0.2f);
+ *first22++=T2(first1[0]*0.3f);
+ first1+=3;
+ }
+ }
+};
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_PLANAR_VIEW(T1),RGB_VIEW(T2),F>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first10=(T1*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T1* first11=(T1*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T1* first12=(T1*)boost::gil::at_c<2>(_v1.row_begin(0));
+ T2* first2=(T1*)_v2.row_begin(0);
+ T1* last2=first2+_v1.size()*3;
+ while(first2!=last2) {
+ first2[0]=T2(*first12++*0.1f);
+ first2[1]=T2(*first11++*0.2f);
+ first2[2]=T2(*first10++*0.3f);
+ first2+=3;
+ }
+ }
+};
+
+template <typename View1, typename View2, typename F>
+void test_transform(std::size_t trials) {
+ image<typename View1::value_type, is_planar<View1>::value> im1(width,height);
+ image<typename View2::value_type, is_planar<View2>::value> im2(width,height);
+ //std::cout << "GIL: " <<measure_time(transform_gil_t<View1,View2,F>(view(im1),view(im2),F()),trials) << std::endl;
+ //std::cout << "Non-GIL: "<<measure_time(transform_nongil_t<View1,View2,F>(view(im1),view(im2),F()),trials) << std::endl;
+}
+
+void test_performance()
+{
+#ifdef NDEBUG
+ std::size_t num_trials=1000;
+#else
+ std::size_t num_trials=1;
+#endif
+
+ // fill()
+ std::cout<<"test fill_pixels() on rgb8_image_t with rgb8_pixel_t"<<std::endl;
+ test_fill<rgb8_view_t,rgb8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test fill_pixels() on rgb8_planar_image_t with rgb8_pixel_t"<<std::endl;
+ test_fill<rgb8_planar_view_t,rgb8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test fill_pixels() on rgb8_image_t with bgr8_pixel_t"<<std::endl;
+ test_fill<rgb8_view_t,bgr8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test fill_pixels() on rgb8_planar_image_t with bgr8_pixel_t"<<std::endl;
+ test_fill<rgb8_planar_view_t,bgr8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ // for_each()
+ std::cout<<"test for_each_pixel() on rgb8_image_t"<<std::endl;
+ test_for_each<rgb8_view_t,rgb_fr_t<uint8_t> >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test for_each_pixel() on rgb8_planar_image_t"<<std::endl;
+ test_for_each<rgb8_planar_view_t,rgb_fr_t<uint8_t> >(num_trials);
+ std::cout<<std::endl;
+
+ // copy()
+ std::cout<<"test copy_pixels() between rgb8_image_t and rgb8_image_t"<<std::endl;
+ test_copy<rgb8_view_t,rgb8_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_image_t and bgr8_image_t"<<std::endl;
+ test_copy<rgb8_view_t,bgr8_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_planar_image_t and rgb8_planar_image_t"<<std::endl;
+ test_copy<rgb8_planar_view_t,rgb8_planar_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_image_t and rgb8_planar_image_t"<<std::endl;
+ test_copy<rgb8_view_t,rgb8_planar_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_planar_image_t and rgb8_image_t"<<std::endl;
+ test_copy<rgb8_planar_view_t,rgb8_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ // transform()
+ std::cout<<"test transform_pixels() between rgb8_image_t and rgb8_image_t"<<std::endl;
+ test_transform<rgb8_view_t,rgb8_view_t,bgr_to_rgb_t<uint8_t,pixel<uint8_t,rgb_layout_t> > >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test transform_pixels() between rgb8_planar_image_t and rgb8_planar_image_t"<<std::endl;
+ test_transform<rgb8_planar_view_t,rgb8_planar_view_t,bgr_to_rgb_t<uint8_t,planar_pixel_reference<uint8_t,rgb_t> > >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test transform_pixels() between rgb8_image_t and rgb8_planar_image_t"<<std::endl;
+ test_transform<rgb8_view_t,rgb8_planar_view_t,bgr_to_rgb_t<uint8_t,pixel<uint8_t,rgb_layout_t> > >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test transform_pixels() between rgb8_planar_image_t and rgb8_image_t"<<std::endl;
+ test_transform<rgb8_planar_view_t,rgb8_view_t,bgr_to_rgb_t<uint8_t,planar_pixel_reference<uint8_t,rgb_t> > >(num_trials);
+ std::cout<<std::endl;
+}
+
+int main()
+{
+
+ test_performance();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/legacy/pixel.cpp b/src/boost/libs/gil/test/legacy/pixel.cpp
new file mode 100644
index 000000000..743f1b157
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/pixel.cpp
@@ -0,0 +1,322 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mp11.hpp>
+
+#include <exception>
+#include <iostream>
+#include <iterator>
+#include <type_traits>
+
+using namespace boost::gil;
+using std::swap;
+using namespace boost;
+
+void error_if(bool condition);
+
+struct increment {
+ template <typename Incrementable> void operator()(Incrementable& x) const { ++x; }
+};
+
+struct prev
+{
+ template <typename Subtractable>
+ auto operator()(const Subtractable& x) const -> typename channel_traits<Subtractable>::value_type
+ {
+ using return_type = typename channel_traits<Subtractable>::value_type;
+ return static_cast<return_type>(x - 1);
+ }
+};
+
+struct set_to_one{ int operator()() const { return 1; } };
+
+// Construct with two pixel types. They must be compatible and the second must be mutable
+template <typename C1, typename C2>
+struct do_basic_test : public C1, public C2
+{
+ using pixel1_t = typename C1::type;
+ using pixel2_t = typename C2::type;
+ using pixel1_value_t = typename C1::pixel_t::value_type;
+ using pixel2_value_t = typename C2::pixel_t::value_type;
+ using pixel_value_t = pixel1_value_t;
+
+ do_basic_test(const pixel_value_t& v) : C1(v), C2(v) {}
+
+ void test_all() {
+ test_heterogeneous();
+
+ // test homogeneous algorithms - fill, max, min
+ static const int num_chan = num_channels<typename C2::pixel_t>::value;
+ static_fill(C2::_pixel, gil::at_c<0>(C1::_pixel)+1);
+ error_if(gil::at_c<0>(C2::_pixel) != gil::at_c<num_chan-1>(C2::_pixel));
+
+ C2::_pixel = C1::_pixel;
+ error_if(static_max(C2::_pixel) != static_max(C1::_pixel));
+ error_if(static_min(C2::_pixel) != static_min(C1::_pixel));
+ error_if(static_max(C2::_pixel) < static_min(C2::_pixel));
+
+ // test operator[]
+ C2::_pixel[0] = C1::_pixel[0]+1;
+ error_if(C2::_pixel[0] != C1::_pixel[0]+1);
+ }
+
+ void test_heterogeneous() {
+ // Both must be pixel types (not necessarily pixel values). The second must be mutable. They must be compatible
+ boost::function_requires<PixelConcept<typename C1::pixel_t> >();
+ boost::function_requires<MutablePixelConcept<typename C2::pixel_t> >();
+ boost::function_requires<PixelsCompatibleConcept<typename C1::pixel_t,typename C2::pixel_t> >();
+
+ C2::_pixel = C1::_pixel; // test operator=
+ error_if(C1::_pixel != C2::_pixel); // test operator==
+
+ // construct a pixel value from it
+ pixel1_value_t v1(C1::_pixel);
+ pixel2_value_t v2(C2::_pixel);
+ error_if(v1 != v2);
+
+ // construct from a pixel value
+ pixel1_t c1(v1);
+ pixel2_t c2(v2);
+ error_if(c1 != c2);
+
+ // Invert the first semantic channel.
+ C2::_pixel = C1::_pixel;
+ semantic_at_c<0>(C2::_pixel) = channel_invert(semantic_at_c<0>(C2::_pixel));
+ error_if(C1::_pixel == C2::_pixel); // now they must not be equal
+
+ // test pixel algorithms
+ C2::_pixel = C1::_pixel;
+ static_for_each(C2::_pixel, increment());
+ static_transform(C2::_pixel, C2::_pixel, prev());
+ error_if(C1::_pixel!=C2::_pixel);
+
+ static_generate(C2::_pixel, set_to_one());
+ error_if(gil::at_c<0>(C2::_pixel) != 1);
+
+ // Test swap if both are mutable and if their value type is the same
+ // (We know the second one is mutable)
+ using p1_ref = typename boost::add_reference<typename C1::type>::type;
+ using is_swappable = std::integral_constant
+ <
+ bool,
+ pixel_reference_is_mutable<p1_ref>::value &&
+ std::is_same<pixel1_value_t, pixel2_value_t>::value
+ >;
+ test_swap(is_swappable{});
+ }
+
+ void test_swap(std::false_type) {}
+ void test_swap(std::true_type) {
+ // test swap
+ static_fill(C1::_pixel, 0);
+ static_fill(C2::_pixel, 1);
+ pixel_value_t pv1(C1::_pixel);
+ pixel_value_t pv2(C2::_pixel);
+ error_if(C2::_pixel == C1::_pixel);
+ swap(C1::_pixel, C2::_pixel);
+ error_if(C1::_pixel != pv2 || C2::_pixel != pv1);
+ }
+};
+
+template <typename PixelValue, int Tag=0>
+class value_core
+{
+public:
+ using type = PixelValue;
+ using pixel_t = type;
+ type _pixel;
+
+ value_core() : _pixel(0) {}
+ value_core(const type& val) : _pixel(val) { // test copy constructor
+ boost::function_requires<PixelValueConcept<pixel_t> >();
+ type p2; // test default constructor
+ boost::ignore_unused(p2);
+ }
+};
+
+template <typename PixelRef, int Tag=0>
+class reference_core : public value_core<typename std::remove_reference<PixelRef>::type::value_type, Tag>
+{
+public:
+ using type = PixelRef;
+ using pixel_t = typename std::remove_reference<PixelRef>::type;
+ using parent_t = value_core<typename pixel_t::value_type, Tag>;
+
+ type _pixel;
+
+ reference_core() : parent_t(), _pixel(parent_t::_pixel) {}
+ reference_core(const typename pixel_t::value_type& val) : parent_t(val), _pixel(parent_t::_pixel) {
+ boost::function_requires<PixelConcept<pixel_t> >();
+ }
+};
+
+// Use a subset of pixel models that covers all color spaces, channel depths, reference/value, planar/interleaved, const/mutable
+// color conversion will be invoked on pairs of them. Having an exhaustive binary check would be too big/expensive.
+using representative_pixels_t = mp11::mp_list
+<
+ value_core<gray8_pixel_t>,
+ reference_core<gray16_pixel_t&>,
+ value_core<bgr8_pixel_t>,
+ reference_core<rgb8_planar_ref_t>,
+ value_core<argb32_pixel_t>,
+ reference_core<cmyk32f_pixel_t&>,
+ reference_core<abgr16c_ref_t>, // immutable reference
+ reference_core<rgb32fc_planar_ref_t>
+>;
+
+template <typename Pixel1>
+struct ccv2 {
+ template <typename P1, typename P2>
+ void color_convert_compatible(const P1& p1, P2& p2, std::true_type) {
+ using value_t = typename P1::value_type;
+ p2 = p1;
+ value_t converted;
+ color_convert(p1, converted);
+ error_if(converted != p2);
+ }
+
+ template <typename P1, typename P2>
+ void color_convert_compatible(const P1& p1, P2& p2, std::false_type) {
+ color_convert(p1,p2);
+ }
+
+ template <typename P1, typename P2>
+ void color_convert_impl(const P1& p1, P2& p2) {
+ using is_compatible = typename pixels_are_compatible<P1,P2>::type;
+ color_convert_compatible(p1, p2, is_compatible());
+ }
+
+ template <typename Pixel2>
+ void operator()(Pixel2) {
+ // convert from Pixel1 to Pixel2 (or, if Pixel2 is immutable, to its value type)
+ using p2_is_mutable = pixel_reference_is_mutable<typename Pixel2::type>;
+ using pixel_model_t = typename std::remove_reference<typename Pixel2::type>::type;
+ using p2_value_t = typename pixel_model_t::value_type;
+ using pixel2_mutable = mp11::mp_if<p2_is_mutable, Pixel2, value_core<p2_value_t>>;
+
+ Pixel1 p1;
+ pixel2_mutable p2;
+
+ color_convert_impl(p1._pixel, p2._pixel);
+ }
+};
+
+struct ccv1 {
+ template <typename Pixel>
+ void operator()(Pixel) {
+ mp11::mp_for_each<representative_pixels_t>(ccv2<Pixel>());
+ }
+};
+
+void test_color_convert() {
+ mp11::mp_for_each<representative_pixels_t>(ccv1());
+}
+
+void test_packed_pixel()
+{
+ using rgb565_pixel_t = packed_pixel_type<uint16_t, mp11::mp_list_c<unsigned,5,6,5>, rgb_layout_t>::type;
+ boost::function_requires<PixelValueConcept<rgb565_pixel_t> >();
+ static_assert(sizeof(rgb565_pixel_t) == 2, "");
+
+ // define a bgr556 pixel
+ using bgr556_pixel_t = packed_pixel_type<uint16_t, mp11::mp_list_c<unsigned,5,6,5>, bgr_layout_t>::type;
+ boost::function_requires<PixelValueConcept<bgr556_pixel_t> >();
+
+ // Create a zero packed pixel and a full regular unpacked pixel.
+ rgb565_pixel_t r565;//((uint16_t)0);
+ rgb8_pixel_t rgb_full(255,255,255);
+
+ // Convert all channels of the unpacked pixel to the packed one & ensure the packed one is full
+ get_color(r565,red_t()) = channel_convert<kth_element_type<rgb565_pixel_t, 0>::type>(get_color(rgb_full,red_t()));
+ get_color(r565,green_t()) = channel_convert<kth_element_type<rgb565_pixel_t, 1>::type>(get_color(rgb_full,green_t()));
+ get_color(r565,blue_t()) = channel_convert<kth_element_type<rgb565_pixel_t, 2>::type>(get_color(rgb_full,blue_t()));
+ error_if(r565 != rgb565_pixel_t((uint16_t)65535));
+
+ // rgb565 is compatible with bgr556. Test interoperability
+ boost::function_requires<PixelsCompatibleConcept<rgb565_pixel_t,bgr556_pixel_t> >();
+
+ do_basic_test<value_core<rgb565_pixel_t,0>, value_core<bgr556_pixel_t,1> >(r565).test_heterogeneous();
+
+ color_convert(r565,rgb_full);
+ color_convert(rgb_full,r565);
+
+ // Test bit-aligned pixel reference
+ using bgr121_ref_t = const bit_aligned_pixel_reference<std::uint8_t, mp11::mp_list_c<int,1,2,1>, bgr_layout_t, true>;
+ using rgb121_ref_t = const bit_aligned_pixel_reference<std::uint8_t, mp11::mp_list_c<int,1,2,1>, rgb_layout_t, true>;
+ using rgb121_pixel_t = rgb121_ref_t::value_type;
+ rgb121_pixel_t p121;
+ do_basic_test<reference_core<bgr121_ref_t,0>, reference_core<rgb121_ref_t,1> >(p121).test_heterogeneous();
+ do_basic_test<value_core<rgb121_pixel_t,0>, reference_core<rgb121_ref_t,1> >(p121).test_heterogeneous();
+
+ static_assert(pixel_reference_is_proxy<rgb8_planar_ref_t>::value, "");
+ static_assert(pixel_reference_is_proxy<bgr121_ref_t>::value, "");
+
+ static_assert(!pixel_reference_is_proxy<rgb8_pixel_t>::value, "");
+ static_assert(!pixel_reference_is_proxy<rgb8_pixel_t&>::value, "");
+ static_assert(!pixel_reference_is_proxy<rgb8_pixel_t const&>::value, "");
+
+ static_assert(pixel_reference_is_mutable<rgb8_pixel_t&>::value, "");
+ static_assert(!pixel_reference_is_mutable<rgb8_pixel_t const&>::value, "");
+
+ static_assert(pixel_reference_is_mutable<rgb8_planar_ref_t>::value, "");
+ static_assert(pixel_reference_is_mutable<rgb8_planar_ref_t const&>::value, "");
+
+ static_assert(!pixel_reference_is_mutable<rgb8c_planar_ref_t>::value, "");
+ static_assert(!pixel_reference_is_mutable<rgb8c_planar_ref_t const&>::value, "");
+
+ static_assert(pixel_reference_is_mutable<bgr121_ref_t>::value, "");
+ static_assert(!pixel_reference_is_mutable<bgr121_ref_t::const_reference>::value, "");
+}
+
+void test_pixel() {
+ test_packed_pixel();
+ rgb8_pixel_t rgb8(1,2,3);
+
+ do_basic_test<value_core<rgb8_pixel_t,0>, reference_core<rgb8_pixel_t&,1> >(rgb8).test_all();
+ do_basic_test<value_core<bgr8_pixel_t,0>, reference_core<rgb8_planar_ref_t,1> >(rgb8).test_all();
+ do_basic_test<reference_core<rgb8_planar_ref_t,0>, reference_core<bgr8_pixel_t&,1> >(rgb8).test_all();
+ do_basic_test<reference_core<const rgb8_pixel_t&,0>, reference_core<rgb8_pixel_t&,1> >(rgb8).test_all();
+
+ test_color_convert();
+
+ // Semantic vs physical channel accessors. Named channel accessors
+ bgr8_pixel_t bgr8(rgb8);
+ error_if(bgr8[0] == rgb8[0]);
+ error_if(dynamic_at_c(bgr8,0) == dynamic_at_c(rgb8,0));
+ error_if(gil::at_c<0>(bgr8) == gil::at_c<0>(rgb8));
+ error_if(semantic_at_c<0>(bgr8) != semantic_at_c<0>(rgb8));
+ error_if(get_color(bgr8,blue_t()) != get_color(rgb8,blue_t()));
+
+ // Assigning a grayscale channel to a pixel
+ gray16_pixel_t g16(34);
+ g16 = 8;
+ uint16_t g = get_color(g16,gray_color_t());
+ error_if(g != 8);
+ error_if(g16 != 8);
+}
+
+
+int main()
+{
+ try
+ {
+ test_pixel();
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/gil/test/legacy/pixel_iterator.cpp b/src/boost/libs/gil/test/legacy/pixel_iterator.cpp
new file mode 100644
index 000000000..1b4a6d2a4
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/pixel_iterator.cpp
@@ -0,0 +1,355 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef _MSC_VER
+#pragma warning(disable : 4244) // 'argument': conversion from 'int' to 'unsigned char', possible loss of data
+#endif
+
+#include <boost/gil.hpp>
+
+#include <boost/assert.hpp>
+#include <boost/mp11.hpp>
+
+#include <exception>
+#include <iostream>
+#include <type_traits>
+#include <vector>
+
+using namespace boost::gil;
+using namespace std;
+
+void test_pixel_iterator()
+{
+ boost::function_requires<Point2DConcept<point<int>>>();
+
+ boost::function_requires<MutablePixelIteratorConcept<bgr8_ptr_t> >();
+ boost::function_requires<MutablePixelIteratorConcept<cmyk8_planar_ptr_t> >();
+ boost::function_requires<PixelIteratorConcept<rgb8c_planar_step_ptr_t> >();
+ boost::function_requires<MutableStepIteratorConcept<rgb8_step_ptr_t> >();
+
+ boost::function_requires<MutablePixelLocatorConcept<rgb8_step_loc_t> >();
+ boost::function_requires<PixelLocatorConcept<rgb8c_planar_step_loc_t> >();
+
+ boost::function_requires<MutableStepIteratorConcept<cmyk8_planar_step_ptr_t> >();
+ boost::function_requires<StepIteratorConcept<gray8c_step_ptr_t> >();
+
+ boost::function_requires<MutablePixelLocatorConcept<memory_based_2d_locator<rgb8_step_ptr_t> > >();
+
+ using bgr121_ref_t = bit_aligned_pixel_reference
+ <
+ std::uint8_t,
+ boost::mp11::mp_list_c<int,1,2,1>,
+ bgr_layout_t,
+ true
+ > const;
+ using bgr121_ptr_t = bit_aligned_pixel_iterator<bgr121_ref_t>;
+
+ boost::function_requires<MutablePixelIteratorConcept<bgr121_ptr_t> >();
+ boost::function_requires<PixelBasedConcept<bgr121_ptr_t> >();
+ boost::function_requires<MemoryBasedIteratorConcept<bgr121_ptr_t> >();
+ boost::function_requires<HasDynamicXStepTypeConcept<bgr121_ptr_t> >();
+
+// TEST dynamic_step_t
+ static_assert(std::is_same<cmyk16_step_ptr_t, dynamic_x_step_type<cmyk16_step_ptr_t>::type>::value, "");
+ static_assert(std::is_same<cmyk16_planar_step_ptr_t, dynamic_x_step_type<cmyk16_planar_ptr_t>::type>::value, "");
+
+ static_assert(std::is_same<iterator_type<uint8_t,gray_layout_t,false,false,false>::type,gray8c_ptr_t>::value, "");
+
+// TEST iterator_is_step
+ static_assert(iterator_is_step<cmyk16_step_ptr_t>::value, "");
+ static_assert(iterator_is_step<cmyk16_planar_step_ptr_t>::value, "");
+ static_assert(!iterator_is_step<cmyk16_planar_ptr_t>::value, "");
+
+ using ccv_rgb_g_fn = color_convert_deref_fn<rgb8c_ref_t, gray8_pixel_t>;
+ using ccv_g_rgb_fn = color_convert_deref_fn<gray8c_ref_t, rgb8_pixel_t>;
+ gil_function_requires<PixelDereferenceAdaptorConcept<ccv_rgb_g_fn> >();
+ gil_function_requires<PixelDereferenceAdaptorConcept<deref_compose<ccv_rgb_g_fn,ccv_g_rgb_fn> > >();
+
+ using rgb2gray_ptr = dereference_iterator_adaptor<rgb8_ptr_t, ccv_rgb_g_fn>;
+ static_assert(!iterator_is_step<rgb2gray_ptr>::value, "");
+
+ using rgb2gray_step_ptr = dynamic_x_step_type<rgb2gray_ptr>::type;
+ static_assert(std::is_same<rgb2gray_step_ptr, dereference_iterator_adaptor<rgb8_step_ptr_t, ccv_rgb_g_fn>>::value, "");
+
+ make_step_iterator(rgb2gray_ptr(),2);
+
+ using rgb2gray_step_ptr1 = dereference_iterator_adaptor<rgb8_step_ptr_t, ccv_rgb_g_fn>;
+ static_assert(iterator_is_step<rgb2gray_step_ptr1>::value, "");
+ static_assert(std::is_same<rgb2gray_step_ptr1, dynamic_x_step_type<rgb2gray_step_ptr1>::type>::value, "");
+
+ using rgb2gray_step_ptr2 = memory_based_step_iterator<dereference_iterator_adaptor<rgb8_ptr_t, ccv_rgb_g_fn>>;
+ static_assert(iterator_is_step<rgb2gray_step_ptr2 >::value, "");
+ static_assert(std::is_same<rgb2gray_step_ptr2, dynamic_x_step_type<rgb2gray_step_ptr2>::type>::value, "");
+ make_step_iterator(rgb2gray_step_ptr2(),2);
+
+// bit_aligned iterators test
+
+ // Mutable reference to a BGR232 pixel
+ using bgr232_ref_t = bit_aligned_pixel_reference
+ <
+ std::uint8_t,
+ boost::mp11::mp_list_c<unsigned, 2, 3, 2>,
+ bgr_layout_t,
+ true
+ > const;
+
+ // A mutable iterator over BGR232 pixels
+ using bgr232_ptr_t = bit_aligned_pixel_iterator<bgr232_ref_t>;
+
+ // BGR232 pixel value. It is a packed_pixel of size 1 byte. (The last bit is unused)
+ using bgr232_pixel_t = std::iterator_traits<bgr232_ptr_t>::value_type;
+ static_assert(sizeof(bgr232_pixel_t) == 1, "");
+
+ bgr232_pixel_t red(0,0,3); // = 0RRGGGBB, = 01100000
+
+ // a buffer of 7 bytes fits exactly 8 BGR232 pixels.
+ unsigned char pix_buffer[7];
+ std::fill(pix_buffer,pix_buffer+7,0);
+ bgr232_ptr_t pix_it(&pix_buffer[0],0); // start at bit 0 of the first pixel
+ for (int i=0; i<8; ++i) {
+ *pix_it++ = red;
+ }
+
+ // test cross byte pixel values - meaning when a pixel value is stretched over two bytes
+ using gray3_image_t = bit_aligned_image1_type<3, gray_layout_t>::type;
+ using image_t = gray3_image_t;
+
+ using view_t = image_t::view_t;
+ using ref_t = view_t::reference;
+
+ using iterator_t = bit_aligned_pixel_iterator<ref_t>;
+
+ std::vector< unsigned char > buf( 4 );
+ // bit pattern is: 1011 0110 0110 1101 1101 1011
+ // each byte is read right to left
+ buf[0] = 182;
+ buf[1] = 109;
+ buf[2] = 219;
+
+ iterator_t it( &buf[0], 0 );
+
+ ref_t p1 = *it; it++;
+ ref_t p2 = *it; it++;
+ ref_t p3 = *it; it++;
+ ref_t p4 = *it; it++;
+ ref_t p5 = *it; it++;
+ ref_t p6 = *it; it++;
+ ref_t p7 = *it; it++;
+ ref_t p8 = *it; it++;
+
+ unsigned char v1 = get_color( p1, gray_color_t() );
+ unsigned char v2 = get_color( p2, gray_color_t() );
+ unsigned char v3 = get_color( p3, gray_color_t() );
+ unsigned char v4 = get_color( p4, gray_color_t() );
+ unsigned char v5 = get_color( p5, gray_color_t() );
+ unsigned char v6 = get_color( p6, gray_color_t() );
+ unsigned char v7 = get_color( p7, gray_color_t() );
+ unsigned char v8 = get_color( p8, gray_color_t() );
+
+ // all values should be 110b ( 6 );
+ BOOST_ASSERT(v1 == 6);
+ BOOST_ASSERT(v2 == 6);
+ BOOST_ASSERT(v3 == 6);
+ BOOST_ASSERT(v4 == 6);
+ BOOST_ASSERT(v5 == 6);
+ BOOST_ASSERT(v6 == 6);
+ BOOST_ASSERT(v7 == 6);
+ BOOST_ASSERT(v8 == 6);
+}
+
+// TODO: Make better tests. Use some code from below.
+
+/*
+template <typename Pixel>
+void invert_pixel1(Pixel& pix) {
+ at_c<0>(pix)=0;
+}
+
+template <typename T> inline void ignore_unused_variable_warning(const T&){}
+
+void test_pixel_iterator() {
+ rgb8_pixel_t rgb8(1,2,3);
+ rgba8_pixel_t rgba8;
+
+ rgb8_ptr_t ptr1=&rgb8;
+ memunit_advance(ptr1, 3);
+ const rgb8_ptr_t ptr2=memunit_advanced(ptr1,10);
+
+ memunit_distance(ptr1,ptr2);
+ const rgb8_pixel_t& ref=memunit_advanced_ref(ptr1,10); ignore_unused_variable_warning(ref);
+
+ rgb8_planar_ptr_t planarPtr1(&rgb8);
+ rgb8_planar_ptr_t planarPtr2(&rgb8);
+ memunit_advance(planarPtr1,10);
+ memunit_distance(planarPtr1,planarPtr2);
+ rgb8_planar_ptr_t planarPtr3=memunit_advanced(planarPtr1,10);
+
+// planarPtr2=&rgba8;
+
+ planar_pixel_reference<uint8_t&,rgb_t> pxl=*(planarPtr1+5);
+ rgb8_pixel_t pv2=pxl;
+ rgb8_pixel_t pv3=*(planarPtr1+5);
+ rgb8_pixel_t pv=planarPtr1[5];
+
+ assert(*(planarPtr1+5)==planarPtr1[5]);
+
+ rgb8_planar_ref_t planarRef=memunit_advanced_ref(planarPtr1,10);
+
+ rgb8_step_ptr_t stepIt(&rgb8,5);
+ stepIt++;
+ rgb8_step_ptr_t stepIt2=stepIt+10;
+ stepIt2=stepIt;
+
+ rgb8_step_ptr_t stepIt3(&rgb8,5);
+
+ rgb8_pixel_t& ref1=stepIt3[5];
+// bool v=std::is_pod<iterator_traits<memory_based_step_iterator<rgb8_ptr_t> >::value_type>::value;
+// v=std::is_pod<rgb8_pixel_t>::value;
+// v=std::is_pod<int>::value;
+
+ rgb8_step_ptr_t rgb8StepIt(ptr1, 10);
+ rgb8_step_ptr_t rgb8StepIt2=rgb8StepIt;
+ rgb8StepIt=rgb8StepIt2;
+ ++rgb8StepIt;
+ rgb8_ref_t reff=*rgb8StepIt; ignore_unused_variable_warning(reff);
+ rgb8StepIt+=10;
+ std::ptrdiff_t dst=rgb8StepIt2-rgb8StepIt; ignore_unused_variable_warning(dst);
+
+ rgb8_pixel_t val1=ref1;
+ rgb8_ptr_t ptr=&ref1;
+
+ invert_pixel1(*planarPtr1);
+// invert_pixel1(*ptr);
+ rgb8c_planar_ptr_t r8cpp;
+// invert_pixel1(*r8cpp);
+
+ rgb8_pixel_t& val21=stepIt3[5];
+ rgb8_pixel_t val22=val21;
+
+ rgb8_pixel_t val2=stepIt3[5];
+ rgb8_ptr_t ptr11=&(stepIt3[5]); ignore_unused_variable_warning(ptr11);
+ rgb8_ptr_t ptr3=&*(stepIt3+5); ignore_unused_variable_warning(ptr3);
+
+ rgb8_step_ptr_t stepIt4(ptr,5);
+ ++stepIt4;
+
+ rgb8_step_ptr_t stepIt5;
+ if (stepIt4==stepIt5) {
+ int st=0;ignore_unused_variable_warning(st);
+ }
+
+ iterator_from_2d<rgb8_loc_t> pix_img_it(rgb8_loc_t(ptr, 20), 5);
+ ++pix_img_it;
+ pix_img_it+=10;
+ rgb8_pixel_t& refr=*pix_img_it;
+ refr=rgb8_pixel_t(1,2,3);
+ *pix_img_it=rgb8_pixel_t(1,2,3);
+ pix_img_it[3]=rgb8_pixel_t(1,2,3);
+ *(pix_img_it+3)=rgb8_pixel_t(1,2,3);
+
+ iterator_from_2d<rgb8c_loc_t> pix_img_it_c(rgb8c_loc_t(rgb8c_ptr_t(ptr),20), 5);
+ ++pix_img_it_c;
+ pix_img_it_c+=10;
+ // *pix_img_it_c=rgb8_pixel_t(1,2,3); // error: assigning though const iterator
+ using dif_t = iterator_from_2d<rgb8_loc_t>::difference_type;
+ dif_t dt=0;
+ std::ptrdiff_t tdt=dt; ignore_unused_variable_warning(tdt);
+
+ // memory_based_step_iterator<rgb8_pixel_t> stepIt3Err=stepIt+10; // error: non-const from const iterator
+
+ memory_based_2d_locator<rgb8_step_ptr_t> xy_locator(ptr,27);
+
+ xy_locator.x()++;
+// memory_based_step_iterator<rgb8_pixel_t>& yit=xy_locator.y();
+ xy_locator.y()++;
+ xy_locator+=point<std::ptrdiff_t>(3,4);
+ // *xy_locator=(xy_locator(-1,0)+xy_locator(0,1))/2;
+ rgb8_pixel_t& rf=*xy_locator; ignore_unused_variable_warning(rf);
+
+ make_step_iterator(rgb8_ptr_t(),3);
+ make_step_iterator(rgb8_planar_ptr_t(),3);
+ make_step_iterator(rgb8_planar_step_ptr_t(),3);
+
+ // Test operator-> on planar ptrs
+ {
+ rgb8c_planar_ptr_t cp(&rgb8);
+ rgb8_planar_ptr_t p(&rgb8);
+// get_color(p,red_t()) = get_color(cp,green_t()); // does not compile - cannot assign a non-const pointer to a const pointer. Otherwise you will be able to modify the value through it.
+ }
+// xy_locator.y()++;
+
+ // dimensions to explore
+ //
+ // values, references, pointers
+ // color spaces (rgb,cmyk,gray)
+ // channel ordering (bgr vs rgb)
+ // planar vs interleaved
+
+// Pixel POINTERS
+// using RGB8ConstPtr = iterator_traits<rgb8_ptr_t>::pointer const;
+ using RGB8ConstPtr = rgb8_ptr_t const;
+ using RGB8ConstPlanarPtr = rgb8_planar_ptr_t const;
+// using RGB8ConstPlanarPtr = iterator_traits<rgb8_planar_ptr_t>::pointer const;
+
+// constructing from values, references and other pointers
+ RGB8ConstPtr rgb8_const_ptr=NULL; ignore_unused_variable_warning(rgb8_const_ptr);
+ rgb8_ptr_t rgb8ptr=&rgb8;
+
+ rgb8=bgr8_pixel_t(30,20,10);
+ rgb8_planar_ptr_t rgb8_pptr=&rgb8;
+ ++rgb8_pptr;
+ rgb8_pptr--;
+ rgb8_pptr[0]=rgb8;
+ RGB8ConstPlanarPtr rgb8_const_planar_ptr=&rgb8;
+
+ rgb8c_planar_ptr_t r8c=&rgb8;
+ r8c=&rgb8;
+
+ rgb8_pptr=&rgb8;
+
+ // rgb8_const_planar_ptr=&rgb16p; // error: incompatible bit depth
+
+ // iterator_traits<CMYK8>::pointer cmyk8_ptr_t=&rgb8; // error: incompatible pointer type
+
+ RGB8ConstPtr rgb8_const_ptr_err=rgb8ptr; // const pointer from non-regular pointer
+ignore_unused_variable_warning(rgb8_const_ptr_err);
+// dereferencing pointers to obtain references
+ rgb8_ref_t rgb8ref_2=*rgb8ptr; ignore_unused_variable_warning(rgb8ref_2);
+ assert(rgb8ref_2==rgb8);
+ // RGB8Ref rgb8ref_2_err=*rgb8_const_planar_ptr; // error: non-const reference from const pointer
+
+ rgb8_planar_ref_t rgb8planarref_3=*rgb8_pptr; // planar reference from planar pointer
+ assert(rgb8planarref_3==rgb8);
+ // RGB8Ref rgb8ref_3=*rgb8_planar_ptr_t; // error: non-planar reference from planar pointer
+
+ const rgb8_pixel_t crgb8=rgb8;
+ *rgb8_pptr=rgb8;
+ *rgb8_pptr=crgb8;
+
+ memunit_advance(rgb8_pptr,3);
+ memunit_advance(rgb8_pptr,-3);
+}
+*/
+
+int main()
+{
+ try
+ {
+ test_pixel_iterator();
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/gil/test/legacy/recreate_image.cpp b/src/boost/libs/gil/test/legacy/recreate_image.cpp
new file mode 100644
index 000000000..7ca616cdb
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/recreate_image.cpp
@@ -0,0 +1,108 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef _MSC_VER
+//#pragma warning(disable : 4244) // conversion from 'gil::image<V,Alloc>::coord_t' to 'int', possible loss of data (visual studio compiler doesn't realize that the two types are the same)
+#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated
+#endif
+
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <ios>
+#include <iostream>
+#include <fstream>
+#include <map>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+using namespace boost::gil;
+using namespace std;
+using namespace boost;
+
+///////////////////////////////////////////////////////////////
+
+std::size_t is_planar_impl( const std::size_t size_in_units
+ , const std::size_t channels_in_image
+ , std::true_type
+ )
+{
+ return size_in_units * channels_in_image;
+}
+
+std::size_t is_planar_impl( const std::size_t size_in_units
+ , const std::size_t
+ , std::false_type
+ )
+{
+ return size_in_units;
+}
+
+template< typename View >
+std::size_t get_row_size_in_memunits( typename View::x_coord_t width)
+{ // number of units per row
+ std::size_t size_in_memunits = width * memunit_step( typename View::x_iterator() );
+
+ return size_in_memunits;
+}
+
+
+template< typename View
+ , bool IsPlanar
+ >
+std::size_t total_allocated_size_in_bytes( const typename View::point_t& dimensions )
+{
+
+ using x_iterator = typename View::x_iterator;
+
+ // when value_type is a non-pixel, like int or float, num_channels< ... > doesn't work.
+ const std::size_t _channels_in_image = mp11::mp_eval_if< is_pixel< typename View::value_type >
+ , num_channels< View >
+ , std::integral_constant<int, 1>
+ >::type::value;
+
+ std::size_t size_in_units = is_planar_impl( get_row_size_in_memunits< View >( dimensions.x ) * dimensions.y
+ , _channels_in_image
+ , typename std::conditional< IsPlanar, std::true_type, std::false_type >::type()
+ );
+
+ // return the size rounded up to the nearest byte
+ std::size_t btm = byte_to_memunit< typename View::x_iterator >::value;
+
+
+ return ( size_in_units + btm - 1 )
+ / btm;
+}
+
+
+void test_recreate_image()
+{
+ auto tasib_1 = total_allocated_size_in_bytes<rgb8_view_t, false>({640, 480});
+ auto tasib_2 = total_allocated_size_in_bytes<rgb8_view_t, false>({320, 200});
+
+ rgb8_image_t img( 640, 480 );
+ img.recreate( 320, 200 );
+}
+
+int main()
+{
+ test_recreate_image();
+
+ return ::boost::report_errors();
+}
+
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4127) //conditional expression is constant
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
diff --git a/src/boost/libs/gil/test/legacy/sample_image.cpp b/src/boost/libs/gil/test/legacy/sample_image.cpp
new file mode 100644
index 000000000..bbcdf0179
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/sample_image.cpp
@@ -0,0 +1,159 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+unsigned char halfdome[][3174]={
+{
+ 47,47,48,48,48,48,48,47,51,50,49,51,50,60,110,150,143,93,164,168,125,137,53,54,56,54,52,50,52,51,50,51,53,52,51,51,52,53,51,51,52,52,51,51,50,52,51,53,51,52,51,53,52,54,57,57,59,57,59,59,60,60,177,185,206,221,230,224,227,
+ 50,52,48,51,50,51,52,51,53,51,53,53,56,54,59,59,61,64,149,149,153,65,58,57,57,57,55,55,56,57,55,57,56,56,53,54,56,55,53,55,54,56,56,55,54,54,56,54,55,57,56,54,57,57,59,70,178,75,67,191,132,194,226,201,226,226,227,237,222,
+ 54,54,55,54,53,54,55,54,56,58,57,59,59,59,59,61,61,61,62,64,65,65,85,61,58,59,60,61,60,61,58,60,58,60,59,60,59,58,60,60,57,59,59,58,60,61,59,57,58,60,60,62,61,63,192,210,223,223,231,222,226,218,208,204,205,206,205,215,207,
+ 58,57,57,59,58,58,60,58,60,60,59,58,62,63,64,64,62,63,66,66,67,67,65,66,64,62,64,61,62,63,65,64,63,63,64,60,63,63,62,64,62,64,63,65,63,64,63,62,61,64,63,84,119,69,146,179,202,221,217,208,205,209,206,212,201,182,178,184,183,
+ 60,61,62,60,61,64,64,62,65,63,65,66,69,65,66,67,69,67,69,69,67,70,71,70,69,69,68,68,67,70,70,69,69,68,69,67,66,68,67,75,70,67,89,65,67,67,67,66,66,67,68,78,93,159,188,178,161,185,196,215,196,187,174,172,170,174,175,171,171,
+ 66,66,65,66,68,69,67,68,67,70,68,70,72,72,73,73,73,73,74,75,75,75,76,74,75,75,74,75,76,75,75,74,75,75,74,75,76,90,157,157,158,177,163,182,161,72,76,70,71,71,72,74,75,80,117,129,143,166,200,194,191,210,215,200,182,181,176,182,196,
+ 72,72,71,72,72,71,74,72,74,73,73,77,77,78,77,79,77,80,78,79,82,80,81,92,81,91,80,80,81,81,81,79,81,79,116,123,103,96,87,80,105,115,140,82,97,97,130,169,162,124,77,78,80,79,81,83,83,142,192,202,211,182,203,191,194,176,169,184,184,
+ 75,76,75,73,77,77,79,76,79,77,79,80,81,84,84,83,85,86,87,166,241,96,89,88,89,88,100,88,88,87,92,203,91,173,178,162,179,87,86,85,83,84,84,82,83,82,85,83,85,94,81,83,81,83,84,135,183,187,192,176,180,208,193,216,203,196,196,207,191,
+ 79,80,79,81,81,82,82,86,83,84,85,88,89,95,244,238,93,128,222,227,245,248,231,99,159,98,183,196,95,97,183,215,215,223,230,230,228,117,92,90,90,90,88,87,87,86,87,87,88,86,89,89,90,91,101,231,214,189,221,165,166,192,184,193,194,176,170,159,157,
+ 84,84,86,86,86,88,88,88,90,90,91,94,217,244,246,248,249,188,223,223,224,231,232,222,226,218,189,171,190,199,223,179,199,204,205,202,203,205,188,101,97,93,94,93,93,95,96,106,115,97,96,98,209,234,217,224,242,242,242,217,214,191,139,183,179,179,164,154,143,
+ 89,89,89,92,91,91,93,95,94,96,115,226,208,212,235,241,245,212,196,200,201,209,203,192,183,187,219,192,198,211,214,224,200,197,184,181,186,203,190,218,189,131,173,189,160,188,173,175,185,197,199,201,192,237,211,196,225,241,242,230,238,222,222,221,218,188,168,184,197,
+ 95,98,98,98,99,101,102,161,161,143,215,193,232,200,200,204,227,208,228,214,212,226,48,195,213,193,191,203,201,206,229,232,210,183,225,221,234,232,234,197,206,189,204,200,193,201,191,200,206,215,223,202,196,186,189,181,209,211,215,183,236,232,176,209,217,231,181,177,178,
+ 103,101,105,106,153,171,197,209,204,218,184,169,199,197,210,213,202,209,215,222,234,203,120,41,195,197,187,197,186,208,193,198,198,196,197,200,201,198,202,210,222,190,178,198,211,232,226,220,204,189,190,199,188,194,193,170,169,187,190,209,225,219,208,225,212,207,199,191,203,
+ 109,109,111,150,205,175,184,193,175,161,165,121,134,130,126,160,203,190,184,161,147,204,61,89,193,201,198,185,215,192,183,193,189,209,189,174,172,172,170,178,197,188,186,214,227,229,143,163,160,182,193,207,189,209,190,191,176,184,197,171,180,181,207,218,218,212,176,170,170,
+ 118,182,143,213,169,184,183,192,201,179,193,212,203,182,154,196,205,163,201,193,191,117,59,45,179,193,228,204,203,186,202,189,159,162,166,180,195,195,191,218,205,177,201,200,199,204,228,183,202,209,202,203,199,212,217,189,207,183,186,192,188,188,175,177,183,179,186,179,184,
+ 126,155,183,185,189,188,185,197,175,183,192,192,188,151,172,86,190,196,184,178,128,111,57,56,135,192,188,198,195,150,180,202,214,224,211,205,182,197,199,195,211,196,181,194,206,194,194,194,192,211,197,198,201,191,197,194,197,192,189,186,181,177,169,190,171,163,171,175,160,
+ 133,134,136,136,163,146,116,166,186,181,205,201,93,132,137,198,207,190,69,119,127,110,70,66,153,192,180,164,168,179,188,199,189,177,183,188,189,160,177,190,194,193,192,194,124,175,193,186,178,180,207,209,187,178,144,97,131,159,105,200,114,125,135,141,179,199,172,108,117,
+ 120,151,138,128,163,112,124,96,103,139,102,149,213,197,208,214,193,80,104,154,107,125,84,63,141,161,163,175,183,186,190,183,201,79,86,204,191,207,194,207,184,169,141,146,171,181,128,125,83,91,101,114,127,163,120,119,114,122,126,140,87,115,113,125,186,104,83,68,84,
+ 118,133,167,92,126,109,124,173,137,181,150,147,166,203,176,178,82,81,123,109,137,146,60,56,146,193,156,175,180,175,194,203,185,178,82,84,74,113,105,65,64,127,65,70,140,92,83,82,80,80,82,79,84,74,99,138,84,76,109,77,142,123,76,83,71,74,55,54,34,
+ 182,127,117,134,158,163,201,189,166,149,192,147,191,164,175,165,120,174,99,109,167,130,153,62,180,131,96,193,203,204,191,215,183,141,70,70,66,68,73,73,71,61,74,85,95,66,63,133,154,135,89,113,89,102,69,124,68,85,77,56,51,72,94,34,60,37,90,39,34,
+ 149,167,135,154,108,173,152,148,184,153,157,182,167,194,176,161,202,148,120,132,149,174,156,125,147,74,133,220,225,187,116,218,209,216,70,69,72,68,61,59,60,63,70,73,63,64,81,59,84,99,80,95,70,90,52,76,162,144,87,67,65,68,98,116,90,55,140,156,58,
+ 91,120,142,143,157,191,188,196,151,209,199,189,177,188,81,77,44,102,112,126,155,70,200,127,88,107,87,59,95,101,153,145,203,188,62,129,124,63,66,58,60,62,67,58,60,68,62,63,77,64,63,64,71,130,97,92,105,72,67,71,158,166,144,152,160,127,125,140,115,
+ 133,164,135,143,168,172,196,181,211,206,197,165,144,56,91,59,46,57,65,157,146,89,177,128,59,53,76,59,63,58,132,122,126,183,209,68,59,74,69,74,77,76,78,49,57,57,72,64,67,81,100,69,146,137,153,69,140,166,83,173,175,169,171,166,41,149,154,120,172,
+ 101,131,158,153,167,86,82,193,163,204,140,129,105,111,44,46,32,157,150,190,120,52,120,163,144,71,68,84,81,87,160,160,106,123,121,97,69,75,79,70,60,57,73,60,61,61,94,77,73,131,115,126,121,96,130,169,128,128,145,180,159,64,139,106,147,45,27,33,20,
+ 67,80,168,201,199,68,148,210,111,132,85,63,139,88,101,60,92,96,66,104,76,47,103,165,115,82,49,89,113,88,127,168,178,133,81,90,84,60,63,105,64,80,64,67,54,62,70,89,88,57,86,129,159,154,202,146,143,126,60,57,69,66,144,32,28,33,62,27,35,
+ 98,101,82,151,129,73,80,129,134,102,116,66,81,53,87,110,95,87,144,69,123,118,106,95,88,69,69,108,91,151,158,132,137,71,158,179,184,145,65,72,64,91,72,73,76,65,60,52,57,63,119,73,67,128,114,80,123,134,172,158,108,114,28,27,28,22,33,27,52,
+ 158,127,109,79,90,75,74,169,97,94,124,61,121,160,171,150,102,60,47,115,136,121,155,81,142,141,135,114,114,144,78,118,79,76,67,123,90,125,77,148,103,77,68,96,73,68,50,62,60,98,101,113,117,117,122,143,97,51,64,60,51,28,37,44,35,30,40,52,74,
+ 139,174,90,111,108,143,123,135,128,113,129,123,139,132,96,55,47,57,69,95,102,76,124,76,52,59,148,131,119,68,86,152,100,105,128,89,139,116,118,131,125,151,93,66,66,61,61,61,58,65,81,68,87,88,102,96,90,111,72,71,79,29,42,37,46,44,49,61,96,
+ 128,159,122,75,55,64,168,129,93,116,109,122,140,149,161,48,58,55,93,96,87,122,76,74,57,66,144,143,57,61,87,130,96,115,131,54,105,117,87,89,79,168,139,156,108,106,80,60,60,87,69,101,85,72,66,90,84,91,91,101,127,41,37,65,65,48,30,70,128,
+ 153,175,59,54,52,155,159,113,143,118,113,127,149,121,148,81,162,97,120,140,57,51,57,58,80,56,124,164,81,58,100,140,60,112,118,98,106,93,65,89,65,129,61,144,119,182,171,78,148,70,101,91,85,90,78,106,89,109,118,131,117,54,75,100,86,47,78,181,134,
+ 60,50,51,52,48,148,87,156,170,141,146,159,77,51,144,174,102,112,161,49,58,73,46,63,64,63,60,135,129,122,87,121,122,174,105,79,96,55,56,60,108,39,46,67,51,144,123,136,59,91,80,99,84,62,92,101,103,99,128,136,215,127,110,139,121,74,135,181,175,
+ 55,51,55,54,105,173,137,149,186,92,84,79,91,92,96,190,101,164,72,50,75,51,67,56,72,93,118,53,63,57,82,159,182,150,127,53,57,69,59,58,54,62,78,71,96,132,90,72,55,63,83,119,86,131,65,66,114,140,95,130,160,135,158,124,133,94,135,147,140,
+ 56,64,47,127,175,145,131,132,178,110,84,71,127,64,136,118,93,86,139,66,116,79,55,64,50,80,133,72,95,161,164,163,163,106,68,52,58,40,60,42,42,84,86,110,88,129,73,72,43,49,49,84,116,93,78,76,132,110,147,126,122,132,82,139,138,79,62,175,158,
+ 50,53,56,59,170,124,166,103,147,89,116,125,101,126,122,156,100,151,165,128,146,54,73,143,66,128,147,149,145,139,144,162,161,109,94,55,46,85,54,57,69,47,63,59,127,65,85,44,99,71,55,70,37,87,119,109,70,122,161,145,148,179,129,119,77,129,134,160,141,
+ 99,53,76,140,161,77,119,137,163,68,89,92,58,138,122,153,129,88,137,134,134,99,95,116,130,117,155,120,136,108,165,158,207,58,87,77,43,55,51,119,59,43,71,63,83,61,86,45,34,72,112,59,162,56,39,66,124,132,139,201,164,172,69,75,92,89,139,150,50,
+ 48,49,56,85,83,51,103,106,118,87,104,190,118,110,143,154,74,144,119,103,117,109,155,141,102,104,96,134,111,89,155,154,121,66,43,42,31,41,54,53,70,52,62,47,97,102,71,57,48,42,60,77,84,72,49,62,56,121,67,173,55,203,53,95,56,54,57,103,57,
+ 48,55,119,169,97,101,106,123,84,55,144,135,116,143,84,114,116,148,102,128,104,114,109,65,93,104,106,164,128,128,145,185,115,51,135,165,75,70,112,152,108,92,57,55,60,59,54,57,120,86,69,136,110,132,62,73,78,88,72,94,57,92,168,55,107,53,43,50,28,
+ 51,51,66,75,71,56,127,117,50,100,145,138,100,128,73,158,105,112,112,170,102,66,92,107,144,140,142,146,147,167,140,116,135,126,175,126,75,118,95,115,62,117,105,70,80,46,75,105,121,127,112,56,89,101,109,52,102,53,51,81,55,157,144,130,47,42,63,82,47,
+ 76,57,122,66,98,54,48,82,65,133,111,135,108,92,146,48,147,123,146,103,102,94,140,100,90,112,100,146,148,151,171,117,160,114,135,128,95,121,129,105,83,128,135,82,118,91,81,60,102,121,107,97,89,117,93,51,52,35,72,48,59,55,57,41,38,56,60,7,24,
+ 97,144,102,119,53,129,63,74,104,145,134,70,109,108,131,103,86,106,108,67,115,92,127,109,66,81,160,128,165,177,120,123,157,78,114,95,149,161,102,135,94,115,129,127,108,66,64,100,84,156,127,67,89,128,88,123,38,35,42,41,50,58,47,57,134,130,111,68,68,
+ 115,121,134,46,126,62,107,158,98,79,113,72,82,147,149,109,117,120,103,109,127,109,130,119,92,103,175,143,124,140,110,111,57,110,124,103,128,142,122,83,109,94,152,92,105,101,46,86,88,131,160,88,108,89,88,156,128,66,59,56,69,83,71,100,76,106,116,43,28,
+ 118,115,62,176,98,129,95,67,62,60,88,77,90,100,113,71,83,141,88,124,124,130,102,125,103,139,109,117,179,128,54,75,102,65,158,117,124,60,112,54,71,168,127,62,145,62,107,87,98,90,136,79,130,147,126,113,69,60,116,50,78,84,80,80,57,132,117,34,101,
+ 126,86,127,113,141,148,92,74,81,58,60,62,118,118,49,68,152,116,125,170,119,115,148,125,119,53,87,156,78,145,71,134,52,105,101,80,50,54,93,49,124,107,107,101,55,64,72,113,64,105,133,143,93,137,157,118,70,29,61,76,60,78,105,59,48,53,42,123,70,
+ 45,49,104,155,135,81,157,85,73,139,91,63,99,116,84,107,59,60,144,108,69,122,128,120,144,65,96,116,121,136,152,120,91,130,144,104,63,51,64,104,78,148,78,50,53,59,64,110,75,97,133,162,85,105,146,48,118,110,88,95,52,58,59,74,42,44,7,61,67,
+ 47,49,75,70,86,99,80,63,174,60,94,121,66,87,115,31,50,111,118,97,101,101,121,110,128,97,131,168,125,134,155,79,150,134,103,68,97,59,86,105,125,140,124,113,40,50,53,82,72,84,104,120,154,162,42,61,35,77,60,42,103,78,58,107,52,52,8,28,59,
+ 49,44,44,40,69,203,93,106,97,105,98,131,68,112,131,112,119,153,80,88,94,108,126,151,133,115,153,124,141,147,115,88,116,62,132,112,133,69,66,130,151,163,66,58,82,92,73,57,103,115,95,156,118,158,62,65,51,93,32,88,55,103,100,120,81,47,66,29,38,
+},
+{
+ 93,93,93,93,93,94,94,94,93,94,95,94,95,100,129,161,158,123,175,178,145,151,98,96,96,96,96,97,95,96,96,95,96,94,95,95,96,95,96,94,94,95,95,96,96,95,96,96,96,96,96,97,98,97,97,99,99,102,100,101,102,104,193,199,213,228,236,229,233,
+ 96,96,97,97,96,97,97,97,97,99,99,99,99,101,100,102,104,106,163,163,162,109,102,100,101,100,101,100,100,99,100,99,100,100,100,100,100,100,99,99,99,100,99,99,99,100,99,99,100,100,100,100,100,100,102,107,186,108,108,195,143,205,229,211,233,234,235,242,231,
+ 100,101,101,101,101,102,102,102,102,102,102,103,103,105,105,106,106,106,107,109,108,108,119,106,106,105,105,105,104,104,104,104,104,104,104,102,104,104,103,103,103,102,103,103,102,103,103,103,104,103,102,103,104,106,198,218,227,228,235,224,231,226,215,211,213,213,214,224,215,
+ 105,105,105,105,106,106,106,107,107,107,108,108,108,108,109,110,111,110,110,111,111,111,111,111,111,111,111,110,109,110,109,110,109,109,108,109,108,107,108,107,108,107,107,107,107,106,107,107,107,107,107,121,133,112,162,188,211,226,223,217,214,217,214,219,209,192,188,194,193,
+ 110,110,110,110,111,111,111,112,112,113,113,114,113,114,114,114,114,114,114,115,116,115,116,116,116,116,116,115,115,115,114,115,115,115,114,114,114,113,113,116,114,114,123,114,112,112,113,113,112,112,113,118,131,176,195,187,175,195,204,220,204,191,184,183,181,186,185,181,178,
+ 115,115,116,115,115,115,116,116,117,117,118,118,119,119,118,120,120,120,120,121,121,121,122,122,122,121,121,121,120,122,122,121,120,121,120,119,121,128,165,166,166,185,171,189,169,117,119,118,118,118,119,119,122,124,150,153,163,176,208,202,199,218,220,205,189,190,186,192,205,
+ 119,120,120,120,121,122,121,122,122,123,123,123,123,125,125,126,126,125,126,128,128,129,129,132,128,132,129,128,128,128,128,128,128,128,144,148,136,133,130,127,140,145,156,127,133,135,157,176,170,145,123,123,124,125,127,128,129,161,200,204,214,190,212,200,200,186,179,196,193,
+ 124,125,125,126,126,126,126,127,127,128,128,130,131,131,131,133,132,132,134,168,242,138,137,136,136,136,141,135,135,135,136,206,137,180,185,173,185,133,131,131,130,130,130,130,132,129,129,131,131,134,129,130,131,131,132,160,193,195,199,186,190,215,201,224,211,204,204,213,199,
+ 130,131,131,131,131,131,132,132,133,134,134,135,137,140,246,242,139,156,227,231,245,248,234,144,168,143,195,208,143,142,192,220,218,223,234,234,229,148,139,138,137,136,136,135,135,135,134,134,135,136,136,136,137,139,143,235,218,195,221,183,184,200,190,200,203,187,181,172,169,
+ 134,135,136,136,137,137,137,138,138,140,140,142,225,246,248,249,250,195,227,228,226,232,235,224,229,222,197,178,195,202,225,187,204,208,208,205,208,208,194,145,143,142,142,142,142,141,143,147,148,143,143,143,220,237,222,228,243,243,243,221,219,198,165,192,189,189,175,163,156,
+ 141,141,142,142,142,143,144,144,145,145,151,230,212,217,240,243,247,218,201,204,205,212,207,198,189,192,220,197,202,214,218,227,204,202,190,188,194,205,194,219,193,161,181,196,174,198,183,185,192,202,203,207,206,237,215,202,230,242,243,231,238,224,226,225,220,196,178,191,200,
+ 147,147,147,147,148,149,151,180,178,164,219,199,236,206,205,208,230,212,228,217,217,230,62,187,211,194,191,199,199,207,230,233,214,190,226,222,234,233,234,200,209,194,206,202,196,202,194,203,209,219,224,204,198,192,193,188,213,215,214,188,240,235,185,212,223,233,188,184,187,
+ 151,152,153,154,171,182,204,214,209,221,193,183,204,201,213,215,206,214,218,225,232,206,124,57,195,197,182,185,177,200,197,199,199,199,202,205,205,203,206,213,222,196,188,200,212,232,226,221,205,197,195,202,192,198,197,177,177,192,196,212,226,221,212,225,213,209,202,196,209,
+ 157,158,159,169,207,186,193,199,187,178,179,163,165,164,163,169,207,199,190,169,147,209,72,95,193,197,192,181,212,190,191,198,195,211,195,182,178,180,176,183,201,191,192,215,226,229,172,183,181,191,198,209,195,209,193,198,184,191,201,178,187,186,210,218,219,214,183,178,180,
+ 163,191,169,218,182,194,193,201,205,193,202,214,208,192,173,200,209,173,200,190,192,120,67,60,183,189,216,198,195,180,189,190,168,170,177,185,199,199,195,220,206,189,205,205,203,208,228,194,206,211,203,207,202,212,218,194,208,189,191,194,195,194,183,185,188,187,192,186,190,
+ 168,175,191,195,196,195,193,202,188,190,200,200,195,175,184,109,192,199,186,175,135,121,69,68,137,189,180,196,186,148,177,191,215,225,212,207,189,200,203,200,213,199,189,198,207,198,196,198,196,211,200,200,203,196,200,198,201,196,194,192,188,184,178,194,181,173,178,181,170,
+ 173,173,173,173,163,171,130,180,193,188,209,207,101,138,139,191,199,200,86,121,130,115,79,77,155,189,172,162,166,179,181,190,195,187,188,194,195,174,186,197,201,200,198,197,137,186,197,193,187,188,207,210,194,184,161,119,147,168,130,204,130,146,147,145,179,202,183,129,127,
+ 132,155,139,136,166,129,123,109,115,149,111,150,207,188,209,215,207,98,106,154,108,127,89,75,140,163,164,175,180,185,181,177,176,94,100,206,196,207,191,203,184,172,145,147,172,180,136,130,103,105,113,125,142,162,131,132,129,137,138,143,106,123,122,140,182,111,97,90,100,
+ 128,141,168,108,135,124,130,175,144,176,149,153,169,210,178,182,106,96,121,112,138,148,68,66,149,190,152,172,177,166,180,195,179,177,94,98,91,118,113,84,84,130,81,87,143,105,101,100,98,97,97,98,99,96,114,140,104,99,122,96,148,130,96,98,90,90,79,77,54,
+ 179,141,130,151,164,162,199,192,164,150,193,149,191,169,175,169,126,164,101,113,169,132,149,73,178,132,101,188,199,189,182,208,175,138,81,81,79,83,84,84,83,80,91,95,103,80,77,134,154,135,98,120,101,111,90,124,86,96,88,72,68,87,103,55,78,59,97,60,54,
+ 152,167,143,161,122,172,164,148,183,156,155,169,168,197,182,164,200,152,122,134,150,169,152,118,138,80,135,210,216,180,115,214,201,207,81,81,86,82,74,73,74,77,83,84,76,74,93,77,88,102,86,103,81,102,77,95,163,152,97,83,86,86,109,120,93,65,145,150,70,
+ 105,131,147,147,158,187,190,195,152,207,192,191,180,186,91,78,57,105,114,130,158,75,190,126,84,106,92,68,97,102,142,145,200,176,75,129,123,73,79,76,72,76,79,70,73,76,73,76,88,77,76,74,84,125,103,96,112,82,86,88,162,170,150,154,161,126,126,139,120,
+ 137,161,143,149,167,170,196,182,209,206,194,169,155,66,101,71,59,70,72,154,151,95,169,129,67,62,78,67,73,68,128,121,123,181,197,79,71,82,80,83,86,83,85,61,71,71,81,76,77,89,101,78,140,134,149,76,137,163,99,173,176,169,175,168,61,147,152,123,173,
+ 113,129,155,158,167,97,100,195,165,208,147,142,107,115,59,61,49,150,147,184,126,66,121,158,143,76,68,85,80,88,151,152,108,124,125,102,79,77,85,79,72,67,81,73,74,72,98,86,83,130,115,125,122,99,133,166,127,131,149,180,152,85,140,116,152,44,38,44,33,
+ 79,96,169,201,195,85,145,207,114,136,88,82,140,88,105,72,94,92,74,110,83,61,109,162,104,86,53,89,106,89,124,161,165,129,85,93,88,71,71,107,74,87,73,76,67,74,79,96,93,65,94,128,158,151,195,134,141,128,71,73,83,74,147,44,40,42,79,36,46,
+ 115,107,98,148,135,92,99,138,138,111,116,72,86,59,91,100,100,95,142,80,121,119,109,98,89,73,71,109,91,151,153,128,132,72,151,168,176,142,72,80,73,95,78,84,84,76,71,69,71,76,123,82,76,131,114,85,126,132,173,158,112,120,39,37,41,34,44,36,58,
+ 159,131,116,90,99,84,90,170,106,98,125,72,121,157,172,152,104,69,56,116,141,126,153,88,135,137,129,111,115,141,80,116,79,76,70,122,89,121,79,144,105,81,74,98,78,75,65,75,74,98,103,112,116,112,120,140,97,60,72,70,59,41,48,60,48,44,52,60,74,
+ 145,171,96,121,115,135,125,143,137,113,132,124,144,128,97,66,63,69,80,97,111,81,124,79,57,67,142,129,119,72,89,150,101,105,127,92,137,115,118,129,120,145,94,70,73,70,73,72,70,76,87,73,92,91,106,96,92,111,79,75,82,45,57,49,57,59,56,73,103,
+ 132,164,131,88,76,82,169,124,102,113,112,125,144,152,165,65,66,68,99,106,100,122,80,77,61,71,139,142,63,67,84,128,97,112,130,59,108,117,89,90,82,166,137,146,108,108,86,70,72,95,75,99,86,72,71,92,84,93,94,102,126,52,48,75,74,59,41,83,129,
+ 155,177,77,75,73,154,163,117,147,124,114,130,147,136,140,85,159,102,124,138,65,60,63,65,83,62,123,163,84,62,104,137,63,113,118,100,105,95,70,90,70,128,66,141,117,175,162,77,145,74,102,91,87,92,75,108,89,111,119,128,117,67,87,105,95,57,85,187,139,
+ 79,70,72,71,71,141,93,157,174,148,154,161,89,63,141,167,101,108,162,57,69,76,55,72,69,69,65,129,126,120,88,120,122,172,105,80,92,62,66,64,111,48,55,75,55,132,122,136,66,96,83,102,85,70,92,99,108,103,128,138,213,131,115,140,127,80,140,183,171,
+ 71,71,74,71,108,174,138,150,190,116,81,93,95,94,101,191,105,164,79,59,76,61,70,64,73,90,116,60,70,61,84,153,178,150,129,60,63,74,67,67,62,67,81,74,93,129,92,77,63,67,82,118,90,124,71,69,115,142,95,131,159,133,161,120,135,90,141,139,141,
+ 70,77,68,135,172,147,126,137,172,111,90,76,129,70,136,117,93,91,123,71,116,80,65,73,54,78,128,74,98,156,162,161,158,107,73,59,62,51,66,54,53,85,89,111,85,121,77,74,53,59,60,86,110,86,84,80,134,118,148,125,111,129,83,143,139,90,68,175,161,
+ 65,70,75,74,170,129,165,111,146,95,121,128,106,129,123,159,102,147,164,123,143,62,79,141,68,124,145,149,144,135,145,158,159,109,94,60,55,86,61,62,76,59,70,62,120,71,89,52,100,72,63,74,50,88,119,112,75,126,160,145,153,177,125,126,82,132,134,161,140,
+ 108,68,82,147,153,84,123,143,169,80,93,95,71,140,129,155,133,92,130,133,138,104,102,116,127,118,153,120,136,109,163,157,205,62,88,81,51,62,54,119,66,52,75,67,84,61,88,53,46,74,113,66,153,60,45,71,120,124,140,200,165,171,72,82,97,92,144,153,58,
+ 66,69,70,94,97,63,106,110,122,91,112,187,121,110,144,158,78,144,116,102,113,109,149,141,102,104,96,133,114,90,155,156,121,71,51,51,43,48,61,61,72,60,66,56,97,104,77,65,53,46,65,73,90,79,56,70,60,116,72,158,62,206,65,100,67,62,65,107,78,
+ 69,74,131,165,105,104,102,136,88,68,145,137,118,149,91,119,116,137,105,126,100,112,106,71,95,104,102,161,128,125,144,184,118,57,132,162,76,76,96,145,107,90,63,64,66,66,64,66,107,85,69,120,97,121,66,76,81,92,73,94,65,94,169,65,113,61,56,71,41,
+ 70,65,77,85,77,69,131,121,61,105,146,134,106,123,78,163,109,112,110,166,105,69,97,109,138,142,143,142,145,167,137,115,136,119,168,124,77,116,93,114,64,108,107,68,83,51,73,105,117,126,111,54,86,91,101,60,99,59,60,83,61,160,145,130,60,57,69,86,62,
+ 89,70,130,74,102,67,61,86,74,137,107,132,111,93,150,62,142,114,145,106,101,92,131,98,88,110,105,146,143,151,173,117,153,111,131,124,96,115,125,104,81,120,134,86,111,86,81,64,101,112,93,93,88,117,93,57,58,41,73,55,66,60,66,52,52,69,75,14,32,
+ 98,152,102,119,68,134,73,83,112,146,139,80,110,112,140,108,91,102,108,72,114,100,119,108,72,85,161,129,161,174,122,120,155,81,110,91,144,153,97,131,89,113,125,127,109,71,69,103,90,139,113,68,89,126,90,109,43,48,53,49,58,65,59,67,133,127,113,81,81,
+ 124,132,136,59,119,75,108,170,103,89,116,82,92,147,152,114,118,125,98,115,127,108,130,124,94,105,178,129,120,140,112,110,63,104,120,95,126,135,116,82,98,97,152,89,109,99,52,90,83,123,151,90,110,85,86,141,132,66,67,58,67,89,71,103,86,106,110,61,40,
+ 127,119,71,171,97,140,100,73,72,67,88,86,94,104,115,80,84,142,87,120,122,125,106,122,101,138,111,116,179,126,63,78,96,69,154,114,118,66,115,62,70,164,117,64,140,65,96,90,96,92,129,81,116,144,117,113,74,66,120,58,78,84,81,85,67,129,117,41,113,
+ 144,92,126,117,148,152,96,82,85,68,69,72,123,119,56,74,156,118,119,160,115,113,141,123,122,58,84,150,87,143,76,132,58,103,99,81,57,64,94,57,118,105,96,100,59,67,74,107,68,105,134,140,91,137,153,123,74,37,65,82,66,80,101,68,54,63,50,119,79,
+ 61,65,107,166,132,96,154,93,81,140,99,70,107,127,87,100,67,71,149,104,75,120,128,121,139,69,94,113,123,136,146,115,83,125,134,101,67,54,70,95,79,144,81,58,59,65,70,114,78,98,130,153,83,99,136,56,116,109,95,95,62,68,59,76,49,58,14,83,72,
+ 64,66,82,69,93,109,91,73,169,69,101,125,69,80,117,41,60,113,119,93,99,98,118,108,127,95,124,163,124,134,148,80,142,127,107,67,95,67,84,101,121,137,122,101,49,57,63,88,81,88,100,109,147,146,49,69,46,66,67,46,97,79,66,110,60,66,17,36,74,
+ 72,62,59,59,78,204,94,110,100,109,100,137,82,121,131,117,113,146,84,88,98,106,120,149,126,116,150,121,141,140,112,88,108,68,121,109,127,73,70,121,134,150,71,65,88,87,70,60,102,108,96,154,120,152,68,68,58,88,36,87,61,103,96,123,79,57,65,40,51,
+},
+{
+ 144,146,144,145,144,144,144,146,145,144,144,145,145,148,160,176,176,160,188,190,166,170,147,147,147,146,145,144,146,145,144,145,145,144,144,145,145,143,143,144,145,143,144,143,143,145,144,144,145,144,144,146,145,146,148,148,150,149,152,151,152,154,206,207,222,236,242,236,238,
+ 148,147,147,147,148,147,148,148,148,148,149,149,149,149,152,152,152,154,177,179,178,153,150,149,149,150,150,149,149,148,149,149,149,148,148,148,148,147,149,146,147,147,148,147,148,147,148,148,148,149,149,149,149,150,150,156,201,156,156,209,174,213,236,216,236,237,239,244,235,
+ 153,152,154,152,153,151,151,152,152,152,152,153,153,155,154,154,154,154,156,155,156,155,159,155,155,154,154,153,154,154,154,153,152,152,152,153,152,152,152,151,151,152,150,150,151,152,151,151,151,150,153,153,153,154,206,222,231,232,238,230,235,229,221,217,219,220,220,227,221,
+ 157,155,155,157,156,156,157,156,156,157,157,157,158,158,158,157,158,158,159,159,158,158,159,158,159,158,158,158,158,156,157,156,156,157,157,156,156,155,155,154,155,154,154,155,155,155,154,154,155,155,156,161,165,157,176,196,215,229,226,219,216,220,219,223,214,201,197,200,202,
+ 161,160,160,161,160,159,160,160,160,161,161,162,163,162,162,162,162,161,163,162,163,163,162,162,162,162,162,163,163,160,161,162,161,161,161,160,160,160,159,161,158,160,163,159,159,158,159,158,158,159,159,162,167,184,198,194,187,201,208,221,207,201,191,190,188,192,192,190,190,
+ 165,165,164,164,165,165,164,165,166,165,166,165,165,166,166,164,166,166,167,167,166,167,167,167,166,167,167,167,167,166,167,167,166,166,166,166,164,166,176,177,177,192,183,195,180,163,162,162,162,163,163,163,164,166,175,175,179,187,211,207,203,219,221,209,197,197,194,198,208,
+ 169,169,168,168,167,167,169,169,168,168,167,169,170,171,170,170,170,171,170,169,171,172,171,171,170,173,171,171,171,171,170,171,170,169,175,169,170,171,170,168,172,170,174,168,169,167,177,184,180,171,166,166,167,168,169,170,171,182,205,210,217,197,215,203,204,194,187,201,200,
+ 172,173,172,173,172,173,172,172,172,173,173,172,173,174,174,174,174,174,176,192,242,178,177,176,176,176,176,176,176,175,176,212,175,190,193,188,193,174,172,172,171,171,171,171,171,171,170,171,172,172,171,171,171,172,173,182,200,202,204,193,196,215,205,224,214,207,207,215,205,
+ 177,176,175,176,176,176,175,175,177,176,177,177,178,180,245,241,180,184,227,232,243,246,235,183,190,181,202,213,181,181,200,219,217,223,233,233,228,180,178,176,176,176,176,176,175,174,175,175,176,175,175,176,177,179,178,234,222,202,223,197,196,203,198,204,206,193,189,181,180,
+ 179,180,178,180,179,178,179,179,179,180,180,183,228,245,247,248,247,201,227,227,225,231,234,223,228,221,201,186,199,208,224,194,204,208,208,207,209,209,200,181,181,180,180,180,178,180,177,179,180,179,179,179,220,233,221,228,238,238,238,222,220,205,190,197,195,194,182,173,167,
+ 182,183,182,182,183,184,184,184,185,185,186,231,215,218,240,242,245,219,204,205,206,211,206,201,193,195,220,200,203,213,217,224,205,204,193,191,195,205,197,218,197,184,190,200,191,202,191,193,199,206,207,208,208,233,216,206,228,237,238,229,233,223,224,223,220,199,185,195,204,
+ 187,187,187,187,188,189,189,198,196,188,220,204,234,208,207,210,229,213,227,216,216,225,76,179,203,188,186,189,190,207,225,227,213,193,223,219,229,228,230,201,208,195,206,201,196,203,198,203,209,218,220,205,200,195,197,191,213,214,215,194,234,230,189,211,221,228,194,190,191,
+ 190,191,189,189,188,195,207,213,210,220,199,191,205,204,213,213,208,212,216,221,226,207,127,71,190,192,177,176,169,189,198,201,200,200,202,206,205,203,206,212,219,198,197,200,209,224,221,216,204,199,196,202,194,199,199,183,184,195,196,211,221,218,211,221,212,208,203,198,210,
+ 194,193,192,192,211,194,198,203,194,191,191,194,190,190,193,183,208,201,194,173,146,207,79,100,187,189,182,173,200,185,194,199,197,210,196,186,182,184,180,185,200,194,194,212,221,223,195,195,195,196,199,207,197,208,197,199,188,192,201,184,189,189,208,214,214,212,186,185,187,
+ 195,203,195,217,193,199,199,204,207,199,204,213,208,200,187,203,209,180,195,184,188,121,77,73,179,179,202,189,186,175,175,193,176,178,181,187,199,199,196,215,205,197,205,204,202,207,221,203,207,210,204,205,202,209,214,195,205,193,195,196,196,194,188,189,192,189,194,189,193,
+ 199,193,198,200,201,199,198,203,194,199,202,202,199,195,198,117,187,194,184,169,132,121,79,79,136,184,172,189,177,144,169,178,210,216,208,205,193,200,202,200,208,199,192,199,204,199,197,199,198,208,200,200,203,198,201,198,200,198,195,193,191,192,186,196,187,183,184,186,179,
+ 200,198,198,198,165,190,137,190,198,191,207,206,105,143,133,180,184,195,104,118,129,114,85,87,154,185,164,158,161,172,171,177,195,192,191,194,195,183,190,199,200,201,199,198,154,192,198,196,192,192,203,205,197,191,174,139,154,174,150,202,149,155,157,153,174,197,186,149,148,
+ 140,157,143,139,163,134,132,117,123,150,112,151,196,181,204,207,202,112,106,149,111,128,94,88,138,161,161,171,174,180,171,166,155,100,101,201,195,204,184,192,179,171,147,148,170,175,140,133,111,114,120,134,153,161,139,148,146,148,147,152,123,131,131,147,173,122,115,111,121,
+ 140,153,170,120,136,128,130,168,146,170,148,155,171,209,178,182,120,110,117,111,136,148,75,75,145,182,144,162,169,155,167,182,168,172,97,101,95,115,113,92,90,128,91,95,141,114,108,107,108,107,105,107,108,107,123,143,128,123,139,119,148,134,107,108,104,106,103,101,71,
+ 174,145,131,150,166,160,193,185,160,145,190,146,188,169,175,170,134,158,100,114,168,133,142,80,170,122,101,177,190,173,172,196,161,129,82,81,79,80,82,84,88,85,92,93,99,77,77,128,150,129,100,120,106,113,101,128,104,109,102,86,84,101,114,73,91,75,109,74,68,
+ 154,164,144,156,125,166,159,149,179,157,150,166,169,191,182,165,190,145,118,132,149,162,143,103,125,67,130,195,203,167,104,203,190,196,74,75,75,76,73,72,74,75,79,80,75,76,91,72,84,98,82,96,76,98,98,112,161,151,115,102,103,103,121,124,91,73,134,144,72,
+ 112,140,152,153,159,181,183,188,154,202,185,188,179,182,87,74,55,103,111,130,157,78,178,116,80,98,82,55,85,93,131,138,189,162,69,119,111,69,70,67,69,70,73,69,70,74,71,72,83,70,72,70,76,114,92,90,104,96,103,106,162,167,150,154,160,127,120,134,119,
+ 140,161,148,152,167,164,190,177,203,201,191,167,156,62,95,65,53,57,63,148,151,96,163,116,53,55,72,56,60,51,120,115,116,171,180,66,65,74,70,73,81,77,79,61,64,67,78,73,73,82,101,70,132,125,140,73,132,154,115,168,173,166,173,166,66,143,152,125,169,
+ 115,127,155,158,167,95,96,188,164,204,150,137,112,114,54,56,47,141,136,179,130,77,118,151,137,61,64,72,63,75,136,140,99,118,109,88,64,72,75,65,65,62,73,64,68,69,94,75,76,126,112,122,121,103,129,154,119,125,149,176,150,83,136,113,151,56,46,56,40,
+ 82,96,169,195,188,85,139,201,113,129,92,77,138,87,101,69,85,89,61,92,75,72,101,156,89,64,50,75,91,76,112,151,147,115,68,73,72,61,63,102,63,76,68,63,61,66,70,84,83,65,91,127,153,145,181,123,133,121,63,70,84,76,145,57,54,55,83,47,54,
+ 111,114,103,149,135,84,92,136,136,107,110,68,79,69,93,101,101,91,134,69,119,115,100,91,77,56,54,101,81,147,142,116,119,61,136,154,159,130,55,67,63,84,70,68,74,67,63,60,62,63,117,79,69,127,114,82,120,127,168,153,111,114,54,50,55,45,61,47,67,
+ 158,133,115,90,103,88,91,163,106,98,125,64,120,151,167,150,103,62,53,108,135,125,149,74,125,124,119,99,111,132,67,112,67,63,60,110,79,117,68,132,88,62,56,86,72,65,56,62,61,99,102,109,111,105,114,131,87,57,69,67,57,54,60,73,63,56,61,67,78,
+ 144,169,98,125,113,141,124,142,135,114,131,126,143,126,96,61,56,60,74,82,109,79,113,66,49,53,129,125,112,54,81,142,90,91,121,84,124,110,107,113,113,135,70,52,58,58,59,60,59,61,72,67,88,88,95,90,78,103,75,71,88,57,68,62,69,69,69,79,102,
+ 136,159,131,99,77,82,167,121,94,114,114,124,142,150,159,61,59,59,94,102,93,121,60,52,46,46,131,138,53,52,62,124,97,105,126,54,102,105,79,78,73,154,124,134,95,91,65,54,56,85,64,96,74,67,49,80,85,91,89,103,124,65,62,85,84,72,52,81,127,
+ 153,173,75,73,72,154,164,120,146,121,113,128,144,133,128,77,152,91,122,135,52,44,43,45,64,51,114,158,73,48,96,130,58,106,117,92,103,84,53,78,53,112,52,132,103,161,152,58,130,67,94,91,82,83,72,98,78,107,115,129,115,79,93,109,98,67,88,178,133,
+ 80,70,71,74,71,140,96,152,170,145,153,158,80,55,130,160,97,97,158,46,51,59,44,48,48,49,53,122,120,107,72,108,118,163,105,74,89,46,41,45,101,40,38,48,47,125,109,127,47,81,74,100,84,62,94,95,100,94,123,137,202,132,118,139,128,76,138,177,165,
+ 71,70,74,75,111,173,130,147,184,108,77,91,91,85,100,185,102,151,62,47,58,42,52,46,53,68,109,50,52,47,71,140,174,144,125,46,51,58,43,44,46,52,60,53,89,122,78,54,43,46,65,104,74,116,57,55,110,140,97,129,154,132,158,121,135,95,139,138,132,
+ 71,79,70,133,168,145,124,137,165,110,87,70,128,64,128,106,85,83,110,61,104,66,45,53,45,65,122,62,93,152,155,153,152,105,62,42,49,39,50,38,46,82,86,106,74,115,62,59,38,40,41,61,101,76,63,68,129,104,144,120,118,124,77,141,139,91,67,172,156,
+ 67,68,72,73,170,129,163,114,143,93,124,125,105,128,123,149,103,137,152,115,139,51,70,136,56,113,138,144,138,130,139,152,151,99,84,54,46,75,43,49,57,39,52,52,112,55,73,40,83,51,52,60,37,77,105,97,56,120,155,141,145,172,126,124,83,131,133,159,133,
+ 109,70,82,147,155,80,123,145,168,76,96,99,66,140,129,152,132,85,126,130,136,100,90,111,121,114,148,113,127,106,160,152,198,53,79,67,35,43,40,109,51,36,59,48,84,55,85,38,36,59,104,44,139,48,38,54,114,116,138,194,160,166,57,66,98,88,140,149,47,
+ 66,65,72,93,94,61,106,114,123,90,113,182,119,111,141,154,75,140,113,101,109,104,143,139,101,102,88,129,105,83,152,150,113,60,40,40,37,35,45,40,71,44,47,47,96,103,52,42,45,38,53,61,81,58,42,47,45,111,50,153,50,201,52,88,50,64,52,94,39,
+ 65,70,128,162,101,103,108,135,93,60,138,137,117,145,92,116,115,134,102,123,95,97,92,61,85,99,95,158,121,114,139,178,106,46,118,150,63,66,84,139,96,84,49,43,48,49,41,44,87,72,51,106,93,111,54,65,68,74,62,80,46,94,157,56,110,50,43,40,18,
+ 68,64,75,81,74,60,133,120,56,106,147,131,108,123,70,163,101,108,107,160,94,56,87,101,133,136,139,137,141,165,136,110,132,112,159,120,60,102,90,109,55,103,101,61,84,43,63,100,107,122,103,57,82,87,94,47,87,49,53,76,60,151,142,127,47,43,62,46,35,
+ 87,62,127,69,101,60,58,87,67,140,108,131,112,90,150,56,140,110,138,95,98,84,121,92,88,105,95,140,136,148,168,114,149,107,125,121,90,110,122,103,76,109,123,67,100,75,65,46,100,106,89,91,88,113,92,49,46,49,66,44,50,46,47,39,42,48,31,6,14,
+ 101,153,109,119,59,130,65,76,112,146,136,77,102,113,143,107,93,100,105,58,112,91,108,96,65,83,155,120,155,168,120,117,147,72,105,90,139,149,93,123,84,109,108,123,106,54,50,96,80,133,106,68,83,123,78,97,41,44,49,43,50,50,43,47,121,124,99,56,39,
+ 123,133,137,56,119,72,105,163,107,86,109,74,91,147,153,114,118,121,98,112,126,99,125,118,94,97,167,115,118,135,110,106,52,102,115,92,122,134,110,82,87,81,148,78,108,96,40,78,75,106,143,80,107,86,83,131,125,71,65,48,59,77,67,92,76,99,107,27,26,
+ 126,123,66,172,98,141,98,72,60,61,78,82,94,107,117,71,88,142,75,117,120,124,102,120,103,136,102,110,176,120,50,74,90,57,149,107,114,56,111,43,64,158,111,56,132,61,90,82,90,89,122,71,110,137,112,99,69,69,115,45,71,79,80,73,48,123,115,24,83,
+ 138,98,128,121,148,153,102,81,77,62,61,65,121,121,51,64,146,116,120,156,114,110,137,117,119,51,66,146,79,137,66,118,48,97,94,66,44,48,88,44,106,103,91,96,45,54,56,98,50,105,128,138,82,131,150,117,73,43,70,80,66,67,100,47,46,48,23,111,45,
+ 59,60,102,164,133,95,150,100,85,140,99,62,108,125,88,103,63,58,148,102,67,118,124,119,137,60,83,110,121,127,137,107,82,123,124,95,55,45,54,90,65,134,66,42,46,51,58,101,64,94,129,145,77,94,129,52,104,109,93,89,51,50,49,63,42,42,7,37,53,
+ 59,59,76,71,96,113,89,71,170,66,103,123,71,86,117,49,50,108,121,93,100,97,117,106,126,97,121,158,122,132,143,72,132,117,99,57,88,58,75,98,114,134,116,94,38,42,42,64,71,77,95,109,141,132,40,72,52,71,63,49,93,79,53,100,42,61,7,16,32,
+ 60,56,58,54,70,201,97,116,107,114,103,139,80,123,133,118,110,142,70,87,97,103,118,146,121,108,143,117,136,135,110,86,110,64,108,96,121,66,57,116,123,148,58,53,76,73,57,46,101,103,95,151,114,143,59,74,60,89,38,88,66,99,96,121,65,44,52,20,28,
+},
+};
+
+using namespace boost::gil;
+extern rgb8c_planar_view_t sample_view;
+rgb8c_planar_view_t sample_view = planar_rgb_view(69,46,halfdome[0],halfdome[1],halfdome[2],69);
diff --git a/src/boost/libs/gil/test/test_utility_output_stream.cpp b/src/boost/libs/gil/test/test_utility_output_stream.cpp
new file mode 100644
index 000000000..eb46e2cd5
--- /dev/null
+++ b/src/boost/libs/gil/test/test_utility_output_stream.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+#include <cstdint>
+#include <sstream>
+#include <type_traits>
+
+namespace utility = boost::gil::test::utility;
+
+int main()
+{
+ static_assert(
+ std::is_same<utility::printable_numeric_t<std::uint8_t>, int>::value,
+ "std::uint8_t not printable as int");
+ static_assert(
+ !std::is_same<utility::printable_numeric_t<std::uint64_t>, int>::value,
+ "std::uint64_t printable as int");
+ static_assert(
+ std::is_same<utility::printable_numeric_t<float>, double>::value,
+ "float not printable as double");
+
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::int8_t{-128});
+ BOOST_TEST_EQ(oss.str(), "v0=-128");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::uint8_t{128});
+ BOOST_TEST_EQ(oss.str(), "v0=128");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::int16_t{-32768});
+ BOOST_TEST_EQ(oss.str(), "v0=-32768");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::uint16_t{32768});
+ BOOST_TEST_EQ(oss.str(), "v0=32768");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(float{1.2345f});
+ BOOST_TEST_EQ(oss.str(), "v0=1.2345");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(double{1.2345});
+ BOOST_TEST_EQ(oss.str(), "v0=1.2345");
+ }
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/test_utility_output_stream.hpp b/src/boost/libs/gil/test/test_utility_output_stream.hpp
new file mode 100644
index 000000000..e2a8a01bb
--- /dev/null
+++ b/src/boost/libs/gil/test/test_utility_output_stream.hpp
@@ -0,0 +1,133 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distribtted under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_TEST_UTILITY_HPP
+#define BOOST_GIL_TEST_TEST_UTILITY_HPP
+
+#include <boost/gil/color_base_algorithm.hpp> // static_for_each
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/promote_integral.hpp>
+
+#include <boost/core/demangle.hpp>
+#include <boost/core/typeinfo.hpp>
+
+#include <cstdint>
+#include <ostream>
+#include <type_traits>
+
+// Utilities to make GIL primitives printable for BOOST_TEST_EQ and other macros
+
+namespace boost { namespace gil {
+
+namespace test { namespace utility {
+
+template <typename T>
+struct printable_numeric
+{
+ using type = typename std::conditional
+ <
+ std::is_integral<T>::value,
+ typename ::boost::gil::promote_integral<T>::type,
+ typename std::common_type<T, double>::type
+ >::type;
+
+ static_assert(std::is_arithmetic<T>::value, "T must be numeric type");
+ static_assert(sizeof(T) <= sizeof(type), "bit-size narrowing conversion");
+};
+
+template <typename T>
+using printable_numeric_t = typename printable_numeric<T>::type;
+
+struct print_color_base
+{
+ std::ostream& os_;
+ std::size_t element_index_{0};
+ print_color_base(std::ostream& os) : os_(os) {}
+
+ template <typename Element>
+ void operator()(Element const& c)
+ {
+ printable_numeric_t<Element> n{c};
+ if (element_index_ > 0) os_ << ", ";
+ os_ << "v" << element_index_ << "=" << n;
+ ++element_index_;
+ }
+
+ template <typename BitField, int FirstBit, int NumBits, bool IsMutable>
+ void operator()(gil::packed_channel_reference<BitField, FirstBit, NumBits, IsMutable> const& c)
+ {
+ printable_numeric_t<BitField> n{c.get()};
+ if (element_index_ > 0) os_ << ", ";
+ os_ << "v" << element_index_ << "=" << n;
+ ++element_index_;
+ }
+
+ template <typename BaseChannelValue, typename MinVal, typename MaxVal>
+ void operator()(gil::scoped_channel_value<BaseChannelValue, MinVal, MaxVal> const& c)
+ {
+ printable_numeric_t<BaseChannelValue> n{c};
+ if (element_index_ > 0) os_ << ", ";
+ os_ << "v" << element_index_ << "=" << n;
+ ++element_index_;
+ }
+};
+
+}} // namespace test::utility
+
+template <typename T>
+std::ostream& operator<<(std::ostream& os, point<T> const& p)
+{
+ os << "point<" << boost::core::demangled_name(typeid(T)) << ">";
+ os << "(" << p.x << ", " << p.y << ")" << std::endl;
+ return os;
+}
+
+template <typename ChannelValue, typename Layout>
+std::ostream& operator<<(std::ostream& os, pixel<ChannelValue, Layout> const& p)
+{
+ os << "pixel<"
+ << "\n\tChannel=" << boost::core::demangled_name(typeid(ChannelValue))
+ << ",\n\tLayout=" << boost::core::demangled_name(typeid(Layout))
+ << "\n>(";
+
+ static_for_each(p, test::utility::print_color_base{os});
+ os << ")" << std::endl;
+ return os;
+}
+
+template <typename BitField, typename ChannelRefs, typename Layout>
+std::ostream& operator<<(std::ostream& os, packed_pixel<BitField, ChannelRefs, Layout> const& p)
+{
+ os << "packed_pixel<"
+ << "\n\tBitField=" << boost::core::demangled_name(typeid(BitField))
+ << ",\n\tChannelRefs=" << boost::core::demangled_name(typeid(ChannelRefs))
+ << ",\n\tLayout=" << boost::core::demangled_name(typeid(Layout))
+ << ">(";
+
+ static_for_each(p, test::utility::print_color_base{os});
+ os << ")" << std::endl;
+ return os;
+}
+
+template <typename ChannelReference, typename ColorSpace>
+std::ostream& operator<<(std::ostream& os, planar_pixel_reference<ChannelReference, ColorSpace> const& p)
+{
+ os << "planar_pixel_reference<"
+ << "\nChannelReference=" << boost::core::demangled_name(typeid(ChannelReference))
+ << ",\nColorSpace=" << boost::core::demangled_name(typeid(ColorSpace))
+ << ">(";
+
+ static_for_each(p, test::utility::print_color_base{os});
+ os << ")" << std::endl;
+ return os;
+}
+
+}} // namespace boost::gil
+
+#endif