From 125af7d2d3cbd5178ba3a141e01e31fc504b6df3 Mon Sep 17 00:00:00 2001 From: Asheikhm <50454115+Asheikhm@users.noreply.github.com> Date: Tue, 28 Oct 2025 17:24:48 -0400 Subject: [PATCH 01/37] Issue 2075 : Apply RGB on transpose matrices. (#2206) * adding unit test for applyRGB buffer, check in the applyRGB if the buffer is C order or not, for now throw error Signed-off-by: Afsaneh Sheikhmiri * Adsk Contrib - Detect C/F order, if not C order : RuntimeError shown, test is still not passing Signed-off-by: Afsaneh Sheikhmiri * remove 1d arrays from the test, since even after Transpose, 1d arrays are still contiguous Signed-off-by: Afsaneh Sheikhmiri --------- Signed-off-by: Afsaneh Sheikhmiri Co-authored-by: Doug Walker --- src/bindings/python/PyCPUProcessor.cpp | 8 ++- src/bindings/python/PyUtils.cpp | 21 ++++++++ src/bindings/python/PyUtils.h | 3 ++ tests/python/CPUProcessorTest.py | 69 +++++++++++++++++++++++++- 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/src/bindings/python/PyCPUProcessor.cpp b/src/bindings/python/PyCPUProcessor.cpp index 84b91427bf..e5786ba244 100644 --- a/src/bindings/python/PyCPUProcessor.cpp +++ b/src/bindings/python/PyCPUProcessor.cpp @@ -96,7 +96,10 @@ written to the dstImgDesc image, leaving srcImgDesc unchanged. py::buffer_info info = data.request(); checkBufferDivisible(info, 3); - // Interpret as single row of RGB pixels + // --- detect C-contiguous --- + checkCContiguousArray(info); + + // --- proceed normally --- BitDepth bitDepth = getBufferBitDepth(info); py::gil_scoped_release release; @@ -115,6 +118,7 @@ written to the dstImgDesc image, leaving srcImgDesc unchanged. chanStrideBytes, xStrideBytes, yStrideBytes); + self->apply(img); }, "data"_a, @@ -171,6 +175,8 @@ float values is returned, leaving the input list unchanged. py::buffer_info info = data.request(); checkBufferDivisible(info, 4); + // --- detect C-contiguous --- + checkCContiguousArray(info); // Interpret as single row of RGBA pixels BitDepth bitDepth = getBufferBitDepth(info); diff --git a/src/bindings/python/PyUtils.cpp b/src/bindings/python/PyUtils.cpp index 23be750685..fbf1afc31e 100644 --- a/src/bindings/python/PyUtils.cpp +++ b/src/bindings/python/PyUtils.cpp @@ -179,6 +179,27 @@ void checkBufferType(const py::buffer_info & info, BitDepth bitDepth) checkBufferType(info, bitDepthToDtype(bitDepth)); } +void checkCContiguousArray(const py::buffer_info & info) +{ + bool isC = true; + ptrdiff_t itemsize = info.itemsize; + auto shape = info.shape; + auto strides = info.strides; + py::ssize_t ndim = info.ndim; + + ptrdiff_t expected = itemsize; + for (py::ssize_t i = ndim - 1; i >= 0; --i) + { + if (strides[i] != expected) { isC = false; break; } + expected *= shape[i]; + } + + if (!isC) + { + throw std::runtime_error("function only supports C-contiguous (row-major) arrays"); + } +} + void checkBufferDivisible(const py::buffer_info & info, py::ssize_t numChannels) { if (info.size % numChannels != 0) diff --git a/src/bindings/python/PyUtils.h b/src/bindings/python/PyUtils.h index f5d39ee911..8e0ca44ef5 100644 --- a/src/bindings/python/PyUtils.h +++ b/src/bindings/python/PyUtils.h @@ -89,6 +89,9 @@ unsigned long getBufferLut3DGridSize(const py::buffer_info & info); // Throw if vector size is not divisible by channel count void checkVectorDivisible(const std::vector & pixel, size_t numChannels); +// Throw if array is not C-contiguous +void checkCContiguousArray(const py::buffer_info & info); + } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_PYUTILS_H diff --git a/tests/python/CPUProcessorTest.py b/tests/python/CPUProcessorTest.py index 4fc5e3c157..128281cfe9 100644 --- a/tests/python/CPUProcessorTest.py +++ b/tests/python/CPUProcessorTest.py @@ -19,7 +19,7 @@ class CPUProcessorTest(unittest.TestCase): - FLOAT_DELTA = 1e+5 + FLOAT_DELTA = 1e-5 UINT_DELTA = 1 @classmethod @@ -385,6 +385,28 @@ def test_apply_rgb_list(self): delta=self.FLOAT_DELTA ) + def test_apply_rgb_buffer_column_major(self): + if not np: + logger.warning("NumPy not found. Skipping test!") + return + + for arr, cpu_proc_fwd in [ + (self.float_rgb_2d, self.default_cpu_proc_fwd), + (self.float_rgb_3d, self.default_cpu_proc_fwd), + (self.half_rgb_2d, self.half_cpu_proc_fwd), + (self.half_rgb_3d, self.half_cpu_proc_fwd), + (self.uint16_rgb_2d, self.uint16_cpu_proc_fwd), + (self.uint16_rgb_3d, self.uint16_cpu_proc_fwd), + (self.uint8_rgb_2d, self.uint8_cpu_proc_fwd), + (self.uint8_rgb_3d, self.uint8_cpu_proc_fwd), + ]: + # Transpose to F-order (column-major) + arr_copy = arr.copy().T + + # Expect runtime error for non-C-contiguous array + with self.assertRaises(RuntimeError): + cpu_proc_fwd.applyRGB(arr_copy) + def test_apply_rgb_buffer(self): if not np: logger.warning("NumPy not found. Skipping test!") @@ -627,3 +649,48 @@ def test_apply_rgba_buffer(self): arr.flat[i], delta=self.UINT_DELTA ) + + def test_apply_rgba_buffer_column_major(self): + if not np: + logger.warning("NumPy not found. Skipping test!") + return + + for arr, cpu_proc_fwd in [ + ( + self.float_rgba_2d, + self.default_cpu_proc_fwd + ), + ( + self.float_rgba_3d, + self.default_cpu_proc_fwd + ), + ( + self.half_rgba_2d, + self.half_cpu_proc_fwd + ), + ( + self.half_rgba_3d, + self.half_cpu_proc_fwd + ), + ( + self.uint16_rgba_2d, + self.uint16_cpu_proc_fwd + ), + ( + self.uint16_rgba_3d, + self.uint16_cpu_proc_fwd + ), + ( + self.uint8_rgba_2d, + self.uint8_cpu_proc_fwd + ), + ( + self.uint8_rgba_3d, + self.uint8_cpu_proc_fwd, + ), + ]: + # Transpose to F-order (column-major) + arr_copy = arr.copy().T + # Expect runtime error for non-C-contiguous array + with self.assertRaises(RuntimeError): + cpu_proc_fwd.applyRGBA(arr_copy) From b59cd64368992aec3dfb4901f3de52b8f7878862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Achard?= Date: Mon, 24 Nov 2025 23:23:10 +0000 Subject: [PATCH 02/37] Add Python 3.14 wheels and minor fixes (#2218) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enable Python 3.14 wheels Signed-off-by: Rémi Achard * Replace macos-13 by macos-15-intel Signed-off-by: Rémi Achard * Allow find_package CONFIG mode with Package_ROOT Signed-off-by: Rémi Achard --------- Signed-off-by: Rémi Achard --- .github/workflows/ci_workflow.yml | 2 +- .github/workflows/wheel_workflow.yml | 54 ++++++++++++------------ share/cmake/modules/FindImath.cmake | 6 +-- share/cmake/modules/FindOSL.cmake | 32 +++++++------- share/cmake/modules/Findexpat.cmake | 6 +-- share/cmake/modules/Findminizip-ng.cmake | 6 +-- share/cmake/modules/Findpybind11.cmake | 6 +-- share/cmake/modules/Findyaml-cpp.cmake | 4 +- 8 files changed, 53 insertions(+), 63 deletions(-) diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 62ea921776..82a186d04d 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -459,7 +459,7 @@ jobs: if: | github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository - runs-on: macos-13 + runs-on: macos-15-intel strategy: matrix: build: [1, 2, 3, 4, 5] diff --git a/.github/workflows/wheel_workflow.yml b/.github/workflows/wheel_workflow.yml index ed83e68457..8fa6ce2f66 100644 --- a/.github/workflows/wheel_workflow.yml +++ b/.github/workflows/wheel_workflow.yml @@ -101,10 +101,10 @@ jobs: manylinux: manylinux_2_28 python: cp313-manylinux_x86_64 arch: x86_64 - # - build: CPython 3.14 64 bits manylinux_2_28 - # manylinux: manylinux_2_28 - # python: cp314-manylinux_x86_64 - # arch: x86_64 + - build: CPython 3.14 64 bits manylinux_2_28 + manylinux: manylinux_2_28 + python: cp314-manylinux_x86_64 + arch: x86_64 # ------------------------------------------------------------------- # CPython 64 bits manylinux2014 # ------------------------------------------------------------------- @@ -128,10 +128,10 @@ jobs: manylinux: manylinux2014 python: cp313-manylinux_x86_64 arch: x86_64 - # - build: CPython 3.14 64 bits manylinux2014 - # manylinux: manylinux2014 - # python: cp314-manylinux_x86_64 - # arch: x86_64 + - build: CPython 3.14 64 bits manylinux2014 + manylinux: manylinux2014 + python: cp314-manylinux_x86_64 + arch: x86_64 steps: - uses: actions/checkout@v4 @@ -142,7 +142,7 @@ jobs: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@v3.3.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} @@ -190,10 +190,10 @@ jobs: manylinux: manylinux2014 python: cp313-manylinux_aarch64 arch: aarch64 - # - build: CPython 3.14 ARM 64 bits manylinux2014 - # manylinux: manylinux2014 - # python: cp314-manylinux_aarch64 - # arch: aarch64 + - build: CPython 3.14 ARM 64 bits manylinux2014 + manylinux: manylinux2014 + python: cp314-manylinux_aarch64 + arch: aarch64 steps: - uses: actions/checkout@v4 @@ -204,7 +204,7 @@ jobs: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@v3.3.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} @@ -221,7 +221,7 @@ jobs: macos: name: Build wheels on macOS - runs-on: macos-13 + runs-on: macos-15-intel # Don't run on OCIO forks if: | github.event_name != 'schedule' || @@ -247,9 +247,9 @@ jobs: - build: CPython 3.13 64 bits python: cp313-macosx_x86_64 arch: x86_64 - # - build: CPython 3.14 64 bits - # python: cp314-macosx_x86_64 - # arch: x86_64 + - build: CPython 3.14 64 bits + python: cp314-macosx_x86_64 + arch: x86_64 steps: - uses: actions/checkout@v4 @@ -264,7 +264,7 @@ jobs: brew uninstall --ignore-dependencies openexr imath || true - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@v3.3.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} @@ -306,9 +306,9 @@ jobs: - build: CPython 3.13 ARM 64 bits python: cp313-macosx_arm64 arch: arm64 - # - build: CPython 3.14 ARM 64 bits - # python: cp314-macosx_arm64 - # arch: arm64 + - build: CPython 3.14 ARM 64 bits + python: cp314-macosx_arm64 + arch: arm64 steps: - uses: actions/checkout@v4 @@ -319,7 +319,7 @@ jobs: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@v3.3.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} @@ -361,9 +361,9 @@ jobs: - build: CPython 3.13 64 bits python: cp313-win_amd64 arch: AMD64 - # - build: CPython 3.14 64 bits - # python: cp314-win_amd64 - # arch: AMD64 + - build: CPython 3.14 64 bits + python: cp314-win_amd64 + arch: AMD64 steps: - uses: actions/checkout@v4 @@ -374,7 +374,7 @@ jobs: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@v3.3.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} diff --git a/share/cmake/modules/FindImath.cmake b/share/cmake/modules/FindImath.cmake index 6126b934f7..fc2086aad1 100644 --- a/share/cmake/modules/FindImath.cmake +++ b/share/cmake/modules/FindImath.cmake @@ -40,10 +40,8 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_Imath_REQUIRED_VARS Imath_LIBRARY) set(_Imath_LIB_VER "${Imath_FIND_VERSION_MAJOR}_${Imath_FIND_VERSION_MINOR}") - if(NOT DEFINED Imath_ROOT) - # Search for ImathConfig.cmake - find_package(Imath ${Imath_FIND_VERSION} CONFIG QUIET) - endif() + # Search for ImathConfig.cmake + find_package(Imath ${Imath_FIND_VERSION} CONFIG QUIET) if(Imath_FOUND) get_target_property(Imath_LIBRARY Imath::Imath LOCATION) diff --git a/share/cmake/modules/FindOSL.cmake b/share/cmake/modules/FindOSL.cmake index 5cefe410bc..54dc17fb73 100644 --- a/share/cmake/modules/FindOSL.cmake +++ b/share/cmake/modules/FindOSL.cmake @@ -29,22 +29,22 @@ ############################################################################### ### Try to find package ### -if(NOT DEFINED OSL_ROOT) - find_package(OSL ${OSL_FIND_VERSION} CONFIG QUIET) - - set(OSL_SHADERS_INCLUDE_DIR ${OSL_INCLUDE_DIR}/../share) - # Variable used by the OSL unit tests. - set(OSL_SHADERS_DIR ${OSL_SHADERS_INCLUDE_DIR}/OSL/shaders) - - include (FindPackageHandleStandardArgs) - find_package_handle_standard_args (OSL - REQUIRED_VARS - OSL_INCLUDE_DIR - OSL_LIB_DIR - VERSION_VAR - OSL_VERSION - ) -else() +find_package(OSL ${OSL_FIND_VERSION} CONFIG QUIET) + +set(OSL_SHADERS_INCLUDE_DIR ${OSL_INCLUDE_DIR}/../share) +# Variable used by the OSL unit tests. +set(OSL_SHADERS_DIR ${OSL_SHADERS_INCLUDE_DIR}/OSL/shaders) + +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (OSL + REQUIRED_VARS + OSL_INCLUDE_DIR + OSL_LIB_DIR + VERSION_VAR + OSL_VERSION +) + +if(NOT OSL_FOUND) set(OSL_INCLUDE_DIR ${OSL_ROOT}/include) set(OSL_VERSION_HEADER "${OSL_INCLUDE_DIR}/OSL/oslversion.h") diff --git a/share/cmake/modules/Findexpat.cmake b/share/cmake/modules/Findexpat.cmake index 1e715bb0cf..73eed21fb9 100644 --- a/share/cmake/modules/Findexpat.cmake +++ b/share/cmake/modules/Findexpat.cmake @@ -39,10 +39,8 @@ endif() if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_expat_REQUIRED_VARS expat_LIBRARY) - if(NOT DEFINED expat_ROOT) - # Search for expat-config.cmake - find_package(expat ${expat_FIND_VERSION} CONFIG QUIET) - endif() + # Search for expat-config.cmake + find_package(expat ${expat_FIND_VERSION} CONFIG QUIET) if(expat_FOUND) if (TARGET expat::libexpat) diff --git a/share/cmake/modules/Findminizip-ng.cmake b/share/cmake/modules/Findminizip-ng.cmake index 3609b0ef84..bf194c073d 100644 --- a/share/cmake/modules/Findminizip-ng.cmake +++ b/share/cmake/modules/Findminizip-ng.cmake @@ -45,10 +45,8 @@ if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") endif() if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) - if(NOT DEFINED minizip-ng_ROOT) - # Search for minizip-ng-config.cmake - find_package(minizip-ng ${minizip-ng_FIND_VERSION} CONFIG QUIET) - endif() + # Search for minizip-ng-config.cmake + find_package(minizip-ng ${minizip-ng_FIND_VERSION} CONFIG QUIET) if (minizip-ng_FOUND) get_target_property(minizip-ng_INCLUDE_DIR MINIZIP::minizip-ng INTERFACE_INCLUDE_DIRECTORIES) diff --git a/share/cmake/modules/Findpybind11.cmake b/share/cmake/modules/Findpybind11.cmake index ccbb53e656..bfcb9a696e 100644 --- a/share/cmake/modules/Findpybind11.cmake +++ b/share/cmake/modules/Findpybind11.cmake @@ -24,10 +24,8 @@ ### Try to find package ### if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) - if(NOT DEFINED pybind11_ROOT) - # Search for pybind11Config.cmake - find_package(pybind11 ${pybind11_FIND_VERSION} CONFIG QUIET) - endif() + # Search for pybind11Config.cmake + find_package(pybind11 ${pybind11_FIND_VERSION} CONFIG QUIET) if(NOT pybind11_FOUND) # Find include directory diff --git a/share/cmake/modules/Findyaml-cpp.cmake b/share/cmake/modules/Findyaml-cpp.cmake index d10bdb4f5e..95275bcea8 100644 --- a/share/cmake/modules/Findyaml-cpp.cmake +++ b/share/cmake/modules/Findyaml-cpp.cmake @@ -44,9 +44,7 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_yaml-cpp_REQUIRED_VARS yaml-cpp_LIBRARY) # Search for yaml-cpp-config.cmake - if(NOT DEFINED yaml-cpp_ROOT) - find_package(yaml-cpp ${yaml-cpp_FIND_VERSION} CONFIG ${quiet}) - endif() + find_package(yaml-cpp ${yaml-cpp_FIND_VERSION} CONFIG ${quiet}) if(yaml-cpp_FOUND) # Alias target for yaml-cpp < 0.8 compatibility From 1d77ecda706b7d67e350c2f0416d5e470b48be74 Mon Sep 17 00:00:00 2001 From: Carol Payne <52329064+carolalynn@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:06:22 -0800 Subject: [PATCH 03/37] Updating news for OCIO 2.5 and Slack link (#2217) Signed-off-by: Carol Payne Co-authored-by: Doug Walker --- docs/site/homepage/data/en/contact.yml | 4 ++-- docs/site/homepage/data/en/news.yml | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/site/homepage/data/en/contact.yml b/docs/site/homepage/data/en/contact.yml index 624ddcf0e3..f0b6e8b9e8 100644 --- a/docs/site/homepage/data/en/contact.yml +++ b/docs/site/homepage/data/en/contact.yml @@ -9,8 +9,8 @@ contact: contact_list: - icon : ti-comment # themify icon pack : https://themify.me/themify-icons name: "Slack:" - info : "OpenColorIO" - link: "http://slack.opencolorio.org" + info : "#OpenColorIO" + link: "https://academysoftwarefdn.slack.com" - icon : ti-email # themify icon pack : https://themify.me/themify-icons name: "OCIO-User:" diff --git a/docs/site/homepage/data/en/news.yml b/docs/site/homepage/data/en/news.yml index 71a4626961..fe04515deb 100644 --- a/docs/site/homepage/data/en/news.yml +++ b/docs/site/homepage/data/en/news.yml @@ -2,26 +2,26 @@ news: enable : true image : images/disney_insideout.jpeg - title : OCIO v2 is here! + title : OCIO v2.5.0 is here! content : "Check out our [guides](https://opencolorio.readthedocs.io/en/latest/releases/_index.html#releases) for upgrading. Here are just a few highlights of new features:" caption: "Image courtesy of Disney (c)" feature_item : # feature item loop - - title : New GPU Renderer - icon : ti-world # themify icon pack : https://themify.me/themify-icons - content : The GPU renderer now matches the CPU and may be used to render final frames! + - title : Config Merging + icon : ti-files # themify icon pack : https://themify.me/themify-icons + content : This much-anticipated feature is now in Preview. Please provide feedback on use cases and workflows. Merging enables user and application control over things like name and alias conflicts, color space duplication, and much more. # feature item loop - - title : Better User Experience - icon : ti-brush # themify icon pack : https://themify.me/themify-icons - content : Config authors have new tools to organize color spaces by category, hide color spaces, and define hierarchical menus. New File and Viewing Rules allow more powerful default behaviors. + - title : Vulkan GPU Support + icon : ti-image # themify icon pack : https://themify.me/themify-icons + content : Support has been added for the Khronos Vulkan graphics API standard. The OCIO GPU renderer may now be used within applications that use Vulkan to get the most out of the latest GPUs. # feature item loop - - title : Improved ACES Support - icon : ti-stats-up # themify icon pack : https://themify.me/themify-icons - content : ACES Output Transforms no longer use 3d-LUTs and are accurate even for extreme exposure values. There is also full read and write support for the Academy/ASC Common LUT Format (CLF). + - title : Full ACES 2.0 Support + icon : ti-brush # themify icon pack : https://themify.me/themify-icons + content : With the inclusion of ACES 2.0 Built-In configs, our ACES 2.0 support is now feature complete. This allows use of the ACES 2.0 Output Transforms as OCIO views. # feature item loop - - title : Analysis Tools + - title : New Color Space Attributes icon : ti-panel # themify icon pack : https://themify.me/themify-icons - content : There are new command line tools for evaluating LUTs, converting to CLF, serializing OCIO Processors, and more! \ No newline at end of file + content : OCIO now supports the Color Interop ID developed by the Color Interop Forum, as well as attributes for ICC and AMF. Please see the latest config release for example usage. \ No newline at end of file From 2bc8759dc2921017cf2d5d2c43cf664813069c1e Mon Sep 17 00:00:00 2001 From: Cuneyt Ozdas Date: Sun, 11 Jan 2026 12:06:13 -0800 Subject: [PATCH 04/37] Fix Windows Doxygen install script (#2234) * - Fix Windows Doxygen install script as Doxygen v1.16.0 changed the released zip name. Signed-off-by: cuneyt.ozdas * double escape maybe? Signed-off-by: cuneyt.ozdas --------- Signed-off-by: cuneyt.ozdas --- share/ci/scripts/windows/install_doxygen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/ci/scripts/windows/install_doxygen.sh b/share/ci/scripts/windows/install_doxygen.sh index a08783f765..7b4341d5f5 100755 --- a/share/ci/scripts/windows/install_doxygen.sh +++ b/share/ci/scripts/windows/install_doxygen.sh @@ -10,7 +10,7 @@ DOXYGEN_LOCATION="$1" choco install jq # Get the URL of the latest zip package for Doxygen. -url=$(curl -s 'https://api.github.com/repos/doxygen/doxygen/releases/latest' | jq -r '.assets[] | select(.name | test("doxygen-.*windows.x64.bin.zip")) | .browser_download_url') +url=$(curl -s 'https://api.github.com/repos/doxygen/doxygen/releases/latest' | jq -r '.assets[] | select(.name | test("doxygen-.*\\.x64\\.bin\\.zip")) | .browser_download_url') # Download the zip. mkdir $DOXYGEN_LOCATION From 5d2409bbdb009e8d825afbf39a84835871adb00a Mon Sep 17 00:00:00 2001 From: Cuneyt Ozdas Date: Sun, 11 Jan 2026 13:24:26 -0800 Subject: [PATCH 05/37] Remove [0,1] clamping from ICC transforms (#2224) * Addressing issue #1915, remove [0, 1] clamping from ICC profiles. Currently the clamping is removed ONLY when the the type 0 (simple gamma) TRC is used. In this case the the mirroring around origin is used for the negative values. Other parametric curves are currently implemented as 1DLuts thus will not handle out of bound values properly. In a later wave we can either convert LUTs to half-domain ones or try to implement them with more complex ops (such as exponent with linear). Signed-off-by: cuneyt.ozdas * - Fixing the op tests in the inverse direction - More detailed explanation for the clamp removal in pure-gamma TRC cases. Signed-off-by: cuneyt.ozdas --------- Signed-off-by: cuneyt.ozdas Co-authored-by: Doug Walker --- src/OpenColorIO/fileformats/FileFormatICC.cpp | 38 ++++++++--------- tests/cpu/fileformats/FileFormatICC_tests.cpp | 42 ++++++++++++------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/src/OpenColorIO/fileformats/FileFormatICC.cpp b/src/OpenColorIO/fileformats/FileFormatICC.cpp index 4768101129..69c0145d8a 100755 --- a/src/OpenColorIO/fileformats/FileFormatICC.cpp +++ b/src/OpenColorIO/fileformats/FileFormatICC.cpp @@ -15,7 +15,6 @@ #include "ops/gamma/GammaOp.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/matrix/MatrixOp.h" -#include "ops/range/RangeOp.h" #include "Platform.h" #include "transforms/FileTransform.h" @@ -794,13 +793,23 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, } } - // The matrix/TRC transform in the ICC profile converts display device code values to the - // CIE XYZ based version of the ICC profile connection space (PCS). - // However, in OCIO the most common use of an ICC monitor profile is as a display color space, - // and in that usage it is more natural for the XYZ to display code value transform to be called - // the forward direction. + // The matrix/TRC transform in the ICC profile converts display device code + // values to the CIE XYZ based version of the ICC profile connection space + // (PCS). However, in OCIO the most common use of an ICC monitor profile is + // as a display color space, and in that usage it is more natural for the + // XYZ to display code value transform to be called the forward direction. - // Curves / ParaCurves operates in the range 0.0 to 1.0 as per ICC specifications. + // The ICC spec states that the TRC tags should clamp to [0,1]. For curves + // that are implemented in the ICC profile as LUTs and most parametric + // curves (which become LUTs in OCIO), this is the case. However, as + // floating-point and HDR workflows become more common, the clamping has + // become a critical roadblock. For example, it is now common to have ICC + // profiles for linear color spaces that need to pass values outside [0,1]. + // Therefore, OCIO now implements single entry 'curv' tags and type 0 'para' + // tags without clamping using an ExponentTransform which extends above 1 + // and mirrors below 0. (Note that gamma values of 1 do not need to be + // tested for here since they will be omitted as no-ops later by the + // optimizer.) switch (newDir) { @@ -817,18 +826,12 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const GammaOpData::Params greenParams = { cachedFile->mGammaRGB[1] }; const GammaOpData::Params blueParams = { cachedFile->mGammaRGB[2] }; const GammaOpData::Params alphaParams = { cachedFile->mGammaRGB[3] }; - auto gamma = std::make_shared(GammaOpData::BASIC_FWD, + auto gamma = std::make_shared(GammaOpData::BASIC_MIRROR_FWD, redParams, greenParams, blueParams, alphaParams); - // GammaOp will clamp at 0 so we don't do it in the RangeOp. - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1, - RangeOpData::EmptyValue(), 1, - TRANSFORM_DIR_FORWARD); - CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); } @@ -859,18 +862,13 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const GammaOpData::Params greenParams = { cachedFile->mGammaRGB[1] }; const GammaOpData::Params blueParams = { cachedFile->mGammaRGB[2] }; const GammaOpData::Params alphaParams = { cachedFile->mGammaRGB[3] }; - auto gamma = std::make_shared(GammaOpData::BASIC_REV, + auto gamma = std::make_shared(GammaOpData::BASIC_MIRROR_REV, redParams, greenParams, blueParams, alphaParams); CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); - - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1, - RangeOpData::EmptyValue(), 1, - TRANSFORM_DIR_FORWARD); } break; } diff --git a/tests/cpu/fileformats/FileFormatICC_tests.cpp b/tests/cpu/fileformats/FileFormatICC_tests.cpp index e0c816093c..d120e24871 100644 --- a/tests/cpu/fileformats/FileFormatICC_tests.cpp +++ b/tests/cpu/fileformats/FileFormatICC_tests.cpp @@ -244,6 +244,8 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) { OCIO::ContextRcPtr context = OCIO::Context::Create(); { + // This test uses a profile where the TRC is a 1024 element LUT. + static const std::string iccFileName("icc-test-3.icm"); OCIO::OpRcPtrVec ops; OCIO_CHECK_NO_THROW(BuildOpsTest(ops, iccFileName, context, OCIO::TRANSFORM_DIR_INVERSE)); @@ -287,7 +289,8 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) op->apply(srcImage, 3); } - // Values outside [0.0, 1.0] are clamped and won't round-trip. + // Currently the LUT-based TRC's clamp the values outside + // [0.0, 1.0], thus those values won't round-trip. static constexpr float bckImage[] = { 0.0f, 0.0f, 0.3f, 0.0f, 0.4f, 0.5f, 0.6f, 0.5f, @@ -301,26 +304,35 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) } { + // This test uses a profile where the TRC is + // a parametric curve of type 0 (basic gamma) with + // gamma values {2.174, 2.174, 2.174, 1.0}. + static const std::string iccFileName("icc-test-2.pf"); OCIO::OpRcPtrVec ops; OCIO_CHECK_NO_THROW(BuildOpsTest(ops, iccFileName, context, OCIO::TRANSFORM_DIR_INVERSE)); OCIO_CHECK_NO_THROW(ops.finalize()); OCIO_CHECK_NO_THROW(ops.optimize(OCIO::OPTIMIZATION_LOSSLESS)); + OCIO_REQUIRE_EQUAL(2, ops.size()); + OCIO_CHECK_EQUAL("", ops[0]->getInfo()); + OCIO_CHECK_EQUAL("", ops[1]->getInfo()); // apply ops - float srcImage[] = { + const std::array srcImage{ -0.1f, 0.0f, 0.3f, 0.0f, 0.4f, 0.5f, 0.6f, 0.5f, 0.7f, 1.0f, 1.9f, 1.0f }; - const float dstImage[] = { - 0.012437f, 0.004702f, 0.070333f, 0.0f, + const std::array dstImage{ + 0.009241f, 0.003003f, 0.070198f, 0.0f, 0.188392f, 0.206965f, 0.343595f, 0.5f, - 0.693246f, 0.863199f, 1.07867f , 1.0f }; + 1.210462f, 1.058761f, 4.003706f, 1.0f }; + + std::array testImage = srcImage; for (const auto & op : ops) { - op->apply(srcImage, 3); + op->apply(testImage.data(), 3); } // Compare results @@ -328,7 +340,7 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) for (unsigned int i = 0; i<12; ++i) { - OCIO_CHECK_CLOSE(srcImage[i], dstImage[i], error); + OCIO_CHECK_CLOSE(testImage[i], dstImage[i], error); } // Invert the processing. @@ -337,24 +349,22 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) OCIO_CHECK_NO_THROW(BuildOpsTest(opsInv, iccFileName, context, OCIO::TRANSFORM_DIR_FORWARD)); OCIO_CHECK_NO_THROW(opsInv.finalize()); OCIO_CHECK_NO_THROW(opsInv.optimize(OCIO::OPTIMIZATION_LOSSLESS)); + OCIO_REQUIRE_EQUAL(2, opsInv.size()); + OCIO_CHECK_EQUAL("", opsInv[0]->getInfo()); + OCIO_CHECK_EQUAL("", opsInv[1]->getInfo()); for (const auto & op : opsInv) { - op->apply(srcImage, 3); + op->apply(testImage.data(), 3); } - // Values outside [0.0, 1.0] are clamped and won't round-trip. - const float bckImage[] = { - 0.0f, 0.0f, 0.3f, 0.0f, - 0.4f, 0.5f, 0.6f, 0.5f, - 0.7f, 1.0f, 1.0f, 1.0f }; - - // Compare results + // For pure-gamma TRCs, values outside [0.0, 1.0] are NOT clamped + // thus those values should round-trip correctly. const float error2 = 2e-4f; for (unsigned int i = 0; i<12; ++i) { - OCIO_CHECK_CLOSE(srcImage[i], bckImage[i], error2); + OCIO_CHECK_CLOSE(testImage[i], srcImage[i], error2); } } From d7917d439869e6d6806333aa98e0502cd7b33f83 Mon Sep 17 00:00:00 2001 From: Cuneyt Ozdas Date: Sun, 11 Jan 2026 14:05:25 -0800 Subject: [PATCH 06/37] Addressing Issue #2228 - Heap-use-after-free in OpenColorIO::ThrowInvalidRegex (#2231) This turned out to be not a UAF issue but an out-of-bounds-access issue where the throw was accessing the incorrect (and potentially shorter) string with an index derived from another (and potentially longer) string. Signed-off-by: cuneyt.ozdas Co-authored-by: Doug Walker --- src/OpenColorIO/FileRules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenColorIO/FileRules.cpp b/src/OpenColorIO/FileRules.cpp index e0df0d0276..19cbd47bf7 100644 --- a/src/OpenColorIO/FileRules.cpp +++ b/src/OpenColorIO/FileRules.cpp @@ -117,7 +117,7 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase if (globString[idx] == ']') { - ThrowInvalidRegex(globPattern, globPattern + idx); + ThrowInvalidRegex(globPattern, &globString[idx]); } // Full processing from '[' to ']'. From 9fea546de9f022189072b6a5dca55bafe6c7ea55 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Sun, 11 Jan 2026 18:26:02 -0500 Subject: [PATCH 07/37] Fix Vulkan texture binding index issue (#2226) * Fix texture binding index issue Signed-off-by: Doug Walker * Add texture binding index getters Signed-off-by: Doug Walker * Adjust addTexture return and fix Python binding Signed-off-by: Doug Walker * Fix unit tests Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- include/OpenColorIO/OpenColorIO.h | 28 +- src/OpenColorIO/GpuShader.cpp | 66 +- src/OpenColorIO/GpuShader.h | 2 + src/OpenColorIO/GpuShaderDesc.cpp | 4 + src/OpenColorIO/GpuShaderUtils.cpp | 12 +- src/OpenColorIO/GpuShaderUtils.h | 6 +- .../ops/fixedfunction/FixedFunctionOpGPU.cpp | 67 +- src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp | 32 +- src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp | 20 +- src/bindings/python/PyGpuShaderDesc.cpp | 42 +- tests/cpu/GpuShader_tests.cpp | 219 +- tests/data/files/clf/lut1d_lut3d_lut1d.clf | 65601 ++++++++++++++++ tests/python/GpuShaderDescTest.py | 97 +- 13 files changed, 66071 insertions(+), 125 deletions(-) create mode 100644 tests/data/files/clf/lut1d_lut3d_lut1d.clf diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index c02a6c8344..ad294fc805 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -3503,8 +3503,9 @@ class OCIOEXPORT GpuShaderCreator * The 'values' parameter contains the LUT data which must be used as-is as the dimensions and * origin are hard-coded in the fragment shader program. So, it means one GPU texture per entry. * - * \return Index of the texture. For shading languages using explicit texture bindings, the return - * value is the same as the texture binding index in the generated shader program. + * \return Shader binding index of the texture. For shading languages using explicit texture bindings, + * the return value is the same as the texture binding index in the generated shader program. + * The setDescriptorSetIndex function may be used to offset the starting index value. **/ virtual unsigned addTexture(const char * textureName, const char * samplerName, @@ -3522,8 +3523,9 @@ class OCIOEXPORT GpuShaderCreator * and origin are hard-coded in the fragment shader program. So, it means one GPU 3D texture * per entry. * - * \return Index of the texture. For shading languages using explicit texture bindings, the return - * value is the same as the texture binding index in the generated shader program. + * \return Shader binding index of the texture. For shading languages using explicit texture bindings, + * the return value is the same as the texture binding index in the generated shader program. + * The setDescriptorSetIndex function may be used to offset the starting index value. **/ virtual unsigned add3DTexture(const char * textureName, const char * samplerName, @@ -3775,7 +3777,12 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator **/ virtual std::size_t getUniformBufferSize() const noexcept = 0; - // 1D lut related methods + /** + * The getTexture methods are used to access Lut1D arrays to upload to the GPU as textures. + * Please note that the index used here is based on the total number of Lut1Ds used by + * the Processor and is different from the texture shader binding index, which may be + * obtained using the corresponding function. + */ virtual unsigned getNumTextures() const noexcept = 0; virtual void getTexture(unsigned index, const char *& textureName, @@ -3786,8 +3793,15 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator TextureDimensions & dimensions, Interpolation & interpolation) const = 0; virtual void getTextureValues(unsigned index, const float *& values) const = 0; + /// Get the index used to declare the texture in the shader for languages such as Vulkan. + virtual unsigned getTextureShaderBindingIndex(unsigned index) const = 0; - // 3D lut related methods + /** + * The get3DTexture methods are used to access Lut3D arrays to upload to the GPU as textures. + * Please note that the index used here is based on the total number of Lut3Ds used by + * the Processor and is different from the texture shader binding index, which may be + * obtained using the corresponding function. + */ virtual unsigned getNum3DTextures() const noexcept = 0; virtual void get3DTexture(unsigned index, const char *& textureName, @@ -3795,6 +3809,8 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator unsigned & edgelen, Interpolation & interpolation) const = 0; virtual void get3DTextureValues(unsigned index, const float *& values) const = 0; + /// Get the index used to declare the texture in the shader for languages such as Vulkan. + virtual unsigned get3DTextureShaderBindingIndex(unsigned index) const = 0; /// Get the complete OCIO shader program. const char * getShaderText() const noexcept; diff --git a/src/OpenColorIO/GpuShader.cpp b/src/OpenColorIO/GpuShader.cpp index 38eda8a30e..665cee02f1 100644 --- a/src/OpenColorIO/GpuShader.cpp +++ b/src/OpenColorIO/GpuShader.cpp @@ -70,6 +70,7 @@ class PrivateImpl GpuShaderDesc::TextureType channel, unsigned dimensions, Interpolation interpolation, + unsigned textureShaderBindingIndex, const float * v) : m_textureName(textureName) , m_samplerName(samplerName) @@ -79,6 +80,7 @@ class PrivateImpl , m_type(channel) , m_dimensions(dimensions) , m_interp(interpolation) + , m_textureShaderBindingIndex(textureShaderBindingIndex) { if (!textureName || !*textureName) { @@ -113,6 +115,7 @@ class PrivateImpl GpuShaderDesc::TextureType m_type; unsigned m_dimensions; Interpolation m_interp; + unsigned m_textureShaderBindingIndex; std::vector m_values; @@ -214,11 +217,13 @@ class PrivateImpl << width << " > " << get1dLutMaxWidth(); throw Exception(ss.str().c_str()); } - unsigned textureIndex = static_cast(m_textures.size()); + unsigned textureShaderBindingIndex = static_cast(m_textures.size()) + + static_cast(m_textures3D.size()); unsigned numDimensions = static_cast(dimensions); - Texture t(textureName, samplerName, width, height, 1, channel, numDimensions, interpolation, values); + Texture t(textureName, samplerName, width, height, 1, channel, numDimensions, interpolation, + textureShaderBindingIndex, values); m_textures.push_back(t); - return textureIndex; + return textureShaderBindingIndex; } void getTexture(unsigned index, @@ -268,6 +273,20 @@ class PrivateImpl values = &t.m_values[0]; } + unsigned getTextureShaderBindingIndex(unsigned index) const + { + if(index >= m_textures.size()) + { + std::ostringstream ss; + ss << "1D LUT access error: index = " << index + << " where size = " << m_textures.size(); + throw Exception(ss.str().c_str()); + } + + const Texture & t = m_textures[index]; + return t.m_textureShaderBindingIndex; + } + unsigned add3DTexture(const char * textureName, const char * samplerName, unsigned edgelen, @@ -282,12 +301,13 @@ class PrivateImpl throw Exception(ss.str().c_str()); } - unsigned textureIndex = static_cast(m_textures3D.size()); + unsigned textureShaderBindingIndex = static_cast(m_textures.size()) + + static_cast(m_textures3D.size()); Texture t(textureName, samplerName, edgelen, edgelen, edgelen, GpuShaderDesc::TEXTURE_RGB_CHANNEL, 3, - interpolation, values); + interpolation, textureShaderBindingIndex, values); m_textures3D.push_back(t); - return textureIndex; + return textureShaderBindingIndex; } void get3DTexture(unsigned index, @@ -325,6 +345,20 @@ class PrivateImpl values = &t.m_values[0]; } + unsigned get3DTextureShaderBindingIndex(unsigned index) const + { + if(index >= m_textures3D.size()) + { + std::ostringstream ss; + ss << "3D LUT access error: index = " << index + << " where size = " << m_textures3D.size(); + throw Exception(ss.str().c_str()); + } + + const Texture & t = m_textures3D[index]; + return t.m_textureShaderBindingIndex; + } + unsigned getNumUniforms() const { return (unsigned)m_uniforms.size(); @@ -544,7 +578,9 @@ unsigned GenericGpuShaderDesc::addTexture(const char * textureName, Interpolation interpolation, const float * values) { - return getImplGeneric()->addTexture(textureName, samplerName, width, height, channel, dimensions, interpolation, values); + return getImplGeneric()->addTexture(textureName, samplerName, width, height, channel, + dimensions, interpolation, values) + + getTextureBindingStart(); } void GenericGpuShaderDesc::getTexture(unsigned index, @@ -555,7 +591,8 @@ void GenericGpuShaderDesc::getTexture(unsigned index, TextureDimensions & dimensions, Interpolation & interpolation) const { - getImplGeneric()->getTexture(index, textureName, samplerName, width, height, channel, dimensions, interpolation); + getImplGeneric()->getTexture(index, textureName, samplerName, width, height, channel, + dimensions, interpolation); } void GenericGpuShaderDesc::getTextureValues(unsigned index, const float *& values) const @@ -563,6 +600,11 @@ void GenericGpuShaderDesc::getTextureValues(unsigned index, const float *& value getImplGeneric()->getTextureValues(index, values); } +unsigned GenericGpuShaderDesc::getTextureShaderBindingIndex(unsigned index) const +{ + return getImplGeneric()->getTextureShaderBindingIndex(index) + getTextureBindingStart(); +} + unsigned GenericGpuShaderDesc::getNum3DTextures() const noexcept { return unsigned(getImplGeneric()->m_textures3D.size()); @@ -574,7 +616,8 @@ unsigned GenericGpuShaderDesc::add3DTexture(const char * textureName, Interpolation interpolation, const float * values) { - return getImplGeneric()->add3DTexture(textureName, samplerName, edgelen, interpolation, values); + return getImplGeneric()->add3DTexture(textureName, samplerName, edgelen, interpolation, values) + + getTextureBindingStart(); } void GenericGpuShaderDesc::get3DTexture(unsigned index, @@ -591,6 +634,11 @@ void GenericGpuShaderDesc::get3DTextureValues(unsigned index, const float *& val getImplGeneric()->get3DTextureValues(index, values); } +unsigned GenericGpuShaderDesc::get3DTextureShaderBindingIndex(unsigned index) const +{ + return getImplGeneric()->get3DTextureShaderBindingIndex(index) + getTextureBindingStart(); +} + void GenericGpuShaderDesc::Deleter(GenericGpuShaderDesc* c) { delete c; diff --git a/src/OpenColorIO/GpuShader.h b/src/OpenColorIO/GpuShader.h index 8b099cc12f..174d346e34 100644 --- a/src/OpenColorIO/GpuShader.h +++ b/src/OpenColorIO/GpuShader.h @@ -67,6 +67,7 @@ class GenericGpuShaderDesc : public GpuShaderDesc TextureDimensions & dimensions, Interpolation & interpolation) const override; void getTextureValues(unsigned index, const float *& values) const override; + unsigned getTextureShaderBindingIndex(unsigned index) const override; // Accessors to the 3D textures built from 3D LUT // @@ -82,6 +83,7 @@ class GenericGpuShaderDesc : public GpuShaderDesc unsigned & edgelen, Interpolation & interpolation) const override; void get3DTextureValues(unsigned index, const float *& value) const override; + unsigned get3DTextureShaderBindingIndex(unsigned index) const override; private: diff --git a/src/OpenColorIO/GpuShaderDesc.cpp b/src/OpenColorIO/GpuShaderDesc.cpp index ffa9be7407..574a7c3594 100644 --- a/src/OpenColorIO/GpuShaderDesc.cpp +++ b/src/OpenColorIO/GpuShaderDesc.cpp @@ -181,8 +181,10 @@ void GpuShaderCreator::setDescriptorSetIndex(unsigned index, unsigned textureBin { throw Exception("Texture binding start index must be greater than 0."); } + AutoMutex lock(getImpl()->m_cacheIDMutex); getImpl()->m_descriptorSetIndex = index; getImpl()->m_textureBindingStart = textureBindingStart; + getImpl()->m_cacheID.clear(); } unsigned GpuShaderCreator::getDescriptorSetIndex() const noexcept @@ -270,6 +272,8 @@ const char * GpuShaderCreator::getCacheID() const noexcept os << getImpl()->m_resourcePrefix << " "; os << getImpl()->m_pixelName << " "; os << getImpl()->m_numResources << " "; + os << getImpl()->m_descriptorSetIndex << " "; + os << getImpl()->m_textureBindingStart << " "; os << getImpl()->m_shaderCodeID; getImpl()->m_cacheID = os.str(); } diff --git a/src/OpenColorIO/GpuShaderUtils.cpp b/src/OpenColorIO/GpuShaderUtils.cpp index 6b32c01cf1..fa1ca43fb2 100644 --- a/src/OpenColorIO/GpuShaderUtils.cpp +++ b/src/OpenColorIO/GpuShaderUtils.cpp @@ -845,11 +845,11 @@ std::string GpuShaderText::getSamplerName(const std::string& textureName) void GpuShaderText::declareTex1D(const std::string & textureName, unsigned descriptorSetIndex, - unsigned textureIndex, unsigned textureBindingStart) + unsigned textureIndex) { std::string textureDecl, samplerDecl; getTexDecl<1>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl, - descriptorSetIndex, textureIndex + textureBindingStart); + descriptorSetIndex, textureIndex); if (!textureDecl.empty()) { @@ -864,11 +864,11 @@ void GpuShaderText::declareTex1D(const std::string & textureName, void GpuShaderText::declareTex2D(const std::string & textureName, unsigned descriptorSetIndex, - unsigned textureIndex, unsigned textureBindingStart) + unsigned textureIndex) { std::string textureDecl, samplerDecl; getTexDecl<2>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl, - descriptorSetIndex, textureIndex + textureBindingStart); + descriptorSetIndex, textureIndex); if (!textureDecl.empty()) { @@ -883,11 +883,11 @@ void GpuShaderText::declareTex2D(const std::string & textureName, void GpuShaderText::declareTex3D(const std::string& textureName, unsigned descriptorSetIndex, - unsigned textureIndex, unsigned textureBindingStart) + unsigned textureIndex) { std::string textureDecl, samplerDecl; getTexDecl<3>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl, - descriptorSetIndex, textureIndex + textureBindingStart); + descriptorSetIndex, textureIndex); if (!textureDecl.empty()) { diff --git a/src/OpenColorIO/GpuShaderUtils.h b/src/OpenColorIO/GpuShaderUtils.h index 72ef1c670d..0b081acba9 100644 --- a/src/OpenColorIO/GpuShaderUtils.h +++ b/src/OpenColorIO/GpuShaderUtils.h @@ -171,11 +171,11 @@ class GpuShaderText static std::string getSamplerName(const std::string& textureName); // Declare the global texture and sampler information for a 1D texture. - void declareTex1D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex, unsigned textureBindingStart); + void declareTex1D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex); // Declare the global texture and sampler information for a 2D texture. - void declareTex2D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex, unsigned textureBindingStart); + void declareTex2D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex); // Declare the global texture and sampler information for a 3D texture. - void declareTex3D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex, unsigned textureBindingStart); + void declareTex3D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex); // Get the texture lookup call for a 1D texture. std::string sampleTex1D(const std::string& textureName, const std::string& coords) const; diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp index 0ead67f67c..6f3070d557 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp @@ -507,7 +507,7 @@ std::string _Add_Reach_table( unsigned resourceIndex, const ACES2::Table1D & table) { - // Reserve name + // Reserve name. std::ostringstream resName; resName << shaderCreator->getResourcePrefix() << std::string("_") @@ -518,7 +518,7 @@ std::string _Add_Reach_table( std::string name(resName.str()); StringUtils::ReplaceInPlace(name, "__", "_"); - // Register texture + // Determine texture dimensions. GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; if (shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_1_0 || shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_3_0 @@ -527,31 +527,35 @@ std::string _Add_Reach_table( dimensions = GpuShaderDesc::TEXTURE_2D; } - const unsigned textureIndex = shaderCreator->addTexture( - name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - table.total_size, - 1, - GpuShaderCreator::TEXTURE_RED_CHANNEL, - dimensions, - INTERP_NEAREST, - &(table[0])); - + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + table.total_size, + 1, + GpuShaderCreator::TEXTURE_RED_CHANNEL, + dimensions, + INTERP_NEAREST, + &(table[0]) + ); + // Create the texture declaration. if (dimensions == GpuShaderDesc::TEXTURE_1D) { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } else { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } - // Sampler function + // Sampler function. GpuShaderText ss(shaderCreator->getLanguage()); ss.newLine() << ss.floatKeyword() << " " << name << "_sample(float h)"; @@ -805,7 +809,7 @@ std::string _Add_Cusp_table( unsigned resourceIndex, const ACES2::GamutCompressParams & g) { - // Reserve name + // Reserve name. std::ostringstream resName; resName << shaderCreator->getResourcePrefix() << std::string("_") @@ -816,7 +820,7 @@ std::string _Add_Cusp_table( std::string name(resName.str()); StringUtils::ReplaceInPlace(name, "__", "_"); - // Register texture + // Determine texture dimensions. GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; if (shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_1_0 || shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_3_0 @@ -825,30 +829,35 @@ std::string _Add_Cusp_table( dimensions = GpuShaderDesc::TEXTURE_2D; } - const unsigned textureIndex = shaderCreator->addTexture( - name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - g.gamut_cusp_table.total_size, - 1, - GpuShaderCreator::TEXTURE_RGB_CHANNEL, - dimensions, - INTERP_NEAREST, - &(g.gamut_cusp_table[0][0])); + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + g.gamut_cusp_table.total_size, + 1, + GpuShaderCreator::TEXTURE_RGB_CHANNEL, + dimensions, + INTERP_NEAREST, + &(g.gamut_cusp_table[0][0]) + ); + // Create the texture declaration. if (dimensions == GpuShaderDesc::TEXTURE_1D) { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } else { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } - // Sampler function + // Sampler function. GpuShaderText ss(shaderCreator->getLanguage()); const std::string hues_array_name = name + "_hues_array"; diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp index 573496d653..f901859800 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp @@ -198,16 +198,18 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, dimensions = GpuShaderDesc::TEXTURE_2D; } - // (Using CacheID here to potentially allow reuse of existing textures.) - const unsigned textureIndex = shaderCreator->addTexture(name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - width, - height, - singleChannel ? GpuShaderCreator::TEXTURE_RED_CHANNEL - : GpuShaderCreator::TEXTURE_RGB_CHANNEL, - dimensions, - lutData->getConcreteInterpolation(), - &values[0]); + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + width, + height, + singleChannel ? GpuShaderCreator::TEXTURE_RED_CHANNEL + : GpuShaderCreator::TEXTURE_RGB_CHANNEL, + dimensions, + lutData->getConcreteInterpolation(), + &values[0] + ); // Add the LUT code to the OCIO shader program. @@ -217,12 +219,14 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, // or the language doesn't support 1D textures, // a 2D texture is used. + // Create a 2D texture declaration. { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } - + // Create the helper function to deal with 2D array lookups. { GpuShaderText ss(shaderCreator->getLanguage()); @@ -302,8 +306,10 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, } else { + // Create a 1D texture declaration. GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp index 01423f6973..e81bd180b7 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp @@ -38,16 +38,22 @@ void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DO { samplerInterpolation = INTERP_NEAREST; } - // (Using CacheID here to potentially allow reuse of existing textures.) - const unsigned textureIndex = shaderCreator->add3DTexture(name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - lutData->getGridSize(), - samplerInterpolation, - &lutData->getArray()[0]); + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->add3DTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + lutData->getGridSize(), + samplerInterpolation, + &lutData->getArray()[0] + ); + + // Create the texture declaration. { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex3D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex3D(name, + shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } diff --git a/src/bindings/python/PyGpuShaderDesc.cpp b/src/bindings/python/PyGpuShaderDesc.cpp index e6c9b600fc..a43f1f3c80 100644 --- a/src/bindings/python/PyGpuShaderDesc.cpp +++ b/src/bindings/python/PyGpuShaderDesc.cpp @@ -29,6 +29,7 @@ struct Texture GpuShaderDesc::TextureType m_channel; GpuShaderDesc::TextureDimensions m_dimensions; Interpolation m_interpolation; + unsigned m_textureShaderBindingIndex; GpuShaderDescRcPtr m_shaderDesc; int m_index; }; @@ -39,6 +40,7 @@ struct Texture3D std::string m_samplerName; unsigned m_edgelen; Interpolation m_interpolation; + unsigned m_textureShaderBindingIndex; GpuShaderDescRcPtr m_shaderDesc; int m_index; }; @@ -140,13 +142,13 @@ void bindPyGpuShaderDesc(py::module & m) py::gil_scoped_release release; - self->addTexture(textureName.c_str(), - samplerName.c_str(), - width, height, - channel, - dimensions, - interpolation, - static_cast(info.ptr)); + return self->addTexture(textureName.c_str(), + samplerName.c_str(), + width, height, + channel, + dimensions, + interpolation, + static_cast(info.ptr)); }, "textureName"_a, "samplerName"_a, "width"_a, "height"_a, "channel"_a, "dimensions"_a, "interpolation"_a, "values"_a, @@ -171,11 +173,11 @@ void bindPyGpuShaderDesc(py::module & m) py::gil_scoped_release release; - self->add3DTexture(textureName.c_str(), - samplerName.c_str(), - edgelen, - interpolation, - static_cast(info.ptr)); + return self->add3DTexture(textureName.c_str(), + samplerName.c_str(), + edgelen, + interpolation, + static_cast(info.ptr)); }, "textureName"_a, "samplerName"_a, "edgeLen"_a, "interpolation"_a, "values"_a, DOC(GpuShaderCreator, add3DTexture)) @@ -253,6 +255,7 @@ void bindPyGpuShaderDesc(py::module & m) .def_readonly("channel", &Texture::m_channel) .def_readonly("dimensions", &Texture::m_dimensions) .def_readonly("interpolation", &Texture::m_interpolation) + .def_readonly("textureShaderBindingIndex", &Texture::m_textureShaderBindingIndex) .def("getValues", [](Texture & self) { py::gil_scoped_release release; @@ -297,9 +300,10 @@ void bindPyGpuShaderDesc(py::module & m) Interpolation interpolation; it.m_obj->getTexture(i, textureName, samplerName, width, height, channel, dimensions, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->getTextureShaderBindingIndex(i); return { textureName, samplerName, width, height, channel, dimensions, interpolation, - it.m_obj, i}; + textureShaderBindingIndex, it.m_obj, i}; }) .def("__iter__", [](TextureIterator & it) -> TextureIterator & { @@ -317,9 +321,10 @@ void bindPyGpuShaderDesc(py::module & m) Interpolation interpolation; it.m_obj->getTexture(i, textureName, samplerName, width, height, channel, dimensions, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->getTextureShaderBindingIndex(i); return { textureName, samplerName, width, height, channel, dimensions, interpolation, - it.m_obj, i}; + textureShaderBindingIndex, it.m_obj, i}; }); clsTexture3D @@ -327,6 +332,7 @@ void bindPyGpuShaderDesc(py::module & m) .def_readonly("samplerName", &Texture3D::m_samplerName) .def_readonly("edgeLen", &Texture3D::m_edgelen) .def_readonly("interpolation", &Texture3D::m_interpolation) + .def_readonly("textureShaderBindingIndex", &Texture3D::m_textureShaderBindingIndex) .def("getValues", [](Texture3D & self) { py::gil_scoped_release release; @@ -355,8 +361,10 @@ void bindPyGpuShaderDesc(py::module & m) unsigned edgelen; Interpolation interpolation; it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->get3DTextureShaderBindingIndex(i); - return { textureName, samplerName, edgelen, interpolation, it.m_obj, i }; + return { textureName, samplerName, edgelen, interpolation, textureShaderBindingIndex, + it.m_obj, i }; }) .def("__iter__", [](Texture3DIterator & it) -> Texture3DIterator & { @@ -371,8 +379,10 @@ void bindPyGpuShaderDesc(py::module & m) unsigned edgelen; Interpolation interpolation; it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->get3DTextureShaderBindingIndex(i); - return { textureName, samplerName, edgelen, interpolation, it.m_obj, i }; + return { textureName, samplerName, edgelen, interpolation, textureShaderBindingIndex, + it.m_obj, i }; }); } diff --git a/tests/cpu/GpuShader_tests.cpp b/tests/cpu/GpuShader_tests.cpp index 569358239b..eb2bc09dc8 100644 --- a/tests/cpu/GpuShader_tests.cpp +++ b/tests/cpu/GpuShader_tests.cpp @@ -36,7 +36,7 @@ OCIO_ADD_TEST(GpuShader, generic_shader) OCIO_CHECK_NO_THROW(shaderDesc->finalize()); const std::string id(shaderDesc->getCacheID()); - OCIO_CHECK_EQUAL(id, std::string("glsl_1.3 1sd234_ res_1sd234_ pxl_1sd234_ 0 " + OCIO_CHECK_EQUAL(id, std::string("glsl_1.3 1sd234_ res_1sd234_ pxl_1sd234_ 0 0 1 " "6001c324468d497f99aa06d3014798d8")); OCIO_CHECK_NO_THROW(shaderDesc->setResourcePrefix("res_1")); OCIO_CHECK_NO_THROW(shaderDesc->finalize()); @@ -53,15 +53,18 @@ OCIO_ADD_TEST(GpuShader, generic_shader) 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f }; OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 0U); - OCIO_CHECK_NO_THROW(shaderDesc->addTexture("lut1", - "lut1Sampler", - width, height, - OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, - OCIO::GpuShaderDesc::TEXTURE_2D, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); + unsigned textureShaderBindingIndex = 0U; + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->addTexture("lut1", "lut1Sampler", + width, height, + OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, + OCIO::GpuShaderDesc::TEXTURE_2D, + OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 1U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 1U); const char * textureName = nullptr; const char * samplerName = nullptr; @@ -98,13 +101,15 @@ OCIO_ADD_TEST(GpuShader, generic_shader) // Support several 1D LUTs - OCIO_CHECK_NO_THROW(shaderDesc->addTexture("lut2", "lut2Sampler", width, height, - OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, - d, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); - + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->addTexture("lut2", "lut2Sampler", + width, height, + OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, + d, OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 2U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 2U); OCIO_CHECK_NO_THROW(shaderDesc->getTextureValues(0, vals)); OCIO_CHECK_NO_THROW(shaderDesc->getTextureValues(1, vals)); @@ -121,11 +126,14 @@ OCIO_ADD_TEST(GpuShader, generic_shader) 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 0.7f, 0.8f, 0.9f, }; OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 0U); - OCIO_CHECK_NO_THROW(shaderDesc->add3DTexture("lut1", "lut1Sampler", edgelen, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); - + unsigned textureShaderBindingIndex = 0U; + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->add3DTexture("lut1", "lut1Sampler", edgelen, + OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 1U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 3U); const char * textureName = nullptr; const char * samplerName = nullptr; @@ -157,11 +165,13 @@ OCIO_ADD_TEST(GpuShader, generic_shader) // Supports several 3D LUTs - OCIO_CHECK_NO_THROW(shaderDesc->add3DTexture("lut1", "lut1Sampler", edgelen, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); - + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->add3DTexture("lut2", "lut2Sampler", edgelen, + OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 2U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 4U); // Check the 3D LUT limit @@ -1354,3 +1364,168 @@ float4 OCIOMain( OCIO_CHECK_EQUAL(expected, text); } + +OCIO_ADD_TEST(GpuShader, VulkanSupport) +{ + OCIO::ConfigRcPtr config = OCIO::Config::Create(); + auto ft = OCIO::FileTransform::Create(); + std::vector paths = { + std::string(OCIO::GetTestFilesDir()), + std::string("clf"), + std::string("lut1d_lut3d_lut1d.clf") + }; + const std::string filePath = pystring::os::path::normpath( + pystring::os::path::join(paths) + ); + ft->setSrc(filePath.c_str()); + + auto processor = config->getProcessor(ft); + auto gpuProcessor = processor->getOptimizedGPUProcessor(OCIO::OPTIMIZATION_NONE); + + auto shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); + OCIO_CHECK_NO_THROW(shaderDesc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_VK_4_6)); + OCIO_CHECK_NO_THROW(shaderDesc->setDescriptorSetIndex(2, 10)); + + gpuProcessor->extractGpuShaderInfo(shaderDesc); + + OCIO_CHECK_EQUAL(shaderDesc->getDescriptorSetIndex(), 2U); + OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 2U); + OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 1U); + + // Check Lut1D textures. + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned w = 0; + unsigned h = 0; + OCIO::GpuShaderDesc::TextureType t = OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL; + OCIO::GpuShaderDesc::TextureDimensions d = OCIO::GpuShaderDesc::TEXTURE_2D; + OCIO::Interpolation i = OCIO::INTERP_UNKNOWN; + + const unsigned index = 0; + OCIO_CHECK_NO_THROW(shaderDesc->getTexture(index, textureName, samplerName, w, h, t, d, i)); + + OCIO_CHECK_EQUAL(std::string(textureName), "ocio_lut1d_0"); + OCIO_CHECK_EQUAL(std::string(samplerName), "ocio_lut1d_0Sampler"); + OCIO_CHECK_EQUAL(w, 65); + OCIO_CHECK_EQUAL(h, 1); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL, t); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_1D, d); + OCIO_CHECK_EQUAL(OCIO::INTERP_LINEAR, i); + + OCIO_CHECK_EQUAL(shaderDesc->getTextureShaderBindingIndex(index), 10U); + } + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned w = 0; + unsigned h = 0; + OCIO::GpuShaderDesc::TextureType t = OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL; + OCIO::GpuShaderDesc::TextureDimensions d = OCIO::GpuShaderDesc::TEXTURE_1D; + OCIO::Interpolation i = OCIO::INTERP_UNKNOWN; + + const unsigned index = 1; + OCIO_CHECK_NO_THROW(shaderDesc->getTexture(index, textureName, samplerName, w, h, t, d, i)); + + OCIO_CHECK_EQUAL(std::string(textureName), "ocio_lut1d_2"); + OCIO_CHECK_EQUAL(std::string(samplerName), "ocio_lut1d_2Sampler"); + OCIO_CHECK_EQUAL(w, 4096); + OCIO_CHECK_EQUAL(h, 17); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL, t); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_2D, d); + OCIO_CHECK_EQUAL(OCIO::INTERP_LINEAR, i); + + OCIO_CHECK_EQUAL(shaderDesc->getTextureShaderBindingIndex(index), 12U); + } + // Check Lut3D textures. + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned edgelen = 0; + OCIO::Interpolation i = OCIO::INTERP_UNKNOWN; + + const unsigned index = 0; + OCIO_CHECK_NO_THROW(shaderDesc->get3DTexture(index, textureName, samplerName, edgelen, i)); + + OCIO_CHECK_EQUAL(std::string(textureName), "ocio_lut3d_1"); + OCIO_CHECK_EQUAL(std::string(samplerName), "ocio_lut3d_1Sampler"); + OCIO_CHECK_EQUAL(edgelen, 3); + OCIO_CHECK_EQUAL(OCIO::INTERP_LINEAR, i); + + OCIO_CHECK_EQUAL(shaderDesc->get3DTextureShaderBindingIndex(index), 11U); + } + + const std::string text(shaderDesc->getShaderText()); + + // Note that the binding index increments properly for the three LUTs. + + static constexpr char expected[] = { R"( +// Declaration of all textures + +layout(set=2, binding = 10) uniform sampler1D ocio_lut1d_0Sampler; +layout(set=2, binding = 11) uniform sampler3D ocio_lut3d_1Sampler; +layout(set=2, binding = 12) uniform sampler2D ocio_lut1d_2Sampler; + +// Declaration of all helper methods + +vec2 ocio_lut1d_2_computePos(float f) +{ + float dep; + float abs_f = abs(f); + if (abs_f > 6.10351562e-05) + { + vec3 fComp = vec3(15., 15., 15.); + float absarr = min( abs_f, 65504.); + fComp.x = floor( log2( absarr ) ); + float lower = pow( 2.0, fComp.x ); + fComp.y = ( absarr - lower ) / lower; + vec3 scale = vec3(1024., 1024., 1024.); + dep = dot( fComp, scale ); + } + else + { + dep = abs_f * 16777216.; + } + dep += (f < 0.) ? 32768.0 : 0.0; + vec2 retVal; + retVal.y = floor(dep / 4095.); + retVal.x = dep - retVal.y * 4095.; + retVal.x = (retVal.x + 0.5) / 4096.; + retVal.y = (retVal.y + 0.5) / 17.; + return retVal; +} + +// Declaration of the OCIO shader function + +vec4 OCIOMain(vec4 inPixel) +{ + vec4 outColor = inPixel; + + // Add LUT 1D processing for ocio_lut1d_0 + + { + vec3 ocio_lut1d_0_coords = (outColor.rgb * vec3(64., 64., 64.) + vec3(0.5, 0.5, 0.5) ) / vec3(65., 65., 65.); + outColor.r = texture(ocio_lut1d_0Sampler, ocio_lut1d_0_coords.r).r; + outColor.g = texture(ocio_lut1d_0Sampler, ocio_lut1d_0_coords.g).r; + outColor.b = texture(ocio_lut1d_0Sampler, ocio_lut1d_0_coords.b).r; + } + + // Add LUT 3D processing for ocio_lut3d_1 + + vec3 ocio_lut3d_1_coords = (outColor.zyx * vec3(2., 2., 2.) + vec3(0.5, 0.5, 0.5)) / vec3(3., 3., 3.); + outColor.rgb = texture(ocio_lut3d_1Sampler, ocio_lut3d_1_coords).rgb; + + // Add LUT 1D processing for ocio_lut1d_2 + + { + outColor.r = texture(ocio_lut1d_2Sampler, ocio_lut1d_2_computePos(outColor.r)).r; + outColor.g = texture(ocio_lut1d_2Sampler, ocio_lut1d_2_computePos(outColor.g)).r; + outColor.b = texture(ocio_lut1d_2Sampler, ocio_lut1d_2_computePos(outColor.b)).r; + } + + return outColor; +} +)" }; + + OCIO_CHECK_EQUAL(expected, text); +} diff --git a/tests/data/files/clf/lut1d_lut3d_lut1d.clf b/tests/data/files/clf/lut1d_lut3d_lut1d.clf new file mode 100644 index 0000000000..43d014dd8f --- /dev/null +++ b/tests/data/files/clf/lut1d_lut3d_lut1d.clf @@ -0,0 +1,65601 @@ + + + Lut1D + Lut3D + long Lut1D + Tests usage of 1D, 3D, and 2D GPU textures + + +-1023.75 -814.57901062 -609.35459116 -408.06413206 -210.69486002 -17.23383306 172.33206451 +358.01612748 539.83183532 717.79285803 891.91306235 1062.20651821 1228.68750559 1391.3705217 +1550.27028852 1705.40176087 1856.7801348 2004.42085656 2148.33963205 2288.55243686 2425.07552692 +2557.92544981 2687.11905684 2812.6735158 2934.60632479 3052.93532674 3167.6787252 3278.85510108 +3386.48343078 3490.58310562 3591.17395287 3688.27625839 3781.91079124 3872.09883039 3958.86219376 +4042.22326999 4122.20505311 4198.83118074 4272.12597606 4342.11449427 4408.8225741 4472.27689524 +4532.50504253 4589.53557817 4643.39812331 4694.12345067 4741.7435906 4786.29195292 4827.80346844 +4866.31475423 4901.86430878 4934.49274476 4964.24306987 4991.16103051 5015.295539 5036.69921448 +5055.42908327 5071.54750984 5085.12347624 5096.23441517 5104.96898507 5111.4316027 5115.75073242 +5118.09724648 5118.75 + + + + +-60 5 75 +-10 50 400 + 0 100 1200 + +-40 500 -30 +-80 400 500 +-20 300 900 + +-30 1500 -20 +-50 1023 100 +-10 800 300 + + +100 -5 -75 +200 -50 600 +300 100 1200 + +40 600 30 +380 400 400 +20 200 1100 + +530 1500 -50 +450 1230 500 +610 1800 300 + + +1660 -50 -100 +1510 150 200 +900 -40 900 + +1240 300 -50 +980 500 600 +820 400 800 + +1030 -100 -50 +1050 823 200 +1110 900 1200 + + + + +44646 +44637 +44634 +44631 +44629 +44627 +44626 +44624 +44623 +44622 +44621 +44619 +44618 +44617 +44616 +44615 +44614 +44614 +44613 +44612 +44611 +44610 +44609 +44609 +44608 +44607 +44607 +44606 +44605 +44605 +44604 +44603 +44603 +44602 +44601 +44601 +44600 +44600 +44599 +44599 +44598 +44598 +44597 +44596 +44596 +44595 +44595 +44594 +44594 +44593 +44593 +44592 +44592 +44592 +44591 +44591 +44590 +44590 +44589 +44589 +44588 +44588 +44588 +44587 +44587 +44586 +44586 +44585 +44585 +44585 +44584 +44584 +44583 +44583 +44583 +44582 +44582 +44582 +44581 +44581 +44580 +44580 +44580 +44579 +44579 +44579 +44578 +44578 +44577 +44577 +44577 +44576 +44576 +44576 +44575 +44575 +44575 +44574 +44574 +44574 +44573 +44573 +44573 +44572 +44572 +44572 +44571 +44571 +44571 +44571 +44570 +44570 +44570 +44569 +44569 +44569 +44568 +44568 +44568 +44567 +44567 +44567 +44567 +44566 +44566 +44566 +44565 +44565 +44565 +44565 +44564 +44564 +44564 +44563 +44563 +44563 +44563 +44562 +44562 +44562 +44561 +44561 +44561 +44561 +44560 +44560 +44560 +44560 +44559 +44559 +44559 +44559 +44558 +44558 +44558 +44557 +44557 +44557 +44557 +44556 +44556 +44556 +44556 +44555 +44555 +44555 +44555 +44554 +44554 +44554 +44554 +44553 +44553 +44553 +44553 +44553 +44552 +44552 +44552 +44552 +44551 +44551 +44551 +44551 +44550 +44550 +44550 +44550 +44549 +44549 +44549 +44549 +44549 +44548 +44548 +44548 +44548 +44547 +44547 +44547 +44547 +44546 +44546 +44546 +44546 +44546 +44545 +44545 +44545 +44545 +44544 +44544 +44544 +44544 +44544 +44543 +44543 +44543 +44543 +44543 +44542 +44542 +44542 +44542 +44541 +44541 +44541 +44541 +44541 +44540 +44540 +44540 +44540 +44540 +44539 +44539 +44539 +44539 +44539 +44538 +44538 +44538 +44538 +44538 +44537 +44537 +44537 +44537 +44537 +44536 +44536 +44536 +44536 +44536 +44535 +44535 +44535 +44535 +44535 +44534 +44534 +44534 +44534 +44534 +44533 +44533 +44533 +44533 +44533 +44532 +44532 +44532 +44532 +44532 +44532 +44531 +44531 +44531 +44531 +44531 +44530 +44530 +44530 +44530 +44530 +44529 +44529 +44529 +44529 +44529 +44529 +44528 +44528 +44528 +44528 +44528 +44527 +44527 +44527 +44527 +44527 +44527 +44526 +44526 +44526 +44526 +44526 +44525 +44525 +44525 +44525 +44525 +44525 +44524 +44524 +44524 +44524 +44524 +44524 +44523 +44523 +44523 +44523 +44523 +44523 +44522 +44522 +44522 +44522 +44522 +44521 +44521 +44521 +44521 +44521 +44521 +44520 +44520 +44520 +44520 +44520 +44520 +44519 +44519 +44519 +44519 +44519 +44519 +44518 +44518 +44518 +44518 +44518 +44518 +44517 +44517 +44517 +44517 +44517 +44517 +44516 +44516 +44516 +44516 +44516 +44516 +44516 +44515 +44515 +44515 +44515 +44515 +44515 +44514 +44514 +44514 +44514 +44514 +44514 +44513 +44513 +44513 +44513 +44513 +44513 +44513 +44512 +44512 +44512 +44512 +44512 +44512 +44511 +44511 +44511 +44511 +44511 +44511 +44510 +44510 +44510 +44510 +44510 +44510 +44510 +44509 +44509 +44509 +44509 +44509 +44509 +44509 +44508 +44508 +44508 +44508 +44508 +44508 +44507 +44507 +44507 +44507 +44507 +44507 +44507 +44506 +44506 +44506 +44506 +44506 +44506 +44506 +44505 +44505 +44505 +44505 +44505 +44505 +44505 +44504 +44504 +44504 +44504 +44504 +44504 +44503 +44503 +44503 +44503 +44503 +44503 +44503 +44502 +44502 +44502 +44502 +44502 +44502 +44502 +44501 +44501 +44501 +44501 +44501 +44501 +44501 +44500 +44500 +44500 +44500 +44500 +44500 +44500 +44500 +44499 +44499 +44499 +44499 +44499 +44499 +44499 +44498 +44498 +44498 +44498 +44498 +44498 +44498 +44497 +44497 +44497 +44497 +44497 +44497 +44497 +44496 +44496 +44496 +44496 +44496 +44496 +44496 +44496 +44495 +44495 +44495 +44495 +44495 +44495 +44495 +44494 +44494 +44494 +44494 +44494 +44494 +44494 +44494 +44493 +44493 +44493 +44493 +44493 +44493 +44493 +44492 +44492 +44492 +44492 +44492 +44492 +44492 +44492 +44491 +44491 +44491 +44491 +44491 +44491 +44491 +44490 +44490 +44490 +44490 +44490 +44490 +44490 +44490 +44489 +44489 +44489 +44489 +44489 +44489 +44489 +44489 +44488 +44488 +44488 +44488 +44488 +44488 +44488 +44488 +44487 +44487 +44487 +44487 +44487 +44487 +44487 +44487 +44486 +44486 +44486 +44486 +44486 +44486 +44486 +44486 +44485 +44485 +44485 +44485 +44485 +44485 +44485 +44485 +44484 +44484 +44484 +44484 +44484 +44484 +44484 +44484 +44483 +44483 +44483 +44483 +44483 +44483 +44483 +44483 +44482 +44482 +44482 +44482 +44482 +44482 +44482 +44482 +44481 +44481 +44481 +44481 +44481 +44481 +44481 +44481 +44480 +44480 +44480 +44480 +44480 +44480 +44480 +44480 +44480 +44479 +44479 +44479 +44479 +44479 +44479 +44479 +44479 +44478 +44478 +44478 +44478 +44478 +44478 +44478 +44478 +44478 +44477 +44477 +44477 +44477 +44477 +44477 +44477 +44477 +44476 +44476 +44476 +44476 +44476 +44476 +44476 +44476 +44476 +44475 +44475 +44475 +44475 +44475 +44475 +44475 +44475 +44474 +44474 +44474 +44474 +44474 +44474 +44474 +44474 +44474 +44473 +44473 +44473 +44473 +44473 +44473 +44473 +44473 +44473 +44472 +44472 +44472 +44472 +44472 +44472 +44472 +44472 +44472 +44471 +44471 +44471 +44471 +44471 +44471 +44471 +44471 +44471 +44470 +44470 +44470 +44470 +44470 +44470 +44470 +44470 +44469 +44469 +44469 +44469 +44469 +44469 +44469 +44469 +44469 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44467 +44467 +44467 +44467 +44467 +44467 +44467 +44467 +44467 +44466 +44466 +44466 +44466 +44466 +44466 +44466 +44466 +44466 +44465 +44465 +44465 +44465 +44465 +44465 +44465 +44465 +44465 +44464 +44464 +44464 +44464 +44464 +44464 +44464 +44464 +44464 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44462 +44462 +44462 +44462 +44462 +44462 +44462 +44462 +44462 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44460 +44460 +44460 +44460 +44460 +44460 +44460 +44460 +44460 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44456 +44456 +44456 +44456 +44456 +44456 +44456 +44456 +44456 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44362 +44362 +44362 +44362 +44362 +44362 +44362 +44362 +44362 +44361 +44361 +44361 +44361 +44361 +44361 +44361 +44361 +44360 +44360 +44360 +44360 +44360 +44360 +44360 +44360 +44359 +44359 +44359 +44359 +44359 +44359 +44359 +44359 +44359 +44358 +44358 +44358 +44358 +44358 +44358 +44358 +44358 +44357 +44357 +44357 +44357 +44357 +44357 +44357 +44357 +44356 +44356 +44356 +44356 +44356 +44356 +44356 +44356 +44355 +44355 +44355 +44355 +44355 +44355 +44355 +44355 +44354 +44354 +44354 +44354 +44354 +44354 +44354 +44354 +44354 +44353 +44353 +44353 +44353 +44353 +44353 +44353 +44353 +44352 +44352 +44352 +44352 +44352 +44352 +44352 +44352 +44351 +44351 +44351 +44351 +44351 +44351 +44351 +44351 +44351 +44350 +44350 +44350 +44350 +44350 +44350 +44350 +44350 +44349 +44349 +44349 +44349 +44349 +44349 +44349 +44349 +44349 +44348 +44348 +44348 +44348 +44348 +44348 +44348 +44348 +44347 +44347 +44347 +44347 +44347 +44347 +44347 +44347 +44347 +44346 +44346 +44346 +44346 +44346 +44346 +44346 +44346 +44345 +44345 +44345 +44345 +44345 +44345 +44345 +44345 +44345 +44344 +44344 +44344 +44344 +44344 +44344 +44344 +44344 +44344 +44343 +44343 +44343 +44343 +44343 +44343 +44343 +44343 +44342 +44342 +44342 +44342 +44342 +44342 +44342 +44342 +44342 +44341 +44341 +44341 +44341 +44341 +44341 +44341 +44341 +44341 +44340 +44340 +44340 +44340 +44340 +44340 +44340 +44340 +44340 +44339 +44339 +44339 +44339 +44339 +44339 +44339 +44339 +44338 +44338 +44338 +44338 +44338 +44338 +44338 +44338 +44338 +44337 +44337 +44337 +44337 +44337 +44337 +44337 +44337 +44337 +44336 +44336 +44336 +44336 +44336 +44336 +44336 +44336 +44336 +44335 +44335 +44335 +44335 +44335 +44335 +44335 +44335 +44335 +44334 +44334 +44334 +44334 +44334 +44334 +44334 +44334 +44334 +44333 +44333 +44333 +44333 +44333 +44333 +44333 +44333 +44333 +44332 +44332 +44332 +44332 +44332 +44332 +44332 +44332 +44332 +44331 +44331 +44331 +44331 +44331 +44331 +44331 +44331 +44331 +44330 +44330 +44330 +44330 +44330 +44330 +44330 +44330 +44330 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44328 +44328 +44328 +44328 +44328 +44328 +44328 +44328 +44328 +44327 +44327 +44327 +44327 +44327 +44327 +44327 +44327 +44327 +44326 +44326 +44326 +44326 +44326 +44326 +44326 +44326 +44326 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44324 +44324 +44324 +44324 +44324 +44324 +44324 +44324 +44324 +44323 +44323 +44323 +44323 +44323 +44323 +44323 +44323 +44323 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44321 +44321 +44321 +44321 +44321 +44321 +44321 +44321 +44321 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44319 +44319 +44319 +44319 +44319 +44319 +44319 +44319 +44319 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44317 +44317 +44317 +44317 +44317 +44317 +44317 +44317 +44317 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44314 +44314 +44314 +44314 +44314 +44314 +44314 +44314 +44314 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44308 +44308 +44308 +44308 +44308 +44308 +44308 +44308 +44308 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44258 +44258 +44258 +44258 +44258 +44258 +44258 +44257 +44257 +44257 +44257 +44257 +44257 +44256 +44256 +44256 +44256 +44256 +44255 +44255 +44255 +44255 +44255 +44255 +44254 +44254 +44254 +44254 +44254 +44254 +44253 +44253 +44253 +44253 +44253 +44253 +44252 +44252 +44252 +44252 +44252 +44252 +44251 +44251 +44251 +44251 +44251 +44251 +44250 +44250 +44250 +44250 +44250 +44250 +44249 +44249 +44249 +44249 +44249 +44249 +44248 +44248 +44248 +44248 +44248 +44248 +44247 +44247 +44247 +44247 +44247 +44247 +44246 +44246 +44246 +44246 +44246 +44246 +44246 +44245 +44245 +44245 +44245 +44245 +44245 +44244 +44244 +44244 +44244 +44244 +44244 +44243 +44243 +44243 +44243 +44243 +44243 +44242 +44242 +44242 +44242 +44242 +44242 +44241 +44241 +44241 +44241 +44241 +44241 +44240 +44240 +44240 +44240 +44240 +44240 +44240 +44239 +44239 +44239 +44239 +44239 +44239 +44238 +44238 +44238 +44238 +44238 +44238 +44237 +44237 +44237 +44237 +44237 +44237 +44236 +44236 +44236 +44236 +44236 +44236 +44236 +44235 +44235 +44235 +44235 +44235 +44235 +44234 +44234 +44234 +44234 +44234 +44234 +44233 +44233 +44233 +44233 +44233 +44233 +44232 +44232 +44232 +44232 +44232 +44232 +44232 +44231 +44231 +44231 +44231 +44231 +44231 +44230 +44230 +44230 +44230 +44230 +44230 +44230 +44229 +44229 +44229 +44229 +44229 +44229 +44228 +44228 +44228 +44228 +44228 +44228 +44227 +44227 +44227 +44227 +44227 +44227 +44227 +44226 +44226 +44226 +44226 +44226 +44226 +44225 +44225 +44225 +44225 +44225 +44225 +44225 +44224 +44224 +44224 +44224 +44224 +44224 +44223 +44223 +44223 +44223 +44223 +44223 +44223 +44222 +44222 +44222 +44222 +44222 +44222 +44221 +44221 +44221 +44221 +44221 +44221 +44221 +44220 +44220 +44220 +44220 +44220 +44220 +44220 +44219 +44219 +44219 +44219 +44219 +44219 +44218 +44218 +44218 +44218 +44218 +44218 +44218 +44217 +44217 +44217 +44217 +44217 +44217 +44216 +44216 +44216 +44216 +44216 +44216 +44216 +44215 +44215 +44215 +44215 +44215 +44215 +44215 +44214 +44214 +44214 +44214 +44214 +44214 +44213 +44213 +44213 +44213 +44213 +44213 +44213 +44212 +44212 +44212 +44212 +44212 +44212 +44212 +44211 +44211 +44211 +44211 +44211 +44211 +44211 +44210 +44210 +44210 +44210 +44210 +44210 +44209 +44209 +44209 +44209 +44209 +44209 +44209 +44208 +44208 +44208 +44208 +44208 +44208 +44208 +44207 +44207 +44207 +44207 +44207 +44207 +44207 +44206 +44206 +44206 +44206 +44206 +44206 +44206 +44205 +44205 +44205 +44205 +44205 +44205 +44205 +44204 +44204 +44204 +44204 +44204 +44204 +44203 +44203 +44203 +44203 +44203 +44203 +44203 +44202 +44202 +44202 +44202 +44202 +44202 +44202 +44201 +44201 +44201 +44201 +44201 +44201 +44201 +44200 +44200 +44200 +44200 +44200 +44200 +44200 +44199 +44199 +44199 +44199 +44199 +44199 +44199 +44198 +44198 +44198 +44198 +44198 +44198 +44198 +44197 +44197 +44197 +44197 +44197 +44197 +44197 +44196 +44196 +44196 +44196 +44196 +44196 +44196 +44195 +44195 +44195 +44195 +44195 +44195 +44195 +44194 +44194 +44194 +44194 +44194 +44194 +44194 +44193 +44193 +44193 +44193 +44193 +44193 +44193 +44192 +44192 +44192 +44192 +44192 +44192 +44192 +44192 +44191 +44191 +44191 +44191 +44191 +44191 +44191 +44190 +44190 +44190 +44190 +44190 +44190 +44190 +44189 +44189 +44189 +44189 +44189 +44189 +44189 +44188 +44188 +44188 +44188 +44188 +44188 +44188 +44187 +44187 +44187 +44187 +44187 +44187 +44187 +44186 +44186 +44186 +44186 +44186 +44186 +44186 +44186 +44185 +44185 +44185 +44185 +44185 +44185 +44185 +44184 +44184 +44184 +44184 +44184 +44184 +44184 +44183 +44183 +44183 +44183 +44183 +44183 +44183 +44182 +44182 +44182 +44182 +44182 +44182 +44182 +44182 +44181 +44181 +44181 +44181 +44181 +44181 +44181 +44180 +44180 +44180 +44180 +44180 +44180 +44180 +44179 +44179 +44179 +44179 +44179 +44179 +44179 +44179 +44178 +44178 +44178 +44178 +44178 +44178 +44178 +44177 +44177 +44177 +44177 +44177 +44177 +44177 +44177 +44176 +44176 +44176 +44176 +44176 +44176 +44176 +44175 +44175 +44175 +44175 +44175 +44175 +44175 +44174 +44174 +44174 +44174 +44174 +44174 +44174 +44174 +44173 +44173 +44173 +44173 +44173 +44173 +44173 +44172 +44172 +44172 +44172 +44172 +44172 +44172 +44172 +44171 +44171 +44171 +44171 +44171 +44171 +44171 +44170 +44170 +44170 +44170 +44170 +44170 +44170 +44170 +44169 +44169 +44169 +44169 +44169 +44169 +44169 +44168 +44168 +44168 +44168 +44168 +44168 +44168 +44168 +44167 +44167 +44167 +44167 +44167 +44167 +44167 +44167 +44166 +44166 +44166 +44166 +44166 +44166 +44166 +44165 +44165 +44165 +44165 +44165 +44165 +44165 +44165 +44164 +44164 +44164 +44164 +44164 +44164 +44164 +44163 +44163 +44163 +44163 +44163 +44163 +44163 +44163 +44162 +44162 +44162 +44162 +44162 +44162 +44162 +44162 +44161 +44161 +44161 +44161 +44161 +44161 +44161 +44161 +44160 +44160 +44160 +44160 +44160 +44160 +44160 +44159 +44159 +44159 +44159 +44159 +44159 +44159 +44159 +44158 +44158 +44158 +44158 +44158 +44158 +44158 +44158 +44157 +44157 +44157 +44157 +44157 +44157 +44157 +44157 +44156 +44156 +44156 +44156 +44156 +44156 +44156 +44155 +44155 +44155 +44155 +44155 +44155 +44155 +44155 +44154 +44154 +44154 +44154 +44154 +44154 +44154 +44154 +44153 +44153 +44153 +44153 +44153 +44153 +44153 +44153 +44152 +44152 +44152 +44152 +44152 +44152 +44152 +44152 +44151 +44151 +44151 +44151 +44151 +44151 +44151 +44151 +44150 +44150 +44150 +44150 +44150 +44150 +44150 +44150 +44149 +44149 +44149 +44149 +44149 +44149 +44149 +44149 +44148 +44148 +44148 +44148 +44148 +44148 +44148 +44148 +44147 +44147 +44147 +44147 +44147 +44147 +44147 +44147 +44146 +44146 +44146 +44146 +44146 +44146 +44146 +44146 +44145 +44145 +44145 +44145 +44145 +44145 +44145 +44145 +44144 +44144 +44144 +44144 +44144 +44144 +44144 +44144 +44143 +44143 +44143 +44143 +44143 +44143 +44143 +44143 +44142 +44142 +44142 +44142 +44142 +44142 +44142 +44142 +44141 +44141 +44141 +44141 +44141 +44141 +44141 +44141 +44140 +44140 +44140 +44140 +44140 +44140 +44140 +44140 +44139 +44139 +44139 +44139 +44139 +44139 +44139 +44139 +44138 +44138 +44138 +44138 +44138 +44138 +44138 +44138 +44137 +44137 +44137 +44137 +44137 +44137 +44137 +44137 +44136 +44136 +44136 +44136 +44136 +44136 +44136 +44136 +44136 +44135 +44135 +44135 +44135 +44135 +44135 +44135 +44135 +44134 +44134 +44134 +44134 +44134 +44134 +44134 +44134 +44133 +44133 +44133 +44133 +44133 +44133 +44133 +44133 +44132 +44132 +44132 +44132 +44132 +44132 +44132 +44132 +44132 +44131 +44131 +44131 +44131 +44131 +44131 +44131 +44131 +44130 +44130 +44130 +44130 +44130 +44130 +44130 +44130 +44129 +44129 +44129 +44129 +44129 +44129 +44129 +44129 +44129 +44128 +44128 +44128 +44128 +44128 +44128 +44128 +44128 +44127 +44127 +44127 +44127 +44127 +44127 +44127 +44127 +44126 +44126 +44126 +44126 +44126 +44126 +44126 +44126 +44126 +44125 +44125 +44125 +44125 +44125 +44125 +44125 +44125 +44124 +44124 +44124 +44124 +44124 +44124 +44124 +44124 +44124 +44123 +44123 +44123 +44123 +44123 +44123 +44123 +44123 +44122 +44122 +44122 +44122 +44122 +44122 +44122 +44122 +44121 +44121 +44121 +44121 +44121 +44121 +44121 +44121 +44121 +44120 +44120 +44120 +44120 +44120 +44120 +44120 +44120 +44120 +44119 +44119 +44119 +44119 +44119 +44119 +44119 +44119 +44118 +44118 +44118 +44118 +44118 +44118 +44118 +44118 +44118 +44117 +44117 +44117 +44117 +44117 +44117 +44117 +44117 +44116 +44116 +44116 +44116 +44116 +44115 +44115 +44115 +44115 +44114 +44114 +44114 +44114 +44114 +44113 +44113 +44113 +44113 +44112 +44112 +44112 +44112 +44111 +44111 +44111 +44111 +44111 +44110 +44110 +44110 +44110 +44109 +44109 +44109 +44109 +44108 +44108 +44108 +44108 +44108 +44107 +44107 +44107 +44107 +44106 +44106 +44106 +44106 +44106 +44105 +44105 +44105 +44105 +44104 +44104 +44104 +44104 +44103 +44103 +44103 +44103 +44103 +44102 +44102 +44102 +44102 +44101 +44101 +44101 +44101 +44101 +44100 +44100 +44100 +44100 +44099 +44099 +44099 +44099 +44099 +44098 +44098 +44098 +44098 +44097 +44097 +44097 +44097 +44097 +44096 +44096 +44096 +44096 +44095 +44095 +44095 +44095 +44095 +44094 +44094 +44094 +44094 +44093 +44093 +44093 +44093 +44093 +44092 +44092 +44092 +44092 +44091 +44091 +44091 +44091 +44091 +44090 +44090 +44090 +44090 +44089 +44089 +44089 +44089 +44089 +44088 +44088 +44088 +44088 +44087 +44087 +44087 +44087 +44087 +44086 +44086 +44086 +44086 +44086 +44085 +44085 +44085 +44085 +44084 +44084 +44084 +44084 +44084 +44083 +44083 +44083 +44083 +44082 +44082 +44082 +44082 +44082 +44081 +44081 +44081 +44081 +44081 +44080 +44080 +44080 +44080 +44079 +44079 +44079 +44079 +44079 +44078 +44078 +44078 +44078 +44078 +44077 +44077 +44077 +44077 +44076 +44076 +44076 +44076 +44076 +44075 +44075 +44075 +44075 +44075 +44074 +44074 +44074 +44074 +44074 +44073 +44073 +44073 +44073 +44072 +44072 +44072 +44072 +44072 +44071 +44071 +44071 +44071 +44071 +44070 +44070 +44070 +44070 +44070 +44069 +44069 +44069 +44069 +44068 +44068 +44068 +44068 +44068 +44067 +44067 +44067 +44067 +44067 +44066 +44066 +44066 +44066 +44066 +44065 +44065 +44065 +44065 +44064 +44064 +44064 +44064 +44064 +44063 +44063 +44063 +44063 +44063 +44062 +44062 +44062 +44062 +44062 +44061 +44061 +44061 +44061 +44061 +44060 +44060 +44060 +44060 +44060 +44059 +44059 +44059 +44059 +44059 +44058 +44058 +44058 +44058 +44057 +44057 +44057 +44057 +44057 +44056 +44056 +44056 +44056 +44056 +44055 +44055 +44055 +44055 +44055 +44054 +44054 +44054 +44054 +44054 +44053 +44053 +44053 +44053 +44053 +44052 +44052 +44052 +44052 +44052 +44051 +44051 +44051 +44051 +44051 +44050 +44050 +44050 +44050 +44050 +44049 +44049 +44049 +44049 +44049 +44048 +44048 +44048 +44048 +44048 +44047 +44047 +44047 +44047 +44047 +44046 +44046 +44046 +44046 +44046 +44045 +44045 +44045 +44045 +44045 +44044 +44044 +44044 +44044 +44044 +44043 +44043 +44043 +44043 +44043 +44042 +44042 +44042 +44042 +44042 +44041 +44041 +44041 +44041 +44041 +44040 +44040 +44040 +44040 +44040 +44039 +44039 +44039 +44039 +44039 +44038 +44038 +44038 +44038 +44038 +44037 +44037 +44037 +44037 +44037 +44036 +44036 +44036 +44036 +44036 +44035 +44035 +44035 +44035 +44035 +44034 +44034 +44034 +44034 +44034 +44034 +44033 +44033 +44033 +44033 +44033 +44032 +44032 +44032 +44031 +44031 +44031 +44030 +44030 +44030 +44029 +44029 +44028 +44028 +44028 +44027 +44027 +44026 +44026 +44026 +44025 +44025 +44025 +44024 +44024 +44023 +44023 +44023 +44022 +44022 +44021 +44021 +44021 +44020 +44020 +44020 +44019 +44019 +44018 +44018 +44018 +44017 +44017 +44016 +44016 +44016 +44015 +44015 +44015 +44014 +44014 +44013 +44013 +44013 +44012 +44012 +44011 +44011 +44011 +44010 +44010 +44010 +44009 +44009 +44008 +44008 +44008 +44007 +44007 +44007 +44006 +44006 +44005 +44005 +44005 +44004 +44004 +44004 +44003 +44003 +44002 +44002 +44002 +44001 +44001 +44000 +44000 +44000 +43999 +43999 +43999 +43998 +43998 +43997 +43997 +43997 +43996 +43996 +43996 +43995 +43995 +43994 +43994 +43994 +43993 +43993 +43993 +43992 +43992 +43991 +43991 +43991 +43990 +43990 +43990 +43989 +43989 +43988 +43988 +43988 +43987 +43987 +43987 +43986 +43986 +43986 +43985 +43985 +43984 +43984 +43984 +43983 +43983 +43983 +43982 +43982 +43981 +43981 +43981 +43980 +43980 +43980 +43979 +43979 +43978 +43978 +43978 +43977 +43977 +43977 +43976 +43976 +43976 +43975 +43975 +43974 +43974 +43974 +43973 +43973 +43973 +43972 +43972 +43971 +43971 +43971 +43970 +43970 +43970 +43969 +43969 +43969 +43968 +43968 +43967 +43967 +43967 +43966 +43966 +43966 +43965 +43965 +43965 +43964 +43964 +43963 +43963 +43963 +43962 +43962 +43962 +43961 +43961 +43961 +43960 +43960 +43959 +43959 +43959 +43958 +43958 +43958 +43957 +43957 +43957 +43956 +43956 +43955 +43955 +43955 +43954 +43954 +43954 +43953 +43953 +43953 +43952 +43952 +43952 +43951 +43951 +43950 +43950 +43950 +43949 +43949 +43949 +43948 +43948 +43948 +43947 +43947 +43946 +43946 +43946 +43945 +43945 +43945 +43944 +43944 +43944 +43943 +43943 +43943 +43942 +43942 +43941 +43941 +43941 +43940 +43940 +43940 +43939 +43939 +43939 +43938 +43938 +43938 +43937 +43937 +43936 +43936 +43936 +43935 +43935 +43935 +43934 +43934 +43934 +43933 +43933 +43933 +43932 +43932 +43932 +43931 +43931 +43930 +43930 +43930 +43929 +43929 +43929 +43928 +43928 +43928 +43927 +43927 +43927 +43926 +43926 +43926 +43925 +43925 +43924 +43924 +43924 +43923 +43923 +43923 +43922 +43922 +43922 +43921 +43921 +43921 +43920 +43920 +43920 +43919 +43919 +43919 +43918 +43918 +43917 +43917 +43917 +43916 +43916 +43916 +43915 +43915 +43915 +43914 +43914 +43914 +43913 +43913 +43913 +43912 +43912 +43912 +43911 +43911 +43911 +43910 +43910 +43909 +43909 +43909 +43908 +43908 +43908 +43907 +43907 +43907 +43906 +43906 +43906 +43905 +43905 +43905 +43904 +43904 +43904 +43903 +43903 +43903 +43902 +43902 +43902 +43901 +43901 +43901 +43900 +43900 +43900 +43899 +43899 +43898 +43898 +43898 +43897 +43897 +43897 +43896 +43896 +43896 +43895 +43895 +43895 +43894 +43894 +43894 +43893 +43893 +43893 +43892 +43892 +43892 +43891 +43891 +43891 +43890 +43890 +43890 +43889 +43889 +43889 +43888 +43888 +43888 +43887 +43887 +43887 +43886 +43886 +43886 +43885 +43885 +43885 +43884 +43884 +43883 +43883 +43883 +43882 +43882 +43882 +43881 +43881 +43881 +43880 +43880 +43880 +43879 +43879 +43879 +43878 +43878 +43878 +43877 +43877 +43877 +43876 +43876 +43876 +43875 +43875 +43875 +43874 +43874 +43874 +43873 +43873 +43873 +43872 +43872 +43872 +43871 +43871 +43871 +43870 +43870 +43870 +43869 +43869 +43869 +43868 +43868 +43868 +43867 +43867 +43867 +43866 +43866 +43866 +43865 +43865 +43865 +43864 +43864 +43864 +43863 +43863 +43863 +43862 +43862 +43862 +43861 +43861 +43861 +43860 +43860 +43860 +43859 +43859 +43859 +43858 +43858 +43858 +43857 +43857 +43857 +43856 +43856 +43856 +43855 +43855 +43855 +43854 +43854 +43854 +43853 +43853 +43853 +43852 +43852 +43852 +43851 +43851 +43851 +43850 +43850 +43850 +43849 +43849 +43849 +43849 +43848 +43848 +43848 +43847 +43847 +43847 +43846 +43846 +43846 +43845 +43845 +43845 +43844 +43844 +43844 +43843 +43843 +43843 +43842 +43842 +43842 +43841 +43841 +43841 +43840 +43840 +43840 +43839 +43839 +43839 +43838 +43838 +43838 +43837 +43837 +43837 +43836 +43836 +43836 +43835 +43835 +43835 +43834 +43834 +43834 +43834 +43833 +43833 +43833 +43832 +43832 +43832 +43831 +43831 +43831 +43830 +43830 +43830 +43829 +43829 +43829 +43828 +43828 +43828 +43827 +43827 +43827 +43826 +43826 +43826 +43825 +43825 +43825 +43824 +43824 +43824 +43824 +43823 +43823 +43823 +43822 +43822 +43822 +43821 +43821 +43821 +43820 +43820 +43820 +43819 +43819 +43819 +43818 +43818 +43818 +43817 +43817 +43817 +43816 +43816 +43816 +43816 +43815 +43815 +43815 +43814 +43814 +43814 +43813 +43813 +43813 +43812 +43811 +43811 +43810 +43809 +43809 +43808 +43808 +43807 +43806 +43806 +43805 +43804 +43804 +43803 +43803 +43802 +43801 +43801 +43800 +43799 +43799 +43798 +43797 +43797 +43796 +43796 +43795 +43794 +43794 +43793 +43792 +43792 +43791 +43791 +43790 +43789 +43789 +43788 +43787 +43787 +43786 +43786 +43785 +43784 +43784 +43783 +43782 +43782 +43781 +43781 +43780 +43779 +43779 +43778 +43778 +43777 +43776 +43776 +43775 +43774 +43774 +43773 +43773 +43772 +43771 +43771 +43770 +43770 +43769 +43768 +43768 +43767 +43766 +43766 +43765 +43765 +43764 +43763 +43763 +43762 +43762 +43761 +43760 +43760 +43759 +43759 +43758 +43757 +43757 +43756 +43755 +43755 +43754 +43754 +43753 +43752 +43752 +43751 +43751 +43750 +43749 +43749 +43748 +43748 +43747 +43746 +43746 +43745 +43745 +43744 +43743 +43743 +43742 +43742 +43741 +43740 +43740 +43739 +43739 +43738 +43737 +43737 +43736 +43736 +43735 +43734 +43734 +43733 +43733 +43732 +43731 +43731 +43730 +43730 +43729 +43728 +43728 +43727 +43727 +43726 +43725 +43725 +43724 +43724 +43723 +43723 +43722 +43721 +43721 +43720 +43720 +43719 +43718 +43718 +43717 +43717 +43716 +43715 +43715 +43714 +43714 +43713 +43713 +43712 +43711 +43711 +43710 +43710 +43709 +43708 +43708 +43707 +43707 +43706 +43706 +43705 +43704 +43704 +43703 +43703 +43702 +43701 +43701 +43700 +43700 +43699 +43699 +43698 +43697 +43697 +43696 +43696 +43695 +43694 +43694 +43693 +43693 +43692 +43692 +43691 +43690 +43690 +43689 +43689 +43688 +43688 +43687 +43686 +43686 +43685 +43685 +43684 +43684 +43683 +43682 +43682 +43681 +43681 +43680 +43680 +43679 +43678 +43678 +43677 +43677 +43676 +43676 +43675 +43674 +43674 +43673 +43673 +43672 +43672 +43671 +43670 +43670 +43669 +43669 +43668 +43668 +43667 +43666 +43666 +43665 +43665 +43664 +43664 +43663 +43662 +43662 +43661 +43661 +43660 +43660 +43659 +43659 +43658 +43657 +43657 +43656 +43656 +43655 +43655 +43654 +43654 +43653 +43652 +43652 +43651 +43651 +43650 +43650 +43649 +43648 +43648 +43647 +43647 +43646 +43646 +43645 +43645 +43644 +43643 +43643 +43642 +43642 +43641 +43641 +43640 +43640 +43639 +43638 +43638 +43637 +43637 +43636 +43636 +43635 +43635 +43634 +43633 +43633 +43632 +43632 +43631 +43631 +43630 +43630 +43629 +43629 +43628 +43627 +43627 +43626 +43626 +43625 +43625 +43624 +43624 +43623 +43622 +43622 +43621 +43621 +43620 +43620 +43619 +43619 +43618 +43618 +43617 +43616 +43616 +43615 +43615 +43614 +43614 +43613 +43613 +43612 +43612 +43611 +43611 +43610 +43609 +43609 +43608 +43608 +43607 +43607 +43606 +43606 +43605 +43605 +43604 +43603 +43603 +43602 +43602 +43601 +43601 +43600 +43600 +43599 +43599 +43598 +43598 +43597 +43596 +43596 +43595 +43595 +43594 +43594 +43593 +43593 +43592 +43592 +43591 +43591 +43590 +43590 +43589 +43588 +43588 +43587 +43587 +43586 +43586 +43585 +43585 +43584 +43584 +43583 +43583 +43582 +43582 +43581 +43580 +43580 +43579 +43579 +43578 +43578 +43577 +43577 +43576 +43576 +43575 +43575 +43574 +43574 +43573 +43573 +43572 +43571 +43571 +43570 +43570 +43569 +43569 +43568 +43568 +43567 +43567 +43566 +43566 +43565 +43565 +43564 +43564 +43563 +43563 +43562 +43561 +43561 +43560 +43560 +43559 +43559 +43558 +43558 +43557 +43557 +43556 +43556 +43555 +43555 +43554 +43554 +43553 +43553 +43552 +43552 +43551 +43551 +43550 +43550 +43549 +43548 +43548 +43547 +43547 +43546 +43546 +43545 +43545 +43544 +43544 +43543 +43543 +43542 +43542 +43541 +43541 +43540 +43540 +43539 +43539 +43538 +43538 +43537 +43537 +43536 +43536 +43535 +43535 +43534 +43534 +43533 +43532 +43532 +43531 +43531 +43530 +43530 +43529 +43529 +43528 +43528 +43527 +43527 +43526 +43526 +43525 +43525 +43524 +43524 +43523 +43523 +43522 +43522 +43521 +43521 +43520 +43520 +43519 +43519 +43518 +43518 +43517 +43517 +43516 +43516 +43515 +43515 +43514 +43514 +43513 +43513 +43512 +43512 +43511 +43511 +43510 +43510 +43509 +43509 +43508 +43508 +43507 +43507 +43506 +43506 +43505 +43505 +43504 +43504 +43503 +43503 +43502 +43502 +43501 +43501 +43500 +43500 +43499 +43499 +43498 +43498 +43497 +43497 +43496 +43496 +43495 +43495 +43494 +43494 +43493 +43493 +43492 +43492 +43491 +43491 +43490 +43490 +43489 +43489 +43488 +43488 +43487 +43487 +43486 +43486 +43485 +43485 +43484 +43484 +43483 +43483 +43482 +43482 +43481 +43481 +43480 +43480 +43479 +43479 +43478 +43478 +43477 +43477 +43476 +43476 +43475 +43475 +43474 +43474 +43473 +43473 +43472 +43472 +43471 +43471 +43470 +43470 +43469 +43469 +43468 +43468 +43467 +43467 +43466 +43466 +43465 +43465 +43464 +43464 +43463 +43463 +43462 +43462 +43461 +43461 +43460 +43460 +43460 +43459 +43459 +43458 +43458 +43457 +43457 +43456 +43456 +43455 +43455 +43454 +43454 +43453 +43453 +43452 +43452 +43451 +43451 +43450 +43450 +43449 +43449 +43448 +43448 +43447 +43447 +43446 +43446 +43445 +43445 +43444 +43444 +43444 +43443 +43443 +43442 +43442 +43441 +43441 +43440 +43440 +43439 +43439 +43438 +43438 +43437 +43437 +43436 +43436 +43435 +43435 +43434 +43434 +43433 +43433 +43432 +43432 +43432 +43431 +43431 +43430 +43430 +43429 +43429 +43428 +43428 +43427 +43427 +43426 +43426 +43425 +43425 +43424 +43424 +43423 +43423 +43422 +43422 +43422 +43421 +43421 +43420 +43420 +43419 +43419 +43418 +43418 +43417 +43417 +43416 +43416 +43415 +43415 +43414 +43414 +43413 +43413 +43413 +43412 +43412 +43411 +43411 +43410 +43410 +43409 +43409 +43408 +43408 +43407 +43407 +43406 +43406 +43405 +43405 +43404 +43404 +43404 +43403 +43403 +43402 +43402 +43401 +43401 +43400 +43400 +43399 +43399 +43398 +43398 +43397 +43397 +43397 +43396 +43396 +43395 +43395 +43394 +43394 +43393 +43393 +43392 +43392 +43391 +43391 +43390 +43390 +43390 +43389 +43389 +43388 +43388 +43387 +43387 +43386 +43386 +43385 +43385 +43384 +43384 +43383 +43383 +43383 +43382 +43382 +43381 +43381 +43380 +43380 +43379 +43379 +43378 +43378 +43377 +43377 +43377 +43376 +43376 +43375 +43375 +43374 +43374 +43373 +43373 +43372 +43372 +43371 +43371 +43371 +43370 +43370 +43369 +43369 +43368 +43368 +43367 +43367 +43366 +43366 +43366 +43365 +43365 +43364 +43364 +43363 +43363 +43362 +43362 +43361 +43361 +43361 +43360 +43360 +43359 +43359 +43358 +43358 +43357 +43357 +43356 +43356 +43355 +43355 +43355 +43354 +43354 +43353 +43353 +43352 +43352 +43351 +43351 +43350 +43350 +43350 +43349 +43349 +43348 +43348 +43347 +43347 +43346 +43346 +43346 +43345 +43345 +43344 +43344 +43343 +43343 +43342 +43342 +43341 +43341 +43341 +43340 +43340 +43339 +43339 +43338 +43338 +43337 +43337 +43336 +43336 +43336 +43335 +43335 +43334 +43334 +43333 +43333 +43332 +43332 +43332 +43331 +43331 +43330 +43330 +43329 +43329 +43328 +43328 +43328 +43327 +43327 +43326 +43326 +43325 +43325 +43324 +43324 +43324 +43323 +43323 +43322 +43322 +43321 +43321 +43320 +43320 +43319 +43319 +43319 +43318 +43318 +43317 +43317 +43316 +43316 +43315 +43315 +43315 +43314 +43314 +43313 +43313 +43312 +43312 +43312 +43311 +43311 +43310 +43310 +43309 +43309 +43308 +43308 +43308 +43307 +43307 +43306 +43306 +43305 +43305 +43304 +43304 +43304 +43303 +43303 +43302 +43302 +43301 +43301 +43300 +43300 +43300 +43299 +43299 +43298 +43298 +43297 +43297 +43297 +43296 +43296 +43295 +43295 +43294 +43294 +43293 +43293 +43293 +43292 +43292 +43291 +43291 +43290 +43290 +43290 +43289 +43289 +43288 +43288 +43287 +43287 +43286 +43286 +43286 +43285 +43285 +43284 +43284 +43283 +43283 +43283 +43282 +43281 +43280 +43279 +43278 +43277 +43276 +43276 +43275 +43274 +43273 +43272 +43271 +43270 +43270 +43269 +43268 +43267 +43266 +43265 +43264 +43264 +43263 +43262 +43261 +43260 +43259 +43258 +43258 +43257 +43256 +43255 +43254 +43253 +43252 +43252 +43251 +43250 +43249 +43248 +43247 +43246 +43246 +43245 +43244 +43243 +43242 +43241 +43241 +43240 +43239 +43238 +43237 +43236 +43235 +43235 +43234 +43233 +43232 +43231 +43230 +43230 +43229 +43228 +43227 +43226 +43225 +43224 +43224 +43223 +43222 +43221 +43220 +43219 +43219 +43218 +43217 +43216 +43215 +43214 +43214 +43213 +43212 +43211 +43210 +43209 +43209 +43208 +43207 +43206 +43205 +43204 +43204 +43203 +43202 +43201 +43200 +43200 +43199 +43198 +43197 +43196 +43195 +43195 +43194 +43193 +43192 +43191 +43190 +43190 +43189 +43188 +43187 +43186 +43186 +43185 +43184 +43183 +43182 +43181 +43181 +43180 +43179 +43178 +43177 +43177 +43176 +43175 +43174 +43173 +43172 +43172 +43171 +43170 +43169 +43168 +43168 +43167 +43166 +43165 +43164 +43164 +43163 +43162 +43161 +43160 +43159 +43159 +43158 +43157 +43156 +43155 +43155 +43154 +43153 +43152 +43151 +43151 +43150 +43149 +43148 +43147 +43147 +43146 +43145 +43144 +43143 +43143 +43142 +43141 +43140 +43139 +43139 +43138 +43137 +43136 +43135 +43135 +43134 +43133 +43132 +43131 +43131 +43130 +43129 +43128 +43127 +43127 +43126 +43125 +43124 +43124 +43123 +43122 +43121 +43120 +43120 +43119 +43118 +43117 +43116 +43116 +43115 +43114 +43113 +43112 +43112 +43111 +43110 +43109 +43109 +43108 +43107 +43106 +43105 +43105 +43104 +43103 +43102 +43102 +43101 +43100 +43099 +43098 +43098 +43097 +43096 +43095 +43094 +43094 +43093 +43092 +43091 +43091 +43090 +43089 +43088 +43087 +43087 +43086 +43085 +43084 +43084 +43083 +43082 +43081 +43081 +43080 +43079 +43078 +43077 +43077 +43076 +43075 +43074 +43074 +43073 +43072 +43071 +43071 +43070 +43069 +43068 +43067 +43067 +43066 +43065 +43064 +43064 +43063 +43062 +43061 +43061 +43060 +43059 +43058 +43058 +43057 +43056 +43055 +43054 +43054 +43053 +43052 +43051 +43051 +43050 +43049 +43048 +43048 +43047 +43046 +43045 +43045 +43044 +43043 +43042 +43042 +43041 +43040 +43039 +43039 +43038 +43037 +43036 +43036 +43035 +43034 +43033 +43033 +43032 +43031 +43030 +43030 +43029 +43028 +43027 +43027 +43026 +43025 +43024 +43024 +43023 +43022 +43021 +43021 +43020 +43019 +43018 +43018 +43017 +43016 +43015 +43015 +43014 +43013 +43012 +43012 +43011 +43010 +43009 +43009 +43008 +43006 +43005 +43003 +43002 +43000 +42999 +42997 +42996 +42995 +42993 +42992 +42990 +42989 +42987 +42986 +42984 +42983 +42981 +42980 +42978 +42977 +42975 +42974 +42972 +42971 +42969 +42968 +42967 +42965 +42964 +42962 +42961 +42959 +42958 +42956 +42955 +42953 +42952 +42950 +42949 +42948 +42946 +42945 +42943 +42942 +42940 +42939 +42937 +42936 +42934 +42933 +42931 +42930 +42929 +42927 +42926 +42924 +42923 +42921 +42920 +42918 +42917 +42916 +42914 +42913 +42911 +42910 +42908 +42907 +42905 +42904 +42903 +42901 +42900 +42898 +42897 +42895 +42894 +42892 +42891 +42890 +42888 +42887 +42885 +42884 +42882 +42881 +42880 +42878 +42877 +42875 +42874 +42872 +42871 +42870 +42868 +42867 +42865 +42864 +42862 +42861 +42860 +42858 +42857 +42855 +42854 +42852 +42851 +42850 +42848 +42847 +42845 +42844 +42842 +42841 +42840 +42838 +42837 +42835 +42834 +42833 +42831 +42830 +42828 +42827 +42825 +42824 +42823 +42821 +42820 +42818 +42817 +42816 +42814 +42813 +42811 +42810 +42809 +42807 +42806 +42804 +42803 +42802 +42800 +42799 +42797 +42796 +42794 +42793 +42792 +42790 +42789 +42787 +42786 +42785 +42783 +42782 +42781 +42779 +42778 +42776 +42775 +42774 +42772 +42771 +42769 +42768 +42767 +42765 +42764 +42762 +42761 +42760 +42758 +42757 +42755 +42754 +42753 +42751 +42750 +42749 +42747 +42746 +42744 +42743 +42742 +42740 +42739 +42737 +42736 +42735 +42733 +42732 +42731 +42729 +42728 +42726 +42725 +42724 +42722 +42721 +42720 +42718 +42717 +42715 +42714 +42713 +42711 +42710 +42709 +42707 +42706 +42704 +42703 +42702 +42700 +42699 +42698 +42696 +42695 +42693 +42692 +42691 +42689 +42688 +42687 +42685 +42684 +42683 +42681 +42680 +42679 +42677 +42676 +42674 +42673 +42672 +42670 +42669 +42668 +42666 +42665 +42664 +42662 +42661 +42659 +42658 +42657 +42655 +42654 +42653 +42651 +42650 +42649 +42647 +42646 +42645 +42643 +42642 +42641 +42639 +42638 +42637 +42635 +42634 +42633 +42631 +42630 +42628 +42627 +42626 +42624 +42623 +42622 +42620 +42619 +42618 +42616 +42615 +42614 +42612 +42611 +42610 +42608 +42607 +42606 +42604 +42603 +42602 +42600 +42599 +42598 +42596 +42595 +42594 +42592 +42591 +42590 +42588 +42587 +42586 +42584 +42583 +42582 +42580 +42579 +42578 +42576 +42575 +42574 +42572 +42571 +42570 +42568 +42567 +42566 +42564 +42563 +42562 +42561 +42559 +42558 +42557 +42555 +42554 +42553 +42551 +42550 +42549 +42547 +42546 +42545 +42543 +42542 +42541 +42539 +42538 +42537 +42535 +42534 +42533 +42532 +42530 +42529 +42528 +42526 +42525 +42524 +42522 +42521 +42520 +42518 +42517 +42516 +42515 +42513 +42512 +42511 +42509 +42508 +42507 +42505 +42504 +42503 +42501 +42500 +42499 +42498 +42496 +42495 +42494 +42492 +42491 +42490 +42488 +42487 +42486 +42485 +42483 +42482 +42481 +42479 +42478 +42477 +42476 +42474 +42473 +42472 +42470 +42469 +42468 +42466 +42465 +42464 +42463 +42461 +42460 +42459 +42457 +42456 +42455 +42454 +42452 +42451 +42450 +42448 +42447 +42446 +42445 +42443 +42442 +42441 +42439 +42438 +42437 +42436 +42434 +42433 +42432 +42430 +42429 +42428 +42427 +42425 +42424 +42423 +42422 +42420 +42419 +42418 +42416 +42415 +42414 +42413 +42411 +42410 +42409 +42408 +42406 +42405 +42404 +42402 +42401 +42400 +42399 +42397 +42396 +42395 +42394 +42392 +42391 +42390 +42388 +42387 +42386 +42385 +42383 +42382 +42381 +42380 +42378 +42377 +42376 +42375 +42373 +42372 +42371 +42369 +42368 +42367 +42366 +42364 +42363 +42362 +42361 +42359 +42358 +42357 +42356 +42354 +42353 +42352 +42351 +42349 +42348 +42347 +42346 +42344 +42343 +42342 +42341 +42339 +42338 +42337 +42336 +42334 +42333 +42332 +42331 +42329 +42328 +42327 +42326 +42324 +42323 +42322 +42321 +42319 +42318 +42317 +42316 +42314 +42313 +42312 +42311 +42309 +42308 +42307 +42306 +42304 +42303 +42302 +42301 +42299 +42298 +42297 +42296 +42294 +42293 +42292 +42291 +42290 +42288 +42287 +42286 +42285 +42283 +42282 +42281 +42280 +42278 +42277 +42276 +42275 +42273 +42272 +42271 +42270 +42269 +42267 +42266 +42265 +42264 +42262 +42261 +42260 +42259 +42257 +42256 +42255 +42254 +42253 +42251 +42250 +42249 +42248 +42246 +42245 +42244 +42243 +42242 +42240 +42239 +42238 +42237 +42235 +42234 +42233 +42232 +42231 +42229 +42228 +42227 +42226 +42224 +42223 +42222 +42221 +42220 +42218 +42217 +42216 +42215 +42213 +42212 +42211 +42210 +42209 +42207 +42206 +42205 +42204 +42203 +42201 +42200 +42199 +42198 +42196 +42195 +42194 +42193 +42192 +42190 +42189 +42188 +42187 +42186 +42184 +42183 +42182 +42181 +42180 +42178 +42177 +42176 +42175 +42173 +42172 +42171 +42170 +42169 +42167 +42166 +42165 +42164 +42163 +42161 +42160 +42159 +42158 +42157 +42155 +42154 +42153 +42152 +42151 +42149 +42148 +42147 +42146 +42145 +42143 +42142 +42141 +42140 +42139 +42137 +42136 +42135 +42134 +42133 +42132 +42130 +42129 +42128 +42127 +42126 +42124 +42123 +42122 +42121 +42120 +42118 +42117 +42116 +42115 +42114 +42112 +42111 +42110 +42109 +42107 +42104 +42102 +42099 +42097 +42095 +42092 +42090 +42088 +42085 +42083 +42080 +42078 +42076 +42073 +42071 +42069 +42066 +42064 +42062 +42059 +42057 +42055 +42052 +42050 +42048 +42045 +42043 +42041 +42038 +42036 +42034 +42031 +42029 +42027 +42024 +42022 +42020 +42017 +42015 +42013 +42010 +42008 +42006 +42003 +42001 +41999 +41996 +41994 +41992 +41989 +41987 +41985 +41981 +41976 +41972 +41967 +41962 +41958 +41953 +41949 +41944 +41939 +41935 +41930 +41926 +41921 +41916 +41912 +41907 +41903 +41898 +41894 +41889 +41884 +41880 +41875 +41871 +41866 +41862 +41857 +41853 +41848 +41843 +41839 +41834 +41830 +41825 +41821 +41816 +41812 +41807 +41803 +41798 +41794 +41789 +41784 +41780 +41775 +41771 +41766 +41762 +41757 +41753 +41748 +41744 +41739 +41735 +41730 +41726 +41721 +41717 +41712 +41708 +41703 +41699 +41695 +41690 +41686 +41681 +41677 +41672 +41668 +41663 +41659 +41654 +41650 +41645 +41641 +41637 +41632 +41628 +41623 +41619 +41614 +41610 +41605 +41601 +41597 +41592 +41588 +41583 +41579 +41574 +41570 +41566 +41561 +41557 +41552 +41548 +41544 +41539 +41535 +41530 +41526 +41522 +41517 +41513 +41508 +41504 +41500 +41495 +41491 +41486 +41482 +41478 +41473 +41469 +41465 +41460 +41456 +41452 +41447 +41443 +41438 +41434 +41430 +41425 +41421 +41417 +41412 +41408 +41404 +41399 +41395 +41391 +41386 +41382 +41378 +41373 +41369 +41365 +41360 +41356 +41352 +41347 +41343 +41339 +41334 +41330 +41326 +41322 +41317 +41313 +41309 +41304 +41300 +41296 +41292 +41287 +41283 +41279 +41274 +41270 +41266 +41262 +41257 +41253 +41249 +41244 +41240 +41236 +41232 +41227 +41223 +41219 +41215 +41210 +41206 +41202 +41198 +41193 +41189 +41185 +41181 +41176 +41172 +41168 +41164 +41159 +41155 +41151 +41147 +41143 +41138 +41134 +41130 +41126 +41121 +41117 +41113 +41109 +41105 +41100 +41096 +41092 +41088 +41084 +41079 +41075 +41071 +41067 +41063 +41058 +41054 +41050 +41046 +41042 +41038 +41033 +41029 +41025 +41021 +41017 +41012 +41008 +41004 +41000 +40996 +40992 +40988 +40983 +40979 +40975 +40971 +40967 +40963 +40957 +40949 +40940 +40932 +40924 +40916 +40907 +40899 +40891 +40882 +40874 +40866 +40858 +40849 +40841 +40833 +40825 +40816 +40808 +40800 +40792 +40784 +40775 +40767 +40759 +40751 +40743 +40734 +40726 +40718 +40710 +40702 +40693 +40685 +40677 +40669 +40661 +40653 +40644 +40636 +40628 +40620 +40612 +40604 +40595 +40587 +40579 +40571 +40563 +40555 +40547 +40539 +40530 +40522 +40514 +40506 +40498 +40490 +40482 +40474 +40466 +40458 +40449 +40441 +40433 +40425 +40417 +40409 +40401 +40393 +40385 +40377 +40369 +40361 +40353 +40345 +40337 +40329 +40321 +40313 +40305 +40296 +40288 +40280 +40272 +40264 +40256 +40248 +40240 +40232 +40224 +40216 +40208 +40200 +40192 +40185 +40177 +40169 +40161 +40153 +40145 +40137 +40129 +40121 +40113 +40105 +40097 +40089 +40081 +40073 +40065 +40057 +40049 +40041 +40034 +40026 +40018 +40010 +40002 +39994 +39986 +39978 +39970 +39962 +39954 +39947 +39939 +39926 +39910 +39894 +39878 +39863 +39847 +39831 +39815 +39800 +39784 +39768 +39753 +39737 +39721 +39706 +39690 +39674 +39659 +39643 +39627 +39612 +39596 +39580 +39565 +39549 +39534 +39518 +39502 +39487 +39471 +39456 +39440 +39424 +39409 +39393 +39378 +39362 +39347 +39331 +39316 +39300 +39285 +39269 +39254 +39238 +39223 +39207 +39192 +39176 +39161 +39145 +39130 +39114 +39099 +39083 +39068 +39052 +39037 +39022 +39006 +38991 +38975 +38960 +38945 +38929 +38914 +38885 +38854 +38823 +38793 +38762 +38731 +38701 +38670 +38639 +38609 +38578 +38547 +38517 +38486 +38455 +38425 +38394 +38364 +38333 +38303 +38272 +38242 +38211 +38181 +38150 +38120 +38089 +38059 +38028 +37998 +37967 +37937 +37907 +37864 +37804 +37743 +37682 +37621 +37561 +37500 +37440 +37379 +37318 +37258 +37197 +37137 +37076 +37016 +36955 +36895 +36805 +36684 +36563 +36443 +36322 +36201 +36081 +35960 +35840 +35599 +35358 +35117 +34877 +34456 +33975 +33494 +33014 + 234 + 715 + 1195 + 1675 + 2101 + 2341 + 2581 + 2820 + 3060 + 3186 + 3305 + 3425 + 3545 + 3664 + 3784 + 3903 + 4023 + 4119 + 4179 + 4238 + 4298 + 4358 + 4417 + 4477 + 4536 + 4596 + 4655 + 4715 + 4774 + 4834 + 4893 + 4953 + 5012 + 5071 + 5125 + 5155 + 5185 + 5214 + 5244 + 5274 + 5303 + 5333 + 5362 + 5392 + 5422 + 5451 + 5481 + 5510 + 5540 + 5569 + 5599 + 5628 + 5658 + 5687 + 5717 + 5746 + 5776 + 5805 + 5835 + 5864 + 5893 + 5923 + 5952 + 5982 + 6011 + 6040 + 6070 + 6099 + 6128 + 6151 + 6165 + 6180 + 6195 + 6209 + 6224 + 6239 + 6253 + 6268 + 6283 + 6297 + 6312 + 6326 + 6341 + 6356 + 6370 + 6385 + 6399 + 6414 + 6428 + 6443 + 6458 + 6472 + 6487 + 6501 + 6516 + 6530 + 6545 + 6559 + 6574 + 6588 + 6603 + 6617 + 6632 + 6646 + 6661 + 6675 + 6690 + 6704 + 6719 + 6733 + 6748 + 6762 + 6777 + 6791 + 6806 + 6820 + 6834 + 6849 + 6863 + 6878 + 6892 + 6907 + 6921 + 6935 + 6950 + 6964 + 6979 + 6993 + 7007 + 7022 + 7036 + 7050 + 7065 + 7079 + 7094 + 7108 + 7122 + 7137 + 7151 + 7165 + 7174 + 7181 + 7188 + 7195 + 7202 + 7210 + 7217 + 7224 + 7231 + 7238 + 7245 + 7252 + 7260 + 7267 + 7274 + 7281 + 7288 + 7295 + 7302 + 7309 + 7317 + 7324 + 7331 + 7338 + 7345 + 7352 + 7359 + 7366 + 7373 + 7380 + 7388 + 7395 + 7402 + 7409 + 7416 + 7423 + 7430 + 7437 + 7444 + 7451 + 7458 + 7465 + 7473 + 7480 + 7487 + 7494 + 7501 + 7508 + 7515 + 7522 + 7529 + 7536 + 7543 + 7550 + 7557 + 7564 + 7571 + 7578 + 7585 + 7592 + 7599 + 7606 + 7613 + 7620 + 7627 + 7634 + 7641 + 7649 + 7656 + 7663 + 7670 + 7677 + 7684 + 7691 + 7698 + 7705 + 7712 + 7719 + 7726 + 7732 + 7739 + 7746 + 7753 + 7760 + 7767 + 7774 + 7781 + 7788 + 7795 + 7802 + 7809 + 7816 + 7823 + 7830 + 7837 + 7844 + 7851 + 7858 + 7865 + 7872 + 7879 + 7886 + 7893 + 7900 + 7906 + 7913 + 7920 + 7927 + 7934 + 7941 + 7948 + 7955 + 7962 + 7969 + 7976 + 7983 + 7990 + 7996 + 8003 + 8010 + 8017 + 8024 + 8031 + 8038 + 8045 + 8052 + 8058 + 8065 + 8072 + 8079 + 8086 + 8093 + 8100 + 8107 + 8114 + 8120 + 8127 + 8134 + 8141 + 8148 + 8155 + 8162 + 8168 + 8175 + 8182 + 8189 + 8194 + 8197 + 8201 + 8204 + 8208 + 8211 + 8214 + 8218 + 8221 + 8225 + 8228 + 8231 + 8235 + 8238 + 8242 + 8245 + 8249 + 8252 + 8255 + 8259 + 8262 + 8266 + 8269 + 8272 + 8276 + 8279 + 8283 + 8286 + 8289 + 8293 + 8296 + 8300 + 8303 + 8306 + 8310 + 8313 + 8316 + 8320 + 8323 + 8327 + 8330 + 8333 + 8337 + 8340 + 8344 + 8347 + 8350 + 8354 + 8357 + 8360 + 8364 + 8367 + 8371 + 8374 + 8377 + 8381 + 8384 + 8387 + 8391 + 8394 + 8397 + 8401 + 8404 + 8408 + 8411 + 8414 + 8418 + 8421 + 8424 + 8428 + 8431 + 8434 + 8438 + 8441 + 8444 + 8448 + 8451 + 8455 + 8458 + 8461 + 8465 + 8468 + 8471 + 8475 + 8478 + 8481 + 8485 + 8488 + 8491 + 8495 + 8498 + 8501 + 8505 + 8508 + 8511 + 8515 + 8518 + 8521 + 8525 + 8528 + 8531 + 8535 + 8538 + 8541 + 8545 + 8548 + 8551 + 8555 + 8558 + 8561 + 8564 + 8568 + 8571 + 8574 + 8578 + 8581 + 8584 + 8588 + 8591 + 8594 + 8598 + 8601 + 8604 + 8608 + 8611 + 8614 + 8617 + 8621 + 8624 + 8627 + 8631 + 8634 + 8637 + 8641 + 8644 + 8647 + 8650 + 8654 + 8657 + 8660 + 8664 + 8667 + 8670 + 8673 + 8677 + 8680 + 8683 + 8687 + 8690 + 8693 + 8696 + 8700 + 8703 + 8706 + 8710 + 8713 + 8716 + 8719 + 8723 + 8726 + 8729 + 8732 + 8736 + 8739 + 8742 + 8746 + 8749 + 8752 + 8755 + 8759 + 8762 + 8765 + 8768 + 8772 + 8775 + 8778 + 8781 + 8785 + 8788 + 8791 + 8794 + 8798 + 8801 + 8804 + 8807 + 8811 + 8814 + 8817 + 8820 + 8824 + 8827 + 8833 + 8840 + 8846 + 8853 + 8859 + 8866 + 8872 + 8879 + 8885 + 8892 + 8898 + 8905 + 8911 + 8917 + 8924 + 8930 + 8937 + 8943 + 8950 + 8956 + 8962 + 8969 + 8975 + 8982 + 8988 + 8994 + 9001 + 9007 + 9014 + 9020 + 9026 + 9033 + 9039 + 9046 + 9052 + 9058 + 9065 + 9071 + 9077 + 9084 + 9090 + 9096 + 9103 + 9109 + 9115 + 9122 + 9128 + 9134 + 9141 + 9147 + 9153 + 9160 + 9166 + 9172 + 9179 + 9185 + 9191 + 9198 + 9204 + 9210 + 9216 + 9219 + 9222 + 9226 + 9229 + 9232 + 9235 + 9238 + 9241 + 9244 + 9248 + 9251 + 9254 + 9257 + 9260 + 9263 + 9266 + 9269 + 9273 + 9276 + 9279 + 9282 + 9285 + 9288 + 9291 + 9294 + 9297 + 9300 + 9304 + 9307 + 9310 + 9313 + 9316 + 9319 + 9322 + 9325 + 9328 + 9331 + 9335 + 9338 + 9341 + 9344 + 9347 + 9350 + 9353 + 9356 + 9359 + 9362 + 9365 + 9368 + 9371 + 9374 + 9378 + 9381 + 9384 + 9387 + 9390 + 9393 + 9396 + 9399 + 9402 + 9405 + 9408 + 9411 + 9414 + 9417 + 9420 + 9423 + 9426 + 9429 + 9432 + 9435 + 9439 + 9442 + 9445 + 9448 + 9451 + 9454 + 9457 + 9460 + 9463 + 9466 + 9469 + 9472 + 9475 + 9478 + 9481 + 9484 + 9487 + 9490 + 9493 + 9496 + 9499 + 9502 + 9505 + 9508 + 9511 + 9514 + 9517 + 9520 + 9523 + 9526 + 9529 + 9532 + 9535 + 9538 + 9541 + 9544 + 9547 + 9550 + 9553 + 9556 + 9559 + 9562 + 9565 + 9568 + 9571 + 9574 + 9577 + 9580 + 9582 + 9585 + 9588 + 9591 + 9594 + 9597 + 9600 + 9603 + 9606 + 9609 + 9612 + 9615 + 9618 + 9621 + 9624 + 9627 + 9630 + 9633 + 9636 + 9639 + 9642 + 9645 + 9647 + 9650 + 9653 + 9656 + 9659 + 9662 + 9665 + 9668 + 9671 + 9674 + 9677 + 9680 + 9683 + 9686 + 9688 + 9691 + 9694 + 9697 + 9700 + 9703 + 9706 + 9709 + 9712 + 9715 + 9718 + 9720 + 9723 + 9726 + 9729 + 9732 + 9735 + 9738 + 9741 + 9744 + 9747 + 9749 + 9752 + 9755 + 9758 + 9761 + 9764 + 9767 + 9770 + 9773 + 9775 + 9778 + 9781 + 9784 + 9787 + 9790 + 9793 + 9796 + 9798 + 9801 + 9804 + 9807 + 9810 + 9813 + 9816 + 9819 + 9821 + 9824 + 9827 + 9830 + 9833 + 9836 + 9839 + 9841 + 9844 + 9847 + 9850 + 9853 + 9856 + 9858 + 9861 + 9864 + 9867 + 9870 + 9873 + 9876 + 9878 + 9881 + 9884 + 9887 + 9890 + 9893 + 9895 + 9898 + 9901 + 9904 + 9907 + 9909 + 9912 + 9915 + 9918 + 9921 + 9924 + 9926 + 9929 + 9932 + 9935 + 9938 + 9940 + 9943 + 9946 + 9949 + 9952 + 9955 + 9957 + 9960 + 9963 + 9966 + 9969 + 9971 + 9974 + 9977 + 9980 + 9983 + 9985 + 9988 + 9991 + 9994 + 9996 + 9999 +10002 +10005 +10008 +10010 +10013 +10016 +10019 +10022 +10024 +10027 +10030 +10033 +10035 +10038 +10041 +10044 +10046 +10049 +10052 +10055 +10058 +10060 +10063 +10066 +10069 +10071 +10074 +10077 +10080 +10082 +10085 +10088 +10091 +10093 +10096 +10099 +10102 +10104 +10107 +10110 +10113 +10115 +10118 +10121 +10124 +10126 +10129 +10132 +10134 +10137 +10140 +10143 +10145 +10148 +10151 +10154 +10156 +10159 +10162 +10164 +10167 +10170 +10173 +10175 +10178 +10181 +10183 +10186 +10189 +10192 +10194 +10197 +10200 +10202 +10205 +10208 +10211 +10213 +10216 +10219 +10221 +10224 +10227 +10229 +10232 +10235 +10238 +10240 +10241 +10243 +10244 +10246 +10247 +10248 +10250 +10251 +10252 +10254 +10255 +10256 +10258 +10259 +10260 +10262 +10263 +10264 +10266 +10267 +10268 +10270 +10271 +10272 +10274 +10275 +10276 +10278 +10279 +10280 +10282 +10283 +10284 +10286 +10287 +10288 +10290 +10291 +10292 +10294 +10295 +10296 +10298 +10299 +10300 +10302 +10303 +10304 +10305 +10307 +10308 +10309 +10311 +10312 +10313 +10315 +10316 +10317 +10319 +10320 +10321 +10323 +10324 +10325 +10327 +10328 +10329 +10330 +10332 +10333 +10334 +10336 +10337 +10338 +10340 +10341 +10342 +10344 +10345 +10346 +10348 +10349 +10350 +10351 +10353 +10354 +10355 +10357 +10358 +10359 +10361 +10362 +10363 +10364 +10366 +10367 +10368 +10370 +10371 +10372 +10374 +10375 +10376 +10377 +10379 +10380 +10381 +10383 +10384 +10385 +10386 +10388 +10389 +10390 +10392 +10393 +10394 +10396 +10397 +10398 +10399 +10401 +10402 +10403 +10405 +10406 +10407 +10408 +10410 +10411 +10412 +10414 +10415 +10416 +10417 +10419 +10420 +10421 +10422 +10424 +10425 +10426 +10428 +10429 +10430 +10431 +10433 +10434 +10435 +10437 +10438 +10439 +10440 +10442 +10443 +10444 +10445 +10447 +10448 +10449 +10451 +10452 +10453 +10454 +10456 +10457 +10458 +10459 +10461 +10462 +10463 +10464 +10466 +10467 +10468 +10470 +10471 +10472 +10473 +10475 +10476 +10477 +10478 +10480 +10481 +10482 +10483 +10485 +10486 +10487 +10488 +10490 +10491 +10492 +10493 +10495 +10496 +10497 +10498 +10500 +10501 +10502 +10503 +10505 +10506 +10507 +10508 +10510 +10511 +10512 +10513 +10515 +10516 +10517 +10518 +10520 +10521 +10522 +10523 +10525 +10526 +10527 +10528 +10530 +10531 +10532 +10533 +10535 +10536 +10537 +10538 +10540 +10541 +10542 +10543 +10545 +10546 +10547 +10548 +10549 +10551 +10552 +10553 +10554 +10556 +10557 +10558 +10559 +10561 +10562 +10563 +10564 +10566 +10567 +10568 +10569 +10570 +10572 +10573 +10574 +10575 +10577 +10578 +10579 +10580 +10581 +10583 +10584 +10585 +10586 +10588 +10589 +10590 +10591 +10593 +10594 +10595 +10596 +10597 +10599 +10600 +10601 +10602 +10603 +10605 +10606 +10607 +10608 +10610 +10611 +10612 +10613 +10614 +10616 +10617 +10618 +10619 +10621 +10622 +10623 +10624 +10625 +10627 +10628 +10629 +10630 +10631 +10633 +10634 +10635 +10636 +10637 +10639 +10640 +10641 +10642 +10644 +10645 +10646 +10647 +10648 +10650 +10651 +10652 +10653 +10654 +10656 +10657 +10658 +10659 +10660 +10662 +10663 +10664 +10665 +10666 +10668 +10669 +10670 +10671 +10672 +10674 +10675 +10676 +10677 +10678 +10680 +10681 +10682 +10683 +10684 +10685 +10687 +10688 +10689 +10690 +10691 +10693 +10694 +10695 +10696 +10697 +10699 +10700 +10701 +10702 +10703 +10705 +10706 +10707 +10708 +10709 +10710 +10712 +10713 +10714 +10715 +10716 +10718 +10719 +10720 +10721 +10722 +10723 +10725 +10726 +10727 +10728 +10729 +10731 +10732 +10733 +10734 +10735 +10736 +10738 +10739 +10740 +10741 +10742 +10744 +10745 +10746 +10747 +10748 +10749 +10751 +10752 +10753 +10754 +10755 +10756 +10758 +10759 +10760 +10761 +10762 +10763 +10765 +10766 +10767 +10768 +10769 +10770 +10772 +10773 +10774 +10775 +10776 +10777 +10779 +10780 +10781 +10782 +10783 +10784 +10786 +10787 +10788 +10789 +10790 +10791 +10793 +10794 +10795 +10796 +10797 +10798 +10800 +10801 +10802 +10803 +10804 +10805 +10807 +10808 +10809 +10810 +10811 +10812 +10813 +10815 +10816 +10817 +10818 +10819 +10820 +10822 +10823 +10824 +10825 +10826 +10827 +10828 +10830 +10831 +10832 +10833 +10834 +10835 +10836 +10838 +10839 +10840 +10841 +10842 +10843 +10845 +10846 +10847 +10848 +10849 +10850 +10851 +10853 +10854 +10855 +10856 +10857 +10858 +10859 +10861 +10862 +10863 +10864 +10865 +10866 +10867 +10868 +10870 +10871 +10872 +10873 +10874 +10875 +10876 +10878 +10879 +10880 +10881 +10882 +10883 +10884 +10886 +10887 +10888 +10889 +10890 +10891 +10892 +10893 +10895 +10896 +10897 +10898 +10899 +10900 +10901 +10903 +10904 +10905 +10906 +10907 +10908 +10909 +10910 +10912 +10913 +10914 +10915 +10916 +10917 +10918 +10919 +10921 +10922 +10923 +10924 +10925 +10926 +10927 +10928 +10930 +10931 +10932 +10933 +10934 +10935 +10936 +10937 +10939 +10940 +10941 +10942 +10943 +10944 +10945 +10946 +10947 +10949 +10950 +10951 +10952 +10953 +10954 +10955 +10956 +10958 +10959 +10960 +10961 +10962 +10963 +10964 +10965 +10966 +10968 +10969 +10970 +10971 +10972 +10973 +10974 +10975 +10976 +10978 +10979 +10980 +10981 +10982 +10984 +10986 +10989 +10991 +10993 +10995 +10997 +11000 +11002 +11004 +11006 +11008 +11011 +11013 +11015 +11017 +11019 +11022 +11024 +11026 +11028 +11030 +11033 +11035 +11037 +11039 +11041 +11044 +11046 +11048 +11050 +11052 +11054 +11057 +11059 +11061 +11063 +11065 +11068 +11070 +11072 +11074 +11076 +11078 +11081 +11083 +11085 +11087 +11089 +11091 +11093 +11096 +11098 +11100 +11102 +11104 +11106 +11109 +11111 +11113 +11115 +11117 +11119 +11121 +11124 +11126 +11128 +11130 +11132 +11134 +11136 +11139 +11141 +11143 +11145 +11147 +11149 +11151 +11153 +11156 +11158 +11160 +11162 +11164 +11166 +11168 +11170 +11173 +11175 +11177 +11179 +11181 +11183 +11185 +11187 +11189 +11192 +11194 +11196 +11198 +11200 +11202 +11204 +11206 +11208 +11211 +11213 +11215 +11217 +11219 +11221 +11223 +11225 +11227 +11229 +11231 +11234 +11236 +11238 +11240 +11242 +11244 +11246 +11248 +11250 +11252 +11254 +11256 +11259 +11261 +11263 +11264 +11265 +11266 +11267 +11269 +11270 +11271 +11272 +11273 +11274 +11275 +11276 +11277 +11278 +11279 +11280 +11281 +11282 +11283 +11284 +11285 +11286 +11287 +11288 +11289 +11290 +11291 +11292 +11293 +11294 +11295 +11296 +11297 +11298 +11299 +11300 +11301 +11302 +11303 +11304 +11305 +11306 +11307 +11309 +11310 +11311 +11312 +11313 +11314 +11315 +11316 +11317 +11318 +11319 +11320 +11321 +11322 +11323 +11324 +11325 +11326 +11327 +11328 +11329 +11330 +11331 +11332 +11333 +11334 +11335 +11336 +11337 +11338 +11339 +11340 +11341 +11342 +11343 +11344 +11345 +11346 +11347 +11348 +11349 +11350 +11351 +11352 +11353 +11354 +11355 +11356 +11357 +11358 +11359 +11360 +11361 +11362 +11363 +11364 +11365 +11366 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11374 +11375 +11376 +11377 +11378 +11379 +11379 +11380 +11381 +11382 +11383 +11384 +11385 +11386 +11387 +11388 +11389 +11390 +11391 +11392 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11493 +11494 +11495 +11496 +11497 +11497 +11498 +11499 +11500 +11501 +11502 +11503 +11504 +11505 +11506 +11507 +11508 +11509 +11510 +11511 +11511 +11512 +11513 +11514 +11515 +11516 +11517 +11518 +11519 +11520 +11521 +11522 +11523 +11524 +11524 +11525 +11526 +11527 +11528 +11529 +11530 +11531 +11532 +11533 +11534 +11535 +11536 +11536 +11537 +11538 +11539 +11540 +11541 +11542 +11543 +11544 +11545 +11546 +11547 +11547 +11548 +11549 +11550 +11551 +11552 +11553 +11554 +11555 +11556 +11557 +11558 +11558 +11559 +11560 +11561 +11562 +11563 +11564 +11565 +11566 +11567 +11568 +11568 +11569 +11570 +11571 +11572 +11573 +11574 +11575 +11576 +11577 +11578 +11578 +11579 +11580 +11581 +11582 +11583 +11584 +11585 +11586 +11587 +11587 +11588 +11589 +11590 +11591 +11592 +11593 +11594 +11595 +11596 +11596 +11597 +11598 +11599 +11600 +11601 +11602 +11603 +11604 +11605 +11605 +11606 +11607 +11608 +11609 +11610 +11611 +11612 +11613 +11613 +11614 +11615 +11616 +11617 +11618 +11619 +11620 +11621 +11621 +11622 +11623 +11624 +11625 +11626 +11627 +11628 +11629 +11629 +11630 +11631 +11632 +11633 +11634 +11635 +11636 +11637 +11637 +11638 +11639 +11640 +11641 +11642 +11643 +11644 +11644 +11645 +11646 +11647 +11648 +11649 +11650 +11651 +11651 +11652 +11653 +11654 +11655 +11656 +11657 +11658 +11659 +11659 +11660 +11661 +11662 +11663 +11664 +11665 +11666 +11666 +11667 +11668 +11669 +11670 +11671 +11672 +11672 +11673 +11674 +11675 +11676 +11677 +11678 +11679 +11679 +11680 +11681 +11682 +11683 +11684 +11685 +11686 +11686 +11687 +11688 +11689 +11690 +11691 +11692 +11692 +11693 +11694 +11695 +11696 +11697 +11698 +11698 +11699 +11700 +11701 +11702 +11703 +11704 +11704 +11705 +11706 +11707 +11708 +11709 +11710 +11711 +11711 +11712 +11713 +11714 +11715 +11716 +11717 +11717 +11718 +11719 +11720 +11721 +11722 +11722 +11723 +11724 +11725 +11726 +11727 +11728 +11728 +11729 +11730 +11731 +11732 +11733 +11734 +11734 +11735 +11736 +11737 +11738 +11739 +11740 +11740 +11741 +11742 +11743 +11744 +11745 +11745 +11746 +11747 +11748 +11749 +11750 +11751 +11751 +11752 +11753 +11754 +11755 +11756 +11756 +11757 +11758 +11759 +11760 +11761 +11761 +11762 +11763 +11764 +11765 +11766 +11767 +11767 +11768 +11769 +11770 +11771 +11772 +11772 +11773 +11774 +11775 +11776 +11777 +11777 +11778 +11779 +11780 +11781 +11782 +11782 +11783 +11784 +11785 +11786 +11787 +11787 +11788 +11789 +11790 +11791 +11792 +11792 +11793 +11794 +11795 +11796 +11797 +11797 +11798 +11799 +11800 +11801 +11802 +11802 +11803 +11804 +11805 +11806 +11806 +11807 +11808 +11809 +11810 +11811 +11811 +11812 +11813 +11814 +11815 +11816 +11816 +11817 +11818 +11819 +11820 +11820 +11821 +11822 +11823 +11824 +11825 +11825 +11826 +11827 +11828 +11829 +11830 +11830 +11831 +11832 +11833 +11834 +11834 +11835 +11836 +11837 +11838 +11839 +11839 +11840 +11841 +11842 +11843 +11843 +11844 +11845 +11846 +11847 +11847 +11848 +11849 +11850 +11851 +11852 +11852 +11853 +11854 +11855 +11856 +11856 +11857 +11858 +11859 +11860 +11860 +11861 +11862 +11863 +11864 +11865 +11865 +11866 +11867 +11868 +11869 +11869 +11870 +11871 +11872 +11873 +11873 +11874 +11875 +11876 +11877 +11877 +11878 +11879 +11880 +11881 +11881 +11882 +11883 +11884 +11885 +11885 +11886 +11887 +11888 +11889 +11889 +11890 +11891 +11892 +11893 +11893 +11894 +11895 +11896 +11897 +11897 +11898 +11899 +11900 +11901 +11901 +11902 +11903 +11904 +11905 +11905 +11906 +11907 +11908 +11909 +11909 +11910 +11911 +11912 +11913 +11913 +11914 +11915 +11916 +11917 +11917 +11918 +11919 +11920 +11921 +11921 +11922 +11923 +11924 +11924 +11925 +11926 +11927 +11928 +11928 +11929 +11930 +11931 +11932 +11932 +11933 +11934 +11935 +11936 +11936 +11937 +11938 +11939 +11939 +11940 +11941 +11942 +11943 +11943 +11944 +11945 +11946 +11947 +11947 +11948 +11949 +11950 +11950 +11951 +11952 +11953 +11954 +11954 +11955 +11956 +11957 +11957 +11958 +11959 +11960 +11961 +11961 +11962 +11963 +11964 +11965 +11965 +11966 +11967 +11968 +11968 +11969 +11970 +11971 +11972 +11972 +11973 +11974 +11975 +11975 +11976 +11977 +11978 +11979 +11979 +11980 +11981 +11982 +11982 +11983 +11984 +11985 +11985 +11986 +11987 +11988 +11989 +11989 +11990 +11991 +11992 +11992 +11993 +11994 +11995 +11996 +11996 +11997 +11998 +11999 +11999 +12000 +12001 +12002 +12002 +12003 +12004 +12005 +12006 +12006 +12007 +12008 +12009 +12009 +12010 +12011 +12012 +12012 +12013 +12014 +12015 +12015 +12016 +12017 +12018 +12019 +12019 +12020 +12021 +12022 +12022 +12023 +12024 +12025 +12025 +12026 +12027 +12028 +12028 +12029 +12030 +12031 +12031 +12032 +12033 +12034 +12035 +12035 +12036 +12037 +12038 +12038 +12039 +12040 +12041 +12041 +12042 +12043 +12044 +12044 +12045 +12046 +12047 +12049 +12050 +12052 +12053 +12055 +12056 +12058 +12060 +12061 +12063 +12064 +12066 +12067 +12069 +12070 +12072 +12073 +12075 +12076 +12078 +12079 +12081 +12082 +12084 +12085 +12086 +12088 +12089 +12091 +12092 +12094 +12095 +12097 +12098 +12100 +12101 +12103 +12104 +12106 +12107 +12109 +12110 +12112 +12113 +12115 +12116 +12118 +12119 +12121 +12122 +12124 +12125 +12126 +12128 +12129 +12131 +12132 +12134 +12135 +12137 +12138 +12140 +12141 +12143 +12144 +12146 +12147 +12148 +12150 +12151 +12153 +12154 +12156 +12157 +12159 +12160 +12162 +12163 +12164 +12166 +12167 +12169 +12170 +12172 +12173 +12175 +12176 +12178 +12179 +12180 +12182 +12183 +12185 +12186 +12188 +12189 +12191 +12192 +12193 +12195 +12196 +12198 +12199 +12201 +12202 +12203 +12205 +12206 +12208 +12209 +12211 +12212 +12213 +12215 +12216 +12218 +12219 +12221 +12222 +12223 +12225 +12226 +12228 +12229 +12231 +12232 +12233 +12235 +12236 +12238 +12239 +12240 +12242 +12243 +12245 +12246 +12248 +12249 +12250 +12252 +12253 +12255 +12256 +12257 +12259 +12260 +12262 +12263 +12264 +12266 +12267 +12269 +12270 +12271 +12273 +12274 +12276 +12277 +12278 +12280 +12281 +12283 +12284 +12285 +12287 +12288 +12289 +12289 +12290 +12291 +12292 +12292 +12293 +12294 +12294 +12295 +12296 +12296 +12297 +12298 +12299 +12299 +12300 +12301 +12301 +12302 +12303 +12303 +12304 +12305 +12305 +12306 +12307 +12307 +12308 +12309 +12310 +12310 +12311 +12312 +12312 +12313 +12314 +12314 +12315 +12316 +12316 +12317 +12318 +12318 +12319 +12320 +12320 +12321 +12322 +12323 +12323 +12324 +12325 +12325 +12326 +12327 +12327 +12328 +12329 +12329 +12330 +12331 +12331 +12332 +12333 +12333 +12334 +12335 +12335 +12336 +12337 +12337 +12338 +12339 +12339 +12340 +12341 +12341 +12342 +12343 +12344 +12344 +12345 +12346 +12346 +12347 +12348 +12348 +12349 +12350 +12350 +12351 +12352 +12352 +12353 +12354 +12354 +12355 +12356 +12356 +12357 +12358 +12358 +12359 +12360 +12360 +12361 +12362 +12362 +12363 +12364 +12364 +12365 +12366 +12366 +12367 +12367 +12368 +12369 +12369 +12370 +12371 +12371 +12372 +12373 +12373 +12374 +12375 +12375 +12376 +12377 +12377 +12378 +12379 +12379 +12380 +12381 +12381 +12382 +12383 +12383 +12384 +12385 +12385 +12386 +12387 +12387 +12388 +12389 +12389 +12390 +12390 +12391 +12392 +12392 +12393 +12394 +12394 +12395 +12396 +12396 +12397 +12398 +12398 +12399 +12400 +12400 +12401 +12402 +12402 +12403 +12403 +12404 +12405 +12405 +12406 +12407 +12407 +12408 +12409 +12409 +12410 +12411 +12411 +12412 +12412 +12413 +12414 +12414 +12415 +12416 +12416 +12417 +12418 +12418 +12419 +12420 +12420 +12421 +12421 +12422 +12423 +12423 +12424 +12425 +12425 +12426 +12427 +12427 +12428 +12428 +12429 +12430 +12430 +12431 +12432 +12432 +12433 +12434 +12434 +12435 +12435 +12436 +12437 +12437 +12438 +12439 +12439 +12440 +12441 +12441 +12442 +12442 +12443 +12444 +12444 +12445 +12446 +12446 +12447 +12447 +12448 +12449 +12449 +12450 +12451 +12451 +12452 +12453 +12453 +12454 +12454 +12455 +12456 +12456 +12457 +12458 +12458 +12459 +12459 +12460 +12461 +12461 +12462 +12463 +12463 +12464 +12464 +12465 +12466 +12466 +12467 +12467 +12468 +12469 +12469 +12470 +12471 +12471 +12472 +12472 +12473 +12474 +12474 +12475 +12476 +12476 +12477 +12477 +12478 +12479 +12479 +12480 +12481 +12481 +12482 +12482 +12483 +12484 +12484 +12485 +12485 +12486 +12487 +12487 +12488 +12489 +12489 +12490 +12490 +12491 +12492 +12492 +12493 +12493 +12494 +12495 +12495 +12496 +12496 +12497 +12498 +12498 +12499 +12500 +12500 +12501 +12501 +12502 +12503 +12503 +12504 +12504 +12505 +12506 +12506 +12507 +12507 +12508 +12509 +12509 +12510 +12510 +12511 +12512 +12512 +12513 +12513 +12514 +12515 +12515 +12516 +12517 +12517 +12518 +12518 +12519 +12520 +12520 +12521 +12521 +12522 +12523 +12523 +12524 +12524 +12525 +12526 +12526 +12527 +12527 +12528 +12529 +12529 +12530 +12530 +12531 +12532 +12532 +12533 +12533 +12534 +12535 +12535 +12536 +12536 +12537 +12538 +12538 +12539 +12539 +12540 +12540 +12541 +12542 +12542 +12543 +12543 +12544 +12545 +12545 +12546 +12546 +12547 +12548 +12548 +12549 +12549 +12550 +12551 +12551 +12552 +12552 +12553 +12554 +12554 +12555 +12555 +12556 +12556 +12557 +12558 +12558 +12559 +12559 +12560 +12561 +12561 +12562 +12562 +12563 +12564 +12564 +12565 +12565 +12566 +12566 +12567 +12568 +12568 +12569 +12569 +12570 +12571 +12571 +12572 +12572 +12573 +12574 +12574 +12575 +12575 +12576 +12576 +12577 +12578 +12578 +12579 +12579 +12580 +12581 +12581 +12582 +12582 +12583 +12583 +12584 +12585 +12585 +12586 +12586 +12587 +12587 +12588 +12589 +12589 +12590 +12590 +12591 +12592 +12592 +12593 +12593 +12594 +12594 +12595 +12596 +12596 +12597 +12597 +12598 +12598 +12599 +12600 +12600 +12601 +12601 +12602 +12602 +12603 +12604 +12604 +12605 +12605 +12606 +12606 +12607 +12608 +12608 +12609 +12609 +12610 +12611 +12611 +12612 +12612 +12613 +12613 +12614 +12615 +12615 +12616 +12616 +12617 +12617 +12618 +12618 +12619 +12620 +12620 +12621 +12621 +12622 +12622 +12623 +12624 +12624 +12625 +12625 +12626 +12626 +12627 +12628 +12628 +12629 +12629 +12630 +12630 +12631 +12632 +12632 +12633 +12633 +12634 +12634 +12635 +12635 +12636 +12637 +12637 +12638 +12638 +12639 +12639 +12640 +12641 +12641 +12642 +12642 +12643 +12643 +12644 +12644 +12645 +12646 +12646 +12647 +12647 +12648 +12648 +12649 +12650 +12650 +12651 +12651 +12652 +12652 +12653 +12653 +12654 +12655 +12655 +12656 +12656 +12657 +12657 +12658 +12658 +12659 +12660 +12660 +12661 +12661 +12662 +12662 +12663 +12663 +12664 +12665 +12665 +12666 +12666 +12667 +12667 +12668 +12668 +12669 +12670 +12670 +12671 +12671 +12672 +12672 +12673 +12673 +12674 +12675 +12675 +12676 +12676 +12677 +12677 +12678 +12678 +12679 +12680 +12680 +12681 +12681 +12682 +12682 +12683 +12683 +12684 +12684 +12685 +12686 +12686 +12687 +12687 +12688 +12688 +12689 +12689 +12690 +12690 +12691 +12692 +12692 +12693 +12693 +12694 +12694 +12695 +12695 +12696 +12696 +12697 +12698 +12698 +12699 +12699 +12700 +12700 +12701 +12701 +12702 +12702 +12703 +12704 +12704 +12705 +12705 +12706 +12706 +12707 +12707 +12708 +12708 +12709 +12710 +12710 +12711 +12711 +12712 +12712 +12713 +12713 +12714 +12714 +12715 +12715 +12716 +12717 +12717 +12718 +12718 +12719 +12719 +12720 +12720 +12721 +12721 +12722 +12722 +12723 +12724 +12724 +12725 +12725 +12726 +12726 +12727 +12727 +12728 +12728 +12729 +12729 +12730 +12731 +12731 +12732 +12732 +12733 +12733 +12734 +12734 +12735 +12735 +12736 +12736 +12737 +12737 +12738 +12739 +12739 +12740 +12740 +12741 +12741 +12742 +12742 +12743 +12743 +12744 +12744 +12745 +12745 +12746 +12747 +12747 +12748 +12748 +12749 +12749 +12750 +12750 +12751 +12751 +12752 +12752 +12753 +12753 +12754 +12754 +12755 +12756 +12756 +12757 +12757 +12758 +12758 +12759 +12759 +12760 +12760 +12761 +12761 +12762 +12762 +12763 +12763 +12764 +12764 +12765 +12766 +12766 +12767 +12767 +12768 +12768 +12769 +12769 +12770 +12770 +12771 +12771 +12772 +12772 +12773 +12773 +12774 +12774 +12775 +12776 +12776 +12777 +12777 +12778 +12778 +12779 +12779 +12780 +12780 +12781 +12781 +12782 +12782 +12783 +12783 +12784 +12784 +12785 +12785 +12786 +12786 +12787 +12787 +12788 +12789 +12789 +12790 +12790 +12791 +12791 +12792 +12792 +12793 +12793 +12794 +12794 +12795 +12795 +12796 +12796 +12797 +12797 +12798 +12799 +12800 +12801 +12802 +12804 +12805 +12806 +12807 +12808 +12809 +12810 +12811 +12812 +12813 +12814 +12815 +12816 +12817 +12818 +12819 +12820 +12821 +12822 +12823 +12824 +12825 +12826 +12827 +12828 +12829 +12830 +12831 +12832 +12833 +12834 +12835 +12836 +12837 +12838 +12839 +12840 +12841 +12842 +12843 +12844 +12845 +12846 +12847 +12848 +12849 +12850 +12851 +12852 +12853 +12854 +12855 +12856 +12857 +12858 +12859 +12860 +12861 +12862 +12863 +12864 +12865 +12866 +12867 +12868 +12869 +12870 +12871 +12872 +12873 +12874 +12875 +12876 +12877 +12878 +12879 +12880 +12881 +12882 +12883 +12884 +12885 +12886 +12887 +12888 +12889 +12890 +12891 +12892 +12893 +12894 +12895 +12896 +12897 +12898 +12899 +12900 +12901 +12902 +12903 +12904 +12905 +12906 +12907 +12908 +12909 +12910 +12911 +12912 +12913 +12914 +12915 +12916 +12917 +12918 +12919 +12920 +12921 +12922 +12922 +12923 +12924 +12925 +12926 +12927 +12928 +12929 +12930 +12931 +12932 +12933 +12934 +12935 +12936 +12937 +12938 +12939 +12940 +12941 +12942 +12943 +12944 +12945 +12946 +12947 +12948 +12949 +12949 +12950 +12951 +12952 +12953 +12954 +12955 +12956 +12957 +12958 +12959 +12960 +12961 +12962 +12963 +12964 +12965 +12966 +12967 +12968 +12969 +12969 +12970 +12971 +12972 +12973 +12974 +12975 +12976 +12977 +12978 +12979 +12980 +12981 +12982 +12983 +12984 +12985 +12986 +12986 +12987 +12988 +12989 +12990 +12991 +12992 +12993 +12994 +12995 +12996 +12997 +12998 +12999 +13000 +13001 +13001 +13002 +13003 +13004 +13005 +13006 +13007 +13008 +13009 +13010 +13011 +13012 +13013 +13014 +13015 +13015 +13016 +13017 +13018 +13019 +13020 +13021 +13022 +13023 +13024 +13025 +13026 +13027 +13027 +13028 +13029 +13030 +13031 +13032 +13033 +13034 +13035 +13036 +13037 +13038 +13039 +13039 +13040 +13041 +13042 +13043 +13044 +13045 +13046 +13047 +13048 +13049 +13049 +13050 +13051 +13052 +13053 +13054 +13055 +13056 +13057 +13058 +13059 +13060 +13060 +13061 +13062 +13063 +13064 +13065 +13066 +13067 +13068 +13069 +13069 +13070 +13071 +13072 +13073 +13074 +13075 +13076 +13077 +13078 +13078 +13079 +13080 +13081 +13082 +13083 +13084 +13085 +13086 +13087 +13087 +13088 +13089 +13090 +13091 +13092 +13093 +13094 +13095 +13096 +13096 +13097 +13098 +13099 +13100 +13101 +13102 +13103 +13104 +13104 +13105 +13106 +13107 +13108 +13109 +13110 +13111 +13112 +13112 +13113 +13114 +13115 +13116 +13117 +13118 +13119 +13120 +13120 +13121 +13122 +13123 +13124 +13125 +13126 +13127 +13127 +13128 +13129 +13130 +13131 +13132 +13133 +13134 +13135 +13135 +13136 +13137 +13138 +13139 +13140 +13141 +13142 +13142 +13143 +13144 +13145 +13146 +13147 +13148 +13149 +13149 +13150 +13151 +13152 +13153 +13154 +13155 +13155 +13156 +13157 +13158 +13159 +13160 +13161 +13162 +13162 +13163 +13164 +13165 +13166 +13167 +13168 +13168 +13169 +13170 +13171 +13172 +13173 +13174 +13175 +13175 +13176 +13177 +13178 +13179 +13180 +13181 +13181 +13182 +13183 +13184 +13185 +13186 +13187 +13187 +13188 +13189 +13190 +13191 +13192 +13193 +13193 +13194 +13195 +13196 +13197 +13198 +13199 +13199 +13200 +13201 +13202 +13203 +13204 +13204 +13205 +13206 +13207 +13208 +13209 +13210 +13210 +13211 +13212 +13213 +13214 +13215 +13216 +13216 +13217 +13218 +13219 +13220 +13221 +13221 +13222 +13223 +13224 +13225 +13226 +13226 +13227 +13228 +13229 +13230 +13231 +13232 +13232 +13233 +13234 +13235 +13236 +13237 +13237 +13238 +13239 +13240 +13241 +13242 +13242 +13243 +13244 +13245 +13246 +13247 +13247 +13248 +13249 +13250 +13251 +13252 +13252 +13253 +13254 +13255 +13256 +13257 +13257 +13258 +13259 +13260 +13261 +13262 +13262 +13263 +13264 +13265 +13266 +13267 +13267 +13268 +13269 +13270 +13271 +13272 +13272 +13273 +13274 +13275 +13276 +13276 +13277 +13278 +13279 +13280 +13281 +13281 +13282 +13283 +13284 +13285 +13286 +13286 +13287 +13288 +13289 +13290 +13290 +13291 +13292 +13293 +13294 +13295 +13295 +13296 +13297 +13298 +13299 +13299 +13300 +13301 +13302 +13303 +13304 +13304 +13305 +13306 +13307 +13308 +13308 +13309 +13310 +13311 +13312 +13312 +13313 +13313 +13313 +13314 +13314 +13315 +13315 +13315 +13316 +13316 +13317 +13317 +13318 +13318 +13318 +13319 +13319 +13320 +13320 +13320 +13321 +13321 +13322 +13322 +13322 +13323 +13323 +13324 +13324 +13324 +13325 +13325 +13326 +13326 +13326 +13327 +13327 +13328 +13328 +13328 +13329 +13329 +13330 +13330 +13330 +13331 +13331 +13332 +13332 +13332 +13333 +13333 +13334 +13334 +13334 +13335 +13335 +13336 +13336 +13336 +13337 +13337 +13338 +13338 +13338 +13339 +13339 +13340 +13340 +13340 +13341 +13341 +13341 +13342 +13342 +13343 +13343 +13343 +13344 +13344 +13345 +13345 +13345 +13346 +13346 +13347 +13347 +13347 +13348 +13348 +13349 +13349 +13349 +13350 +13350 +13351 +13351 +13351 +13352 +13352 +13353 +13353 +13353 +13354 +13354 +13354 +13355 +13355 +13356 +13356 +13356 +13357 +13357 +13358 +13358 +13358 +13359 +13359 +13360 +13360 +13360 +13361 +13361 +13362 +13362 +13362 +13363 +13363 +13363 +13364 +13364 +13365 +13365 +13365 +13366 +13366 +13367 +13367 +13367 +13368 +13368 +13369 +13369 +13369 +13370 +13370 +13370 +13371 +13371 +13372 +13372 +13372 +13373 +13373 +13374 +13374 +13374 +13375 +13375 +13375 +13376 +13376 +13377 +13377 +13377 +13378 +13378 +13379 +13379 +13379 +13380 +13380 +13380 +13381 +13381 +13382 +13382 +13382 +13383 +13383 +13384 +13384 +13384 +13385 +13385 +13385 +13386 +13386 +13387 +13387 +13387 +13388 +13388 +13388 +13389 +13389 +13390 +13390 +13390 +13391 +13391 +13392 +13392 +13392 +13393 +13393 +13393 +13394 +13394 +13395 +13395 +13395 +13396 +13396 +13396 +13397 +13397 +13398 +13398 +13398 +13399 +13399 +13399 +13400 +13400 +13401 +13401 +13401 +13402 +13402 +13402 +13403 +13403 +13404 +13404 +13404 +13405 +13405 +13405 +13406 +13406 +13407 +13407 +13407 +13408 +13408 +13409 +13409 +13409 +13410 +13410 +13410 +13411 +13411 +13411 +13412 +13412 +13413 +13413 +13413 +13414 +13414 +13414 +13415 +13415 +13416 +13416 +13416 +13417 +13417 +13417 +13418 +13418 +13419 +13419 +13419 +13420 +13420 +13420 +13421 +13421 +13422 +13422 +13422 +13423 +13423 +13423 +13424 +13424 +13425 +13425 +13425 +13426 +13426 +13426 +13427 +13427 +13427 +13428 +13428 +13429 +13429 +13429 +13430 +13430 +13430 +13431 +13431 +13432 +13432 +13432 +13433 +13433 +13433 +13434 +13434 +13434 +13435 +13435 +13436 +13436 +13436 +13437 +13437 +13437 +13438 +13438 +13439 +13439 +13439 +13440 +13440 +13440 +13441 +13441 +13441 +13442 +13442 +13443 +13443 +13443 +13444 +13444 +13444 +13445 +13445 +13445 +13446 +13446 +13447 +13447 +13447 +13448 +13448 +13448 +13449 +13449 +13449 +13450 +13450 +13451 +13451 +13451 +13452 +13452 +13452 +13453 +13453 +13453 +13454 +13454 +13455 +13455 +13455 +13456 +13456 +13456 +13457 +13457 +13457 +13458 +13458 +13458 +13459 +13459 +13460 +13460 +13460 +13461 +13461 +13461 +13462 +13462 +13462 +13463 +13463 +13464 +13464 +13464 +13465 +13465 +13465 +13466 +13466 +13466 +13467 +13467 +13467 +13468 +13468 +13469 +13469 +13469 +13470 +13470 +13470 +13471 +13471 +13471 +13472 +13472 +13472 +13473 +13473 +13474 +13474 +13474 +13475 +13475 +13475 +13476 +13476 +13476 +13477 +13477 +13477 +13478 +13478 +13479 +13479 +13479 +13480 +13480 +13480 +13481 +13481 +13481 +13482 +13482 +13482 +13483 +13483 +13483 +13484 +13484 +13485 +13485 +13485 +13486 +13487 +13487 +13488 +13489 +13489 +13490 +13491 +13492 +13492 +13493 +13494 +13494 +13495 +13496 +13496 +13497 +13498 +13499 +13499 +13500 +13501 +13501 +13502 +13503 +13503 +13504 +13505 +13506 +13506 +13507 +13508 +13508 +13509 +13510 +13510 +13511 +13512 +13512 +13513 +13514 +13515 +13515 +13516 +13517 +13517 +13518 +13519 +13519 +13520 +13521 +13521 +13522 +13523 +13524 +13524 +13525 +13526 +13526 +13527 +13528 +13528 +13529 +13530 +13530 +13531 +13532 +13532 +13533 +13534 +13534 +13535 +13536 +13536 +13537 +13538 +13539 +13539 +13540 +13541 +13541 +13542 +13543 +13543 +13544 +13545 +13545 +13546 +13547 +13547 +13548 +13549 +13549 +13550 +13551 +13551 +13552 +13553 +13553 +13554 +13555 +13555 +13556 +13557 +13557 +13558 +13559 +13559 +13560 +13561 +13561 +13562 +13563 +13563 +13564 +13565 +13565 +13566 +13567 +13567 +13568 +13569 +13569 +13570 +13571 +13571 +13572 +13573 +13573 +13574 +13575 +13575 +13576 +13577 +13577 +13578 +13579 +13579 +13580 +13581 +13581 +13582 +13583 +13583 +13584 +13585 +13585 +13586 +13587 +13587 +13588 +13588 +13589 +13590 +13590 +13591 +13592 +13592 +13593 +13594 +13594 +13595 +13596 +13596 +13597 +13598 +13598 +13599 +13600 +13600 +13601 +13602 +13602 +13603 +13603 +13604 +13605 +13605 +13606 +13607 +13607 +13608 +13609 +13609 +13610 +13611 +13611 +13612 +13612 +13613 +13614 +13614 +13615 +13616 +13616 +13617 +13618 +13618 +13619 +13620 +13620 +13621 +13621 +13622 +13623 +13623 +13624 +13625 +13625 +13626 +13627 +13627 +13628 +13628 +13629 +13630 +13630 +13631 +13632 +13632 +13633 +13634 +13634 +13635 +13635 +13636 +13637 +13637 +13638 +13639 +13639 +13640 +13641 +13641 +13642 +13642 +13643 +13644 +13644 +13645 +13646 +13646 +13647 +13647 +13648 +13649 +13649 +13650 +13651 +13651 +13652 +13652 +13653 +13654 +13654 +13655 +13656 +13656 +13657 +13657 +13658 +13659 +13659 +13660 +13661 +13661 +13662 +13662 +13663 +13664 +13664 +13665 +13666 +13666 +13667 +13667 +13668 +13669 +13669 +13670 +13670 +13671 +13672 +13672 +13673 +13674 +13674 +13675 +13675 +13676 +13677 +13677 +13678 +13678 +13679 +13680 +13680 +13681 +13682 +13682 +13683 +13683 +13684 +13685 +13685 +13686 +13686 +13687 +13688 +13688 +13689 +13690 +13690 +13691 +13691 +13692 +13693 +13693 +13694 +13694 +13695 +13696 +13696 +13697 +13697 +13698 +13699 +13699 +13700 +13700 +13701 +13702 +13702 +13703 +13703 +13704 +13705 +13705 +13706 +13707 +13707 +13708 +13708 +13709 +13710 +13710 +13711 +13711 +13712 +13713 +13713 +13714 +13714 +13715 +13716 +13716 +13717 +13717 +13718 +13719 +13719 +13720 +13720 +13721 +13722 +13722 +13723 +13723 +13724 +13724 +13725 +13726 +13726 +13727 +13727 +13728 +13729 +13729 +13730 +13730 +13731 +13732 +13732 +13733 +13733 +13734 +13735 +13735 +13736 +13736 +13737 +13738 +13738 +13739 +13739 +13740 +13740 +13741 +13742 +13742 +13743 +13743 +13744 +13745 +13745 +13746 +13746 +13747 +13748 +13748 +13749 +13749 +13750 +13750 +13751 +13752 +13752 +13753 +13753 +13754 +13755 +13755 +13756 +13756 +13757 +13758 +13758 +13759 +13759 +13760 +13760 +13761 +13762 +13762 +13763 +13763 +13764 +13764 +13765 +13766 +13766 +13767 +13767 +13768 +13769 +13769 +13770 +13770 +13771 +13771 +13772 +13773 +13773 +13774 +13774 +13775 +13775 +13776 +13777 +13777 +13778 +13778 +13779 +13780 +13780 +13781 +13781 +13782 +13782 +13783 +13784 +13784 +13785 +13785 +13786 +13786 +13787 +13788 +13788 +13789 +13789 +13790 +13790 +13791 +13792 +13792 +13793 +13793 +13794 +13794 +13795 +13796 +13796 +13797 +13797 +13798 +13798 +13799 +13799 +13800 +13801 +13801 +13802 +13802 +13803 +13803 +13804 +13805 +13805 +13806 +13806 +13807 +13807 +13808 +13809 +13809 +13810 +13810 +13811 +13811 +13812 +13812 +13813 +13814 +13814 +13815 +13815 +13816 +13816 +13817 +13818 +13818 +13819 +13819 +13820 +13820 +13821 +13821 +13822 +13823 +13823 +13824 +13824 +13825 +13825 +13826 +13827 +13827 +13828 +13828 +13829 +13829 +13830 +13830 +13831 +13832 +13832 +13833 +13833 +13834 +13834 +13835 +13835 +13836 +13837 +13837 +13838 +13838 +13839 +13839 +13840 +13840 +13841 +13842 +13842 +13843 +13843 +13844 +13844 +13845 +13845 +13846 +13846 +13847 +13848 +13848 +13849 +13849 +13850 +13850 +13851 +13851 +13852 +13853 +13853 +13854 +13854 +13855 +13855 +13856 +13856 +13857 +13857 +13858 +13859 +13859 +13860 +13860 +13861 +13861 +13862 +13862 +13863 +13863 +13864 +13865 +13865 +13866 +13866 +13867 +13867 +13868 +13868 +13869 +13869 +13870 +13871 +13871 +13872 +13872 +13873 +13873 +13874 +13874 +13875 +13875 +13876 +13877 +13877 +13878 +13878 +13879 +13879 +13880 +13880 +13881 +13881 +13882 +13882 +13883 +13884 +13884 +13885 +13885 +13886 +13886 +13887 +13887 +13888 +13888 +13889 +13889 +13890 +13891 +13891 +13892 +13892 +13893 +13893 +13894 +13894 +13895 +13895 +13896 +13896 +13897 +13897 +13898 +13899 +13899 +13900 +13900 +13901 +13901 +13902 +13902 +13903 +13903 +13904 +13904 +13905 +13905 +13906 +13907 +13907 +13908 +13908 +13909 +13909 +13910 +13910 +13911 +13911 +13912 +13912 +13913 +13913 +13914 +13914 +13915 +13916 +13916 +13917 +13917 +13918 +13918 +13919 +13919 +13920 +13920 +13921 +13921 +13922 +13922 +13923 +13923 +13924 +13924 +13925 +13926 +13926 +13927 +13927 +13928 +13928 +13929 +13929 +13930 +13930 +13931 +13931 +13932 +13932 +13933 +13933 +13934 +13934 +13935 +13935 +13936 +13937 +13937 +13938 +13938 +13939 +13939 +13940 +13940 +13941 +13941 +13942 +13942 +13943 +13943 +13944 +13944 +13945 +13945 +13946 +13946 +13947 +13947 +13948 +13948 +13949 +13950 +13950 +13951 +13951 +13952 +13952 +13953 +13953 +13954 +13954 +13955 +13955 +13956 +13956 +13957 +13957 +13958 +13958 +13959 +13959 +13960 +13960 +13961 +13961 +13962 +13962 +13963 +13963 +13964 +13964 +13965 +13966 +13966 +13967 +13967 +13968 +13968 +13969 +13969 +13970 +13970 +13971 +13971 +13972 +13972 +13973 +13973 +13974 +13974 +13975 +13975 +13976 +13976 +13977 +13977 +13978 +13978 +13979 +13979 +13980 +13980 +13981 +13981 +13982 +13982 +13983 +13983 +13984 +13984 +13985 +13985 +13986 +13986 +13987 +13987 +13988 +13988 +13989 +13989 +13990 +13990 +13991 +13991 +13992 +13992 +13993 +13993 +13994 +13994 +13995 +13996 +13996 +13997 +13997 +13998 +13998 +13999 +13999 +14000 +14000 +14001 +14001 +14002 +14002 +14003 +14003 +14004 +14004 +14005 +14005 +14006 +14006 +14007 +14007 +14008 +14008 +14009 +14009 +14010 +14010 +14011 +14011 +14012 +14012 +14013 +14013 +14014 +14014 +14015 +14015 +14016 +14016 +14017 +14017 +14018 +14018 +14019 +14019 +14020 +14020 +14021 +14021 +14022 +14022 +14023 +14023 +14024 +14024 +14024 +14025 +14025 +14026 +14026 +14027 +14027 +14028 +14028 +14029 +14029 +14030 +14030 +14031 +14031 +14032 +14032 +14033 +14033 +14034 +14034 +14035 +14035 +14036 +14036 +14037 +14037 +14038 +14038 +14039 +14039 +14040 +14040 +14041 +14041 +14042 +14042 +14043 +14043 +14044 +14044 +14045 +14045 +14046 +14046 +14047 +14047 +14048 +14048 +14049 +14049 +14050 +14050 +14051 +14051 +14052 +14052 +14053 +14053 +14054 +14054 +14054 +14055 +14055 +14056 +14056 +14057 +14057 +14058 +14058 +14059 +14059 +14060 +14060 +14061 +14061 +14062 +14062 +14063 +14063 +14064 +14064 +14065 +14065 +14066 +14066 +14067 +14067 +14068 +14068 +14069 +14069 +14070 +14070 +14070 +14071 +14071 +14072 +14072 +14073 +14073 +14074 +14075 +14076 +14077 +14078 +14079 +14080 +14081 +14082 +14083 +14084 +14085 +14086 +14087 +14088 +14089 +14090 +14091 +14092 +14093 +14094 +14094 +14095 +14096 +14097 +14098 +14099 +14100 +14101 +14102 +14103 +14104 +14105 +14106 +14107 +14108 +14109 +14110 +14111 +14112 +14113 +14113 +14114 +14115 +14116 +14117 +14118 +14119 +14120 +14121 +14122 +14123 +14124 +14125 +14126 +14127 +14128 +14128 +14129 +14130 +14131 +14132 +14133 +14134 +14135 +14136 +14137 +14138 +14139 +14140 +14141 +14142 +14142 +14143 +14144 +14145 +14146 +14147 +14148 +14149 +14150 +14151 +14152 +14153 +14154 +14155 +14155 +14156 +14157 +14158 +14159 +14160 +14161 +14162 +14163 +14164 +14165 +14166 +14166 +14167 +14168 +14169 +14170 +14171 +14172 +14173 +14174 +14175 +14176 +14177 +14177 +14178 +14179 +14180 +14181 +14182 +14183 +14184 +14185 +14186 +14187 +14187 +14188 +14189 +14190 +14191 +14192 +14193 +14194 +14195 +14196 +14196 +14197 +14198 +14199 +14200 +14201 +14202 +14203 +14204 +14205 +14205 +14206 +14207 +14208 +14209 +14210 +14211 +14212 +14213 +14214 +14214 +14215 +14216 +14217 +14218 +14219 +14220 +14221 +14222 +14222 +14223 +14224 +14225 +14226 +14227 +14228 +14229 +14230 +14230 +14231 +14232 +14233 +14234 +14235 +14236 +14237 +14238 +14238 +14239 +14240 +14241 +14242 +14243 +14244 +14245 +14245 +14246 +14247 +14248 +14249 +14250 +14251 +14252 +14253 +14253 +14254 +14255 +14256 +14257 +14258 +14259 +14260 +14260 +14261 +14262 +14263 +14264 +14265 +14266 +14266 +14267 +14268 +14269 +14270 +14271 +14272 +14273 +14273 +14274 +14275 +14276 +14277 +14278 +14279 +14279 +14280 +14281 +14282 +14283 +14284 +14285 +14286 +14286 +14287 +14288 +14289 +14290 +14291 +14292 +14292 +14293 +14294 +14295 +14296 +14297 +14298 +14298 +14299 +14300 +14301 +14302 +14303 +14304 +14304 +14305 +14306 +14307 +14308 +14309 +14310 +14310 +14311 +14312 +14313 +14314 +14315 +14315 +14316 +14317 +14318 +14319 +14320 +14321 +14321 +14322 +14323 +14324 +14325 +14326 +14326 +14327 +14328 +14329 +14330 +14331 +14332 +14332 +14333 +14334 +14335 +14336 +14336 +14337 +14337 +14338 +14338 +14338 +14339 +14339 +14340 +14340 +14340 +14341 +14341 +14342 +14342 +14343 +14343 +14343 +14344 +14344 +14345 +14345 +14345 +14346 +14346 +14347 +14347 +14348 +14348 +14348 +14349 +14349 +14350 +14350 +14350 +14351 +14351 +14352 +14352 +14353 +14353 +14353 +14354 +14354 +14355 +14355 +14355 +14356 +14356 +14357 +14357 +14357 +14358 +14358 +14359 +14359 +14360 +14360 +14360 +14361 +14361 +14362 +14362 +14362 +14363 +14363 +14364 +14364 +14364 +14365 +14365 +14366 +14366 +14366 +14367 +14367 +14368 +14368 +14369 +14369 +14369 +14370 +14370 +14371 +14371 +14371 +14372 +14372 +14373 +14373 +14373 +14374 +14374 +14375 +14375 +14375 +14376 +14376 +14377 +14377 +14377 +14378 +14378 +14379 +14379 +14379 +14380 +14380 +14381 +14381 +14381 +14382 +14382 +14383 +14383 +14383 +14384 +14384 +14385 +14385 +14385 +14386 +14386 +14387 +14387 +14387 +14388 +14388 +14389 +14389 +14389 +14390 +14390 +14391 +14391 +14391 +14392 +14392 +14393 +14393 +14393 +14394 +14394 +14395 +14395 +14395 +14396 +14396 +14397 +14397 +14397 +14398 +14398 +14399 +14399 +14399 +14400 +14400 +14401 +14401 +14401 +14402 +14402 +14403 +14403 +14403 +14404 +14404 +14405 +14405 +14405 +14406 +14406 +14406 +14407 +14407 +14408 +14408 +14408 +14409 +14409 +14410 +14410 +14410 +14411 +14411 +14412 +14412 +14412 +14413 +14413 +14414 +14414 +14414 +14415 +14415 +14415 +14416 +14416 +14417 +14417 +14417 +14418 +14418 +14419 +14419 +14419 +14420 +14420 +14421 +14421 +14421 +14422 +14422 +14422 +14423 +14423 +14424 +14424 +14424 +14425 +14425 +14426 +14426 +14426 +14427 +14427 +14427 +14428 +14428 +14429 +14429 +14429 +14430 +14430 +14431 +14431 +14431 +14432 +14432 +14432 +14433 +14433 +14434 +14434 +14434 +14435 +14435 +14436 +14436 +14436 +14437 +14437 +14437 +14438 +14438 +14439 +14439 +14439 +14440 +14440 +14440 +14441 +14441 +14442 +14442 +14442 +14443 +14443 +14444 +14444 +14444 +14445 +14445 +14445 +14446 +14446 +14447 +14447 +14447 +14448 +14448 +14448 +14449 +14449 +14450 +14450 +14450 +14451 +14451 +14451 +14452 +14452 +14453 +14453 +14453 +14454 +14454 +14454 +14455 +14455 +14456 +14456 +14456 +14457 +14457 +14457 +14458 +14458 +14459 +14459 +14459 +14460 +14460 +14460 +14461 +14461 +14462 +14462 +14462 +14463 +14463 +14463 +14464 +14464 +14465 +14465 +14465 +14466 +14466 +14466 +14467 +14467 +14468 +14468 +14468 +14469 +14469 +14469 +14470 +14470 +14470 +14471 +14471 +14472 +14472 +14472 +14473 +14473 +14473 +14474 +14474 +14475 +14475 +14475 +14476 +14476 +14476 +14477 +14477 +14477 +14478 +14478 +14479 +14479 +14479 +14480 +14480 +14480 +14481 +14481 +14482 +14482 +14482 +14483 +14483 +14483 +14484 +14484 +14484 +14485 +14485 +14486 +14486 +14486 +14487 +14487 +14487 +14488 +14488 +14488 +14489 +14489 +14490 +14490 +14490 +14491 +14491 +14491 +14492 +14492 +14492 +14493 +14493 +14494 +14494 +14494 +14495 +14495 +14495 +14496 +14496 +14496 +14497 +14497 +14498 +14498 +14498 +14499 +14499 +14499 +14500 +14500 +14500 +14501 +14501 +14501 +14502 +14502 +14503 +14503 +14503 +14504 +14504 +14504 +14505 +14505 +14505 +14506 +14506 +14507 +14507 +14507 +14508 +14508 +14508 +14509 +14509 +14509 +14510 +14510 +14510 +14511 +14511 +14512 +14512 +14512 +14513 +14513 +14513 +14514 +14514 +14514 +14515 +14515 +14515 +14516 +14516 +14517 +14517 +14517 +14518 +14518 +14518 +14519 +14519 +14519 +14520 +14520 +14520 +14521 +14521 +14521 +14522 +14522 +14523 +14523 +14523 +14524 +14524 +14524 +14525 +14525 +14525 +14526 +14526 +14526 +14527 +14527 +14527 +14528 +14528 +14529 +14529 +14529 +14530 +14530 +14530 +14531 +14531 +14531 +14532 +14532 +14532 +14533 +14533 +14533 +14534 +14534 +14534 +14535 +14535 +14536 +14536 +14536 +14537 +14537 +14537 +14538 +14538 +14538 +14539 +14539 +14539 +14540 +14540 +14540 +14541 +14541 +14541 +14542 +14542 +14543 +14543 +14543 +14544 +14544 +14544 +14545 +14545 +14545 +14546 +14546 +14546 +14547 +14547 +14547 +14548 +14548 +14548 +14549 +14549 +14549 +14550 +14550 +14550 +14551 +14551 +14552 +14552 +14552 +14553 +14553 +14553 +14554 +14554 +14554 +14555 +14555 +14555 +14556 +14556 +14556 +14557 +14557 +14557 +14558 +14558 +14558 +14559 +14559 +14559 +14560 +14560 +14560 +14561 +14561 +14561 +14562 +14562 +14562 +14563 +14563 +14564 +14564 +14564 +14565 +14565 +14565 +14566 +14566 +14566 +14567 +14567 +14567 +14568 +14568 +14568 +14569 +14569 +14569 +14570 +14570 +14570 +14571 +14571 +14571 +14572 +14572 +14572 +14573 +14573 +14573 +14574 +14574 +14574 +14575 +14575 +14575 +14576 +14576 +14576 +14577 +14577 +14577 +14578 +14578 +14578 +14579 +14579 +14579 +14580 +14580 +14580 +14581 +14581 +14581 +14582 +14582 +14582 +14583 +14583 +14583 +14584 +14584 +14584 +14585 +14585 +14585 +14586 +14586 +14586 +14587 +14587 +14588 +14588 +14588 +14589 +14589 +14589 +14590 +14590 +14590 +14591 +14591 +14591 +14592 +14592 +14592 +14593 +14593 +14593 +14594 +14594 +14594 +14595 +14595 +14595 +14596 +14596 +14596 +14597 +14597 +14597 +14597 +14598 +14598 +14598 +14599 +14599 +14599 +14600 +14600 +14600 +14601 +14601 +14601 +14602 +14602 +14602 +14603 +14603 +14603 +14604 +14604 +14604 +14605 +14605 +14605 +14606 +14606 +14606 +14607 +14608 +14608 +14609 +14610 +14610 +14611 +14612 +14612 +14613 +14614 +14614 +14615 +14616 +14616 +14617 +14618 +14618 +14619 +14620 +14620 +14621 +14621 +14622 +14623 +14623 +14624 +14625 +14625 +14626 +14627 +14627 +14628 +14629 +14629 +14630 +14631 +14631 +14632 +14632 +14633 +14634 +14634 +14635 +14636 +14636 +14637 +14638 +14638 +14639 +14640 +14640 +14641 +14641 +14642 +14643 +14643 +14644 +14645 +14645 +14646 +14647 +14647 +14648 +14649 +14649 +14650 +14650 +14651 +14652 +14652 +14653 +14654 +14654 +14655 +14656 +14656 +14657 +14657 +14658 +14659 +14659 +14660 +14661 +14661 +14662 +14662 +14663 +14664 +14664 +14665 +14666 +14666 +14667 +14667 +14668 +14669 +14669 +14670 +14671 +14671 +14672 +14672 +14673 +14674 +14674 +14675 +14676 +14676 +14677 +14677 +14678 +14679 +14679 +14680 +14681 +14681 +14682 +14682 +14683 +14684 +14684 +14685 +14686 +14686 +14687 +14687 +14688 +14689 +14689 +14690 +14690 +14691 +14692 +14692 +14693 +14694 +14694 +14695 +14695 +14696 +14697 +14697 +14698 +14698 +14699 +14700 +14700 +14701 +14702 +14702 +14703 +14703 +14704 +14705 +14705 +14706 +14706 +14707 +14708 +14708 +14709 +14709 +14710 +14711 +14711 +14712 +14712 +14713 +14714 +14714 +14715 +14716 +14716 +14717 +14717 +14718 +14719 +14719 +14720 +14720 +14721 +14722 +14722 +14723 +14723 +14724 +14725 +14725 +14726 +14726 +14727 +14728 +14728 +14729 +14729 +14730 +14731 +14731 +14732 +14732 +14733 +14734 +14734 +14735 +14735 +14736 +14737 +14737 +14738 +14738 +14739 +14739 +14740 +14741 +14741 +14742 +14742 +14743 +14744 +14744 +14745 +14745 +14746 +14747 +14747 +14748 +14748 +14749 +14750 +14750 +14751 +14751 +14752 +14752 +14753 +14754 +14754 +14755 +14755 +14756 +14757 +14757 +14758 +14758 +14759 +14760 +14760 +14761 +14761 +14762 +14762 +14763 +14764 +14764 +14765 +14765 +14766 +14767 +14767 +14768 +14768 +14769 +14769 +14770 +14771 +14771 +14772 +14772 +14773 +14773 +14774 +14775 +14775 +14776 +14776 +14777 +14778 +14778 +14779 +14779 +14780 +14780 +14781 +14782 +14782 +14783 +14783 +14784 +14784 +14785 +14786 +14786 +14787 +14787 +14788 +14788 +14789 +14790 +14790 +14791 +14791 +14792 +14792 +14793 +14794 +14794 +14795 +14795 +14796 +14796 +14797 +14798 +14798 +14799 +14799 +14800 +14800 +14801 +14802 +14802 +14803 +14803 +14804 +14804 +14805 +14806 +14806 +14807 +14807 +14808 +14808 +14809 +14810 +14810 +14811 +14811 +14812 +14812 +14813 +14813 +14814 +14815 +14815 +14816 +14816 +14817 +14817 +14818 +14818 +14819 +14820 +14820 +14821 +14821 +14822 +14822 +14823 +14824 +14824 +14825 +14825 +14826 +14826 +14827 +14827 +14828 +14829 +14829 +14830 +14830 +14831 +14831 +14832 +14832 +14833 +14834 +14834 +14835 +14835 +14836 +14836 +14837 +14837 +14838 +14839 +14839 +14840 +14840 +14841 +14841 +14842 +14842 +14843 +14843 +14844 +14845 +14845 +14846 +14846 +14847 +14847 +14848 +14848 +14849 +14850 +14850 +14851 +14851 +14852 +14852 +14853 +14853 +14854 +14854 +14855 +14856 +14856 +14857 +14857 +14858 +14858 +14859 +14859 +14860 +14860 +14861 +14862 +14862 +14863 +14863 +14864 +14864 +14865 +14865 +14866 +14866 +14867 +14868 +14868 +14869 +14869 +14870 +14870 +14871 +14871 +14872 +14872 +14873 +14873 +14874 +14875 +14875 +14876 +14876 +14877 +14877 +14878 +14878 +14879 +14879 +14880 +14880 +14881 +14882 +14882 +14883 +14883 +14884 +14884 +14885 +14885 +14886 +14886 +14887 +14887 +14888 +14888 +14889 +14890 +14890 +14891 +14891 +14892 +14892 +14893 +14893 +14894 +14894 +14895 +14895 +14896 +14896 +14897 +14898 +14898 +14899 +14899 +14900 +14900 +14901 +14901 +14902 +14902 +14903 +14903 +14904 +14904 +14905 +14905 +14906 +14907 +14907 +14908 +14908 +14909 +14909 +14910 +14910 +14911 +14911 +14912 +14912 +14913 +14913 +14914 +14914 +14915 +14915 +14916 +14916 +14917 +14918 +14918 +14919 +14919 +14920 +14920 +14921 +14921 +14922 +14922 +14923 +14923 +14924 +14924 +14925 +14925 +14926 +14926 +14927 +14927 +14928 +14928 +14929 +14930 +14930 +14931 +14931 +14932 +14932 +14933 +14933 +14934 +14934 +14935 +14935 +14936 +14936 +14937 +14937 +14938 +14938 +14939 +14939 +14940 +14940 +14941 +14941 +14942 +14942 +14943 +14943 +14944 +14945 +14945 +14946 +14946 +14947 +14947 +14948 +14948 +14949 +14949 +14950 +14950 +14951 +14951 +14952 +14952 +14953 +14953 +14954 +14954 +14955 +14955 +14956 +14956 +14957 +14957 +14958 +14958 +14959 +14959 +14960 +14960 +14961 +14961 +14962 +14962 +14963 +14963 +14964 +14964 +14965 +14965 +14966 +14966 +14967 +14967 +14968 +14968 +14969 +14969 +14970 +14970 +14971 +14971 +14972 +14973 +14973 +14974 +14974 +14975 +14975 +14976 +14976 +14977 +14977 +14978 +14978 +14979 +14979 +14980 +14980 +14981 +14981 +14982 +14982 +14983 +14983 +14984 +14984 +14985 +14985 +14986 +14986 +14987 +14987 +14988 +14988 +14989 +14989 +14990 +14990 +14991 +14991 +14992 +14992 +14993 +14993 +14994 +14994 +14995 +14995 +14996 +14996 +14997 +14997 +14998 +14998 +14999 +14999 +15000 +15000 +15000 +15001 +15001 +15002 +15002 +15003 +15003 +15004 +15004 +15005 +15005 +15006 +15006 +15007 +15007 +15008 +15008 +15009 +15009 +15010 +15010 +15011 +15011 +15012 +15012 +15013 +15013 +15014 +15014 +15015 +15015 +15016 +15016 +15017 +15017 +15018 +15018 +15019 +15019 +15020 +15020 +15021 +15021 +15022 +15022 +15023 +15023 +15024 +15024 +15025 +15025 +15026 +15026 +15027 +15027 +15028 +15028 +15028 +15029 +15029 +15030 +15030 +15031 +15031 +15032 +15032 +15033 +15033 +15034 +15034 +15035 +15035 +15036 +15036 +15037 +15037 +15038 +15038 +15039 +15039 +15040 +15040 +15041 +15041 +15042 +15042 +15043 +15043 +15043 +15044 +15044 +15045 +15045 +15046 +15046 +15047 +15047 +15048 +15048 +15049 +15049 +15050 +15050 +15051 +15051 +15052 +15052 +15053 +15053 +15054 +15054 +15055 +15055 +15055 +15056 +15056 +15057 +15057 +15058 +15058 +15059 +15059 +15060 +15060 +15061 +15061 +15062 +15062 +15063 +15063 +15064 +15064 +15065 +15065 +15066 +15066 +15066 +15067 +15067 +15068 +15068 +15069 +15069 +15070 +15070 +15071 +15071 +15072 +15072 +15073 +15073 +15074 +15074 +15075 +15075 +15075 +15076 +15076 +15077 +15077 +15078 +15078 +15079 +15079 +15080 +15080 +15081 +15081 +15082 +15082 +15083 +15083 +15083 +15084 +15084 +15085 +15085 +15086 +15086 +15087 +15087 +15088 +15088 +15089 +15089 +15090 +15090 +15091 +15091 +15091 +15092 +15092 +15093 +15093 +15094 +15094 +15095 +15095 +15096 +15096 +15097 +15097 +15098 +15098 +15098 +15099 +15099 +15100 +15100 +15101 +15101 +15102 +15102 +15103 +15103 +15104 +15104 +15104 +15105 +15105 +15106 +15106 +15107 +15107 +15108 +15108 +15109 +15109 +15110 +15110 +15111 +15111 +15111 +15112 +15112 +15113 +15113 +15114 +15114 +15115 +15115 +15116 +15116 +15117 +15117 +15117 +15118 +15118 +15119 +15119 +15120 +15120 +15121 +15121 +15122 +15122 +15122 +15123 +15123 +15124 +15124 +15125 +15125 +15126 +15126 +15127 +15127 +15128 +15128 +15128 +15129 +15129 +15130 +15130 +15131 +15131 +15132 +15132 +15133 +15133 +15133 +15134 +15134 +15135 +15135 +15136 +15136 +15137 +15137 +15138 +15138 +15138 +15139 +15139 +15140 +15140 +15141 +15141 +15142 +15142 +15143 +15143 +15143 +15144 +15144 +15145 +15145 +15146 +15146 +15147 +15147 +15148 +15148 +15148 +15149 +15149 +15150 +15150 +15151 +15151 +15152 +15152 +15152 +15153 +15153 +15154 +15154 +15155 +15155 +15156 +15157 +15158 +15159 +15160 +15161 +15161 +15162 +15163 +15164 +15165 +15166 +15167 +15168 +15169 +15170 +15170 +15171 +15172 +15173 +15174 +15175 +15176 +15177 +15178 +15178 +15179 +15180 +15181 +15182 +15183 +15184 +15185 +15186 +15186 +15187 +15188 +15189 +15190 +15191 +15192 +15193 +15193 +15194 +15195 +15196 +15197 +15198 +15199 +15200 +15200 +15201 +15202 +15203 +15204 +15205 +15206 +15207 +15207 +15208 +15209 +15210 +15211 +15212 +15213 +15214 +15214 +15215 +15216 +15217 +15218 +15219 +15220 +15221 +15221 +15222 +15223 +15224 +15225 +15226 +15227 +15227 +15228 +15229 +15230 +15231 +15232 +15233 +15233 +15234 +15235 +15236 +15237 +15238 +15239 +15239 +15240 +15241 +15242 +15243 +15244 +15245 +15245 +15246 +15247 +15248 +15249 +15250 +15251 +15251 +15252 +15253 +15254 +15255 +15256 +15257 +15257 +15258 +15259 +15260 +15261 +15262 +15262 +15263 +15264 +15265 +15266 +15267 +15268 +15268 +15269 +15270 +15271 +15272 +15273 +15273 +15274 +15275 +15276 +15277 +15278 +15278 +15279 +15280 +15281 +15282 +15283 +15283 +15284 +15285 +15286 +15287 +15288 +15288 +15289 +15290 +15291 +15292 +15293 +15293 +15294 +15295 +15296 +15297 +15298 +15298 +15299 +15300 +15301 +15302 +15303 +15303 +15304 +15305 +15306 +15307 +15308 +15308 +15309 +15310 +15311 +15312 +15312 +15313 +15314 +15315 +15316 +15317 +15317 +15318 +15319 +15320 +15321 +15321 +15322 +15323 +15324 +15325 +15326 +15326 +15327 +15328 +15329 +15330 +15330 +15331 +15332 +15333 +15334 +15335 +15335 +15336 +15337 +15338 +15339 +15339 +15340 +15341 +15342 +15343 +15343 +15344 +15345 +15346 +15347 +15347 +15348 +15349 +15350 +15351 +15352 +15352 +15353 +15354 +15355 +15356 +15356 +15357 +15358 +15359 +15360 +15360 +15361 +15361 +15361 +15362 +15362 +15363 +15363 +15363 +15364 +15364 +15365 +15365 +15365 +15366 +15366 +15367 +15367 +15367 +15368 +15368 +15369 +15369 +15369 +15370 +15370 +15371 +15371 +15371 +15372 +15372 +15373 +15373 +15373 +15374 +15374 +15374 +15375 +15375 +15376 +15376 +15376 +15377 +15377 +15378 +15378 +15378 +15379 +15379 +15380 +15380 +15380 +15381 +15381 +15382 +15382 +15382 +15383 +15383 +15384 +15384 +15384 +15385 +15385 +15385 +15386 +15386 +15387 +15387 +15387 +15388 +15388 +15389 +15389 +15389 +15390 +15390 +15391 +15391 +15391 +15392 +15392 +15392 +15393 +15393 +15394 +15394 +15394 +15395 +15395 +15396 +15396 +15396 +15397 +15397 +15397 +15398 +15398 +15399 +15399 +15399 +15400 +15400 +15401 +15401 +15401 +15402 +15402 +15402 +15403 +15403 +15404 +15404 +15404 +15405 +15405 +15406 +15406 +15406 +15407 +15407 +15407 +15408 +15408 +15409 +15409 +15409 +15410 +15410 +15410 +15411 +15411 +15412 +15412 +15412 +15413 +15413 +15413 +15414 +15414 +15415 +15415 +15415 +15416 +15416 +15417 +15417 +15417 +15418 +15418 +15418 +15419 +15419 +15420 +15420 +15420 +15421 +15421 +15421 +15422 +15422 +15423 +15423 +15423 +15424 +15424 +15424 +15425 +15425 +15426 +15426 +15426 +15427 +15427 +15427 +15428 +15428 +15429 +15429 +15429 +15430 +15430 +15430 +15431 +15431 +15431 +15432 +15432 +15433 +15433 +15433 +15434 +15434 +15434 +15435 +15435 +15436 +15436 +15436 +15437 +15437 +15437 +15438 +15438 +15439 +15439 +15439 +15440 +15440 +15440 +15441 +15441 +15441 +15442 +15442 +15443 +15443 +15443 +15444 +15444 +15444 +15445 +15445 +15446 +15446 +15446 +15447 +15447 +15447 +15448 +15448 +15448 +15449 +15449 +15450 +15450 +15450 +15451 +15451 +15451 +15452 +15452 +15452 +15453 +15453 +15454 +15454 +15454 +15455 +15455 +15455 +15456 +15456 +15456 +15457 +15457 +15458 +15458 +15458 +15459 +15459 +15459 +15460 +15460 +15460 +15461 +15461 +15461 +15462 +15462 +15463 +15463 +15463 +15464 +15464 +15464 +15465 +15465 +15465 +15466 +15466 +15467 +15467 +15467 +15468 +15468 +15468 +15469 +15469 +15469 +15470 +15470 +15470 +15471 +15471 +15472 +15472 +15472 +15473 +15473 +15473 +15474 +15474 +15474 +15475 +15475 +15475 +15476 +15476 +15477 +15477 +15477 +15478 +15478 +15478 +15479 +15479 +15479 +15480 +15480 +15480 +15481 +15481 +15481 +15482 +15482 +15483 +15483 +15483 +15484 +15484 +15484 +15485 +15485 +15485 +15486 +15486 +15486 +15487 +15487 +15487 +15488 +15488 +15489 +15489 +15489 +15490 +15490 +15490 +15491 +15491 +15491 +15492 +15492 +15492 +15493 +15493 +15493 +15494 +15494 +15494 +15495 +15495 +15496 +15496 +15496 +15497 +15497 +15497 +15498 +15498 +15498 +15499 +15499 +15499 +15500 +15500 +15500 +15501 +15501 +15501 +15502 +15502 +15502 +15503 +15503 +15503 +15504 +15504 +15505 +15505 +15505 +15506 +15506 +15506 +15507 +15507 +15507 +15508 +15508 +15508 +15509 +15509 +15509 +15510 +15510 +15510 +15511 +15511 +15511 +15512 +15512 +15512 +15513 +15513 +15513 +15514 +15514 +15515 +15515 +15515 +15516 +15516 +15516 +15517 +15517 +15517 +15518 +15518 +15518 +15519 +15519 +15519 +15520 +15520 +15520 +15521 +15521 +15521 +15522 +15522 +15522 +15523 +15523 +15523 +15524 +15524 +15524 +15525 +15525 +15525 +15526 +15526 +15526 +15527 +15527 +15527 +15528 +15528 +15528 +15529 +15529 +15529 +15530 +15530 +15530 +15531 +15531 +15531 +15532 +15532 +15532 +15533 +15533 +15534 +15534 +15534 +15535 +15535 +15535 +15536 +15536 +15536 +15537 +15537 +15537 +15538 +15538 +15538 +15539 +15539 +15539 +15540 +15540 +15540 +15541 +15541 +15541 +15542 +15542 +15542 +15543 +15543 +15543 +15544 +15544 +15544 +15545 +15545 +15545 +15546 +15546 +15546 +15547 +15547 +15547 +15548 +15548 +15548 +15549 +15549 +15549 +15550 +15550 +15550 +15551 +15551 +15551 +15552 +15552 +15552 +15552 +15553 +15553 +15553 +15554 +15554 +15554 +15555 +15555 +15555 +15556 +15556 +15556 +15557 +15557 +15557 +15558 +15558 +15558 +15559 +15559 +15559 +15560 +15560 +15560 +15561 +15561 +15561 +15562 +15562 +15562 +15563 +15563 +15563 +15564 +15564 +15564 +15565 +15565 +15565 +15566 +15566 +15566 +15567 +15567 +15567 +15568 +15568 +15568 +15569 +15569 +15569 +15570 +15570 +15570 +15571 +15571 +15571 +15571 +15572 +15572 +15572 +15573 +15573 +15573 +15574 +15574 +15574 +15575 +15575 +15575 +15576 +15576 +15576 +15577 +15577 +15577 +15578 +15578 +15578 +15579 +15579 +15579 +15580 +15580 +15580 +15581 +15581 +15581 +15582 +15582 +15582 +15582 +15583 +15583 +15583 +15584 +15584 +15584 +15585 +15585 +15585 +15586 +15586 +15586 +15587 +15587 +15587 +15588 +15588 +15588 +15589 +15589 +15589 +15590 +15590 +15590 +15590 +15591 +15591 +15591 +15592 +15592 +15592 +15593 +15593 +15593 +15594 +15594 +15594 +15595 +15595 +15595 +15596 +15596 +15596 +15597 +15597 +15597 +15597 +15598 +15598 +15598 +15599 +15599 +15599 +15600 +15600 +15600 +15601 +15601 +15601 +15602 +15602 +15602 +15603 +15603 +15603 +15603 +15604 +15604 +15604 +15605 +15605 +15605 +15606 +15606 +15606 +15607 +15607 +15607 +15608 +15608 +15608 +15609 +15609 +15609 +15609 +15610 +15610 +15610 +15611 +15611 +15611 +15612 +15612 +15612 +15613 +15613 +15613 +15614 +15614 +15614 +15614 +15615 +15615 +15615 +15616 +15616 +15616 +15617 +15617 +15617 +15618 +15618 +15618 +15619 +15619 +15619 +15619 +15620 +15620 +15620 +15621 +15621 +15621 +15622 +15622 +15622 +15623 +15623 +15623 +15623 +15624 +15624 +15624 +15625 +15625 +15625 +15626 +15626 +15626 +15627 +15627 +15627 +15627 +15628 +15628 +15628 +15629 +15629 +15629 +15630 +15630 +15630 +15631 +15631 +15631 +15632 +15632 +15632 +15632 +15633 +15634 +15634 +15635 +15635 +15636 +15637 +15637 +15638 +15639 +15639 +15640 +15640 +15641 +15642 +15642 +15643 +15643 +15644 +15645 +15645 +15646 +15646 +15647 +15648 +15648 +15649 +15650 +15650 +15651 +15651 +15652 +15653 +15653 +15654 +15654 +15655 +15656 +15656 +15657 +15657 +15658 +15659 +15659 +15660 +15660 +15661 +15662 +15662 +15663 +15663 +15664 +15665 +15665 +15666 +15666 +15667 +15668 +15668 +15669 +15669 +15670 +15671 +15671 +15672 +15672 +15673 +15673 +15674 +15675 +15675 +15676 +15676 +15677 +15678 +15678 +15679 +15679 +15680 +15681 +15681 +15682 +15682 +15683 +15684 +15684 +15685 +15685 +15686 +15686 +15687 +15688 +15688 +15689 +15689 +15690 +15691 +15691 +15692 +15692 +15693 +15693 +15694 +15695 +15695 +15696 +15696 +15697 +15698 +15698 +15699 +15699 +15700 +15700 +15701 +15702 +15702 +15703 +15703 +15704 +15705 +15705 +15706 +15706 +15707 +15707 +15708 +15709 +15709 +15710 +15710 +15711 +15711 +15712 +15713 +15713 +15714 +15714 +15715 +15715 +15716 +15717 +15717 +15718 +15718 +15719 +15719 +15720 +15721 +15721 +15722 +15722 +15723 +15723 +15724 +15725 +15725 +15726 +15726 +15727 +15727 +15728 +15729 +15729 +15730 +15730 +15731 +15731 +15732 +15733 +15733 +15734 +15734 +15735 +15735 +15736 +15736 +15737 +15738 +15738 +15739 +15739 +15740 +15740 +15741 +15742 +15742 +15743 +15743 +15744 +15744 +15745 +15745 +15746 +15747 +15747 +15748 +15748 +15749 +15749 +15750 +15750 +15751 +15752 +15752 +15753 +15753 +15754 +15754 +15755 +15755 +15756 +15757 +15757 +15758 +15758 +15759 +15759 +15760 +15760 +15761 +15762 +15762 +15763 +15763 +15764 +15764 +15765 +15765 +15766 +15767 +15767 +15768 +15768 +15769 +15769 +15770 +15770 +15771 +15771 +15772 +15773 +15773 +15774 +15774 +15775 +15775 +15776 +15776 +15777 +15777 +15778 +15779 +15779 +15780 +15780 +15781 +15781 +15782 +15782 +15783 +15783 +15784 +15785 +15785 +15786 +15786 +15787 +15787 +15788 +15788 +15789 +15789 +15790 +15790 +15791 +15792 +15792 +15793 +15793 +15794 +15794 +15795 +15795 +15796 +15796 +15797 +15797 +15798 +15799 +15799 +15800 +15800 +15801 +15801 +15802 +15802 +15803 +15803 +15804 +15804 +15805 +15805 +15806 +15807 +15807 +15808 +15808 +15809 +15809 +15810 +15810 +15811 +15811 +15812 +15812 +15813 +15813 +15814 +15815 +15815 +15816 +15816 +15817 +15817 +15818 +15818 +15819 +15819 +15820 +15820 +15821 +15821 +15822 +15822 +15823 +15823 +15824 +15825 +15825 +15826 +15826 +15827 +15827 +15828 +15828 +15829 +15829 +15830 +15830 +15831 +15831 +15832 +15832 +15833 +15833 +15834 +15834 +15835 +15836 +15836 +15837 +15837 +15838 +15838 +15839 +15839 +15840 +15840 +15841 +15841 +15842 +15842 +15843 +15843 +15844 +15844 +15845 +15845 +15846 +15846 +15847 +15847 +15848 +15848 +15849 +15850 +15850 +15851 +15851 +15852 +15852 +15853 +15853 +15854 +15854 +15855 +15855 +15856 +15856 +15857 +15857 +15858 +15858 +15859 +15859 +15860 +15860 +15861 +15861 +15862 +15862 +15863 +15863 +15864 +15864 +15865 +15865 +15866 +15866 +15867 +15867 +15868 +15868 +15869 +15869 +15870 +15870 +15871 +15871 +15872 +15872 +15873 +15874 +15874 +15875 +15875 +15876 +15876 +15877 +15877 +15878 +15878 +15879 +15879 +15880 +15880 +15881 +15881 +15882 +15882 +15883 +15883 +15884 +15884 +15885 +15885 +15886 +15886 +15887 +15887 +15888 +15888 +15889 +15889 +15890 +15890 +15891 +15891 +15892 +15892 +15893 +15893 +15894 +15894 +15895 +15895 +15896 +15896 +15897 +15897 +15898 +15898 +15899 +15899 +15900 +15900 +15901 +15901 +15902 +15902 +15903 +15903 +15904 +15904 +15905 +15905 +15906 +15906 +15907 +15907 +15907 +15908 +15908 +15909 +15909 +15910 +15910 +15911 +15911 +15912 +15912 +15913 +15913 +15914 +15914 +15915 +15915 +15916 +15916 +15917 +15917 +15918 +15918 +15919 +15919 +15920 +15920 +15921 +15921 +15922 +15922 +15923 +15923 +15924 +15924 +15925 +15925 +15926 +15926 +15927 +15927 +15928 +15928 +15929 +15929 +15930 +15930 +15931 +15931 +15931 +15932 +15932 +15933 +15933 +15934 +15934 +15935 +15935 +15936 +15936 +15937 +15937 +15938 +15938 +15939 +15939 +15940 +15940 +15941 +15941 +15942 +15942 +15943 +15943 +15944 +15944 +15945 +15945 +15945 +15946 +15946 +15947 +15947 +15948 +15948 +15949 +15949 +15950 +15950 +15951 +15951 +15952 +15952 +15953 +15953 +15954 +15954 +15955 +15955 +15956 +15956 +15956 +15957 +15957 +15958 +15958 +15959 +15959 +15960 +15960 +15961 +15961 +15962 +15962 +15963 +15963 +15964 +15964 +15965 +15965 +15965 +15966 +15966 +15967 +15967 +15968 +15968 +15969 +15969 +15970 +15970 +15971 +15971 +15972 +15972 +15973 +15973 +15974 +15974 +15974 +15975 +15975 +15976 +15976 +15977 +15977 +15978 +15978 +15979 +15979 +15980 +15980 +15981 +15981 +15982 +15982 +15982 +15983 +15983 +15984 +15984 +15985 +15985 +15986 +15986 +15987 +15987 +15988 +15988 +15989 +15989 +15989 +15990 +15990 +15991 +15991 +15992 +15992 +15993 +15993 +15994 +15994 +15995 +15995 +15995 +15996 +15996 +15997 +15997 +15998 +15998 +15999 +15999 +16000 +16000 +16001 +16001 +16001 +16002 +16002 +16003 +16003 +16004 +16004 +16005 +16005 +16006 +16006 +16007 +16007 +16007 +16008 +16008 +16009 +16009 +16010 +16010 +16011 +16011 +16012 +16012 +16013 +16013 +16013 +16014 +16014 +16015 +16015 +16016 +16016 +16017 +16017 +16018 +16018 +16018 +16019 +16019 +16020 +16020 +16021 +16021 +16022 +16022 +16023 +16023 +16023 +16024 +16024 +16025 +16025 +16026 +16026 +16027 +16027 +16028 +16028 +16028 +16029 +16029 +16030 +16030 +16031 +16031 +16032 +16032 +16033 +16033 +16033 +16034 +16034 +16035 +16035 +16036 +16036 +16037 +16037 +16038 +16038 +16038 +16039 +16039 +16040 +16040 +16041 +16041 +16042 +16042 +16042 +16043 +16043 +16044 +16044 +16045 +16045 +16046 +16046 +16047 +16047 +16047 +16048 +16048 +16049 +16049 +16050 +16050 +16051 +16051 +16051 +16052 +16052 +16053 +16053 +16054 +16054 +16055 +16055 +16055 +16056 +16056 +16057 +16057 +16058 +16058 +16059 +16059 +16059 +16060 +16060 +16061 +16061 +16062 +16062 +16063 +16063 +16063 +16064 +16064 +16065 +16065 +16066 +16066 +16067 +16067 +16067 +16068 +16068 +16069 +16069 +16070 +16070 +16070 +16071 +16071 +16072 +16072 +16073 +16073 +16074 +16074 +16074 +16075 +16075 +16076 +16076 +16077 +16077 +16078 +16078 +16078 +16079 +16079 +16080 +16080 +16081 +16081 +16081 +16082 +16082 +16083 +16083 +16084 +16084 +16085 +16085 +16085 +16086 +16086 +16087 +16087 +16088 +16088 +16088 +16089 +16089 +16090 +16090 +16091 +16091 +16091 +16092 +16092 +16093 +16093 +16094 +16094 +16095 +16095 +16095 +16096 +16096 +16097 +16097 +16098 +16098 +16098 +16099 +16099 +16100 +16100 +16101 +16101 +16101 +16102 +16102 +16103 +16103 +16104 +16104 +16104 +16105 +16105 +16106 +16106 +16107 +16107 +16107 +16108 +16108 +16109 +16109 +16110 +16110 +16110 +16111 +16111 +16112 +16112 +16113 +16113 +16113 +16114 +16114 +16115 +16115 +16116 +16116 +16116 +16117 +16117 +16118 +16118 +16119 +16119 +16119 +16120 +16120 +16121 +16121 +16122 +16122 +16122 +16123 +16123 +16124 +16124 +16125 +16125 +16125 +16126 +16126 +16127 +16127 +16128 +16128 +16128 +16129 +16129 +16130 +16130 +16131 +16131 +16131 +16132 +16132 +16133 +16133 +16133 +16134 +16134 +16135 +16135 +16136 +16136 +16136 +16137 +16137 +16138 +16138 +16139 +16139 +16139 +16140 +16140 +16141 +16141 +16142 +16142 +16142 +16143 +16143 +16144 +16144 +16144 +16145 +16146 +16147 +16148 +16149 +16149 +16150 +16151 +16152 +16153 +16154 +16154 +16155 +16156 +16157 +16158 +16159 +16159 +16160 +16161 +16162 +16163 +16164 +16164 +16165 +16166 +16167 +16168 +16169 +16169 +16170 +16171 +16172 +16173 +16174 +16174 +16175 +16176 +16177 +16178 +16179 +16179 +16180 +16181 +16182 +16183 +16183 +16184 +16185 +16186 +16187 +16188 +16188 +16189 +16190 +16191 +16192 +16192 +16193 +16194 +16195 +16196 +16196 +16197 +16198 +16199 +16200 +16201 +16201 +16202 +16203 +16204 +16205 +16205 +16206 +16207 +16208 +16209 +16209 +16210 +16211 +16212 +16213 +16213 +16214 +16215 +16216 +16217 +16217 +16218 +16219 +16220 +16221 +16221 +16222 +16223 +16224 +16225 +16225 +16226 +16227 +16228 +16229 +16229 +16230 +16231 +16232 +16233 +16233 +16234 +16235 +16236 +16237 +16237 +16238 +16239 +16240 +16241 +16241 +16242 +16243 +16244 +16245 +16245 +16246 +16247 +16248 +16248 +16249 +16250 +16251 +16252 +16252 +16253 +16254 +16255 +16256 +16256 +16257 +16258 +16259 +16259 +16260 +16261 +16262 +16263 +16263 +16264 +16265 +16266 +16266 +16267 +16268 +16269 +16270 +16270 +16271 +16272 +16273 +16273 +16274 +16275 +16276 +16277 +16277 +16278 +16279 +16280 +16280 +16281 +16282 +16283 +16284 +16284 +16285 +16286 +16287 +16287 +16288 +16289 +16290 +16290 +16291 +16292 +16293 +16293 +16294 +16295 +16296 +16297 +16297 +16298 +16299 +16300 +16300 +16301 +16302 +16303 +16303 +16304 +16305 +16306 +16306 +16307 +16308 +16309 +16310 +16310 +16311 +16312 +16313 +16313 +16314 +16315 +16316 +16316 +16317 +16318 +16319 +16319 +16320 +16321 +16322 +16322 +16323 +16324 +16325 +16325 +16326 +16327 +16328 +16328 +16329 +16330 +16331 +16331 +16332 +16333 +16334 +16334 +16335 +16336 +16337 +16337 +16338 +16339 +16340 +16340 +16341 +16342 +16343 +16343 +16344 +16345 +16346 +16346 +16347 +16348 +16349 +16349 +16350 +16351 +16351 +16352 +16353 +16354 +16354 +16355 +16356 +16357 +16357 +16358 +16359 +16360 +16360 +16361 +16362 +16363 +16363 +16364 +16365 +16365 +16366 +16367 +16368 +16368 +16369 +16370 +16371 +16371 +16372 +16373 +16374 +16374 +16375 +16376 +16376 +16377 +16378 +16379 +16379 +16380 +16381 +16382 +16382 +16383 +16384 +16384 +16385 +16385 +16385 +16386 +16386 +16386 +16387 +16387 +16388 +16388 +16388 +16389 +16389 +16389 +16390 +16390 +16390 +16391 +16391 +16391 +16392 +16392 +16393 +16393 +16393 +16394 +16394 +16394 +16395 +16395 +16395 +16396 +16396 +16397 +16397 +16397 +16398 +16398 +16398 +16399 +16399 +16399 +16400 +16400 +16400 +16401 +16401 +16402 +16402 +16402 +16403 +16403 +16403 +16404 +16404 +16404 +16405 +16405 +16405 +16406 +16406 +16406 +16407 +16407 +16408 +16408 +16408 +16409 +16409 +16409 +16410 +16410 +16410 +16411 +16411 +16411 +16412 +16412 +16412 +16413 +16413 +16414 +16414 +16414 +16415 +16415 +16415 +16416 +16416 +16416 +16417 +16417 +16417 +16418 +16418 +16418 +16419 +16419 +16420 +16420 +16420 +16421 +16421 +16421 +16422 +16422 +16422 +16423 +16423 +16423 +16424 +16424 +16424 +16425 +16425 +16425 +16426 +16426 +16426 +16427 +16427 +16428 +16428 +16428 +16429 +16429 +16429 +16430 +16430 +16430 +16431 +16431 +16431 +16432 +16432 +16432 +16433 +16433 +16433 +16434 +16434 +16434 +16435 +16435 +16435 +16436 +16436 +16436 +16437 +16437 +16437 +16438 +16438 +16439 +16439 +16439 +16440 +16440 +16440 +16441 +16441 +16441 +16442 +16442 +16442 +16443 +16443 +16443 +16444 +16444 +16444 +16445 +16445 +16445 +16446 +16446 +16446 +16447 +16447 +16447 +16448 +16448 +16448 +16449 +16449 +16449 +16450 +16450 +16450 +16451 +16451 +16451 +16452 +16452 +16452 +16453 +16453 +16453 +16454 +16454 +16454 +16455 +16455 +16455 +16456 +16456 +16456 +16457 +16457 +16457 +16458 +16458 +16458 +16459 +16459 +16459 +16460 +16460 +16460 +16461 +16461 +16461 +16462 +16462 +16462 +16463 +16463 +16463 +16464 +16464 +16464 +16465 +16465 +16465 +16466 +16466 +16466 +16467 +16467 +16467 +16468 +16468 +16468 +16469 +16469 +16469 +16470 +16470 +16470 +16471 +16471 +16471 +16472 +16472 +16472 +16473 +16473 +16473 +16474 +16474 +16474 +16475 +16475 +16475 +16476 +16476 +16476 +16477 +16477 +16477 +16478 +16478 +16478 +16479 +16479 +16479 +16480 +16480 +16480 +16481 +16481 +16481 +16482 +16482 +16482 +16483 +16483 +16483 +16484 +16484 +16484 +16485 +16485 +16485 +16486 +16486 +16486 +16487 +16487 +16487 +16488 +16488 +16488 +16488 +16489 +16489 +16489 +16490 +16490 +16490 +16491 +16491 +16491 +16492 +16492 +16492 +16493 +16493 +16493 +16494 +16494 +16494 +16495 +16495 +16495 +16496 +16496 +16496 +16497 +16497 +16497 +16498 +16498 +16498 +16498 +16499 +16499 +16499 +16500 +16500 +16500 +16501 +16501 +16501 +16502 +16502 +16502 +16503 +16503 +16503 +16504 +16504 +16504 +16505 +16505 +16505 +16506 +16506 +16506 +16506 +16507 +16507 +16507 +16508 +16508 +16508 +16509 +16509 +16509 +16510 +16510 +16510 +16511 +16511 +16511 +16512 +16512 +16512 +16513 +16513 +16513 +16513 +16514 +16514 +16514 +16515 +16515 +16515 +16516 +16516 +16516 +16517 +16517 +16517 +16518 +16518 +16518 +16519 +16519 +16519 +16519 +16520 +16520 +16520 +16521 +16521 +16521 +16522 +16522 +16522 +16523 +16523 +16523 +16524 +16524 +16524 +16524 +16525 +16525 +16525 +16526 +16526 +16526 +16527 +16527 +16527 +16528 +16528 +16528 +16529 +16529 +16529 +16529 +16530 +16530 +16530 +16531 +16531 +16531 +16532 +16532 +16532 +16533 +16533 +16533 +16534 +16534 +16534 +16534 +16535 +16535 +16535 +16536 +16536 +16536 +16537 +16537 +16537 +16538 +16538 +16538 +16538 +16539 +16539 +16539 +16540 +16540 +16540 +16541 +16541 +16541 +16542 +16542 +16542 +16542 +16543 +16543 +16543 +16544 +16544 +16544 +16545 +16545 +16545 +16546 +16546 +16546 +16546 +16547 +16547 +16547 +16548 +16548 +16548 +16549 +16549 +16549 +16549 +16550 +16550 +16550 +16551 +16551 +16551 +16552 +16552 +16552 +16553 +16553 +16553 +16553 +16554 +16554 +16554 +16555 +16555 +16555 +16556 +16556 +16556 +16556 +16557 +16557 +16557 +16558 +16558 +16558 +16559 +16559 +16559 +16560 +16560 +16560 +16560 +16561 +16561 +16561 +16562 +16562 +16562 +16563 +16563 +16563 +16563 +16564 +16564 +16564 +16565 +16565 +16565 +16566 +16566 +16566 +16566 +16567 +16567 +16567 +16568 +16568 +16568 +16569 +16569 +16569 +16569 +16570 +16570 +16570 +16571 +16571 +16571 +16572 +16572 +16572 +16572 +16573 +16573 +16573 +16574 +16574 +16574 +16575 +16575 +16575 +16575 +16576 +16576 +16576 +16577 +16577 +16577 +16577 +16578 +16578 +16578 +16579 +16579 +16579 +16580 +16580 +16580 +16580 +16581 +16581 +16581 +16582 +16582 +16582 +16583 +16583 +16583 +16583 +16584 +16584 +16584 +16585 +16585 +16585 +16585 +16586 +16586 +16586 +16587 +16587 +16587 +16588 +16588 +16588 +16588 +16589 +16589 +16589 +16590 +16590 +16590 +16590 +16591 +16591 +16591 +16592 +16592 +16592 +16593 +16593 +16593 +16593 +16594 +16594 +16594 +16595 +16595 +16595 +16595 +16596 +16596 +16596 +16597 +16597 +16597 +16597 +16598 +16598 +16598 +16599 +16599 +16599 +16600 +16600 +16600 +16600 +16601 +16601 +16601 +16602 +16602 +16602 +16602 +16603 +16603 +16603 +16604 +16604 +16604 +16604 +16605 +16605 +16605 +16606 +16606 +16606 +16606 +16607 +16607 +16607 +16608 +16608 +16608 +16608 +16609 +16609 +16609 +16610 +16610 +16610 +16611 +16611 +16611 +16611 +16612 +16612 +16612 +16613 +16613 +16613 +16613 +16614 +16614 +16615 +16615 +16616 +16616 +16617 +16617 +16618 +16619 +16619 +16620 +16620 +16621 +16621 +16622 +16623 +16623 +16624 +16624 +16625 +16625 +16626 +16626 +16627 +16628 +16628 +16629 +16629 +16630 +16630 +16631 +16632 +16632 +16633 +16633 +16634 +16634 +16635 +16636 +16636 +16637 +16637 +16638 +16638 +16639 +16639 +16640 +16641 +16641 +16642 +16642 +16643 +16643 +16644 +16644 +16645 +16646 +16646 +16647 +16647 +16648 +16648 +16649 +16649 +16650 +16651 +16651 +16652 +16652 +16653 +16653 +16654 +16654 +16655 +16656 +16656 +16657 +16657 +16658 +16658 +16659 +16659 +16660 +16661 +16661 +16662 +16662 +16663 +16663 +16664 +16664 +16665 +16665 +16666 +16667 +16667 +16668 +16668 +16669 +16669 +16670 +16670 +16671 +16671 +16672 +16673 +16673 +16674 +16674 +16675 +16675 +16676 +16676 +16677 +16677 +16678 +16679 +16679 +16680 +16680 +16681 +16681 +16682 +16682 +16683 +16683 +16684 +16684 +16685 +16686 +16686 +16687 +16687 +16688 +16688 +16689 +16689 +16690 +16690 +16691 +16691 +16692 +16692 +16693 +16694 +16694 +16695 +16695 +16696 +16696 +16697 +16697 +16698 +16698 +16699 +16699 +16700 +16700 +16701 +16702 +16702 +16703 +16703 +16704 +16704 +16705 +16705 +16706 +16706 +16707 +16707 +16708 +16708 +16709 +16709 +16710 +16711 +16711 +16712 +16712 +16713 +16713 +16714 +16714 +16715 +16715 +16716 +16716 +16717 +16717 +16718 +16718 +16719 +16719 +16720 +16720 +16721 +16721 +16722 +16723 +16723 +16724 +16724 +16725 +16725 +16726 +16726 +16727 +16727 +16728 +16728 +16729 +16729 +16730 +16730 +16731 +16731 +16732 +16732 +16733 +16733 +16734 +16734 +16735 +16735 +16736 +16736 +16737 +16738 +16738 +16739 +16739 +16740 +16740 +16741 +16741 +16742 +16742 +16743 +16743 +16744 +16744 +16745 +16745 +16746 +16746 +16747 +16747 +16748 +16748 +16749 +16749 +16750 +16750 +16751 +16751 +16752 +16752 +16753 +16753 +16754 +16754 +16755 +16755 +16756 +16756 +16757 +16757 +16758 +16758 +16759 +16759 +16760 +16760 +16761 +16761 +16762 +16762 +16763 +16763 +16764 +16764 +16765 +16765 +16766 +16766 +16767 +16767 +16768 +16768 +16769 +16769 +16770 +16770 +16771 +16771 +16772 +16772 +16773 +16773 +16774 +16774 +16775 +16775 +16776 +16776 +16777 +16777 +16778 +16778 +16779 +16779 +16780 +16780 +16781 +16781 +16782 +16782 +16783 +16783 +16784 +16784 +16785 +16785 +16786 +16786 +16787 +16787 +16788 +16788 +16789 +16789 +16790 +16790 +16791 +16791 +16792 +16792 +16793 +16793 +16794 +16794 +16795 +16795 +16796 +16796 +16797 +16797 +16798 +16798 +16799 +16799 +16800 +16800 +16801 +16801 +16801 +16802 +16802 +16803 +16803 +16804 +16804 +16805 +16805 +16806 +16806 +16807 +16807 +16808 +16808 +16809 +16809 +16810 +16810 +16811 +16811 +16812 +16812 +16813 +16813 +16814 +16814 +16815 +16815 +16816 +16816 +16816 +16817 +16817 +16818 +16818 +16819 +16819 +16820 +16820 +16821 +16821 +16822 +16822 +16823 +16823 +16824 +16824 +16825 +16825 +16826 +16826 +16827 +16827 +16828 +16828 +16828 +16829 +16829 +16830 +16830 +16831 +16831 +16832 +16832 +16833 +16833 +16834 +16834 +16835 +16835 +16836 +16836 +16837 +16837 +16837 +16838 +16838 +16839 +16839 +16840 +16840 +16841 +16841 +16842 +16842 +16843 +16843 +16844 +16844 +16845 +16845 +16845 +16846 +16846 +16847 +16847 +16848 +16848 +16849 +16849 +16850 +16850 +16851 +16851 +16852 +16852 +16853 +16853 +16853 +16854 +16854 +16855 +16855 +16856 +16856 +16857 +16857 +16858 +16858 +16859 +16859 +16859 +16860 +16860 +16861 +16861 +16862 +16862 +16863 +16863 +16864 +16864 +16865 +16865 +16866 +16866 +16866 +16867 +16867 +16868 +16868 +16869 +16869 +16870 +16870 +16871 +16871 +16872 +16872 +16872 +16873 +16873 +16874 +16874 +16875 +16875 +16876 +16876 +16877 +16877 +16877 +16878 +16878 +16879 +16879 +16880 +16880 +16881 +16881 +16882 +16882 +16883 +16883 +16883 +16884 +16884 +16885 +16885 +16886 +16886 +16887 +16887 +16888 +16888 +16888 +16889 +16889 +16890 +16890 +16891 +16891 +16892 +16892 +16893 +16893 +16893 +16894 +16894 +16895 +16895 +16896 +16896 +16897 +16897 +16897 +16898 +16898 +16899 +16899 +16900 +16900 +16901 +16901 +16902 +16902 +16902 +16903 +16903 +16904 +16904 +16905 +16905 +16906 +16906 +16906 +16907 +16907 +16908 +16908 +16909 +16909 +16910 +16910 +16911 +16911 +16911 +16912 +16912 +16913 +16913 +16914 +16914 +16915 +16915 +16915 +16916 +16916 +16917 +16917 +16918 +16918 +16919 +16919 +16919 +16920 +16920 +16921 +16921 +16922 +16922 +16923 +16923 +16923 +16924 +16924 +16925 +16925 +16926 +16926 +16926 +16927 +16927 +16928 +16928 +16929 +16929 +16930 +16930 +16930 +16931 +16931 +16932 +16932 +16933 +16933 +16934 +16934 +16934 +16935 +16935 +16936 +16936 +16937 +16937 +16937 +16938 +16938 +16939 +16939 +16940 +16940 +16941 +16941 +16941 +16942 +16942 +16943 +16943 +16944 +16944 +16944 +16945 +16945 +16946 +16946 +16947 +16947 +16947 +16948 +16948 +16949 +16949 +16950 +16950 +16951 +16951 +16951 +16952 +16952 +16953 +16953 +16954 +16954 +16954 +16955 +16955 +16956 +16956 +16957 +16957 +16957 +16958 +16958 +16959 +16959 +16960 +16960 +16960 +16961 +16961 +16962 +16962 +16963 +16963 +16963 +16964 +16964 +16965 +16965 +16966 +16966 +16966 +16967 +16967 +16968 +16968 +16969 +16969 +16969 +16970 +16970 +16971 +16971 +16972 +16972 +16972 +16973 +16973 +16974 +16974 +16975 +16975 +16975 +16976 +16976 +16977 +16977 +16978 +16978 +16978 +16979 +16979 +16980 +16980 +16981 +16981 +16981 +16982 +16982 +16983 +16983 +16983 +16984 +16984 +16985 +16985 +16986 +16986 +16986 +16987 +16987 +16988 +16988 +16989 +16989 +16989 +16990 +16990 +16991 +16991 +16991 +16992 +16992 +16993 +16993 +16994 +16994 +16994 +16995 +16995 +16996 +16996 +16997 +16997 +16997 +16998 +16998 +16999 +16999 +16999 +17000 +17000 +17001 +17001 +17002 +17002 +17002 +17003 +17003 +17004 +17004 +17004 +17005 +17005 +17006 +17006 +17007 +17007 +17007 +17008 +17008 +17009 +17009 +17009 +17010 +17010 +17011 +17011 +17012 +17012 +17012 +17013 +17013 +17014 +17014 +17014 +17015 +17015 +17016 +17016 +17016 +17017 +17017 +17018 +17018 +17019 +17019 +17019 +17020 +17020 +17021 +17021 +17021 +17022 +17022 +17023 +17023 +17024 +17024 +17024 +17025 +17025 +17026 +17026 +17026 +17027 +17027 +17028 +17028 +17028 +17029 +17029 +17030 +17030 +17030 +17031 +17031 +17032 +17032 +17033 +17033 +17033 +17034 +17034 +17035 +17035 +17035 +17036 +17036 +17037 +17037 +17037 +17038 +17038 +17039 +17039 +17039 +17040 +17040 +17041 +17041 +17041 +17042 +17042 +17043 +17043 +17043 +17044 +17044 +17045 +17045 +17046 +17046 +17046 +17047 +17047 +17048 +17048 +17048 +17049 +17049 +17050 +17050 +17050 +17051 +17051 +17052 +17052 +17052 +17053 +17053 +17054 +17054 +17054 +17055 +17055 +17056 +17056 +17056 +17057 +17057 +17058 +17058 +17058 +17059 +17059 +17060 +17060 +17060 +17061 +17061 +17062 +17062 +17062 +17063 +17063 +17064 +17064 +17064 +17065 +17065 +17066 +17066 +17066 +17067 +17067 +17068 +17068 +17068 +17069 +17069 +17070 +17070 +17070 +17071 +17071 +17072 +17072 +17072 +17073 +17073 +17074 +17074 +17074 +17075 +17075 +17076 +17076 +17076 +17077 +17077 +17078 +17078 +17078 +17079 +17079 +17079 +17080 +17080 +17081 +17081 +17081 +17082 +17082 +17083 +17083 +17083 +17084 +17084 +17085 +17085 +17085 +17086 +17086 +17087 +17087 +17087 +17088 +17088 +17089 +17089 +17089 +17090 +17090 +17091 +17091 +17091 +17092 +17092 +17093 +17094 +17095 +17096 +17096 +17097 +17098 +17099 +17100 +17100 +17101 +17102 +17103 +17103 +17104 +17105 +17106 +17106 +17107 +17108 +17109 +17110 +17110 +17111 +17112 +17113 +17113 +17114 +17115 +17116 +17117 +17117 +17118 +17119 +17120 +17120 +17121 +17122 +17123 +17123 +17124 +17125 +17126 +17127 +17127 +17128 +17129 +17130 +17130 +17131 +17132 +17133 +17133 +17134 +17135 +17136 +17136 +17137 +17138 +17139 +17139 +17140 +17141 +17142 +17143 +17143 +17144 +17145 +17146 +17146 +17147 +17148 +17149 +17149 +17150 +17151 +17152 +17152 +17153 +17154 +17155 +17155 +17156 +17157 +17158 +17158 +17159 +17160 +17161 +17161 +17162 +17163 +17164 +17164 +17165 +17166 +17167 +17167 +17168 +17169 +17170 +17170 +17171 +17172 +17172 +17173 +17174 +17175 +17175 +17176 +17177 +17178 +17178 +17179 +17180 +17181 +17181 +17182 +17183 +17184 +17184 +17185 +17186 +17187 +17187 +17188 +17189 +17189 +17190 +17191 +17192 +17192 +17193 +17194 +17195 +17195 +17196 +17197 +17198 +17198 +17199 +17200 +17200 +17201 +17202 +17203 +17203 +17204 +17205 +17206 +17206 +17207 +17208 +17208 +17209 +17210 +17211 +17211 +17212 +17213 +17214 +17214 +17215 +17216 +17216 +17217 +17218 +17219 +17219 +17220 +17221 +17221 +17222 +17223 +17224 +17224 +17225 +17226 +17226 +17227 +17228 +17229 +17229 +17230 +17231 +17231 +17232 +17233 +17234 +17234 +17235 +17236 +17236 +17237 +17238 +17239 +17239 +17240 +17241 +17241 +17242 +17243 +17244 +17244 +17245 +17246 +17246 +17247 +17248 +17249 +17249 +17250 +17251 +17251 +17252 +17253 +17253 +17254 +17255 +17256 +17256 +17257 +17258 +17258 +17259 +17260 +17260 +17261 +17262 +17263 +17263 +17264 +17265 +17265 +17266 +17267 +17267 +17268 +17269 +17270 +17270 +17271 +17272 +17272 +17273 +17274 +17274 +17275 +17276 +17277 +17277 +17278 +17279 +17279 +17280 +17281 +17281 +17282 +17283 +17283 +17284 +17285 +17286 +17286 +17287 +17288 +17288 +17289 +17290 +17290 +17291 +17292 +17292 +17293 +17294 +17295 +17295 +17296 +17297 +17297 +17298 +17299 +17299 +17300 +17301 +17301 +17302 +17303 +17303 +17304 +17305 +17305 +17306 +17307 +17307 +17308 +17309 +17310 +17310 +17311 +17312 +17312 +17313 +17314 +17314 +17315 +17316 +17316 +17317 +17318 +17318 +17319 +17320 +17320 +17321 +17322 +17322 +17323 +17324 +17324 +17325 +17326 +17326 +17327 +17328 +17328 +17329 +17330 +17331 +17331 +17332 +17333 +17333 +17334 +17335 +17335 +17336 +17337 +17337 +17338 +17339 +17339 +17340 +17341 +17341 +17342 +17343 +17343 +17344 +17345 +17345 +17346 +17347 +17347 +17348 +17349 +17349 +17350 +17351 +17351 +17352 +17353 +17353 +17354 +17355 +17355 +17356 +17357 +17357 +17358 +17358 +17359 +17360 +17360 +17361 +17362 +17362 +17363 +17364 +17364 +17365 +17366 +17366 +17367 +17368 +17368 +17369 +17370 +17370 +17371 +17372 +17372 +17373 +17374 +17374 +17375 +17376 +17376 +17377 +17378 +17378 +17379 +17379 +17380 +17381 +17381 +17382 +17383 +17383 +17384 +17385 +17385 +17386 +17387 +17387 +17388 +17389 +17389 +17390 +17391 +17391 +17392 +17392 +17393 +17394 +17394 +17395 +17396 +17396 +17397 +17398 +17398 +17399 +17400 +17400 +17401 +17402 +17402 +17403 +17403 +17404 +17405 +17405 +17406 +17407 +17407 +17408 +17408 +17409 +17409 +17409 +17410 +17410 +17410 +17411 +17411 +17411 +17412 +17412 +17412 +17412 +17413 +17413 +17413 +17414 +17414 +17414 +17415 +17415 +17415 +17416 +17416 +17416 +17417 +17417 +17417 +17418 +17418 +17418 +17419 +17419 +17419 +17419 +17420 +17420 +17420 +17421 +17421 +17421 +17422 +17422 +17422 +17423 +17423 +17423 +17424 +17424 +17424 +17425 +17425 +17425 +17425 +17426 +17426 +17426 +17427 +17427 +17427 +17428 +17428 +17428 +17429 +17429 +17429 +17430 +17430 +17430 +17430 +17431 +17431 +17431 +17432 +17432 +17432 +17433 +17433 +17433 +17434 +17434 +17434 +17435 +17435 +17435 +17435 +17436 +17436 +17436 +17437 +17437 +17437 +17438 +17438 +17438 +17439 +17439 +17439 +17439 +17440 +17440 +17440 +17441 +17441 +17441 +17442 +17442 +17442 +17443 +17443 +17443 +17444 +17444 +17444 +17444 +17445 +17445 +17445 +17446 +17446 +17446 +17447 +17447 +17447 +17448 +17448 +17448 +17448 +17449 +17449 +17449 +17450 +17450 +17450 +17451 +17451 +17451 +17451 +17452 +17452 +17452 +17453 +17453 +17453 +17454 +17454 +17454 +17455 +17455 +17455 +17455 +17456 +17456 +17456 +17457 +17457 +17457 +17458 +17458 +17458 +17458 +17459 +17459 +17459 +17460 +17460 +17460 +17461 +17461 +17461 +17461 +17462 +17462 +17462 +17463 +17463 +17463 +17464 +17464 +17464 +17465 +17465 +17465 +17465 +17466 +17466 +17466 +17467 +17467 +17467 +17468 +17468 +17468 +17468 +17469 +17469 +17469 +17470 +17470 +17470 +17471 +17471 +17471 +17471 +17472 +17472 +17472 +17473 +17473 +17473 +17473 +17474 +17474 +17474 +17475 +17475 +17475 +17476 +17476 +17476 +17476 +17477 +17477 +17477 +17478 +17478 +17478 +17479 +17479 +17479 +17479 +17480 +17480 +17480 +17481 +17481 +17481 +17482 +17482 +17482 +17482 +17483 +17483 +17483 +17484 +17484 +17484 +17484 +17485 +17485 +17485 +17486 +17486 +17486 +17487 +17487 +17487 +17487 +17488 +17488 +17488 +17489 +17489 +17489 +17489 +17490 +17490 +17490 +17491 +17491 +17491 +17491 +17492 +17492 +17492 +17493 +17493 +17493 +17494 +17494 +17494 +17494 +17495 +17495 +17495 +17496 +17496 +17496 +17496 +17497 +17497 +17497 +17498 +17498 +17498 +17498 +17499 +17499 +17499 +17500 +17500 +17500 +17501 +17501 +17501 +17501 +17502 +17502 +17502 +17503 +17503 +17503 +17503 +17504 +17504 +17504 +17505 +17505 +17505 +17505 +17506 +17506 +17506 +17507 +17507 +17507 +17507 +17508 +17508 +17508 +17509 +17509 +17509 +17509 +17510 +17510 +17510 +17511 +17511 +17511 +17511 +17512 +17512 +17512 +17513 +17513 +17513 +17513 +17514 +17514 +17514 +17515 +17515 +17515 +17515 +17516 +17516 +17516 +17517 +17517 +17517 +17517 +17518 +17518 +17518 +17519 +17519 +17519 +17519 +17520 +17520 +17520 +17521 +17521 +17521 +17521 +17522 +17522 +17522 +17523 +17523 +17523 +17523 +17524 +17524 +17524 +17525 +17525 +17525 +17525 +17526 +17526 +17526 +17526 +17527 +17527 +17527 +17528 +17528 +17528 +17528 +17529 +17529 +17529 +17530 +17530 +17530 +17530 +17531 +17531 +17531 +17532 +17532 +17532 +17532 +17533 +17533 +17533 +17533 +17534 +17534 +17534 +17535 +17535 +17535 +17535 +17536 +17536 +17536 +17537 +17537 +17537 +17537 +17538 +17538 +17538 +17539 +17539 +17539 +17539 +17540 +17540 +17540 +17540 +17541 +17541 +17541 +17542 +17542 +17542 +17542 +17543 +17543 +17543 +17544 +17544 +17544 +17544 +17545 +17545 +17545 +17545 +17546 +17546 +17546 +17547 +17547 +17547 +17547 +17548 +17548 +17548 +17548 +17549 +17549 +17549 +17550 +17550 +17550 +17550 +17551 +17551 +17551 +17551 +17552 +17552 +17552 +17553 +17553 +17553 +17553 +17554 +17554 +17554 +17555 +17555 +17555 +17555 +17556 +17556 +17556 +17556 +17557 +17557 +17557 +17558 +17558 +17558 +17558 +17559 +17559 +17559 +17559 +17560 +17560 +17560 +17561 +17561 +17561 +17561 +17562 +17562 +17562 +17562 +17563 +17563 +17563 +17563 +17564 +17564 +17564 +17565 +17565 +17565 +17565 +17566 +17566 +17566 +17566 +17567 +17567 +17567 +17568 +17568 +17568 +17568 +17569 +17569 +17569 +17569 +17570 +17570 +17570 +17571 +17571 +17571 +17571 +17572 +17572 +17572 +17572 +17573 +17573 +17573 +17573 +17574 +17574 +17574 +17575 +17575 +17575 +17575 +17576 +17576 +17576 +17577 +17577 +17578 +17578 +17579 +17579 +17580 +17580 +17581 +17581 +17582 +17583 +17583 +17584 +17584 +17585 +17585 +17586 +17586 +17587 +17587 +17588 +17588 +17589 +17589 +17590 +17590 +17591 +17592 +17592 +17593 +17593 +17594 +17594 +17595 +17595 +17596 +17596 +17597 +17597 +17598 +17598 +17599 +17599 +17600 +17600 +17601 +17602 +17602 +17603 +17603 +17604 +17604 +17605 +17605 +17606 +17606 +17607 +17607 +17608 +17608 +17609 +17609 +17610 +17610 +17611 +17611 +17612 +17612 +17613 +17613 +17614 +17614 +17615 +17616 +17616 +17617 +17617 +17618 +17618 +17619 +17619 +17620 +17620 +17621 +17621 +17622 +17622 +17623 +17623 +17624 +17624 +17625 +17625 +17626 +17626 +17627 +17627 +17628 +17628 +17629 +17629 +17630 +17630 +17631 +17631 +17632 +17632 +17633 +17633 +17634 +17634 +17635 +17635 +17636 +17636 +17637 +17637 +17638 +17638 +17639 +17639 +17640 +17640 +17641 +17641 +17642 +17642 +17643 +17643 +17644 +17644 +17645 +17645 +17646 +17646 +17647 +17647 +17648 +17648 +17649 +17649 +17650 +17650 +17651 +17651 +17652 +17652 +17653 +17653 +17654 +17654 +17655 +17655 +17656 +17656 +17657 +17657 +17658 +17658 +17659 +17659 +17660 +17660 +17661 +17661 +17662 +17662 +17663 +17663 +17664 +17664 +17665 +17665 +17666 +17666 +17667 +17667 +17668 +17668 +17669 +17669 +17670 +17670 +17671 +17671 +17672 +17672 +17673 +17673 +17674 +17674 +17675 +17675 +17676 +17676 +17676 +17677 +17677 +17678 +17678 +17679 +17679 +17680 +17680 +17681 +17681 +17682 +17682 +17683 +17683 +17684 +17684 +17685 +17685 +17686 +17686 +17687 +17687 +17688 +17688 +17689 +17689 +17690 +17690 +17690 +17691 +17691 +17692 +17692 +17693 +17693 +17694 +17694 +17695 +17695 +17696 +17696 +17697 +17697 +17698 +17698 +17699 +17699 +17700 +17700 +17701 +17701 +17701 +17702 +17702 +17703 +17703 +17704 +17704 +17705 +17705 +17706 +17706 +17707 +17707 +17708 +17708 +17709 +17709 +17710 +17710 +17710 +17711 +17711 +17712 +17712 +17713 +17713 +17714 +17714 +17715 +17715 +17716 +17716 +17717 +17717 +17717 +17718 +17718 +17719 +17719 +17720 +17720 +17721 +17721 +17722 +17722 +17723 +17723 +17724 +17724 +17724 +17725 +17725 +17726 +17726 +17727 +17727 +17728 +17728 +17729 +17729 +17730 +17730 +17731 +17731 +17731 +17732 +17732 +17733 +17733 +17734 +17734 +17735 +17735 +17736 +17736 +17737 +17737 +17737 +17738 +17738 +17739 +17739 +17740 +17740 +17741 +17741 +17742 +17742 +17742 +17743 +17743 +17744 +17744 +17745 +17745 +17746 +17746 +17747 +17747 +17747 +17748 +17748 +17749 +17749 +17750 +17750 +17751 +17751 +17752 +17752 +17752 +17753 +17753 +17754 +17754 +17755 +17755 +17756 +17756 +17757 +17757 +17757 +17758 +17758 +17759 +17759 +17760 +17760 +17761 +17761 +17762 +17762 +17762 +17763 +17763 +17764 +17764 +17765 +17765 +17766 +17766 +17766 +17767 +17767 +17768 +17768 +17769 +17769 +17770 +17770 +17770 +17771 +17771 +17772 +17772 +17773 +17773 +17774 +17774 +17775 +17775 +17775 +17776 +17776 +17777 +17777 +17778 +17778 +17779 +17779 +17779 +17780 +17780 +17781 +17781 +17782 +17782 +17782 +17783 +17783 +17784 +17784 +17785 +17785 +17786 +17786 +17786 +17787 +17787 +17788 +17788 +17789 +17789 +17790 +17790 +17790 +17791 +17791 +17792 +17792 +17793 +17793 +17793 +17794 +17794 +17795 +17795 +17796 +17796 +17797 +17797 +17797 +17798 +17798 +17799 +17799 +17800 +17800 +17800 +17801 +17801 +17802 +17802 +17803 +17803 +17804 +17804 +17804 +17805 +17805 +17806 +17806 +17807 +17807 +17807 +17808 +17808 +17809 +17809 +17810 +17810 +17810 +17811 +17811 +17812 +17812 +17813 +17813 +17813 +17814 +17814 +17815 +17815 +17816 +17816 +17816 +17817 +17817 +17818 +17818 +17819 +17819 +17819 +17820 +17820 +17821 +17821 +17822 +17822 +17822 +17823 +17823 +17824 +17824 +17825 +17825 +17825 +17826 +17826 +17827 +17827 +17828 +17828 +17828 +17829 +17829 +17830 +17830 +17831 +17831 +17831 +17832 +17832 +17833 +17833 +17834 +17834 +17834 +17835 +17835 +17836 +17836 +17836 +17837 +17837 +17838 +17838 +17839 +17839 +17839 +17840 +17840 +17841 +17841 +17842 +17842 +17842 +17843 +17843 +17844 +17844 +17844 +17845 +17845 +17846 +17846 +17847 +17847 +17847 +17848 +17848 +17849 +17849 +17850 +17850 +17850 +17851 +17851 +17852 +17852 +17852 +17853 +17853 +17854 +17854 +17855 +17855 +17855 +17856 +17856 +17857 +17857 +17857 +17858 +17858 +17859 +17859 +17859 +17860 +17860 +17861 +17861 +17862 +17862 +17862 +17863 +17863 +17864 +17864 +17864 +17865 +17865 +17866 +17866 +17867 +17867 +17867 +17868 +17868 +17869 +17869 +17869 +17870 +17870 +17871 +17871 +17871 +17872 +17872 +17873 +17873 +17874 +17874 +17874 +17875 +17875 +17876 +17876 +17876 +17877 +17877 +17878 +17878 +17878 +17879 +17879 +17880 +17880 +17880 +17881 +17881 +17882 +17882 +17882 +17883 +17883 +17884 +17884 +17885 +17885 +17885 +17886 +17886 +17887 +17887 +17887 +17888 +17888 +17889 +17889 +17889 +17890 +17890 +17891 +17891 +17891 +17892 +17892 +17893 +17893 +17893 +17894 +17894 +17895 +17895 +17895 +17896 +17896 +17897 +17897 +17897 +17898 +17898 +17899 +17899 +17899 +17900 +17900 +17901 +17901 +17901 +17902 +17902 +17903 +17903 +17903 +17904 +17904 +17905 +17905 +17905 +17906 +17906 +17907 +17907 +17907 +17908 +17908 +17909 +17909 +17909 +17910 +17910 +17911 +17911 +17911 +17912 +17912 +17913 +17913 +17913 +17914 +17914 +17915 +17915 +17915 +17916 +17916 +17917 +17917 +17917 +17918 +17918 +17919 +17919 +17919 +17920 +17920 +17921 +17921 +17921 +17922 +17922 +17923 +17923 +17923 +17924 +17924 +17924 +17925 +17925 +17926 +17926 +17926 +17927 +17927 +17928 +17928 +17928 +17929 +17929 +17930 +17930 +17930 +17931 +17931 +17932 +17932 +17932 +17933 +17933 +17934 +17934 +17934 +17935 +17935 +17935 +17936 +17936 +17937 +17937 +17937 +17938 +17938 +17939 +17939 +17939 +17940 +17940 +17941 +17941 +17941 +17942 +17942 +17942 +17943 +17943 +17944 +17944 +17944 +17945 +17945 +17946 +17946 +17946 +17947 +17947 +17947 +17948 +17948 +17949 +17949 +17949 +17950 +17950 +17951 +17951 +17951 +17952 +17952 +17953 +17953 +17953 +17954 +17954 +17954 +17955 +17955 +17956 +17956 +17956 +17957 +17957 +17958 +17958 +17958 +17959 +17959 +17959 +17960 +17960 +17961 +17961 +17961 +17962 +17962 +17962 +17963 +17963 +17964 +17964 +17964 +17965 +17965 +17966 +17966 +17966 +17967 +17967 +17967 +17968 +17968 +17969 +17969 +17969 +17970 +17970 +17970 +17971 +17971 +17972 +17972 +17972 +17973 +17973 +17974 +17974 +17974 +17975 +17975 +17975 +17976 +17976 +17977 +17977 +17977 +17978 +17978 +17978 +17979 +17979 +17980 +17980 +17980 +17981 +17981 +17981 +17982 +17982 +17983 +17983 +17983 +17984 +17984 +17984 +17985 +17985 +17986 +17986 +17986 +17987 +17987 +17987 +17988 +17988 +17989 +17989 +17989 +17990 +17990 +17990 +17991 +17991 +17992 +17992 +17992 +17993 +17993 +17993 +17994 +17994 +17995 +17995 +17995 +17996 +17996 +17996 +17997 +17997 +17998 +17998 +17998 +17999 +17999 +17999 +18000 +18000 +18001 +18001 +18001 +18002 +18002 +18002 +18003 +18003 +18003 +18004 +18004 +18005 +18005 +18005 +18006 +18006 +18006 +18007 +18007 +18008 +18008 +18008 +18009 +18009 +18009 +18010 +18010 +18011 +18011 +18011 +18012 +18012 +18012 +18013 +18013 +18013 +18014 +18014 +18015 +18015 +18015 +18016 +18016 +18016 +18017 +18017 +18017 +18018 +18018 +18019 +18019 +18019 +18020 +18020 +18020 +18021 +18021 +18022 +18022 +18023 +18023 +18024 +18025 +18026 +18026 +18027 +18028 +18028 +18029 +18030 +18031 +18031 +18032 +18033 +18034 +18034 +18035 +18036 +18036 +18037 +18038 +18039 +18039 +18040 +18041 +18041 +18042 +18043 +18044 +18044 +18045 +18046 +18047 +18047 +18048 +18049 +18049 +18050 +18051 +18052 +18052 +18053 +18054 +18054 +18055 +18056 +18057 +18057 +18058 +18059 +18059 +18060 +18061 +18062 +18062 +18063 +18064 +18064 +18065 +18066 +18066 +18067 +18068 +18069 +18069 +18070 +18071 +18071 +18072 +18073 +18074 +18074 +18075 +18076 +18076 +18077 +18078 +18078 +18079 +18080 +18081 +18081 +18082 +18083 +18083 +18084 +18085 +18085 +18086 +18087 +18088 +18088 +18089 +18090 +18090 +18091 +18092 +18092 +18093 +18094 +18095 +18095 +18096 +18097 +18097 +18098 +18099 +18099 +18100 +18101 +18101 +18102 +18103 +18104 +18104 +18105 +18106 +18106 +18107 +18108 +18108 +18109 +18110 +18110 +18111 +18112 +18112 +18113 +18114 +18114 +18115 +18116 +18117 +18117 +18118 +18119 +18119 +18120 +18121 +18121 +18122 +18123 +18123 +18124 +18125 +18125 +18126 +18127 +18127 +18128 +18129 +18129 +18130 +18131 +18131 +18132 +18133 +18134 +18134 +18135 +18136 +18136 +18137 +18138 +18138 +18139 +18140 +18140 +18141 +18142 +18142 +18143 +18144 +18144 +18145 +18146 +18146 +18147 +18148 +18148 +18149 +18150 +18150 +18151 +18152 +18152 +18153 +18154 +18154 +18155 +18156 +18156 +18157 +18158 +18158 +18159 +18160 +18160 +18161 +18162 +18162 +18163 +18164 +18164 +18165 +18166 +18166 +18167 +18168 +18168 +18169 +18170 +18170 +18171 +18172 +18172 +18173 +18173 +18174 +18175 +18175 +18176 +18177 +18177 +18178 +18179 +18179 +18180 +18181 +18181 +18182 +18183 +18183 +18184 +18185 +18185 +18186 +18187 +18187 +18188 +18189 +18189 +18190 +18190 +18191 +18192 +18192 +18193 +18194 +18194 +18195 +18196 +18196 +18197 +18198 +18198 +18199 +18200 +18200 +18201 +18201 +18202 +18203 +18203 +18204 +18205 +18205 +18206 +18207 +18207 +18208 +18209 +18209 +18210 +18210 +18211 +18212 +18212 +18213 +18214 +18214 +18215 +18216 +18216 +18217 +18218 +18218 +18219 +18219 +18220 +18221 +18221 +18222 +18223 +18223 +18224 +18225 +18225 +18226 +18226 +18227 +18228 +18228 +18229 +18230 +18230 +18231 +18231 +18232 +18233 +18233 +18234 +18235 +18235 +18236 +18237 +18237 +18238 +18238 +18239 +18240 +18240 +18241 +18242 +18242 +18243 +18243 +18244 +18245 +18245 +18246 +18247 +18247 +18248 +18248 +18249 +18250 +18250 +18251 +18252 +18252 +18253 +18253 +18254 +18255 +18255 +18256 +18257 +18257 +18258 +18258 +18259 +18260 +18260 +18261 +18262 +18262 +18263 +18263 +18264 +18265 +18265 +18266 +18267 +18267 +18268 +18268 +18269 +18270 +18270 +18271 +18271 +18272 +18273 +18273 +18274 +18275 +18275 +18276 +18276 +18277 +18278 +18278 +18279 +18279 +18280 +18281 +18281 +18282 +18282 +18283 +18284 +18284 +18285 +18286 +18286 +18287 +18287 +18288 +18289 +18289 +18290 +18290 +18291 +18292 +18292 +18293 +18293 +18294 +18295 +18295 +18296 +18297 +18297 +18298 +18298 +18299 +18300 +18300 +18301 +18301 +18302 +18303 +18303 +18304 +18304 +18305 +18306 +18306 +18307 +18307 +18308 +18309 +18309 +18310 +18310 +18311 +18312 +18312 +18313 +18313 +18314 +18315 +18315 +18316 +18316 +18317 +18318 +18318 +18319 +18319 +18320 +18321 +18321 +18322 +18322 +18323 +18324 +18324 +18325 +18325 +18326 +18327 +18327 +18328 +18328 +18329 +18330 +18330 +18331 +18331 +18332 +18332 +18333 +18334 +18334 +18335 +18335 +18336 +18337 +18337 +18338 +18338 +18339 +18340 +18340 +18341 +18341 +18342 +18343 +18343 +18344 +18344 +18345 +18345 +18346 +18347 +18347 +18348 +18348 +18349 +18350 +18350 +18351 +18351 +18352 +18353 +18353 +18354 +18354 +18355 +18355 +18356 +18357 +18357 +18358 +18358 +18359 +18360 +18360 +18361 +18361 +18362 +18362 +18363 +18364 +18364 +18365 +18365 +18366 +18367 +18367 +18368 +18368 +18369 +18369 +18370 +18371 +18371 +18372 +18372 +18373 +18373 +18374 +18375 +18375 +18376 +18376 +18377 +18378 +18378 +18379 +18379 +18380 +18380 +18381 +18382 +18382 +18383 +18383 +18384 +18384 +18385 +18386 +18386 +18387 +18387 +18388 +18388 +18389 +18390 +18390 +18391 +18391 +18392 +18392 +18393 +18394 +18394 +18395 +18395 +18396 +18396 +18397 +18398 +18398 +18399 +18399 +18400 +18400 +18401 +18402 +18402 +18403 +18403 +18404 +18404 +18405 +18406 +18406 +18407 +18407 +18408 +18408 +18409 +18410 +18410 +18411 +18411 +18412 +18412 +18413 +18413 +18414 +18415 +18415 +18416 +18416 +18417 +18417 +18418 +18419 +18419 +18420 +18420 +18421 +18421 +18422 +18422 +18423 +18424 +18424 +18425 +18425 +18426 +18426 +18427 +18428 +18428 +18429 +18429 +18430 +18430 +18431 +18431 +18432 +18432 +18433 +18433 +18433 +18433 +18434 +18434 +18434 +18435 +18435 +18435 +18435 +18436 +18436 +18436 +18436 +18437 +18437 +18437 +18438 +18438 +18438 +18438 +18439 +18439 +18439 +18440 +18440 +18440 +18440 +18441 +18441 +18441 +18441 +18442 +18442 +18442 +18443 +18443 +18443 +18443 +18444 +18444 +18444 +18444 +18445 +18445 +18445 +18446 +18446 +18446 +18446 +18447 +18447 +18447 +18447 +18448 +18448 +18448 +18449 +18449 +18449 +18449 +18450 +18450 +18450 +18451 +18451 +18451 +18451 +18452 +18452 +18452 +18452 +18453 +18453 +18453 +18454 +18454 +18454 +18454 +18455 +18455 +18455 +18455 +18456 +18456 +18456 +18456 +18457 +18457 +18457 +18458 +18458 +18458 +18458 +18459 +18459 +18459 +18459 +18460 +18460 +18460 +18461 +18461 +18461 +18461 +18462 +18462 +18462 +18462 +18463 +18463 +18463 +18464 +18464 +18464 +18464 +18465 +18465 +18465 +18465 +18466 +18466 +18466 +18466 +18467 +18467 +18467 +18468 +18468 +18468 +18468 +18469 +18469 +18469 +18469 +18470 +18470 +18470 +18470 +18471 +18471 +18471 +18472 +18472 +18472 +18472 +18473 +18473 +18473 +18473 +18474 +18474 +18474 +18474 +18475 +18475 +18475 +18476 +18476 +18476 +18476 +18477 +18477 +18477 +18477 +18478 +18478 +18478 +18478 +18479 +18479 +18479 +18480 +18480 +18480 +18480 +18481 +18481 +18481 +18481 +18482 +18482 +18482 +18482 +18483 +18483 +18483 +18483 +18484 +18484 +18484 +18485 +18485 +18485 +18485 +18486 +18486 +18486 +18486 +18487 +18487 +18487 +18487 +18488 +18488 +18488 +18488 +18489 +18489 +18489 +18490 +18490 +18490 +18490 +18491 +18491 +18491 +18491 +18492 +18492 +18492 +18492 +18493 +18493 +18493 +18493 +18494 +18494 +18494 +18494 +18495 +18495 +18495 +18496 +18496 +18496 +18496 +18497 +18497 +18497 +18497 +18498 +18498 +18498 +18498 +18499 +18499 +18499 +18499 +18500 +18500 +18500 +18500 +18501 +18501 +18501 +18501 +18502 +18502 +18502 +18502 +18503 +18503 +18503 +18504 +18504 +18504 +18504 +18505 +18505 +18505 +18505 +18506 +18506 +18506 +18506 +18507 +18507 +18507 +18507 +18508 +18508 +18508 +18508 +18509 +18509 +18509 +18509 +18510 +18510 +18510 +18510 +18511 +18511 +18511 +18511 +18512 +18512 +18512 +18512 +18513 +18513 +18513 +18514 +18514 +18514 +18514 +18515 +18515 +18515 +18515 +18516 +18516 +18516 +18516 +18517 +18517 +18517 +18517 +18518 +18518 +18518 +18518 +18519 +18519 +18519 +18519 +18520 +18520 +18520 +18520 +18521 +18521 +18521 +18521 +18522 +18522 +18522 +18522 +18523 +18523 +18523 +18523 +18524 +18524 +18524 +18524 +18525 +18525 +18525 +18525 +18526 +18526 +18526 +18526 +18527 +18527 +18527 +18527 +18528 +18528 +18528 +18528 +18529 +18529 +18529 +18529 +18530 +18530 +18530 +18530 +18531 +18531 +18531 +18531 +18532 +18532 +18533 +18533 +18534 +18534 +18535 +18535 +18536 +18536 +18537 +18537 +18538 +18538 +18539 +18539 +18540 +18540 +18541 +18541 +18542 +18542 +18543 +18543 +18544 +18544 +18545 +18545 +18546 +18546 +18547 +18547 +18548 +18548 +18549 +18549 +18550 +18550 +18551 +18551 +18552 +18552 +18553 +18553 +18554 +18554 +18555 +18555 +18556 +18556 +18557 +18557 +18557 +18558 +18558 +18559 +18559 +18560 +18560 +18561 +18561 +18562 +18562 +18563 +18563 +18564 +18564 +18565 +18565 +18566 +18566 +18567 +18567 +18568 +18568 +18569 +18569 +18570 +18570 +18571 +18571 +18571 +18572 +18572 +18573 +18573 +18574 +18574 +18575 +18575 +18576 +18576 +18577 +18577 +18578 +18578 +18579 +18579 +18580 +18580 +18581 +18581 +18581 +18582 +18582 +18583 +18583 +18584 +18584 +18585 +18585 +18586 +18586 +18587 +18587 +18588 +18588 +18589 +18589 +18589 +18590 +18590 +18591 +18591 +18592 +18592 +18593 +18593 +18594 +18594 +18595 +18595 +18596 +18596 +18597 +18597 +18597 +18598 +18598 +18599 +18599 +18600 +18600 +18601 +18601 +18602 +18602 +18603 +18603 +18603 +18604 +18604 +18605 +18605 +18606 +18606 +18607 +18607 +18608 +18608 +18609 +18609 +18609 +18610 +18610 +18611 +18611 +18612 +18612 +18613 +18613 +18614 +18614 +18615 +18615 +18615 +18616 +18616 +18617 +18617 +18618 +18618 +18619 +18619 +18620 +18620 +18620 +18621 +18621 +18622 +18622 +18623 +18623 +18624 +18624 +18625 +18625 +18625 +18626 +18626 +18627 +18627 +18628 +18628 +18629 +18629 +18630 +18630 +18630 +18631 +18631 +18632 +18632 +18633 +18633 +18634 +18634 +18634 +18635 +18635 +18636 +18636 +18637 +18637 +18638 +18638 +18639 +18639 +18639 +18640 +18640 +18641 +18641 +18642 +18642 +18643 +18643 +18643 +18644 +18644 +18645 +18645 +18646 +18646 +18647 +18647 +18647 +18648 +18648 +18649 +18649 +18650 +18650 +18651 +18651 +18651 +18652 +18652 +18653 +18653 +18654 +18654 +18655 +18655 +18655 +18656 +18656 +18657 +18657 +18658 +18658 +18658 +18659 +18659 +18660 +18660 +18661 +18661 +18662 +18662 +18662 +18663 +18663 +18664 +18664 +18665 +18665 +18665 +18666 +18666 +18667 +18667 +18668 +18668 +18668 +18669 +18669 +18670 +18670 +18671 +18671 +18672 +18672 +18672 +18673 +18673 +18674 +18674 +18675 +18675 +18675 +18676 +18676 +18677 +18677 +18678 +18678 +18678 +18679 +18679 +18680 +18680 +18681 +18681 +18681 +18682 +18682 +18683 +18683 +18684 +18684 +18684 +18685 +18685 +18686 +18686 +18687 +18687 +18687 +18688 +18688 +18689 +18689 +18690 +18690 +18690 +18691 +18691 +18692 +18692 +18693 +18693 +18693 +18694 +18694 +18695 +18695 +18696 +18696 +18696 +18697 +18697 +18698 +18698 +18698 +18699 +18699 +18700 +18700 +18701 +18701 +18701 +18702 +18702 +18703 +18703 +18704 +18704 +18704 +18705 +18705 +18706 +18706 +18706 +18707 +18707 +18708 +18708 +18709 +18709 +18709 +18710 +18710 +18711 +18711 +18711 +18712 +18712 +18713 +18713 +18714 +18714 +18714 +18715 +18715 +18716 +18716 +18716 +18717 +18717 +18718 +18718 +18719 +18719 +18719 +18720 +18720 +18721 +18721 +18721 +18722 +18722 +18723 +18723 +18724 +18724 +18724 +18725 +18725 +18726 +18726 +18726 +18727 +18727 +18728 +18728 +18728 +18729 +18729 +18730 +18730 +18731 +18731 +18731 +18732 +18732 +18733 +18733 +18733 +18734 +18734 +18735 +18735 +18735 +18736 +18736 +18737 +18737 +18737 +18738 +18738 +18739 +18739 +18739 +18740 +18740 +18741 +18741 +18742 +18742 +18742 +18743 +18743 +18744 +18744 +18744 +18745 +18745 +18746 +18746 +18746 +18747 +18747 +18748 +18748 +18748 +18749 +18749 +18750 +18750 +18750 +18751 +18751 +18752 +18752 +18752 +18753 +18753 +18754 +18754 +18754 +18755 +18755 +18756 +18756 +18756 +18757 +18757 +18758 +18758 +18758 +18759 +18759 +18760 +18760 +18760 +18761 +18761 +18762 +18762 +18762 +18763 +18763 +18764 +18764 +18764 +18765 +18765 +18766 +18766 +18766 +18767 +18767 +18768 +18768 +18768 +18769 +18769 +18770 +18770 +18770 +18771 +18771 +18772 +18772 +18772 +18773 +18773 +18774 +18774 +18774 +18775 +18775 +18775 +18776 +18776 +18777 +18777 +18777 +18778 +18778 +18779 +18779 +18779 +18780 +18780 +18781 +18781 +18781 +18782 +18782 +18783 +18783 +18783 +18784 +18784 +18784 +18785 +18785 +18786 +18786 +18786 +18787 +18787 +18788 +18788 +18788 +18789 +18789 +18790 +18790 +18790 +18791 +18791 +18792 +18792 +18792 +18793 +18793 +18793 +18794 +18794 +18795 +18795 +18795 +18796 +18796 +18797 +18797 +18797 +18798 +18798 +18798 +18799 +18799 +18800 +18800 +18800 +18801 +18801 +18802 +18802 +18802 +18803 +18803 +18803 +18804 +18804 +18805 +18805 +18805 +18806 +18806 +18807 +18807 +18807 +18808 +18808 +18808 +18809 +18809 +18810 +18810 +18810 +18811 +18811 +18812 +18812 +18812 +18813 +18813 +18813 +18814 +18814 +18815 +18815 +18815 +18816 +18816 +18816 +18817 +18817 +18818 +18818 +18818 +18819 +18819 +18819 +18820 +18820 +18821 +18821 +18821 +18822 +18822 +18823 +18823 +18823 +18824 +18824 +18824 +18825 +18825 +18826 +18826 +18826 +18827 +18827 +18827 +18828 +18828 +18829 +18829 +18829 +18830 +18830 +18830 +18831 +18831 +18832 +18832 +18832 +18833 +18833 +18833 +18834 +18834 +18835 +18835 +18835 +18836 +18836 +18836 +18837 +18837 +18838 +18838 +18838 +18839 +18839 +18839 +18840 +18840 +18841 +18841 +18841 +18842 +18842 +18842 +18843 +18843 +18843 +18844 +18844 +18845 +18845 +18845 +18846 +18846 +18846 +18847 +18847 +18848 +18848 +18848 +18849 +18849 +18849 +18850 +18850 +18851 +18851 +18851 +18852 +18852 +18852 +18853 +18853 +18853 +18854 +18854 +18855 +18855 +18855 +18856 +18856 +18856 +18857 +18857 +18858 +18858 +18858 +18859 +18859 +18859 +18860 +18860 +18860 +18861 +18861 +18862 +18862 +18862 +18863 +18863 +18863 +18864 +18864 +18864 +18865 +18865 +18866 +18866 +18866 +18867 +18867 +18867 +18868 +18868 +18868 +18869 +18869 +18870 +18870 +18870 +18871 +18871 +18871 +18872 +18872 +18872 +18873 +18873 +18874 +18874 +18874 +18875 +18875 +18875 +18876 +18876 +18876 +18877 +18877 +18878 +18878 +18878 +18879 +18879 +18879 +18880 +18880 +18880 +18881 +18881 +18881 +18882 +18882 +18883 +18883 +18883 +18884 +18884 +18884 +18885 +18885 +18885 +18886 +18886 +18887 +18887 +18887 +18888 +18888 +18888 +18889 +18889 +18889 +18890 +18890 +18890 +18891 +18891 +18892 +18892 +18892 +18893 +18893 +18893 +18894 +18894 +18894 +18895 +18895 +18895 +18896 +18896 +18896 +18897 +18897 +18898 +18898 +18898 +18899 +18899 +18899 +18900 +18900 +18900 +18901 +18901 +18901 +18902 +18902 +18903 +18903 +18903 +18904 +18904 +18904 +18905 +18905 +18905 +18906 +18906 +18906 +18907 +18907 +18907 +18908 +18908 +18909 +18909 +18909 +18910 +18910 +18910 +18911 +18911 +18911 +18912 +18912 +18912 +18913 +18913 +18913 +18914 +18914 +18914 +18915 +18915 +18916 +18916 +18916 +18917 +18917 +18917 +18918 +18918 +18918 +18919 +18919 +18919 +18920 +18920 +18920 +18921 +18921 +18921 +18922 +18922 +18922 +18923 +18923 +18924 +18924 +18924 +18925 +18925 +18925 +18926 +18926 +18926 +18927 +18927 +18927 +18928 +18928 +18928 +18929 +18929 +18929 +18930 +18930 +18930 +18931 +18931 +18932 +18932 +18932 +18933 +18933 +18933 +18934 +18934 +18934 +18935 +18935 +18935 +18936 +18936 +18936 +18937 +18937 +18937 +18938 +18938 +18938 +18939 +18939 +18939 +18940 +18940 +18940 +18941 +18941 +18941 +18942 +18942 +18943 +18943 +18943 +18944 +18944 +18944 +18945 +18945 +18945 +18946 +18946 +18946 +18947 +18947 +18947 +18948 +18949 +18949 +18950 +18951 +18951 +18952 +18953 +18953 +18954 +18955 +18955 +18956 +18957 +18957 +18958 +18959 +18960 +18960 +18961 +18962 +18962 +18963 +18964 +18964 +18965 +18966 +18966 +18967 +18968 +18968 +18969 +18970 +18970 +18971 +18972 +18972 +18973 +18974 +18974 +18975 +18976 +18976 +18977 +18978 +18978 +18979 +18980 +18980 +18981 +18982 +18982 +18983 +18984 +18984 +18985 +18986 +18986 +18987 +18988 +18988 +18989 +18990 +18990 +18991 +18992 +18992 +18993 +18994 +18994 +18995 +18995 +18996 +18997 +18997 +18998 +18999 +18999 +19000 +19001 +19001 +19002 +19003 +19003 +19004 +19005 +19005 +19006 +19007 +19007 +19008 +19009 +19009 +19010 +19011 +19011 +19012 +19012 +19013 +19014 +19014 +19015 +19016 +19016 +19017 +19018 +19018 +19019 +19020 +19020 +19021 +19022 +19022 +19023 +19023 +19024 +19025 +19025 +19026 +19027 +19027 +19028 +19029 +19029 +19030 +19030 +19031 +19032 +19032 +19033 +19034 +19034 +19035 +19036 +19036 +19037 +19038 +19038 +19039 +19039 +19040 +19041 +19041 +19042 +19043 +19043 +19044 +19045 +19045 +19046 +19046 +19047 +19048 +19048 +19049 +19050 +19050 +19051 +19051 +19052 +19053 +19053 +19054 +19055 +19055 +19056 +19056 +19057 +19058 +19058 +19059 +19060 +19060 +19061 +19061 +19062 +19063 +19063 +19064 +19065 +19065 +19066 +19066 +19067 +19068 +19068 +19069 +19070 +19070 +19071 +19071 +19072 +19073 +19073 +19074 +19075 +19075 +19076 +19076 +19077 +19078 +19078 +19079 +19080 +19080 +19081 +19081 +19082 +19083 +19083 +19084 +19084 +19085 +19086 +19086 +19087 +19088 +19088 +19089 +19089 +19090 +19091 +19091 +19092 +19092 +19093 +19094 +19094 +19095 +19095 +19096 +19097 +19097 +19098 +19099 +19099 +19100 +19100 +19101 +19102 +19102 +19103 +19103 +19104 +19105 +19105 +19106 +19106 +19107 +19108 +19108 +19109 +19109 +19110 +19111 +19111 +19112 +19112 +19113 +19114 +19114 +19115 +19115 +19116 +19117 +19117 +19118 +19118 +19119 +19120 +19120 +19121 +19121 +19122 +19123 +19123 +19124 +19124 +19125 +19126 +19126 +19127 +19127 +19128 +19129 +19129 +19130 +19130 +19131 +19132 +19132 +19133 +19133 +19134 +19135 +19135 +19136 +19136 +19137 +19138 +19138 +19139 +19139 +19140 +19140 +19141 +19142 +19142 +19143 +19143 +19144 +19145 +19145 +19146 +19146 +19147 +19148 +19148 +19149 +19149 +19150 +19151 +19151 +19152 +19152 +19153 +19153 +19154 +19155 +19155 +19156 +19156 +19157 +19158 +19158 +19159 +19159 +19160 +19160 +19161 +19162 +19162 +19163 +19163 +19164 +19165 +19165 +19166 +19166 +19167 +19167 +19168 +19169 +19169 +19170 +19170 +19171 +19171 +19172 +19173 +19173 +19174 +19174 +19175 +19176 +19176 +19177 +19177 +19178 +19178 +19179 +19180 +19180 +19181 +19181 +19182 +19182 +19183 +19184 +19184 +19185 +19185 +19186 +19186 +19187 +19188 +19188 +19189 +19189 +19190 +19190 +19191 +19192 +19192 +19193 +19193 +19194 +19194 +19195 +19196 +19196 +19197 +19197 +19198 +19198 +19199 +19200 +19200 +19201 +19201 +19202 +19202 +19203 +19204 +19204 +19205 +19205 +19206 +19206 +19207 +19207 +19208 +19209 +19209 +19210 +19210 +19211 +19211 +19212 +19213 +19213 +19214 +19214 +19215 +19215 +19216 +19216 +19217 +19218 +19218 +19219 +19219 +19220 +19220 +19221 +19222 +19222 +19223 +19223 +19224 +19224 +19225 +19225 +19226 +19227 +19227 +19228 +19228 +19229 +19229 +19230 +19230 +19231 +19232 +19232 +19233 +19233 +19234 +19234 +19235 +19235 +19236 +19237 +19237 +19238 +19238 +19239 +19239 +19240 +19240 +19241 +19242 +19242 +19243 +19243 +19244 +19244 +19245 +19245 +19246 +19246 +19247 +19248 +19248 +19249 +19249 +19250 +19250 +19251 +19251 +19252 +19253 +19253 +19254 +19254 +19255 +19255 +19256 +19256 +19257 +19257 +19258 +19259 +19259 +19260 +19260 +19261 +19261 +19262 +19262 +19263 +19263 +19264 +19265 +19265 +19266 +19266 +19267 +19267 +19268 +19268 +19269 +19269 +19270 +19270 +19271 +19272 +19272 +19273 +19273 +19274 +19274 +19275 +19275 +19276 +19276 +19277 +19277 +19278 +19279 +19279 +19280 +19280 +19281 +19281 +19282 +19282 +19283 +19283 +19284 +19284 +19285 +19286 +19286 +19287 +19287 +19288 +19288 +19289 +19289 +19290 +19290 +19291 +19291 +19292 +19293 +19293 +19294 +19294 +19295 +19295 +19296 +19296 +19297 +19297 +19298 +19298 +19299 +19299 +19300 +19300 +19301 +19302 +19302 +19303 +19303 +19304 +19304 +19305 +19305 +19306 +19306 +19307 +19307 +19308 +19308 +19309 +19309 +19310 +19311 +19311 +19312 +19312 +19313 +19313 +19314 +19314 +19315 +19315 +19316 +19316 +19317 +19317 +19318 +19318 +19319 +19319 +19320 +19321 +19321 +19322 +19322 +19323 +19323 +19324 +19324 +19325 +19325 +19326 +19326 +19327 +19327 +19328 +19328 +19329 +19329 +19330 +19330 +19331 +19332 +19332 +19333 +19333 +19334 +19334 +19335 +19335 +19336 +19336 +19337 +19337 +19338 +19338 +19339 +19339 +19340 +19340 +19341 +19341 +19342 +19342 +19343 +19343 +19344 +19344 +19345 +19345 +19346 +19347 +19347 +19348 +19348 +19349 +19349 +19350 +19350 +19351 +19351 +19352 +19352 +19353 +19353 +19354 +19354 +19355 +19355 +19356 +19356 +19357 +19357 +19358 +19358 +19359 +19359 +19360 +19360 +19361 +19361 +19362 +19362 +19363 +19363 +19364 +19364 +19365 +19365 +19366 +19367 +19367 +19368 +19368 +19369 +19369 +19370 +19370 +19371 +19371 +19372 +19372 +19373 +19373 +19374 +19374 +19375 +19375 +19376 +19376 +19377 +19377 +19378 +19378 +19379 +19379 +19380 +19380 +19381 +19381 +19382 +19382 +19383 +19383 +19384 +19384 +19385 +19385 +19386 +19386 +19387 +19387 +19388 +19388 +19389 +19389 +19390 +19390 +19391 +19391 +19392 +19392 +19393 +19393 +19394 +19394 +19395 +19395 +19396 +19396 +19397 +19397 +19398 +19398 +19399 +19399 +19400 +19400 +19401 +19401 +19402 +19402 +19403 +19403 +19404 +19404 +19405 +19405 +19406 +19406 +19407 +19407 +19408 +19408 +19409 +19409 +19410 +19410 +19411 +19411 +19412 +19412 +19413 +19413 +19414 +19414 +19415 +19415 +19416 +19416 +19417 +19417 +19418 +19418 +19419 +19419 +19420 +19420 +19421 +19421 +19422 +19422 +19423 +19423 +19424 +19424 +19425 +19425 +19426 +19426 +19426 +19427 +19427 +19428 +19428 +19429 +19429 +19430 +19430 +19431 +19431 +19432 +19432 +19433 +19433 +19434 +19434 +19435 +19435 +19436 +19436 +19437 +19437 +19438 +19438 +19439 +19439 +19440 +19440 +19441 +19441 +19442 +19442 +19443 +19443 +19444 +19444 +19445 +19445 +19446 +19446 +19447 +19447 +19447 +19448 +19448 +19449 +19449 +19450 +19450 +19451 +19451 +19452 +19452 +19453 +19453 +19454 +19454 +19455 +19455 +19456 +19456 +19456 +19457 +19457 +19457 +19457 +19458 +19458 +19458 +19458 +19458 +19459 +19459 +19459 +19459 +19460 +19460 +19460 +19460 +19461 +19461 +19461 +19461 +19462 +19462 +19462 +19462 +19463 +19463 +19463 +19463 +19464 +19464 +19464 +19464 +19464 +19465 +19465 +19465 +19465 +19466 +19466 +19466 +19466 +19467 +19467 +19467 +19467 +19468 +19468 +19468 +19468 +19469 +19469 +19469 +19469 +19469 +19470 +19470 +19470 +19470 +19471 +19471 +19471 +19471 +19472 +19472 +19472 +19472 +19473 +19473 +19473 +19473 +19474 +19474 +19474 +19474 +19474 +19475 +19475 +19475 +19475 +19476 +19476 +19476 +19476 +19477 +19477 +19477 +19477 +19478 +19478 +19478 +19478 +19478 +19479 +19479 +19479 +19479 +19480 +19480 +19480 +19480 +19481 +19481 +19481 +19481 +19482 +19482 +19482 +19482 +19482 +19483 +19483 +19483 +19483 +19484 +19484 +19484 +19484 +19485 +19485 +19485 +19485 +19485 +19486 +19486 +19487 +19487 +19488 +19488 +19489 +19489 +19489 +19490 +19490 +19491 +19491 +19492 +19492 +19493 +19493 +19494 +19494 +19495 +19495 +19495 +19496 +19496 +19497 +19497 +19498 +19498 +19499 +19499 +19500 +19500 +19500 +19501 +19501 +19502 +19502 +19503 +19503 +19504 +19504 +19505 +19505 +19506 +19506 +19506 +19507 +19507 +19508 +19508 +19509 +19509 +19510 +19510 +19511 +19511 +19511 +19512 +19512 +19513 +19513 +19514 +19514 +19515 +19515 +19515 +19516 +19516 +19517 +19517 +19518 +19518 +19519 +19519 +19520 +19520 +19520 +19521 +19521 +19522 +19522 +19523 +19523 +19524 +19524 +19524 +19525 +19525 +19526 +19526 +19527 +19527 +19528 +19528 +19528 +19529 +19529 +19530 +19530 +19531 +19531 +19532 +19532 +19532 +19533 +19533 +19534 +19534 +19535 +19535 +19536 +19536 +19536 +19537 +19537 +19538 +19538 +19539 +19539 +19539 +19540 +19540 +19541 +19541 +19542 +19542 +19543 +19543 +19543 +19544 +19544 +19545 +19545 +19546 +19546 +19546 +19547 +19547 +19548 +19548 +19549 +19549 +19550 +19550 +19550 +19551 +19551 +19552 +19552 +19553 +19553 +19553 +19554 +19554 +19555 +19555 +19556 +19556 +19556 +19557 +19557 +19558 +19558 +19559 +19559 +19559 +19560 +19560 +19561 +19561 +19562 +19562 +19562 +19563 +19563 +19564 +19564 +19565 +19565 +19565 +19566 +19566 +19567 +19567 +19568 +19568 +19568 +19569 +19569 +19570 +19570 +19571 +19571 +19571 +19572 +19572 +19573 +19573 +19573 +19574 +19574 +19575 +19575 +19576 +19576 +19576 +19577 +19577 +19578 +19578 +19579 +19579 +19579 +19580 +19580 +19581 +19581 +19581 +19582 +19582 +19583 +19583 +19584 +19584 +19584 +19585 +19585 +19586 +19586 +19586 +19587 +19587 +19588 +19588 +19589 +19589 +19589 +19590 +19590 +19591 +19591 +19591 +19592 +19592 +19593 +19593 +19594 +19594 +19594 +19595 +19595 +19596 +19596 +19596 +19597 +19597 +19598 +19598 +19599 +19599 +19599 +19600 +19600 +19601 +19601 +19601 +19602 +19602 +19603 +19603 +19603 +19604 +19604 +19605 +19605 +19605 +19606 +19606 +19607 +19607 +19608 +19608 +19608 +19609 +19609 +19610 +19610 +19610 +19611 +19611 +19612 +19612 +19612 +19613 +19613 +19614 +19614 +19614 +19615 +19615 +19616 +19616 +19616 +19617 +19617 +19618 +19618 +19618 +19619 +19619 +19620 +19620 +19620 +19621 +19621 +19622 +19622 +19623 +19623 +19623 +19624 +19624 +19625 +19625 +19625 +19626 +19626 +19627 +19627 +19627 +19628 +19628 +19629 +19629 +19629 +19630 +19630 +19631 +19631 +19631 +19632 +19632 +19632 +19633 +19633 +19634 +19634 +19634 +19635 +19635 +19636 +19636 +19636 +19637 +19637 +19638 +19638 +19638 +19639 +19639 +19640 +19640 +19640 +19641 +19641 +19642 +19642 +19642 +19643 +19643 +19644 +19644 +19644 +19645 +19645 +19646 +19646 +19646 +19647 +19647 +19647 +19648 +19648 +19649 +19649 +19649 +19650 +19650 +19651 +19651 +19651 +19652 +19652 +19653 +19653 +19653 +19654 +19654 +19655 +19655 +19655 +19656 +19656 +19656 +19657 +19657 +19658 +19658 +19658 +19659 +19659 +19660 +19660 +19660 +19661 +19661 +19661 +19662 +19662 +19663 +19663 +19663 +19664 +19664 +19665 +19665 +19665 +19666 +19666 +19666 +19667 +19667 +19668 +19668 +19668 +19669 +19669 +19670 +19670 +19670 +19671 +19671 +19671 +19672 +19672 +19673 +19673 +19673 +19674 +19674 +19675 +19675 +19675 +19676 +19676 +19676 +19677 +19677 +19678 +19678 +19678 +19679 +19679 +19679 +19680 +19680 +19681 +19681 +19681 +19682 +19682 +19683 +19683 +19683 +19684 +19684 +19684 +19685 +19685 +19686 +19686 +19686 +19687 +19687 +19687 +19688 +19688 +19689 +19689 +19689 +19690 +19690 +19690 +19691 +19691 +19692 +19692 +19692 +19693 +19693 +19693 +19694 +19694 +19695 +19695 +19695 +19696 +19696 +19696 +19697 +19697 +19698 +19698 +19698 +19699 +19699 +19699 +19700 +19700 +19701 +19701 +19701 +19702 +19702 +19702 +19703 +19703 +19703 +19704 +19704 +19705 +19705 +19705 +19706 +19706 +19706 +19707 +19707 +19708 +19708 +19708 +19709 +19709 +19709 +19710 +19710 +19711 +19711 +19711 +19712 +19712 +19712 +19713 +19713 +19713 +19714 +19714 +19715 +19715 +19715 +19716 +19716 +19716 +19717 +19717 +19717 +19718 +19718 +19719 +19719 +19719 +19720 +19720 +19720 +19721 +19721 +19721 +19722 +19722 +19723 +19723 +19723 +19724 +19724 +19724 +19725 +19725 +19725 +19726 +19726 +19727 +19727 +19727 +19728 +19728 +19728 +19729 +19729 +19729 +19730 +19730 +19731 +19731 +19731 +19732 +19732 +19732 +19733 +19733 +19733 +19734 +19734 +19735 +19735 +19735 +19736 +19736 +19736 +19737 +19737 +19737 +19738 +19738 +19738 +19739 +19739 +19740 +19740 +19740 +19741 +19741 +19741 +19742 +19742 +19742 +19743 +19743 +19744 +19744 +19744 +19745 +19745 +19745 +19746 +19746 +19746 +19747 +19747 +19747 +19748 +19748 +19748 +19749 +19749 +19750 +19750 +19750 +19751 +19751 +19751 +19752 +19752 +19752 +19753 +19753 +19753 +19754 +19754 +19755 +19755 +19755 +19756 +19756 +19756 +19757 +19757 +19757 +19758 +19758 +19758 +19759 +19759 +19759 +19760 +19760 +19761 +19761 +19761 +19762 +19762 +19762 +19763 +19763 +19763 +19764 +19764 +19764 +19765 +19765 +19765 +19766 +19766 +19766 +19767 +19767 +19768 +19768 +19768 +19769 +19769 +19769 +19770 +19770 +19770 +19771 +19771 +19771 +19772 +19772 +19772 +19773 +19773 +19773 +19774 +19774 +19774 +19775 +19775 +19776 +19776 +19776 +19777 +19777 +19777 +19778 +19778 +19778 +19779 +19779 +19779 +19780 +19780 +19780 +19781 +19781 +19781 +19782 +19782 +19782 +19783 +19783 +19783 +19784 +19784 +19784 +19785 +19785 +19786 +19786 +19786 +19787 +19787 +19787 +19788 +19788 +19788 +19789 +19789 +19789 +19790 +19790 +19790 +19791 +19791 +19791 +19792 +19792 +19792 +19793 +19793 +19793 +19794 +19794 +19794 +19795 +19795 +19795 +19796 +19796 +19796 +19797 +19797 +19797 +19798 +19798 +19799 +19799 +19799 +19800 +19800 +19800 +19801 +19801 +19801 +19802 +19802 +19802 +19803 +19803 +19803 +19804 +19804 +19804 +19805 +19805 +19805 +19806 +19806 +19806 +19807 +19807 +19807 +19808 +19808 +19808 +19809 +19809 +19809 +19810 +19810 +19810 +19811 +19811 +19811 +19812 +19812 +19812 +19813 +19813 +19813 +19814 +19814 +19814 +19815 +19815 +19815 +19816 +19816 +19816 +19817 +19817 +19817 +19818 +19818 +19818 +19819 +19819 +19819 +19820 +19820 +19820 +19821 +19821 +19821 +19822 +19822 +19822 +19823 +19823 +19823 +19824 +19824 +19824 +19825 +19825 +19825 +19826 +19826 +19826 +19827 +19827 +19827 +19828 +19828 +19828 +19829 +19829 +19829 +19830 +19830 +19830 +19831 +19831 +19831 +19832 +19832 +19832 +19833 +19833 +19833 +19834 +19834 +19834 +19835 +19835 +19835 +19836 +19836 +19836 +19837 +19837 +19837 +19838 +19838 +19838 +19839 +19839 +19839 +19840 +19840 +19840 +19841 +19841 +19841 +19841 +19842 +19842 +19842 +19843 +19843 +19843 +19844 +19844 +19844 +19845 +19845 +19845 +19846 +19846 +19846 +19847 +19847 +19847 +19848 +19848 +19848 +19849 +19849 +19849 +19850 +19850 +19850 +19851 +19851 +19851 +19852 +19852 +19852 +19853 +19853 +19853 +19854 +19854 +19854 +19855 +19855 +19855 +19855 +19856 +19856 +19856 +19857 +19857 +19857 +19858 +19858 +19858 +19859 +19859 +19859 +19860 +19860 +19860 +19861 +19861 +19861 +19862 +19862 +19862 +19863 +19863 +19863 +19864 +19864 +19864 +19864 +19865 +19865 +19865 +19866 +19866 +19866 +19867 +19867 +19867 +19868 +19868 +19868 +19869 +19869 +19869 +19870 +19870 +19870 +19871 +19871 +19871 +19872 +19872 +19872 +19872 +19873 +19873 +19873 +19874 +19874 +19875 +19876 +19876 +19877 +19878 +19878 +19879 +19879 +19880 +19881 +19881 +19882 +19883 +19883 +19884 +19885 +19885 +19886 +19886 +19887 +19888 +19888 +19889 +19890 +19890 +19891 +19891 +19892 +19893 +19893 +19894 +19895 +19895 +19896 +19896 +19897 +19898 +19898 +19899 +19900 +19900 +19901 +19901 +19902 +19903 +19903 +19904 +19905 +19905 +19906 +19906 +19907 +19908 +19908 +19909 +19909 +19910 +19911 +19911 +19912 +19913 +19913 +19914 +19914 +19915 +19916 +19916 +19917 +19917 +19918 +19919 +19919 +19920 +19921 +19921 +19922 +19922 +19923 +19924 +19924 +19925 +19925 +19926 +19927 +19927 +19928 +19928 +19929 +19930 +19930 +19931 +19932 +19932 +19933 +19933 +19934 +19935 +19935 +19936 +19936 +19937 +19938 +19938 +19939 +19939 +19940 +19941 +19941 +19942 +19942 +19943 +19944 +19944 +19945 +19945 +19946 +19947 +19947 +19948 +19948 +19949 +19950 +19950 +19951 +19951 +19952 +19953 +19953 +19954 +19954 +19955 +19956 +19956 +19957 +19957 +19958 +19959 +19959 +19960 +19960 +19961 +19961 +19962 +19963 +19963 +19964 +19964 +19965 +19966 +19966 +19967 +19967 +19968 +19969 +19969 +19970 +19970 +19971 +19972 +19972 +19973 +19973 +19974 +19974 +19975 +19976 +19976 +19977 +19977 +19978 +19979 +19979 +19980 +19980 +19981 +19981 +19982 +19983 +19983 +19984 +19984 +19985 +19986 +19986 +19987 +19987 +19988 +19988 +19989 +19990 +19990 +19991 +19991 +19992 +19993 +19993 +19994 +19994 +19995 +19995 +19996 +19997 +19997 +19998 +19998 +19999 +19999 +20000 +20001 +20001 +20002 +20002 +20003 +20003 +20004 +20005 +20005 +20006 +20006 +20007 +20007 +20008 +20009 +20009 +20010 +20010 +20011 +20011 +20012 +20013 +20013 +20014 +20014 +20015 +20015 +20016 +20017 +20017 +20018 +20018 +20019 +20019 +20020 +20021 +20021 +20022 +20022 +20023 +20023 +20024 +20024 +20025 +20026 +20026 +20027 +20027 +20028 +20028 +20029 +20030 +20030 +20031 +20031 +20032 +20032 +20033 +20033 +20034 +20035 +20035 +20036 +20036 +20037 +20037 +20038 +20038 +20039 +20040 +20040 +20041 +20041 +20042 +20042 +20043 +20044 +20044 +20045 +20045 +20046 +20046 +20047 +20047 +20048 +20048 +20049 +20050 +20050 +20051 +20051 +20052 +20052 +20053 +20053 +20054 +20055 +20055 +20056 +20056 +20057 +20057 +20058 +20058 +20059 +20060 +20060 +20061 +20061 +20062 +20062 +20063 +20063 +20064 +20064 +20065 +20066 +20066 +20067 +20067 +20068 +20068 +20069 +20069 +20070 +20070 +20071 +20072 +20072 +20073 +20073 +20074 +20074 +20075 +20075 +20076 +20076 +20077 +20078 +20078 +20079 +20079 +20080 +20080 +20081 +20081 +20082 +20082 +20083 +20083 +20084 +20085 +20085 +20086 +20086 +20087 +20087 +20088 +20088 +20089 +20089 +20090 +20090 +20091 +20092 +20092 +20093 +20093 +20094 +20094 +20095 +20095 +20096 +20096 +20097 +20097 +20098 +20098 +20099 +20100 +20100 +20101 +20101 +20102 +20102 +20103 +20103 +20104 +20104 +20105 +20105 +20106 +20106 +20107 +20108 +20108 +20109 +20109 +20110 +20110 +20111 +20111 +20112 +20112 +20113 +20113 +20114 +20114 +20115 +20115 +20116 +20117 +20117 +20118 +20118 +20119 +20119 +20120 +20120 +20121 +20121 +20122 +20122 +20123 +20123 +20124 +20124 +20125 +20125 +20126 +20126 +20127 +20128 +20128 +20129 +20129 +20130 +20130 +20131 +20131 +20132 +20132 +20133 +20133 +20134 +20134 +20135 +20135 +20136 +20136 +20137 +20137 +20138 +20138 +20139 +20139 +20140 +20141 +20141 +20142 +20142 +20143 +20143 +20144 +20144 +20145 +20145 +20146 +20146 +20147 +20147 +20148 +20148 +20149 +20149 +20150 +20150 +20151 +20151 +20152 +20152 +20153 +20153 +20154 +20154 +20155 +20155 +20156 +20156 +20157 +20158 +20158 +20159 +20159 +20160 +20160 +20161 +20161 +20162 +20162 +20163 +20163 +20164 +20164 +20165 +20165 +20166 +20166 +20167 +20167 +20168 +20168 +20169 +20169 +20170 +20170 +20171 +20171 +20172 +20172 +20173 +20173 +20174 +20174 +20175 +20175 +20176 +20176 +20177 +20177 +20178 +20178 +20179 +20179 +20180 +20180 +20181 +20181 +20182 +20182 +20183 +20183 +20184 +20184 +20185 +20185 +20186 +20186 +20187 +20187 +20188 +20188 +20189 +20189 +20190 +20190 +20191 +20191 +20192 +20192 +20193 +20193 +20194 +20194 +20195 +20195 +20196 +20196 +20197 +20197 +20198 +20198 +20199 +20199 +20200 +20200 +20201 +20201 +20202 +20202 +20203 +20203 +20204 +20204 +20205 +20205 +20206 +20206 +20207 +20207 +20208 +20208 +20209 +20209 +20210 +20210 +20211 +20211 +20212 +20212 +20213 +20213 +20214 +20214 +20215 +20215 +20216 +20216 +20217 +20217 +20218 +20218 +20219 +20219 +20220 +20220 +20221 +20221 +20222 +20222 +20222 +20223 +20223 +20224 +20224 +20225 +20225 +20226 +20226 +20227 +20227 +20228 +20228 +20229 +20229 +20230 +20230 +20231 +20231 +20232 +20232 +20233 +20233 +20234 +20234 +20235 +20235 +20236 +20236 +20237 +20237 +20238 +20238 +20239 +20239 +20239 +20240 +20240 +20241 +20241 +20242 +20242 +20243 +20243 +20244 +20244 +20245 +20245 +20246 +20246 +20247 +20247 +20248 +20248 +20249 +20249 +20250 +20250 +20251 +20251 +20252 +20252 +20252 +20253 +20253 +20254 +20254 +20255 +20255 +20256 +20256 +20257 +20257 +20258 +20258 +20259 +20259 +20260 +20260 +20261 +20261 +20262 +20262 +20263 +20263 +20263 +20264 +20264 +20265 +20265 +20266 +20266 +20267 +20267 +20268 +20268 +20269 +20269 +20270 +20270 +20271 +20271 +20272 +20272 +20272 +20273 +20273 +20274 +20274 +20275 +20275 +20276 +20276 +20277 +20277 +20278 +20278 +20279 +20279 +20280 +20280 +20280 +20281 +20281 +20282 +20282 +20283 +20283 +20284 +20284 +20285 +20285 +20286 +20286 +20287 +20287 +20288 +20288 +20288 +20289 +20289 +20290 +20290 +20291 +20291 +20292 +20292 +20293 +20293 +20294 +20294 +20295 +20295 +20295 +20296 +20296 +20297 +20297 +20298 +20298 +20299 +20299 +20300 +20300 +20301 +20301 +20302 +20302 +20302 +20303 +20303 +20304 +20304 +20305 +20305 +20306 +20306 +20307 +20307 +20308 +20308 +20308 +20309 +20309 +20310 +20310 +20311 +20311 +20312 +20312 +20313 +20313 +20314 +20314 +20314 +20315 +20315 +20316 +20316 +20317 +20317 +20318 +20318 +20319 +20319 +20319 +20320 +20320 +20321 +20321 +20322 +20322 +20323 +20323 +20324 +20324 +20325 +20325 +20325 +20326 +20326 +20327 +20327 +20328 +20328 +20329 +20329 +20330 +20330 +20330 +20331 +20331 +20332 +20332 +20333 +20333 +20334 +20334 +20335 +20335 +20335 +20336 +20336 +20337 +20337 +20338 +20338 +20339 +20339 +20340 +20340 +20340 +20341 +20341 +20342 +20342 +20343 +20343 +20344 +20344 +20345 +20345 +20345 +20346 +20346 +20347 +20347 +20348 +20348 +20349 +20349 +20349 +20350 +20350 +20351 +20351 +20352 +20352 +20353 +20353 +20354 +20354 +20354 +20355 +20355 +20356 +20356 +20357 +20357 +20358 +20358 +20358 +20359 +20359 +20360 +20360 +20361 +20361 +20362 +20362 +20362 +20363 +20363 +20364 +20364 +20365 +20365 +20366 +20366 +20366 +20367 +20367 +20368 +20368 +20369 +20369 +20370 +20370 +20370 +20371 +20371 +20372 +20372 +20373 +20373 +20374 +20374 +20374 +20375 +20375 +20376 +20376 +20377 +20377 +20378 +20378 +20378 +20379 +20379 +20380 +20380 +20381 +20381 +20382 +20382 +20382 +20383 +20383 +20384 +20384 +20385 +20385 +20385 +20386 +20386 +20387 +20387 +20388 +20388 +20389 +20389 +20389 +20390 +20390 +20391 +20391 +20392 +20392 +20392 +20393 +20393 +20394 +20394 +20395 +20395 +20396 +20396 +20396 +20397 +20397 +20398 +20398 +20399 +20399 +20399 +20400 +20400 +20401 +20401 +20402 +20402 +20403 +20403 +20403 +20404 +20405 +20406 +20406 +20407 +20408 +20409 +20410 +20411 +20412 +20413 +20413 +20414 +20415 +20416 +20417 +20418 +20419 +20419 +20420 +20421 +20422 +20423 +20424 +20425 +20425 +20426 +20427 +20428 +20429 +20430 +20431 +20431 +20432 +20433 +20434 +20435 +20436 +20437 +20437 +20438 +20439 +20440 +20441 +20442 +20442 +20443 +20444 +20445 +20446 +20447 +20448 +20448 +20449 +20450 +20451 +20452 +20453 +20453 +20454 +20455 +20456 +20457 +20458 +20459 +20459 +20460 +20461 +20462 +20463 +20464 +20464 +20465 +20466 +20467 +20468 +20469 +20469 +20470 +20471 +20472 +20473 +20474 +20474 +20475 +20476 +20477 +20478 +20479 +20479 +20480 +20481 +20481 +20481 +20482 +20482 +20483 +20483 +20483 +20484 +20484 +20485 +20485 +20486 +20486 +20486 +20487 +20487 +20488 +20488 +20488 +20489 +20489 +20490 +20490 +20490 +20491 +20491 +20492 +20492 +20492 +20493 +20493 +20494 +20494 +20495 +20495 +20495 +20496 +20496 +20497 +20497 +20497 +20498 +20498 +20499 +20499 +20499 +20500 +20500 +20501 +20501 +20501 +20502 +20502 +20503 +20503 +20503 +20504 +20504 +20505 +20505 +20505 +20506 +20506 +20507 +20507 +20507 +20508 +20508 +20509 +20509 +20509 +20510 +20510 +20511 +20511 +20512 +20512 +20512 +20513 +20513 +20513 +20514 +20514 +20515 +20515 +20515 +20516 +20516 +20517 +20517 +20517 +20518 +20518 +20519 +20519 +20519 +20520 +20520 +20521 +20521 +20521 +20522 +20522 +20523 +20523 +20523 +20524 +20524 +20525 +20525 +20525 +20526 +20526 +20527 +20527 +20527 +20528 +20528 +20529 +20529 +20529 +20530 +20530 +20530 +20531 +20531 +20532 +20532 +20532 +20533 +20533 +20534 +20534 +20534 +20535 +20535 +20536 +20536 +20536 +20537 +20537 +20538 +20538 +20538 +20539 +20539 +20539 +20540 +20540 +20541 +20541 +20541 +20542 +20542 +20543 +20543 +20543 +20544 +20544 +20544 +20545 +20545 +20546 +20546 +20546 +20547 +20547 +20548 +20548 +20548 +20549 +20549 +20549 +20550 +20550 +20551 +20551 +20551 +20552 +20552 +20553 +20553 +20553 +20554 +20554 +20554 +20555 +20555 +20556 +20556 +20556 +20557 +20557 +20557 +20558 +20558 +20559 +20559 +20559 +20560 +20560 +20561 +20561 +20561 +20562 +20562 +20562 +20563 +20563 +20564 +20564 +20564 +20565 +20565 +20565 +20566 +20566 +20567 +20567 +20567 +20568 +20568 +20568 +20569 +20569 +20570 +20570 +20570 +20571 +20571 +20571 +20572 +20572 +20573 +20573 +20573 +20574 +20574 +20574 +20575 +20575 +20576 +20576 +20576 +20577 +20577 +20577 +20578 +20578 +20579 +20579 +20579 +20580 +20580 +20580 +20581 +20581 +20581 +20582 +20582 +20583 +20583 +20583 +20584 +20584 +20584 +20585 +20585 +20586 +20586 +20586 +20587 +20587 +20587 +20588 +20588 +20588 +20589 +20589 +20590 +20590 +20590 +20591 +20591 +20591 +20592 +20592 +20592 +20593 +20593 +20594 +20594 +20594 +20595 +20595 +20595 +20596 +20596 +20597 +20597 +20597 +20598 +20598 +20598 +20599 +20599 +20599 +20600 +20600 +20601 +20601 +20601 +20602 +20602 +20602 +20603 +20603 +20603 +20604 +20604 +20604 +20605 +20605 +20606 +20606 +20606 +20607 +20607 +20607 +20608 +20608 +20608 +20609 +20609 +20610 +20610 +20610 +20611 +20611 +20611 +20612 +20612 +20612 +20613 +20613 +20613 +20614 +20614 +20615 +20615 +20615 +20616 +20616 +20616 +20617 +20617 +20617 +20618 +20618 +20618 +20619 +20619 +20620 +20620 +20620 +20621 +20621 +20621 +20622 +20622 +20622 +20623 +20623 +20623 +20624 +20624 +20624 +20625 +20625 +20626 +20626 +20626 +20627 +20627 +20627 +20628 +20628 +20628 +20629 +20629 +20629 +20630 +20630 +20630 +20631 +20631 +20632 +20632 +20632 +20633 +20633 +20633 +20634 +20634 +20634 +20635 +20635 +20635 +20636 +20636 +20636 +20637 +20637 +20637 +20638 +20638 +20639 +20639 +20639 +20640 +20640 +20640 +20641 +20641 +20641 +20642 +20642 +20642 +20643 +20643 +20643 +20644 +20644 +20644 +20645 +20645 +20645 +20646 +20646 +20646 +20647 +20647 +20648 +20648 +20648 +20649 +20649 +20649 +20650 +20650 +20650 +20651 +20651 +20651 +20652 +20652 +20652 +20653 +20653 +20653 +20654 +20654 +20654 +20655 +20655 +20655 +20656 +20656 +20656 +20657 +20657 +20657 +20658 +20658 +20659 +20659 +20659 +20660 +20660 +20660 +20661 +20661 +20661 +20662 +20662 +20662 +20663 +20663 +20663 +20664 +20664 +20664 +20665 +20665 +20665 +20666 +20666 +20666 +20667 +20667 +20667 +20668 +20668 +20668 +20669 +20669 +20669 +20670 +20670 +20670 +20671 +20671 +20671 +20672 +20672 +20672 +20673 +20673 +20673 +20674 +20674 +20674 +20675 +20675 +20675 +20676 +20676 +20676 +20677 +20677 +20677 +20678 +20678 +20678 +20679 +20679 +20679 +20680 +20680 +20680 +20681 +20681 +20681 +20682 +20682 +20682 +20683 +20683 +20683 +20684 +20684 +20684 +20685 +20685 +20685 +20686 +20686 +20686 +20687 +20687 +20687 +20688 +20688 +20688 +20689 +20689 +20689 +20690 +20690 +20690 +20691 +20691 +20691 +20692 +20692 +20692 +20693 +20693 +20693 +20694 +20694 +20694 +20695 +20695 +20695 +20696 +20696 +20696 +20697 +20697 +20697 +20698 +20698 +20698 +20699 +20699 +20699 +20700 +20700 +20700 +20701 +20701 +20701 +20702 +20702 +20702 +20703 +20703 +20703 +20704 +20704 +20704 +20705 +20705 +20705 +20706 +20706 +20706 +20706 +20707 +20707 +20707 +20708 +20708 +20708 +20709 +20709 +20709 +20710 +20710 +20710 +20711 +20711 +20711 +20712 +20712 +20712 +20713 +20713 +20713 +20714 +20714 +20714 +20715 +20715 +20715 +20716 +20716 +20716 +20717 +20717 +20717 +20717 +20718 +20718 +20718 +20719 +20719 +20719 +20720 +20720 +20720 +20721 +20721 +20721 +20722 +20722 +20722 +20723 +20723 +20723 +20724 +20724 +20724 +20725 +20725 +20725 +20725 +20726 +20726 +20726 +20727 +20727 +20727 +20728 +20728 +20728 +20729 +20729 +20729 +20730 +20730 +20730 +20731 +20731 +20731 +20732 +20732 +20732 +20732 +20733 +20733 +20733 +20734 +20734 +20734 +20735 +20735 +20735 +20736 +20736 +20736 +20737 +20737 +20737 +20738 +20738 +20738 +20739 +20739 +20739 +20739 +20740 +20740 +20740 +20741 +20741 +20741 +20742 +20742 +20742 +20743 +20743 +20743 +20744 +20744 +20744 +20744 +20745 +20745 +20745 +20746 +20746 +20746 +20747 +20747 +20747 +20748 +20748 +20748 +20749 +20749 +20749 +20749 +20750 +20750 +20750 +20751 +20751 +20751 +20752 +20752 +20752 +20753 +20753 +20753 +20754 +20754 +20754 +20754 +20755 +20755 +20755 +20756 +20756 +20756 +20757 +20757 +20757 +20758 +20758 +20758 +20759 +20759 +20759 +20759 +20760 +20760 +20760 +20761 +20761 +20761 +20762 +20762 +20762 +20763 +20763 +20763 +20763 +20764 +20764 +20764 +20765 +20765 +20765 +20766 +20766 +20766 +20767 +20767 +20767 +20767 +20768 +20768 +20768 +20769 +20769 +20769 +20770 +20770 +20770 +20771 +20771 +20771 +20771 +20772 +20772 +20772 +20773 +20773 +20773 +20774 +20774 +20774 +20774 +20775 +20775 +20775 +20776 +20776 +20776 +20777 +20777 +20777 +20778 +20778 +20778 +20778 +20779 +20779 +20779 +20780 +20780 +20780 +20781 +20781 +20781 +20781 +20782 +20782 +20782 +20783 +20783 +20783 +20784 +20784 +20784 +20785 +20785 +20785 +20785 +20786 +20786 +20786 +20787 +20787 +20787 +20788 +20788 +20788 +20788 +20789 +20789 +20789 +20790 +20790 +20790 +20791 +20791 +20791 +20791 +20792 +20792 +20792 +20793 +20793 +20793 +20794 +20794 +20794 +20794 +20795 +20795 +20795 +20796 +20796 +20796 +20797 +20797 +20797 +20797 +20798 +20798 +20798 +20799 +20799 +20799 +20800 +20800 +20800 +20800 +20801 +20801 +20801 +20802 +20802 +20802 +20802 +20803 +20803 +20803 +20804 +20804 +20805 +20805 +20806 +20806 +20807 +20808 +20808 +20809 +20809 +20810 +20810 +20811 +20812 +20812 +20813 +20813 +20814 +20815 +20815 +20816 +20816 +20817 +20818 +20818 +20819 +20819 +20820 +20820 +20821 +20822 +20822 +20823 +20823 +20824 +20825 +20825 +20826 +20826 +20827 +20827 +20828 +20829 +20829 +20830 +20830 +20831 +20832 +20832 +20833 +20833 +20834 +20834 +20835 +20836 +20836 +20837 +20837 +20838 +20838 +20839 +20840 +20840 +20841 +20841 +20842 +20842 +20843 +20844 +20844 +20845 +20845 +20846 +20847 +20847 +20848 +20848 +20849 +20849 +20850 +20850 +20851 +20852 +20852 +20853 +20853 +20854 +20854 +20855 +20856 +20856 +20857 +20857 +20858 +20858 +20859 +20860 +20860 +20861 +20861 +20862 +20862 +20863 +20864 +20864 +20865 +20865 +20866 +20866 +20867 +20867 +20868 +20869 +20869 +20870 +20870 +20871 +20871 +20872 +20873 +20873 +20874 +20874 +20875 +20875 +20876 +20876 +20877 +20878 +20878 +20879 +20879 +20880 +20880 +20881 +20881 +20882 +20883 +20883 +20884 +20884 +20885 +20885 +20886 +20886 +20887 +20887 +20888 +20889 +20889 +20890 +20890 +20891 +20891 +20892 +20892 +20893 +20894 +20894 +20895 +20895 +20896 +20896 +20897 +20897 +20898 +20898 +20899 +20900 +20900 +20901 +20901 +20902 +20902 +20903 +20903 +20904 +20904 +20905 +20906 +20906 +20907 +20907 +20908 +20908 +20909 +20909 +20910 +20910 +20911 +20912 +20912 +20913 +20913 +20914 +20914 +20915 +20915 +20916 +20916 +20917 +20917 +20918 +20919 +20919 +20920 +20920 +20921 +20921 +20922 +20922 +20923 +20923 +20924 +20924 +20925 +20926 +20926 +20927 +20927 +20928 +20928 +20929 +20929 +20930 +20930 +20931 +20931 +20932 +20932 +20933 +20933 +20934 +20935 +20935 +20936 +20936 +20937 +20937 +20938 +20938 +20939 +20939 +20940 +20940 +20941 +20941 +20942 +20942 +20943 +20944 +20944 +20945 +20945 +20946 +20946 +20947 +20947 +20948 +20948 +20949 +20949 +20950 +20950 +20951 +20951 +20952 +20952 +20953 +20954 +20954 +20955 +20955 +20956 +20956 +20957 +20957 +20958 +20958 +20959 +20959 +20960 +20960 +20961 +20961 +20962 +20962 +20963 +20963 +20964 +20964 +20965 +20965 +20966 +20966 +20967 +20968 +20968 +20969 +20969 +20970 +20970 +20971 +20971 +20972 +20972 +20973 +20973 +20974 +20974 +20975 +20975 +20976 +20976 +20977 +20977 +20978 +20978 +20979 +20979 +20980 +20980 +20981 +20981 +20982 +20982 +20983 +20983 +20984 +20984 +20985 +20985 +20986 +20986 +20987 +20988 +20988 +20989 +20989 +20990 +20990 +20991 +20991 +20992 +20992 +20993 +20993 +20994 +20994 +20995 +20995 +20996 +20996 +20997 +20997 +20998 +20998 +20999 +20999 +21000 +21000 +21001 +21001 +21002 +21002 +21003 +21003 +21004 +21004 +21005 +21005 +21006 +21006 +21007 +21007 +21008 +21008 +21009 +21009 +21010 +21010 +21011 +21011 +21012 +21012 +21013 +21013 +21014 +21014 +21015 +21015 +21016 +21016 +21017 +21017 +21018 +21018 +21019 +21019 +21020 +21020 +21021 +21021 +21022 +21022 +21023 +21023 +21024 +21024 +21025 +21025 +21026 +21026 +21027 +21027 +21028 +21028 +21029 +21029 +21029 +21030 +21030 +21031 +21031 +21032 +21032 +21033 +21033 +21034 +21034 +21035 +21035 +21036 +21036 +21037 +21037 +21038 +21038 +21039 +21039 +21040 +21040 +21041 +21041 +21042 +21042 +21043 +21043 +21044 +21044 +21045 +21045 +21046 +21046 +21047 +21047 +21048 +21048 +21049 +21049 +21049 +21050 +21050 +21051 +21051 +21052 +21052 +21053 +21053 +21054 +21054 +21055 +21055 +21056 +21056 +21057 +21057 +21058 +21058 +21059 +21059 +21060 +21060 +21061 +21061 +21062 +21062 +21063 +21063 +21063 +21064 +21064 +21065 +21065 +21066 +21066 +21067 +21067 +21068 +21068 +21069 +21069 +21070 +21070 +21071 +21071 +21072 +21072 +21073 +21073 +21073 +21074 +21074 +21075 +21075 +21076 +21076 +21077 +21077 +21078 +21078 +21079 +21079 +21080 +21080 +21081 +21081 +21082 +21082 +21082 +21083 +21083 +21084 +21084 +21085 +21085 +21086 +21086 +21087 +21087 +21088 +21088 +21089 +21089 +21090 +21090 +21090 +21091 +21091 +21092 +21092 +21093 +21093 +21094 +21094 +21095 +21095 +21096 +21096 +21097 +21097 +21098 +21098 +21098 +21099 +21099 +21100 +21100 +21101 +21101 +21102 +21102 +21103 +21103 +21104 +21104 +21104 +21105 +21105 +21106 +21106 +21107 +21107 +21108 +21108 +21109 +21109 +21110 +21110 +21111 +21111 +21111 +21112 +21112 +21113 +21113 +21114 +21114 +21115 +21115 +21116 +21116 +21117 +21117 +21117 +21118 +21118 +21119 +21119 +21120 +21120 +21121 +21121 +21122 +21122 +21122 +21123 +21123 +21124 +21124 +21125 +21125 +21126 +21126 +21127 +21127 +21128 +21128 +21128 +21129 +21129 +21130 +21130 +21131 +21131 +21132 +21132 +21133 +21133 +21133 +21134 +21134 +21135 +21135 +21136 +21136 +21137 +21137 +21138 +21138 +21138 +21139 +21139 +21140 +21140 +21141 +21141 +21142 +21142 +21143 +21143 +21143 +21144 +21144 +21145 +21145 +21146 +21146 +21147 +21147 +21147 +21148 +21148 +21149 +21149 +21150 +21150 +21151 +21151 +21152 +21152 +21152 +21153 +21153 +21154 +21154 +21155 +21155 +21156 +21156 +21156 +21157 +21157 +21158 +21158 +21159 +21159 +21160 +21160 +21160 +21161 +21161 +21162 +21162 +21163 +21163 +21164 +21164 +21164 +21165 +21165 +21166 +21166 +21167 +21167 +21168 +21168 +21168 +21169 +21169 +21170 +21170 +21171 +21171 +21172 +21172 +21172 +21173 +21173 +21174 +21174 +21175 +21175 +21176 +21176 +21176 +21177 +21177 +21178 +21178 +21179 +21179 +21180 +21180 +21180 +21181 +21181 +21182 +21182 +21183 +21183 +21183 +21184 +21184 +21185 +21185 +21186 +21186 +21187 +21187 +21187 +21188 +21188 +21189 +21189 +21190 +21190 +21190 +21191 +21191 +21192 +21192 +21193 +21193 +21194 +21194 +21194 +21195 +21195 +21196 +21196 +21197 +21197 +21197 +21198 +21198 +21199 +21199 +21200 +21200 +21200 +21201 +21201 +21202 +21202 +21203 +21203 +21204 +21204 +21204 +21205 +21205 +21206 +21206 +21207 +21207 +21207 +21208 +21208 +21209 +21209 +21210 +21210 +21210 +21211 +21211 +21212 +21212 +21213 +21213 +21213 +21214 +21214 +21215 +21215 +21216 +21216 +21216 +21217 +21217 +21218 +21218 +21219 +21219 +21219 +21220 +21220 +21221 +21221 +21222 +21222 +21222 +21223 +21223 +21224 +21224 +21225 +21225 +21225 +21226 +21226 +21227 +21227 +21228 +21228 +21228 +21229 +21229 +21230 +21230 +21231 +21231 +21231 +21232 +21232 +21233 +21233 +21233 +21234 +21234 +21235 +21235 +21236 +21236 +21236 +21237 +21237 +21238 +21238 +21239 +21239 +21239 +21240 +21240 +21241 +21241 +21242 +21242 +21242 +21243 +21243 +21244 +21244 +21244 +21245 +21245 +21246 +21246 +21247 +21247 +21247 +21248 +21248 +21249 +21249 +21250 +21250 +21250 +21251 +21251 +21252 +21252 +21252 +21253 +21253 +21254 +21254 +21255 +21255 +21255 +21256 +21256 +21257 +21257 +21257 +21258 +21258 +21259 +21259 +21260 +21260 +21260 +21261 +21261 +21262 +21262 +21262 +21263 +21263 +21264 +21264 +21265 +21265 +21265 +21266 +21266 +21267 +21267 +21267 +21268 +21268 +21269 +21269 +21269 +21270 +21270 +21271 +21271 +21272 +21272 +21272 +21273 +21273 +21274 +21274 +21274 +21275 +21275 +21276 +21276 +21276 +21277 +21277 +21278 +21278 +21279 +21279 +21279 +21280 +21280 +21281 +21281 +21281 +21282 +21282 +21283 +21283 +21283 +21284 +21284 +21285 +21285 +21286 +21286 +21286 +21287 +21287 +21288 +21288 +21288 +21289 +21289 +21290 +21290 +21290 +21291 +21291 +21292 +21292 +21292 +21293 +21293 +21294 +21294 +21294 +21295 +21295 +21296 +21296 +21297 +21297 +21297 +21298 +21298 +21299 +21299 +21300 +21301 +21302 +21303 +21303 +21304 +21305 +21306 +21307 +21307 +21308 +21309 +21310 +21311 +21311 +21312 +21313 +21314 +21315 +21315 +21316 +21317 +21318 +21319 +21320 +21320 +21321 +21322 +21323 +21323 +21324 +21325 +21326 +21327 +21327 +21328 +21329 +21330 +21331 +21331 +21332 +21333 +21334 +21335 +21335 +21336 +21337 +21338 +21339 +21339 +21340 +21341 +21342 +21343 +21343 +21344 +21345 +21346 +21346 +21347 +21348 +21349 +21350 +21350 +21351 +21352 +21353 +21354 +21354 +21355 +21356 +21357 +21357 +21358 +21359 +21360 +21361 +21361 +21362 +21363 +21364 +21364 +21365 +21366 +21367 +21368 +21368 +21369 +21370 +21371 +21371 +21372 +21373 +21374 +21375 +21375 +21376 +21377 +21378 +21378 +21379 +21380 +21381 +21381 +21382 +21383 +21384 +21385 +21385 +21386 +21387 +21388 +21388 +21389 +21390 +21391 +21391 +21392 +21393 +21394 +21394 +21395 +21396 +21397 +21398 +21398 +21399 +21400 +21401 +21401 +21402 +21403 +21404 +21404 +21405 +21406 +21407 +21407 +21408 +21409 +21410 +21410 +21411 +21412 +21413 +21413 +21414 +21415 +21416 +21416 +21417 +21418 +21419 +21419 +21420 +21421 +21422 +21422 +21423 +21424 +21425 +21425 +21426 +21427 +21428 +21428 +21429 +21430 +21431 +21431 +21432 +21433 +21434 +21434 +21435 +21436 +21437 +21437 +21438 +21439 +21440 +21440 +21441 +21442 +21443 +21443 +21444 +21445 +21445 +21446 +21447 +21448 +21448 +21449 +21450 +21451 +21451 +21452 +21453 +21454 +21454 +21455 +21456 +21457 +21457 +21458 +21459 +21459 +21460 +21461 +21462 +21462 +21463 +21464 +21465 +21465 +21466 +21467 +21467 +21468 +21469 +21470 +21470 +21471 +21472 +21473 +21473 +21474 +21475 +21475 +21476 +21477 +21478 +21478 +21479 +21480 +21481 +21481 +21482 +21483 +21483 +21484 +21485 +21486 +21486 +21487 +21488 +21488 +21489 +21490 +21491 +21491 +21492 +21493 +21494 +21494 +21495 +21496 +21496 +21497 +21498 +21499 +21499 +21500 +21501 +21501 +21502 +21503 +21504 +21504 +21504 +21505 +21505 +21506 +21506 +21506 +21507 +21507 +21507 +21508 +21508 +21508 +21509 +21509 +21509 +21510 +21510 +21511 +21511 +21511 +21512 +21512 +21512 +21513 +21513 +21513 +21514 +21514 +21514 +21515 +21515 +21515 +21516 +21516 +21517 +21517 +21517 +21518 +21518 +21518 +21519 +21519 +21519 +21520 +21520 +21520 +21521 +21521 +21521 +21522 +21522 +21522 +21523 +21523 +21524 +21524 +21524 +21525 +21525 +21525 +21526 +21526 +21526 +21527 +21527 +21527 +21528 +21528 +21528 +21529 +21529 +21529 +21530 +21530 +21530 +21531 +21531 +21531 +21532 +21532 +21533 +21533 +21533 +21534 +21534 +21534 +21535 +21535 +21535 +21536 +21536 +21536 +21537 +21537 +21537 +21538 +21538 +21538 +21539 +21539 +21539 +21540 +21540 +21540 +21541 +21541 +21541 +21542 +21542 +21542 +21543 +21543 +21543 +21544 +21544 +21544 +21545 +21545 +21546 +21546 +21546 +21547 +21547 +21547 +21548 +21548 +21548 +21549 +21549 +21549 +21550 +21550 +21550 +21551 +21551 +21551 +21552 +21552 +21552 +21553 +21553 +21553 +21554 +21554 +21554 +21555 +21555 +21555 +21556 +21556 +21556 +21557 +21557 +21557 +21558 +21558 +21558 +21559 +21559 +21559 +21560 +21560 +21560 +21561 +21561 +21561 +21562 +21562 +21562 +21563 +21563 +21563 +21564 +21564 +21564 +21565 +21565 +21565 +21566 +21566 +21566 +21567 +21567 +21567 +21568 +21568 +21568 +21569 +21569 +21569 +21570 +21570 +21570 +21571 +21571 +21571 +21572 +21572 +21572 +21573 +21573 +21573 +21574 +21574 +21574 +21575 +21575 +21575 +21576 +21576 +21576 +21577 +21577 +21577 +21578 +21578 +21578 +21579 +21579 +21579 +21579 +21580 +21580 +21580 +21581 +21581 +21581 +21582 +21582 +21582 +21583 +21583 +21583 +21584 +21584 +21584 +21585 +21585 +21585 +21586 +21586 +21586 +21587 +21587 +21587 +21588 +21588 +21588 +21589 +21589 +21589 +21590 +21590 +21590 +21591 +21591 +21591 +21592 +21592 +21592 +21592 +21593 +21593 +21593 +21594 +21594 +21594 +21595 +21595 +21595 +21596 +21596 +21596 +21597 +21597 +21597 +21598 +21598 +21598 +21599 +21599 +21599 +21600 +21600 +21600 +21600 +21601 +21601 +21601 +21602 +21602 +21602 +21603 +21603 +21603 +21604 +21604 +21604 +21605 +21605 +21605 +21606 +21606 +21606 +21607 +21607 +21607 +21607 +21608 +21608 +21608 +21609 +21609 +21609 +21610 +21610 +21610 +21611 +21611 +21611 +21612 +21612 +21612 +21613 +21613 +21613 +21613 +21614 +21614 +21614 +21615 +21615 +21615 +21616 +21616 +21616 +21617 +21617 +21617 +21618 +21618 +21618 +21619 +21619 +21619 +21619 +21620 +21620 +21620 +21621 +21621 +21621 +21622 +21622 +21622 +21623 +21623 +21623 +21624 +21624 +21624 +21624 +21625 +21625 +21625 +21626 +21626 +21626 +21627 +21627 +21627 +21628 +21628 +21628 +21628 +21629 +21629 +21629 +21630 +21630 +21630 +21631 +21631 +21631 +21632 +21632 +21632 +21633 +21633 +21633 +21633 +21634 +21634 +21634 +21635 +21635 +21635 +21636 +21636 +21636 +21637 +21637 +21637 +21637 +21638 +21638 +21638 +21639 +21639 +21639 +21640 +21640 +21640 +21641 +21641 +21641 +21641 +21642 +21642 +21642 +21643 +21643 +21643 +21644 +21644 +21644 +21644 +21645 +21645 +21645 +21646 +21646 +21646 +21647 +21647 +21647 +21648 +21648 +21648 +21648 +21649 +21649 +21649 +21650 +21650 +21650 +21651 +21651 +21651 +21651 +21652 +21652 +21652 +21653 +21653 +21653 +21654 +21654 +21654 +21654 +21655 +21655 +21655 +21656 +21656 +21656 +21657 +21657 +21657 +21657 +21658 +21658 +21658 +21659 +21659 +21659 +21660 +21660 +21660 +21660 +21661 +21661 +21661 +21662 +21662 +21662 +21663 +21663 +21663 +21663 +21664 +21664 +21664 +21665 +21665 +21665 +21666 +21666 +21666 +21666 +21667 +21667 +21667 +21668 +21668 +21668 +21669 +21669 +21669 +21669 +21670 +21670 +21670 +21671 +21671 +21671 +21672 +21672 +21672 +21672 +21673 +21673 +21673 +21674 +21674 +21674 +21674 +21675 +21675 +21675 +21676 +21676 +21676 +21677 +21677 +21677 +21677 +21678 +21678 +21678 +21679 +21679 +21679 +21679 +21680 +21680 +21680 +21681 +21681 +21681 +21682 +21682 +21682 +21682 +21683 +21683 +21683 +21684 +21684 +21684 +21684 +21685 +21685 +21685 +21686 +21686 +21686 +21687 +21687 +21687 +21687 +21688 +21688 +21688 +21689 +21689 +21689 +21689 +21690 +21690 +21690 +21691 +21691 +21691 +21691 +21692 +21692 +21692 +21693 +21693 +21693 +21693 +21694 +21694 +21694 +21695 +21695 +21695 +21696 +21696 +21696 +21696 +21697 +21697 +21697 +21698 +21698 +21698 +21698 +21699 +21699 +21699 +21700 +21700 +21700 +21700 +21701 +21701 +21701 +21702 +21702 +21702 +21702 +21703 +21703 +21703 +21704 +21704 +21704 +21704 +21705 +21705 +21705 +21706 +21706 +21706 +21706 +21707 +21707 +21707 +21708 +21708 +21708 +21708 +21709 +21709 +21709 +21710 +21710 +21710 +21710 +21711 +21711 +21711 +21712 +21712 +21712 +21712 +21713 +21713 +21713 +21714 +21714 +21714 +21714 +21715 +21715 +21715 +21716 +21716 +21716 +21716 +21717 +21717 +21717 +21718 +21718 +21718 +21718 +21719 +21719 +21719 +21720 +21720 +21720 +21720 +21721 +21721 +21721 +21721 +21722 +21722 +21722 +21723 +21723 +21723 +21723 +21724 +21724 +21724 +21725 +21725 +21725 +21725 +21726 +21726 +21726 +21727 +21727 +21727 +21727 +21728 +21728 +21728 +21729 +21729 +21729 +21729 +21730 +21730 +21730 +21730 +21731 +21731 +21731 +21732 +21732 +21732 +21732 +21733 +21733 +21733 +21734 +21734 +21734 +21734 +21735 +21735 +21735 +21735 +21736 +21736 +21736 +21737 +21737 +21737 +21737 +21738 +21738 +21738 +21739 +21739 +21739 +21740 +21740 +21741 +21741 +21742 +21742 +21743 +21744 +21744 +21745 +21745 +21746 +21746 +21747 +21747 +21748 +21748 +21749 +21750 +21750 +21751 +21751 +21752 +21752 +21753 +21753 +21754 +21754 +21755 +21756 +21756 +21757 +21757 +21758 +21758 +21759 +21759 +21760 +21760 +21761 +21762 +21762 +21763 +21763 +21764 +21764 +21765 +21765 +21766 +21766 +21767 +21768 +21768 +21769 +21769 +21770 +21770 +21771 +21771 +21772 +21772 +21773 +21773 +21774 +21774 +21775 +21776 +21776 +21777 +21777 +21778 +21778 +21779 +21779 +21780 +21780 +21781 +21781 +21782 +21782 +21783 +21784 +21784 +21785 +21785 +21786 +21786 +21787 +21787 +21788 +21788 +21789 +21789 +21790 +21790 +21791 +21791 +21792 +21793 +21793 +21794 +21794 +21795 +21795 +21796 +21796 +21797 +21797 +21798 +21798 +21799 +21799 +21800 +21800 +21801 +21801 +21802 +21803 +21803 +21804 +21804 +21805 +21805 +21806 +21806 +21807 +21807 +21808 +21808 +21809 +21809 +21810 +21810 +21811 +21811 +21812 +21812 +21813 +21813 +21814 +21814 +21815 +21815 +21816 +21817 +21817 +21818 +21818 +21819 +21819 +21820 +21820 +21821 +21821 +21822 +21822 +21823 +21823 +21824 +21824 +21825 +21825 +21826 +21826 +21827 +21827 +21828 +21828 +21829 +21829 +21830 +21830 +21831 +21831 +21832 +21832 +21833 +21833 +21834 +21834 +21835 +21835 +21836 +21836 +21837 +21837 +21838 +21838 +21839 +21839 +21840 +21840 +21841 +21841 +21842 +21842 +21843 +21843 +21844 +21844 +21845 +21845 +21846 +21846 +21847 +21847 +21848 +21848 +21849 +21849 +21850 +21850 +21851 +21851 +21852 +21852 +21853 +21853 +21854 +21854 +21855 +21855 +21856 +21856 +21857 +21857 +21858 +21858 +21859 +21859 +21860 +21860 +21861 +21861 +21862 +21862 +21863 +21863 +21864 +21864 +21865 +21865 +21866 +21866 +21867 +21867 +21868 +21868 +21869 +21869 +21870 +21870 +21871 +21871 +21872 +21872 +21873 +21873 +21874 +21874 +21875 +21875 +21876 +21876 +21877 +21877 +21878 +21878 +21879 +21879 +21880 +21880 +21881 +21881 +21882 +21882 +21883 +21883 +21883 +21884 +21884 +21885 +21885 +21886 +21886 +21887 +21887 +21888 +21888 +21889 +21889 +21890 +21890 +21891 +21891 +21892 +21892 +21893 +21893 +21894 +21894 +21895 +21895 +21896 +21896 +21897 +21897 +21897 +21898 +21898 +21899 +21899 +21900 +21900 +21901 +21901 +21902 +21902 +21903 +21903 +21904 +21904 +21905 +21905 +21906 +21906 +21907 +21907 +21907 +21908 +21908 +21909 +21909 +21910 +21910 +21911 +21911 +21912 +21912 +21913 +21913 +21914 +21914 +21915 +21915 +21916 +21916 +21916 +21917 +21917 +21918 +21918 +21919 +21919 +21920 +21920 +21921 +21921 +21922 +21922 +21923 +21923 +21924 +21924 +21924 +21925 +21925 +21926 +21926 +21927 +21927 +21928 +21928 +21929 +21929 +21930 +21930 +21931 +21931 +21931 +21932 +21932 +21933 +21933 +21934 +21934 +21935 +21935 +21936 +21936 +21937 +21937 +21938 +21938 +21938 +21939 +21939 +21940 +21940 +21941 +21941 +21942 +21942 +21943 +21943 +21944 +21944 +21944 +21945 +21945 +21946 +21946 +21947 +21947 +21948 +21948 +21949 +21949 +21950 +21950 +21950 +21951 +21951 +21952 +21952 +21953 +21953 +21954 +21954 +21955 +21955 +21955 +21956 +21956 +21957 +21957 +21958 +21958 +21959 +21959 +21960 +21960 +21960 +21961 +21961 +21962 +21962 +21963 +21963 +21964 +21964 +21965 +21965 +21965 +21966 +21966 +21967 +21967 +21968 +21968 +21969 +21969 +21970 +21970 +21970 +21971 +21971 +21972 +21972 +21973 +21973 +21974 +21974 +21974 +21975 +21975 +21976 +21976 +21977 +21977 +21978 +21978 +21979 +21979 +21979 +21980 +21980 +21981 +21981 +21982 +21982 +21983 +21983 +21983 +21984 +21984 +21985 +21985 +21986 +21986 +21987 +21987 +21987 +21988 +21988 +21989 +21989 +21990 +21990 +21991 +21991 +21991 +21992 +21992 +21993 +21993 +21994 +21994 +21995 +21995 +21995 +21996 +21996 +21997 +21997 +21998 +21998 +21999 +21999 +21999 +22000 +22000 +22001 +22001 +22002 +22002 +22002 +22003 +22003 +22004 +22004 +22005 +22005 +22006 +22006 +22006 +22007 +22007 +22008 +22008 +22009 +22009 +22009 +22010 +22010 +22011 +22011 +22012 +22012 +22013 +22013 +22013 +22014 +22014 +22015 +22015 +22016 +22016 +22016 +22017 +22017 +22018 +22018 +22019 +22019 +22019 +22020 +22020 +22021 +22021 +22022 +22022 +22023 +22023 +22023 +22024 +22024 +22025 +22025 +22026 +22026 +22026 +22027 +22027 +22028 +22028 +22029 +22029 +22029 +22030 +22030 +22031 +22031 +22032 +22032 +22032 +22033 +22033 +22034 +22034 +22035 +22035 +22035 +22036 +22036 +22037 +22037 +22038 +22038 +22038 +22039 +22039 +22040 +22040 +22041 +22041 +22041 +22042 +22042 +22043 +22043 +22044 +22044 +22044 +22045 +22045 +22046 +22046 +22047 +22047 +22047 +22048 +22048 +22049 +22049 +22049 +22050 +22050 +22051 +22051 +22052 +22052 +22052 +22053 +22053 +22054 +22054 +22055 +22055 +22055 +22056 +22056 +22057 +22057 +22057 +22058 +22058 +22059 +22059 +22060 +22060 +22060 +22061 +22061 +22062 +22062 +22063 +22063 +22063 +22064 +22064 +22065 +22065 +22065 +22066 +22066 +22067 +22067 +22068 +22068 +22068 +22069 +22069 +22070 +22070 +22070 +22071 +22071 +22072 +22072 +22073 +22073 +22073 +22074 +22074 +22075 +22075 +22075 +22076 +22076 +22077 +22077 +22078 +22078 +22078 +22079 +22079 +22080 +22080 +22080 +22081 +22081 +22082 +22082 +22082 +22083 +22083 +22084 +22084 +22085 +22085 +22085 +22086 +22086 +22087 +22087 +22087 +22088 +22088 +22089 +22089 +22089 +22090 +22090 +22091 +22091 +22092 +22092 +22092 +22093 +22093 +22094 +22094 +22094 +22095 +22095 +22096 +22096 +22096 +22097 +22097 +22098 +22098 +22098 +22099 +22099 +22100 +22100 +22101 +22101 +22101 +22102 +22102 +22103 +22103 +22103 +22104 +22104 +22105 +22105 +22105 +22106 +22106 +22107 +22107 +22107 +22108 +22108 +22109 +22109 +22109 +22110 +22110 +22111 +22111 +22111 +22112 +22112 +22113 +22113 +22113 +22114 +22114 +22115 +22115 +22116 +22116 +22116 +22117 +22117 +22118 +22118 +22118 +22119 +22119 +22120 +22120 +22120 +22121 +22121 +22122 +22122 +22122 +22123 +22123 +22124 +22124 +22124 +22125 +22125 +22126 +22126 +22126 +22127 +22127 +22128 +22128 +22128 +22129 +22129 +22130 +22130 +22130 +22131 +22131 +22132 +22132 +22132 +22133 +22133 +22134 +22134 +22134 +22135 +22135 +22135 +22136 +22136 +22137 +22137 +22137 +22138 +22138 +22139 +22139 +22139 +22140 +22140 +22141 +22141 +22141 +22142 +22142 +22143 +22143 +22143 +22144 +22144 +22145 +22145 +22145 +22146 +22146 +22147 +22147 +22147 +22148 +22148 +22149 +22149 +22149 +22150 +22150 +22150 +22151 +22151 +22152 +22152 +22152 +22153 +22153 +22154 +22154 +22154 +22155 +22155 +22156 +22156 +22156 +22157 +22157 +22158 +22158 +22158 +22159 +22159 +22159 +22160 +22160 +22161 +22161 +22161 +22162 +22162 +22163 +22163 +22163 +22164 +22164 +22165 +22165 +22165 +22166 +22166 +22166 +22167 +22167 +22168 +22168 +22168 +22169 +22169 +22170 +22170 +22170 +22171 +22171 +22171 +22172 +22172 +22173 +22173 +22173 +22174 +22174 +22175 +22175 +22175 +22176 +22176 +22177 +22177 +22177 +22178 +22178 +22178 +22179 +22179 +22180 +22180 +22180 +22181 +22181 +22182 +22182 +22182 +22183 +22183 +22183 +22184 +22184 +22185 +22185 +22185 +22186 +22186 +22186 +22187 +22187 +22188 +22188 +22188 +22189 +22189 +22190 +22190 +22190 +22191 +22191 +22191 +22192 +22192 +22193 +22193 +22193 +22194 +22194 +22194 +22195 +22195 +22196 +22196 +22196 +22197 +22197 +22198 +22198 +22198 +22199 +22199 +22199 +22200 +22200 +22201 +22201 +22202 +22203 +22204 +22204 +22205 +22206 +22207 +22207 +22208 +22209 +22210 +22210 +22211 +22212 +22213 +22213 +22214 +22215 +22216 +22216 +22217 +22218 +22219 +22219 +22220 +22221 +22222 +22222 +22223 +22224 +22225 +22225 +22226 +22227 +22228 +22228 +22229 +22230 +22231 +22231 +22232 +22233 +22233 +22234 +22235 +22236 +22236 +22237 +22238 +22239 +22239 +22240 +22241 +22242 +22242 +22243 +22244 +22245 +22245 +22246 +22247 +22247 +22248 +22249 +22250 +22250 +22251 +22252 +22253 +22253 +22254 +22255 +22255 +22256 +22257 +22258 +22258 +22259 +22260 +22261 +22261 +22262 +22263 +22263 +22264 +22265 +22266 +22266 +22267 +22268 +22269 +22269 +22270 +22271 +22271 +22272 +22273 +22274 +22274 +22275 +22276 +22276 +22277 +22278 +22279 +22279 +22280 +22281 +22281 +22282 +22283 +22284 +22284 +22285 +22286 +22286 +22287 +22288 +22289 +22289 +22290 +22291 +22291 +22292 +22293 +22294 +22294 +22295 +22296 +22296 +22297 +22298 +22299 +22299 +22300 +22301 +22301 +22302 +22303 +22303 +22304 +22305 +22306 +22306 +22307 +22308 +22308 +22309 +22310 +22311 +22311 +22312 +22313 +22313 +22314 +22315 +22315 +22316 +22317 +22318 +22318 +22319 +22320 +22320 +22321 +22322 +22322 +22323 +22324 +22324 +22325 +22326 +22327 +22327 +22328 +22329 +22329 +22330 +22331 +22331 +22332 +22333 +22334 +22334 +22335 +22336 +22336 +22337 +22338 +22338 +22339 +22340 +22340 +22341 +22342 +22342 +22343 +22344 +22345 +22345 +22346 +22347 +22347 +22348 +22349 +22349 +22350 +22351 +22351 +22352 +22353 +22353 +22354 +22355 +22355 +22356 +22357 +22357 +22358 +22359 +22360 +22360 +22361 +22362 +22362 +22363 +22364 +22364 +22365 +22366 +22366 +22367 +22368 +22368 +22369 +22370 +22370 +22371 +22372 +22372 +22373 +22374 +22374 +22375 +22376 +22376 +22377 +22378 +22378 +22379 +22380 +22380 +22381 +22382 +22382 +22383 +22384 +22384 +22385 +22386 +22386 +22387 +22388 +22388 +22389 +22390 +22390 +22391 +22392 +22392 +22393 +22394 +22394 +22395 +22396 +22396 +22397 +22398 +22398 +22399 +22400 +22400 +22401 +22402 +22402 +22403 +22404 +22404 +22405 +22406 +22406 +22407 +22408 +22408 +22409 +22410 +22410 +22411 +22412 +22412 +22413 +22414 +22414 +22415 +22416 +22416 +22417 +22418 +22418 +22419 +22420 +22420 +22421 +22421 +22422 +22423 +22423 +22424 +22425 +22425 +22426 +22427 +22427 +22428 +22429 +22429 +22430 +22431 +22431 +22432 +22433 +22433 +22434 +22434 +22435 +22436 +22436 +22437 +22438 +22438 +22439 +22440 +22440 +22441 +22442 +22442 +22443 +22444 +22444 +22445 +22445 +22446 +22447 +22447 +22448 +22449 +22449 +22450 +22451 +22451 +22452 +22453 +22453 +22454 +22454 +22455 +22456 +22456 +22457 +22458 +22458 +22459 +22460 +22460 +22461 +22461 +22462 +22463 +22463 +22464 +22465 +22465 +22466 +22467 +22467 +22468 +22468 +22469 +22470 +22470 +22471 +22472 +22472 +22473 +22474 +22474 +22475 +22475 +22476 +22477 +22477 +22478 +22479 +22479 +22480 +22480 +22481 +22482 +22482 +22483 +22484 +22484 +22485 +22485 +22486 +22487 +22487 +22488 +22489 +22489 +22490 +22490 +22491 +22492 +22492 +22493 +22494 +22494 +22495 +22495 +22496 +22497 +22497 +22498 +22499 +22499 +22500 +22500 +22501 +22502 +22502 +22503 +22504 +22504 +22505 +22505 +22506 +22507 +22507 +22508 +22509 +22509 +22510 +22510 +22511 +22512 +22512 +22513 +22513 +22514 +22515 +22515 +22516 +22517 +22517 +22518 +22518 +22519 +22520 +22520 +22521 +22521 +22522 +22523 +22523 +22524 +22525 +22525 +22526 +22526 +22527 +22528 +22528 +22528 +22529 +22529 +22529 +22530 +22530 +22530 +22531 +22531 +22531 +22531 +22532 +22532 +22532 +22533 +22533 +22533 +22534 +22534 +22534 +22535 +22535 +22535 +22535 +22536 +22536 +22536 +22537 +22537 +22537 +22538 +22538 +22538 +22538 +22539 +22539 +22539 +22540 +22540 +22540 +22541 +22541 +22541 +22541 +22542 +22542 +22542 +22543 +22543 +22543 +22544 +22544 +22544 +22544 +22545 +22545 +22545 +22546 +22546 +22546 +22547 +22547 +22547 +22547 +22548 +22548 +22548 +22549 +22549 +22549 +22550 +22550 +22550 +22550 +22551 +22551 +22551 +22552 +22552 +22552 +22553 +22553 +22553 +22553 +22554 +22554 +22554 +22555 +22555 +22555 +22555 +22556 +22556 +22556 +22557 +22557 +22557 +22558 +22558 +22558 +22558 +22559 +22559 +22559 +22560 +22560 +22560 +22561 +22561 +22561 +22561 +22562 +22562 +22562 +22563 +22563 +22563 +22563 +22564 +22564 +22564 +22565 +22565 +22565 +22566 +22566 +22566 +22566 +22567 +22567 +22567 +22568 +22568 +22568 +22568 +22569 +22569 +22569 +22570 +22570 +22570 +22570 +22571 +22571 +22571 +22572 +22572 +22572 +22573 +22573 +22573 +22573 +22574 +22574 +22574 +22575 +22575 +22575 +22575 +22576 +22576 +22576 +22577 +22577 +22577 +22577 +22578 +22578 +22578 +22579 +22579 +22579 +22579 +22580 +22580 +22580 +22581 +22581 +22581 +22581 +22582 +22582 +22582 +22583 +22583 +22583 +22583 +22584 +22584 +22584 +22585 +22585 +22585 +22585 +22586 +22586 +22586 +22587 +22587 +22587 +22587 +22588 +22588 +22588 +22589 +22589 +22589 +22589 +22590 +22590 +22590 +22591 +22591 +22591 +22591 +22592 +22592 +22592 +22593 +22593 +22593 +22593 +22594 +22594 +22594 +22595 +22595 +22595 +22595 +22596 +22596 +22596 +22597 +22597 +22597 +22597 +22598 +22598 +22598 +22599 +22599 +22599 +22599 +22600 +22600 +22600 +22601 +22601 +22601 +22601 +22602 +22602 +22602 +22602 +22603 +22603 +22603 +22604 +22604 +22604 +22604 +22605 +22605 +22605 +22606 +22606 +22606 +22606 +22607 +22607 +22607 +22608 +22608 +22608 +22608 +22609 +22609 +22609 +22609 +22610 +22610 +22610 +22611 +22611 +22611 +22611 +22612 +22612 +22612 +22613 +22613 +22613 +22613 +22614 +22614 +22614 +22614 +22615 +22615 +22615 +22616 +22616 +22616 +22616 +22617 +22617 +22617 +22618 +22618 +22618 +22618 +22619 +22619 +22619 +22619 +22620 +22620 +22620 +22621 +22621 +22621 +22621 +22622 +22622 +22622 +22622 +22623 +22623 +22623 +22624 +22624 +22624 +22624 +22625 +22625 +22625 +22625 +22626 +22626 +22626 +22627 +22627 +22627 +22627 +22628 +22628 +22628 +22628 +22629 +22629 +22629 +22630 +22630 +22630 +22630 +22631 +22631 +22631 +22631 +22632 +22632 +22632 +22633 +22633 +22633 +22633 +22634 +22634 +22634 +22634 +22635 +22635 +22635 +22636 +22636 +22636 +22636 +22637 +22637 +22637 +22637 +22638 +22638 +22638 +22639 +22639 +22639 +22639 +22640 +22640 +22640 +22640 +22641 +22641 +22641 +22642 +22642 +22642 +22642 +22643 +22643 +22643 +22643 +22644 +22644 +22644 +22644 +22645 +22645 +22645 +22646 +22646 +22646 +22646 +22647 +22647 +22647 +22647 +22648 +22648 +22648 +22648 +22649 +22649 +22649 +22650 +22650 +22650 +22650 +22651 +22651 +22651 +22651 +22652 +22652 +22652 +22652 +22653 +22653 +22653 +22654 +22654 +22654 +22654 +22655 +22655 +22655 +22655 +22656 +22656 +22656 +22656 +22657 +22657 +22657 +22658 +22658 +22658 +22658 +22659 +22659 +22659 +22659 +22660 +22660 +22660 +22660 +22661 +22661 +22661 +22661 +22662 +22662 +22662 +22663 +22663 +22663 +22663 +22664 +22664 +22664 +22664 +22665 +22665 +22665 +22665 +22666 +22666 +22666 +22666 +22667 +22667 +22667 +22668 +22668 +22668 +22668 +22669 +22669 +22669 +22669 +22670 +22670 +22670 +22670 +22671 +22671 +22671 +22671 +22672 +22672 +22672 +22672 +22673 +22673 +22673 +22674 +22674 +22674 +22674 +22675 +22675 +22675 +22675 +22676 +22676 +22676 +22676 +22677 +22677 +22677 +22677 +22678 +22678 +22678 +22678 +22679 +22679 +22679 +22679 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44656 +44659 +44661 +44664 +44665 +44667 +44668 +44670 +44671 +44672 +44673 +44675 +44676 +44677 +44677 +44678 +44679 +44680 +44681 +44682 +44683 +44683 +44684 +44685 +44686 +44686 +44687 +44688 +44688 +44689 +44689 +44690 +44691 +44691 +44692 +44692 +44693 +44694 +44694 +44695 +44695 +44696 +44696 +44697 +44697 +44698 +44698 +44699 +44699 +44700 +44700 +44701 +44701 +44702 +44702 +44703 +44703 +44704 +44704 +44704 +44705 +44705 +44706 +44706 +44707 +44707 +44707 +44708 +44708 +44709 +44709 +44709 +44710 +44710 +44711 +44711 +44711 +44712 +44712 +44712 +44713 +44713 +44714 +44714 +44714 +44715 +44715 +44715 +44716 +44716 +44716 +44717 +44717 +44717 +44718 +44718 +44718 +44719 +44719 +44719 +44720 +44720 +44720 +44721 +44721 +44721 +44722 +44722 +44722 +44723 +44723 +44723 +44724 +44724 +44724 +44724 +44725 +44725 +44725 +44726 +44726 +44726 +44727 +44727 +44727 +44727 +44728 +44728 +44728 +44729 +44729 +44729 +44729 +44730 +44730 +44730 +44731 +44731 +44731 +44731 +44732 +44732 +44732 +44732 +44733 +44733 +44733 +44733 +44734 +44734 +44734 +44735 +44735 +44735 +44735 +44736 +44736 +44736 +44736 +44737 +44737 +44737 +44737 +44738 +44738 +44738 +44738 +44739 +44739 +44739 +44739 +44740 +44740 +44740 +44740 +44741 +44741 +44741 +44741 +44741 +44742 +44742 +44742 +44742 +44743 +44743 +44743 +44743 +44744 +44744 +44744 +44744 +44745 +44745 +44745 +44745 +44745 +44746 +44746 +44746 +44746 +44747 +44747 +44747 +44747 +44747 +44748 +44748 +44748 +44748 +44749 +44749 +44749 +44749 +44749 +44750 +44750 +44750 +44750 +44750 +44751 +44751 +44751 +44751 +44752 +44752 +44752 +44752 +44752 +44753 +44753 +44753 +44753 +44753 +44754 +44754 +44754 +44754 +44754 +44755 +44755 +44755 +44755 +44755 +44756 +44756 +44756 +44756 +44756 +44757 +44757 +44757 +44757 +44757 +44758 +44758 +44758 +44758 +44758 +44759 +44759 +44759 +44759 +44759 +44760 +44760 +44760 +44760 +44760 +44761 +44761 +44761 +44761 +44761 +44761 +44762 +44762 +44762 +44762 +44762 +44763 +44763 +44763 +44763 +44763 +44764 +44764 +44764 +44764 +44764 +44764 +44765 +44765 +44765 +44765 +44765 +44766 +44766 +44766 +44766 +44766 +44766 +44767 +44767 +44767 +44767 +44767 +44768 +44768 +44768 +44768 +44768 +44768 +44769 +44769 +44769 +44769 +44769 +44769 +44770 +44770 +44770 +44770 +44770 +44770 +44771 +44771 +44771 +44771 +44771 +44771 +44772 +44772 +44772 +44772 +44772 +44773 +44773 +44773 +44773 +44773 +44773 +44774 +44774 +44774 +44774 +44774 +44774 +44775 +44775 +44775 +44775 +44775 +44775 +44775 +44776 +44776 +44776 +44776 +44776 +44776 +44777 +44777 +44777 +44777 +44777 +44777 +44778 +44778 +44778 +44778 +44778 +44778 +44779 +44779 +44779 +44779 +44779 +44779 +44780 +44780 +44780 +44780 +44780 +44780 +44780 +44781 +44781 +44781 +44781 +44781 +44781 +44782 +44782 +44782 +44782 +44782 +44782 +44782 +44783 +44783 +44783 +44783 +44783 +44783 +44784 +44784 +44784 +44784 +44784 +44784 +44784 +44785 +44785 +44785 +44785 +44785 +44785 +44785 +44786 +44786 +44786 +44786 +44786 +44786 +44787 +44787 +44787 +44787 +44787 +44787 +44787 +44788 +44788 +44788 +44788 +44788 +44788 +44788 +44789 +44789 +44789 +44789 +44789 +44789 +44789 +44790 +44790 +44790 +44790 +44790 +44790 +44790 +44791 +44791 +44791 +44791 +44791 +44791 +44791 +44792 +44792 +44792 +44792 +44792 +44792 +44792 +44793 +44793 +44793 +44793 +44793 +44793 +44793 +44794 +44794 +44794 +44794 +44794 +44794 +44794 +44795 +44795 +44795 +44795 +44795 +44795 +44795 +44796 +44796 +44796 +44796 +44796 +44796 +44796 +44796 +44797 +44797 +44797 +44797 +44797 +44797 +44797 +44798 +44798 +44798 +44798 +44798 +44798 +44798 +44798 +44799 +44799 +44799 +44799 +44799 +44799 +44799 +44800 +44800 +44800 +44800 +44800 +44800 +44800 +44800 +44801 +44801 +44801 +44801 +44801 +44801 +44801 +44802 +44802 +44802 +44802 +44802 +44802 +44802 +44802 +44803 +44803 +44803 +44803 +44803 +44803 +44803 +44803 +44804 +44804 +44804 +44804 +44804 +44804 +44804 +44804 +44805 +44805 +44805 +44805 +44805 +44805 +44805 +44806 +44806 +44806 +44806 +44806 +44806 +44806 +44806 +44807 +44807 +44807 +44807 +44807 +44807 +44807 +44807 +44808 +44808 +44808 +44808 +44808 +44808 +44808 +44808 +44809 +44809 +44809 +44809 +44809 +44809 +44809 +44809 +44810 +44810 +44810 +44810 +44810 +44810 +44810 +44810 +44810 +44811 +44811 +44811 +44811 +44811 +44811 +44811 +44811 +44812 +44812 +44812 +44812 +44812 +44812 +44812 +44812 +44813 +44813 +44813 +44813 +44813 +44813 +44813 +44813 +44814 +44814 +44814 +44814 +44814 +44814 +44814 +44814 +44814 +44815 +44815 +44815 +44815 +44815 +44815 +44815 +44815 +44816 +44816 +44816 +44816 +44816 +44816 +44816 +44816 +44816 +44817 +44817 +44817 +44817 +44817 +44817 +44817 +44817 +44818 +44818 +44818 +44818 +44818 +44818 +44818 +44818 +44818 +44819 +44819 +44819 +44819 +44819 +44819 +44819 +44819 +44819 +44820 +44820 +44820 +44820 +44820 +44820 +44820 +44820 +44820 +44821 +44821 +44821 +44821 +44821 +44821 +44821 +44821 +44822 +44822 +44822 +44822 +44822 +44822 +44822 +44822 +44822 +44823 +44823 +44823 +44823 +44823 +44823 +44823 +44823 +44823 +44824 +44824 +44824 +44824 +44824 +44824 +44824 +44824 +44824 +44825 +44825 +44825 +44825 +44825 +44825 +44825 +44825 +44825 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44827 +44827 +44827 +44827 +44827 +44827 +44827 +44827 +44827 +44828 +44828 +44828 +44828 +44828 +44828 +44828 +44828 +44828 +44829 +44829 +44829 +44829 +44829 +44829 +44829 +44829 +44829 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44831 +44831 +44831 +44831 +44831 +44831 +44831 +44831 +44831 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44833 +44833 +44833 +44833 +44833 +44833 +44833 +44833 +44833 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44836 +44836 +44836 +44836 +44836 +44836 +44836 +44836 +44836 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44931 +44931 +44931 +44931 +44931 +44931 +44931 +44931 +44932 +44932 +44932 +44932 +44932 +44932 +44932 +44932 +44933 +44933 +44933 +44933 +44933 +44933 +44933 +44933 +44934 +44934 +44934 +44934 +44934 +44934 +44934 +44934 +44935 +44935 +44935 +44935 +44935 +44935 +44935 +44935 +44936 +44936 +44936 +44936 +44936 +44936 +44936 +44936 +44936 +44937 +44937 +44937 +44937 +44937 +44937 +44937 +44937 +44938 +44938 +44938 +44938 +44938 +44938 +44938 +44938 +44939 +44939 +44939 +44939 +44939 +44939 +44939 +44939 +44940 +44940 +44940 +44940 +44940 +44940 +44940 +44940 +44940 +44941 +44941 +44941 +44941 +44941 +44941 +44941 +44941 +44942 +44942 +44942 +44942 +44942 +44942 +44942 +44942 +44942 +44943 +44943 +44943 +44943 +44943 +44943 +44943 +44943 +44944 +44944 +44944 +44944 +44944 +44944 +44944 +44944 +44945 +44945 +44945 +44945 +44945 +44945 +44945 +44945 +44945 +44946 +44946 +44946 +44946 +44946 +44946 +44946 +44946 +44946 +44947 +44947 +44947 +44947 +44947 +44947 +44947 +44947 +44948 +44948 +44948 +44948 +44948 +44948 +44948 +44948 +44948 +44949 +44949 +44949 +44949 +44949 +44949 +44949 +44949 +44950 +44950 +44950 +44950 +44950 +44950 +44950 +44950 +44950 +44951 +44951 +44951 +44951 +44951 +44951 +44951 +44951 +44951 +44952 +44952 +44952 +44952 +44952 +44952 +44952 +44952 +44952 +44953 +44953 +44953 +44953 +44953 +44953 +44953 +44953 +44954 +44954 +44954 +44954 +44954 +44954 +44954 +44954 +44954 +44955 +44955 +44955 +44955 +44955 +44955 +44955 +44955 +44955 +44956 +44956 +44956 +44956 +44956 +44956 +44956 +44956 +44956 +44957 +44957 +44957 +44957 +44957 +44957 +44957 +44957 +44957 +44958 +44958 +44958 +44958 +44958 +44958 +44958 +44958 +44958 +44959 +44959 +44959 +44959 +44959 +44959 +44959 +44959 +44959 +44960 +44960 +44960 +44960 +44960 +44960 +44960 +44960 +44960 +44961 +44961 +44961 +44961 +44961 +44961 +44961 +44961 +44961 +44962 +44962 +44962 +44962 +44962 +44962 +44962 +44962 +44962 +44963 +44963 +44963 +44963 +44963 +44963 +44963 +44963 +44963 +44964 +44964 +44964 +44964 +44964 +44964 +44964 +44964 +44964 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44966 +44966 +44966 +44966 +44966 +44966 +44966 +44966 +44966 +44967 +44967 +44967 +44967 +44967 +44967 +44967 +44967 +44967 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44969 +44969 +44969 +44969 +44969 +44969 +44969 +44969 +44969 +44970 +44970 +44970 +44970 +44970 +44970 +44970 +44970 +44970 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44972 +44972 +44972 +44972 +44972 +44972 +44972 +44972 +44972 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44974 +44974 +44974 +44974 +44974 +44974 +44974 +44974 +44974 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44976 +44976 +44976 +44976 +44976 +44976 +44976 +44976 +44976 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44979 +44979 +44979 +44979 +44979 +44979 +44979 +44979 +44979 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44985 +44985 +44985 +44985 +44985 +44985 +44985 +44985 +44985 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45035 +45035 +45035 +45035 +45035 +45035 +45036 +45036 +45036 +45036 +45036 +45036 +45037 +45037 +45037 +45037 +45037 +45037 +45038 +45038 +45038 +45038 +45038 +45038 +45039 +45039 +45039 +45039 +45039 +45039 +45040 +45040 +45040 +45040 +45040 +45041 +45041 +45041 +45041 +45041 +45041 +45042 +45042 +45042 +45042 +45042 +45042 +45043 +45043 +45043 +45043 +45043 +45043 +45044 +45044 +45044 +45044 +45044 +45044 +45044 +45045 +45045 +45045 +45045 +45045 +45045 +45046 +45046 +45046 +45046 +45046 +45046 +45047 +45047 +45047 +45047 +45047 +45047 +45048 +45048 +45048 +45048 +45048 +45048 +45049 +45049 +45049 +45049 +45049 +45049 +45050 +45050 +45050 +45050 +45050 +45050 +45051 +45051 +45051 +45051 +45051 +45051 +45052 +45052 +45052 +45052 +45052 +45052 +45052 +45053 +45053 +45053 +45053 +45053 +45053 +45054 +45054 +45054 +45054 +45054 +45054 +45055 +45055 +45055 +45055 +45055 +45055 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45117 +45117 +45117 +45117 +45117 +45117 +45117 +45117 +45118 +45118 +45118 +45118 +45118 +45118 +45118 +45118 +45118 +45119 +45119 +45119 +45119 +45119 +45119 +45119 +45119 +45119 +45120 +45120 +45120 +45120 +45120 +45120 +45120 +45120 +45120 +45121 +45121 +45121 +45121 +45121 +45121 +45121 +45121 +45122 +45122 +45122 +45122 +45122 +45122 +45122 +45122 +45122 +45123 +45123 +45123 +45123 +45123 +45123 +45123 +45123 +45123 +45124 +45124 +45124 +45124 +45124 +45124 +45124 +45124 +45124 +45125 +45125 +45125 +45125 +45125 +45125 +45125 +45125 +45125 +45126 +45126 +45126 +45126 +45126 +45126 +45126 +45126 +45126 +45127 +45127 +45127 +45127 +45127 +45127 +45127 +45127 +45127 +45128 +45128 +45128 +45128 +45128 +45128 +45128 +45128 +45128 +45129 +45129 +45129 +45129 +45129 +45129 +45129 +45129 +45129 +45130 +45130 +45130 +45130 +45130 +45130 +45130 +45130 +45130 +45131 +45131 +45131 +45131 +45131 +45131 +45131 +45131 +45131 +45132 +45132 +45132 +45132 +45132 +45132 +45132 +45132 +45132 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45134 +45134 +45134 +45134 +45134 +45134 +45134 +45134 +45134 +45135 +45135 +45135 +45135 +45135 +45135 +45135 +45135 +45135 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45137 +45137 +45137 +45137 +45137 +45137 +45137 +45137 +45137 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45139 +45139 +45139 +45139 +45139 +45139 +45139 +45139 +45139 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45141 +45141 +45141 +45141 +45141 +45141 +45141 +45141 +45141 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45143 +45143 +45143 +45143 +45143 +45143 +45143 +45143 +45143 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45148 +45148 +45148 +45148 +45148 +45148 +45148 +45148 +45148 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45214 +45214 +45214 +45214 +45214 +45214 +45215 +45215 +45215 +45215 +45215 +45215 +45215 +45216 +45216 +45216 +45216 +45216 +45216 +45217 +45217 +45217 +45217 +45217 +45217 +45218 +45218 +45218 +45218 +45218 +45218 +45218 +45219 +45219 +45219 +45219 +45219 +45219 +45220 +45220 +45220 +45220 +45220 +45220 +45220 +45221 +45221 +45221 +45221 +45221 +45221 +45222 +45222 +45222 +45222 +45222 +45222 +45222 +45223 +45223 +45223 +45223 +45223 +45223 +45224 +45224 +45224 +45224 +45224 +45224 +45224 +45225 +45225 +45225 +45225 +45225 +45225 +45226 +45226 +45226 +45226 +45226 +45226 +45226 +45227 +45227 +45227 +45227 +45227 +45227 +45228 +45228 +45228 +45228 +45228 +45228 +45228 +45229 +45229 +45229 +45229 +45229 +45229 +45229 +45230 +45230 +45230 +45230 +45230 +45230 +45231 +45231 +45231 +45231 +45231 +45231 +45231 +45232 +45232 +45232 +45232 +45232 +45232 +45232 +45233 +45233 +45233 +45233 +45233 +45233 +45234 +45234 +45234 +45234 +45234 +45234 +45234 +45235 +45235 +45235 +45235 +45235 +45235 +45235 +45236 +45236 +45236 +45236 +45236 +45236 +45237 +45237 +45237 +45237 +45237 +45237 +45237 +45238 +45238 +45238 +45238 +45238 +45238 +45238 +45239 +45239 +45239 +45239 +45239 +45239 +45239 +45240 +45240 +45240 +45240 +45240 +45240 +45240 +45241 +45241 +45241 +45241 +45241 +45241 +45241 +45242 +45242 +45242 +45242 +45242 +45242 +45242 +45243 +45243 +45243 +45243 +45243 +45243 +45244 +45244 +45244 +45244 +45244 +45244 +45244 +45245 +45245 +45245 +45245 +45245 +45245 +45245 +45246 +45246 +45246 +45246 +45246 +45246 +45246 +45247 +45247 +45247 +45247 +45247 +45247 +45247 +45248 +45248 +45248 +45248 +45248 +45248 +45248 +45249 +45249 +45249 +45249 +45249 +45249 +45249 +45250 +45250 +45250 +45250 +45250 +45250 +45250 +45250 +45251 +45251 +45251 +45251 +45251 +45251 +45251 +45252 +45252 +45252 +45252 +45252 +45252 +45252 +45253 +45253 +45253 +45253 +45253 +45253 +45253 +45254 +45254 +45254 +45254 +45254 +45254 +45254 +45255 +45255 +45255 +45255 +45255 +45255 +45255 +45256 +45256 +45256 +45256 +45256 +45256 +45256 +45257 +45257 +45257 +45257 +45257 +45257 +45257 +45257 +45258 +45258 +45258 +45258 +45258 +45258 +45258 +45259 +45259 +45259 +45259 +45259 +45259 +45259 +45260 +45260 +45260 +45260 +45260 +45260 +45260 +45261 +45261 +45261 +45261 +45261 +45261 +45261 +45261 +45262 +45262 +45262 +45262 +45262 +45262 +45262 +45263 +45263 +45263 +45263 +45263 +45263 +45263 +45264 +45264 +45264 +45264 +45264 +45264 +45264 +45264 +45265 +45265 +45265 +45265 +45265 +45265 +45265 +45266 +45266 +45266 +45266 +45266 +45266 +45266 +45266 +45267 +45267 +45267 +45267 +45267 +45267 +45267 +45268 +45268 +45268 +45268 +45268 +45268 +45268 +45268 +45269 +45269 +45269 +45269 +45269 +45269 +45269 +45270 +45270 +45270 +45270 +45270 +45270 +45270 +45270 +45271 +45271 +45271 +45271 +45271 +45271 +45271 +45272 +45272 +45272 +45272 +45272 +45272 +45272 +45272 +45273 +45273 +45273 +45273 +45273 +45273 +45273 +45274 +45274 +45274 +45274 +45274 +45274 +45274 +45274 +45275 +45275 +45275 +45275 +45275 +45275 +45275 +45276 +45276 +45276 +45276 +45276 +45276 +45276 +45276 +45277 +45277 +45277 +45277 +45277 +45277 +45277 +45277 +45278 +45278 +45278 +45278 +45278 +45278 +45278 +45279 +45279 +45279 +45279 +45279 +45279 +45279 +45279 +45280 +45280 +45280 +45280 +45280 +45280 +45280 +45280 +45281 +45281 +45281 +45281 +45281 +45281 +45281 +45281 +45282 +45282 +45282 +45282 +45282 +45282 +45282 +45283 +45283 +45283 +45283 +45283 +45283 +45283 +45283 +45284 +45284 +45284 +45284 +45284 +45284 +45284 +45284 +45285 +45285 +45285 +45285 +45285 +45285 +45285 +45285 +45286 +45286 +45286 +45286 +45286 +45286 +45286 +45286 +45287 +45287 +45287 +45287 +45287 +45287 +45287 +45287 +45288 +45288 +45288 +45288 +45288 +45288 +45288 +45288 +45289 +45289 +45289 +45289 +45289 +45289 +45289 +45290 +45290 +45290 +45290 +45290 +45290 +45290 +45290 +45291 +45291 +45291 +45291 +45291 +45291 +45291 +45291 +45292 +45292 +45292 +45292 +45292 +45292 +45292 +45292 +45293 +45293 +45293 +45293 +45293 +45293 +45293 +45293 +45294 +45294 +45294 +45294 +45294 +45294 +45294 +45294 +45295 +45295 +45295 +45295 +45295 +45295 +45295 +45295 +45296 +45296 +45296 +45296 +45296 +45296 +45296 +45296 +45296 +45297 +45297 +45297 +45297 +45297 +45297 +45297 +45297 +45298 +45298 +45298 +45298 +45298 +45298 +45298 +45298 +45299 +45299 +45299 +45299 +45299 +45299 +45299 +45299 +45300 +45300 +45300 +45300 +45300 +45300 +45300 +45300 +45301 +45301 +45301 +45301 +45301 +45301 +45301 +45301 +45302 +45302 +45302 +45302 +45302 +45302 +45302 +45302 +45302 +45303 +45303 +45303 +45303 +45303 +45303 +45303 +45303 +45304 +45304 +45304 +45304 +45304 +45304 +45304 +45304 +45305 +45305 +45305 +45305 +45305 +45305 +45305 +45305 +45306 +45306 +45306 +45306 +45306 +45306 +45306 +45306 +45306 +45307 +45307 +45307 +45307 +45307 +45307 +45307 +45307 +45308 +45308 +45308 +45308 +45308 +45308 +45308 +45308 +45309 +45309 +45309 +45309 +45309 +45309 +45309 +45309 +45309 +45310 +45310 +45310 +45310 +45310 +45310 +45310 +45310 +45311 +45311 +45311 +45311 +45311 +45311 +45311 +45311 +45311 +45312 +45312 +45312 +45312 +45312 +45312 +45312 +45312 +45313 +45313 +45313 +45313 +45313 +45313 +45313 +45313 +45314 +45314 +45314 +45314 +45314 +45314 +45314 +45314 +45314 +45315 +45315 +45315 +45315 +45315 +45315 +45315 +45315 +45316 +45316 +45316 +45316 +45316 +45316 +45316 +45316 +45316 +45317 +45317 +45317 +45317 +45317 +45317 +45317 +45317 +45318 +45318 +45318 +45318 +45318 +45318 +45318 +45318 +45318 +45319 +45319 +45319 +45319 +45319 +45319 +45319 +45319 +45319 +45320 +45320 +45320 +45320 +45320 +45320 +45320 +45320 +45321 +45321 +45321 +45321 +45321 +45321 +45321 +45321 +45321 +45322 +45322 +45322 +45322 +45322 +45322 +45322 +45322 +45322 +45323 +45323 +45323 +45323 +45323 +45323 +45323 +45323 +45324 +45324 +45324 +45324 +45324 +45324 +45324 +45324 +45324 +45325 +45325 +45325 +45325 +45325 +45325 +45325 +45325 +45325 +45326 +45326 +45326 +45326 +45326 +45326 +45326 +45326 +45327 +45327 +45327 +45327 +45327 +45327 +45327 +45327 +45327 +45328 +45328 +45328 +45328 +45328 +45328 +45328 +45328 +45328 +45329 +45329 +45329 +45329 +45329 +45329 +45329 +45329 +45329 +45330 +45330 +45330 +45330 +45330 +45330 +45330 +45330 +45330 +45331 +45331 +45331 +45331 +45331 +45331 +45331 +45331 +45331 +45332 +45332 +45332 +45332 +45332 +45332 +45332 +45332 +45333 +45333 +45333 +45333 +45333 +45333 +45333 +45333 +45333 +45334 +45334 +45334 +45334 +45334 +45334 +45334 +45334 +45334 +45335 +45335 +45335 +45335 +45335 +45335 +45335 +45335 +45335 +45336 +45336 +45336 +45336 +45336 +45336 +45336 +45336 +45336 +45337 +45337 +45337 +45337 +45337 +45337 +45337 +45337 +45337 +45338 +45338 +45338 +45338 +45338 +45338 +45338 +45338 +45338 +45339 +45339 +45339 +45339 +45339 +45339 +45339 +45339 +45339 +45340 +45340 +45340 +45340 +45340 +45340 +45340 +45340 +45340 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45342 +45342 +45342 +45342 +45342 +45342 +45342 +45342 +45342 +45343 +45343 +45343 +45343 +45343 +45343 +45343 +45343 +45343 +45344 +45344 +45344 +45344 +45344 +45344 +45344 +45344 +45344 +45345 +45345 +45345 +45345 +45345 +45345 +45345 +45345 +45345 +45346 +45346 +45346 +45346 +45346 +45346 +45347 +45347 +45347 +45347 +45347 +45348 +45348 +45348 +45348 +45349 +45349 +45349 +45349 +45349 +45350 +45350 +45350 +45350 +45351 +45351 +45351 +45351 +45351 +45352 +45352 +45352 +45352 +45352 +45353 +45353 +45353 +45353 +45354 +45354 +45354 +45354 +45354 +45355 +45355 +45355 +45355 +45355 +45356 +45356 +45356 +45356 +45356 +45357 +45357 +45357 +45357 +45358 +45358 +45358 +45358 +45358 +45359 +45359 +45359 +45359 +45359 +45360 +45360 +45360 +45360 +45360 +45361 +45361 +45361 +45361 +45362 +45362 +45362 +45362 +45362 +45363 +45363 +45363 +45363 +45363 +45364 +45364 +45364 +45364 +45364 +45365 +45365 +45365 +45365 +45365 +45366 +45366 +45366 +45366 +45367 +45367 +45367 +45367 +45367 +45368 +45368 +45368 +45368 +45368 +45369 +45369 +45369 +45369 +45369 +45370 +45370 +45370 +45370 +45370 +45371 +45371 +45371 +45371 +45371 +45372 +45372 +45372 +45372 +45372 +45373 +45373 +45373 +45373 +45373 +45374 +45374 +45374 +45374 +45375 +45375 +45375 +45375 +45375 +45376 +45376 +45376 +45376 +45376 +45377 +45377 +45377 +45377 +45377 +45378 +45378 +45378 +45378 +45378 +45379 +45379 +45379 +45379 +45379 +45380 +45380 +45380 +45380 +45380 +45381 +45381 +45381 +45381 +45381 +45382 +45382 +45382 +45382 +45382 +45383 +45383 +45383 +45383 +45383 +45384 +45384 +45384 +45384 +45384 +45385 +45385 +45385 +45385 +45385 +45386 +45386 +45386 +45386 +45386 +45387 +45387 +45387 +45387 +45387 +45387 +45388 +45388 +45388 +45388 +45388 +45389 +45389 +45389 +45389 +45389 +45390 +45390 +45390 +45390 +45390 +45391 +45391 +45391 +45391 +45391 +45392 +45392 +45392 +45392 +45392 +45393 +45393 +45393 +45393 +45393 +45394 +45394 +45394 +45394 +45394 +45395 +45395 +45395 +45395 +45395 +45395 +45396 +45396 +45396 +45396 +45396 +45397 +45397 +45397 +45397 +45397 +45398 +45398 +45398 +45398 +45398 +45399 +45399 +45399 +45399 +45399 +45400 +45400 +45400 +45400 +45400 +45400 +45401 +45401 +45401 +45401 +45401 +45402 +45402 +45402 +45402 +45402 +45403 +45403 +45403 +45403 +45403 +45404 +45404 +45404 +45404 +45404 +45404 +45405 +45405 +45405 +45405 +45405 +45406 +45406 +45406 +45406 +45406 +45407 +45407 +45407 +45407 +45407 +45408 +45408 +45408 +45408 +45408 +45408 +45409 +45409 +45409 +45409 +45409 +45410 +45410 +45410 +45410 +45410 +45411 +45411 +45411 +45411 +45411 +45411 +45412 +45412 +45412 +45412 +45412 +45413 +45413 +45413 +45413 +45413 +45413 +45414 +45414 +45414 +45414 +45414 +45415 +45415 +45415 +45415 +45415 +45416 +45416 +45416 +45416 +45416 +45416 +45417 +45417 +45417 +45417 +45417 +45418 +45418 +45418 +45418 +45418 +45418 +45419 +45419 +45419 +45419 +45419 +45420 +45420 +45420 +45420 +45420 +45420 +45421 +45421 +45421 +45421 +45421 +45422 +45422 +45422 +45422 +45422 +45423 +45423 +45423 +45423 +45423 +45423 +45424 +45424 +45424 +45424 +45424 +45425 +45425 +45425 +45425 +45425 +45425 +45426 +45426 +45426 +45426 +45426 +45426 +45427 +45427 +45427 +45427 +45427 +45428 +45428 +45428 +45428 +45428 +45428 +45429 +45429 +45429 +45429 +45429 +45430 +45430 +45430 +45430 +45430 +45430 +45431 +45431 +45431 +45431 +45431 +45432 +45432 +45432 +45432 +45432 +45432 +45433 +45433 +45433 +45433 +45433 +45433 +45434 +45434 +45434 +45434 +45434 +45435 +45435 +45435 +45435 +45435 +45435 +45436 +45436 +45436 +45436 +45436 +45437 +45437 +45437 +45437 +45437 +45437 +45438 +45438 +45438 +45438 +45438 +45438 +45439 +45439 +45439 +45439 +45439 +45440 +45440 +45440 +45440 +45440 +45440 +45441 +45441 +45441 +45441 +45441 +45441 +45442 +45442 +45442 +45442 +45442 +45442 +45443 +45443 +45443 +45443 +45443 +45444 +45444 +45444 +45444 +45444 +45444 +45445 +45445 +45445 +45445 +45445 +45445 +45446 +45446 +45446 +45446 +45446 +45446 +45447 +45447 +45447 +45447 +45447 +45448 +45448 +45448 +45448 +45448 +45448 +45449 +45449 +45449 +45449 +45449 +45449 +45450 +45450 +45450 +45450 +45450 +45450 +45451 +45451 +45451 +45451 +45451 +45451 +45452 +45452 +45452 +45452 +45452 +45453 +45453 +45453 +45453 +45453 +45453 +45454 +45454 +45454 +45454 +45454 +45454 +45455 +45455 +45455 +45455 +45455 +45455 +45456 +45456 +45456 +45456 +45456 +45456 +45457 +45457 +45457 +45457 +45457 +45457 +45458 +45458 +45458 +45458 +45458 +45458 +45459 +45459 +45459 +45459 +45459 +45459 +45460 +45460 +45460 +45460 +45460 +45460 +45461 +45461 +45461 +45461 +45461 +45462 +45462 +45462 +45462 +45462 +45462 +45463 +45463 +45463 +45463 +45463 +45463 +45464 +45464 +45464 +45464 +45464 +45464 +45465 +45465 +45465 +45465 +45465 +45465 +45466 +45466 +45466 +45466 +45466 +45466 +45467 +45467 +45467 +45467 +45467 +45467 +45468 +45468 +45468 +45468 +45468 +45468 +45469 +45469 +45469 +45469 +45469 +45469 +45470 +45470 +45470 +45470 +45470 +45470 +45470 +45471 +45471 +45471 +45471 +45471 +45471 +45472 +45472 +45472 +45472 +45472 +45472 +45473 +45473 +45473 +45473 +45473 +45473 +45474 +45474 +45474 +45474 +45474 +45474 +45475 +45475 +45475 +45475 +45475 +45475 +45476 +45476 +45476 +45476 +45476 +45476 +45477 +45477 +45477 +45477 +45477 +45477 +45478 +45478 +45478 +45478 +45478 +45478 +45479 +45479 +45479 +45479 +45479 +45479 +45480 +45480 +45480 +45480 +45480 +45480 +45480 +45481 +45481 +45481 +45481 +45481 +45481 +45482 +45482 +45482 +45482 +45482 +45482 +45483 +45483 +45483 +45483 +45483 +45483 +45484 +45484 +45484 +45484 +45484 +45484 +45485 +45485 +45485 +45485 +45485 +45485 +45485 +45486 +45486 +45486 +45486 +45486 +45486 +45487 +45487 +45487 +45487 +45487 +45487 +45488 +45488 +45488 +45488 +45488 +45488 +45489 +45489 +45489 +45489 +45489 +45489 +45489 +45490 +45490 +45490 +45490 +45490 +45490 +45491 +45491 +45491 +45491 +45491 +45491 +45492 +45492 +45492 +45492 +45492 +45492 +45492 +45493 +45493 +45493 +45493 +45493 +45493 +45494 +45494 +45494 +45494 +45494 +45494 +45495 +45495 +45495 +45495 +45495 +45495 +45495 +45496 +45496 +45496 +45496 +45496 +45496 +45497 +45497 +45497 +45497 +45497 +45497 +45498 +45498 +45498 +45498 +45498 +45498 +45498 +45499 +45499 +45499 +45499 +45499 +45499 +45500 +45500 +45500 +45500 +45500 +45500 +45500 +45501 +45501 +45501 +45501 +45501 +45501 +45502 +45502 +45502 +45502 +45502 +45502 +45503 +45503 +45503 +45503 +45503 +45503 +45503 +45504 +45504 +45504 +45504 +45504 +45504 +45505 +45505 +45505 +45505 +45505 +45505 +45505 +45506 +45506 +45506 +45506 +45506 +45506 +45507 +45507 +45507 +45507 +45507 +45507 +45507 +45508 +45508 +45508 +45508 +45508 +45508 +45509 +45509 +45509 +45509 +45509 +45509 +45509 +45510 +45510 +45510 +45510 +45510 +45510 +45511 +45511 +45511 +45511 +45511 +45511 +45511 +45512 +45512 +45512 +45512 +45512 +45512 +45513 +45513 +45513 +45513 +45513 +45513 +45513 +45514 +45514 +45514 +45514 +45514 +45514 +45514 +45515 +45515 +45515 +45515 +45515 +45515 +45516 +45516 +45516 +45516 +45516 +45516 +45516 +45517 +45517 +45517 +45517 +45517 +45517 +45518 +45518 +45518 +45518 +45518 +45518 +45518 +45519 +45519 +45519 +45519 +45519 +45519 +45519 +45520 +45520 +45520 +45520 +45520 +45520 +45521 +45521 +45521 +45521 +45521 +45521 +45521 +45522 +45522 +45522 +45522 +45522 +45522 +45522 +45523 +45523 +45523 +45523 +45523 +45523 +45524 +45524 +45524 +45524 +45524 +45524 +45524 +45525 +45525 +45525 +45525 +45525 +45525 +45525 +45526 +45526 +45526 +45526 +45526 +45526 +45526 +45527 +45527 +45527 +45527 +45528 +45528 +45528 +45529 +45529 +45529 +45529 +45530 +45530 +45530 +45531 +45531 +45531 +45532 +45532 +45532 +45532 +45533 +45533 +45533 +45534 +45534 +45534 +45534 +45535 +45535 +45535 +45536 +45536 +45536 +45536 +45537 +45537 +45537 +45538 +45538 +45538 +45539 +45539 +45539 +45539 +45540 +45540 +45540 +45541 +45541 +45541 +45541 +45542 +45542 +45542 +45543 +45543 +45543 +45543 +45544 +45544 +45544 +45545 +45545 +45545 +45545 +45546 +45546 +45546 +45547 +45547 +45547 +45547 +45548 +45548 +45548 +45549 +45549 +45549 +45549 +45550 +45550 +45550 +45551 +45551 +45551 +45551 +45552 +45552 +45552 +45553 +45553 +45553 +45553 +45554 +45554 +45554 +45555 +45555 +45555 +45555 +45556 +45556 +45556 +45557 +45557 +45557 +45557 +45558 +45558 +45558 +45559 +45559 +45559 +45559 +45560 +45560 +45560 +45560 +45561 +45561 +45561 +45562 +45562 +45562 +45562 +45563 +45563 +45563 +45564 +45564 +45564 +45564 +45565 +45565 +45565 +45566 +45566 +45566 +45566 +45567 +45567 +45567 +45567 +45568 +45568 +45568 +45569 +45569 +45569 +45569 +45570 +45570 +45570 +45570 +45571 +45571 +45571 +45572 +45572 +45572 +45572 +45573 +45573 +45573 +45573 +45574 +45574 +45574 +45575 +45575 +45575 +45575 +45576 +45576 +45576 +45576 +45577 +45577 +45577 +45578 +45578 +45578 +45578 +45579 +45579 +45579 +45579 +45580 +45580 +45580 +45581 +45581 +45581 +45581 +45582 +45582 +45582 +45582 +45583 +45583 +45583 +45584 +45584 +45584 +45584 +45585 +45585 +45585 +45585 +45586 +45586 +45586 +45586 +45587 +45587 +45587 +45588 +45588 +45588 +45588 +45589 +45589 +45589 +45589 +45590 +45590 +45590 +45590 +45591 +45591 +45591 +45592 +45592 +45592 +45592 +45593 +45593 +45593 +45593 +45594 +45594 +45594 +45594 +45595 +45595 +45595 +45596 +45596 +45596 +45596 +45597 +45597 +45597 +45597 +45598 +45598 +45598 +45598 +45599 +45599 +45599 +45599 +45600 +45600 +45600 +45601 +45601 +45601 +45601 +45602 +45602 +45602 +45602 +45603 +45603 +45603 +45603 +45604 +45604 +45604 +45604 +45605 +45605 +45605 +45605 +45606 +45606 +45606 +45606 +45607 +45607 +45607 +45608 +45608 +45608 +45608 +45609 +45609 +45609 +45609 +45610 +45610 +45610 +45610 +45611 +45611 +45611 +45611 +45612 +45612 +45612 +45612 +45613 +45613 +45613 +45613 +45614 +45614 +45614 +45614 +45615 +45615 +45615 +45615 +45616 +45616 +45616 +45617 +45617 +45617 +45617 +45618 +45618 +45618 +45618 +45619 +45619 +45619 +45619 +45620 +45620 +45620 +45620 +45621 +45621 +45621 +45621 +45622 +45622 +45622 +45622 +45623 +45623 +45623 +45623 +45624 +45624 +45624 +45624 +45625 +45625 +45625 +45625 +45626 +45626 +45626 +45626 +45627 +45627 +45627 +45627 +45628 +45628 +45628 +45628 +45629 +45629 +45629 +45629 +45630 +45630 +45630 +45630 +45631 +45631 +45631 +45631 +45632 +45632 +45632 +45632 +45633 +45633 +45633 +45633 +45634 +45634 +45634 +45634 +45635 +45635 +45635 +45635 +45636 +45636 +45636 +45636 +45637 +45637 +45637 +45637 +45638 +45638 +45638 +45638 +45639 +45639 +45639 +45639 +45640 +45640 +45640 +45640 +45641 +45641 +45641 +45641 +45642 +45642 +45642 +45642 +45642 +45643 +45643 +45643 +45643 +45644 +45644 +45644 +45644 +45645 +45645 +45645 +45645 +45646 +45646 +45646 +45646 +45647 +45647 +45647 +45647 +45648 +45648 +45648 +45648 +45649 +45649 +45649 +45649 +45650 +45650 +45650 +45650 +45651 +45651 +45651 +45651 +45651 +45652 +45652 +45652 +45652 +45653 +45653 +45653 +45653 +45654 +45654 +45654 +45654 +45655 +45655 +45655 +45655 +45656 +45656 +45656 +45656 +45657 +45657 +45657 +45657 +45657 +45658 +45658 +45658 +45658 +45659 +45659 +45659 +45659 +45660 +45660 +45660 +45660 +45661 +45661 +45661 +45661 +45662 +45662 +45662 +45662 +45662 +45663 +45663 +45663 +45663 +45664 +45664 +45664 +45664 +45665 +45665 +45665 +45665 +45666 +45666 +45666 +45666 +45667 +45667 +45667 +45667 +45667 +45668 +45668 +45668 +45668 +45669 +45669 +45669 +45669 +45670 +45670 +45670 +45670 +45671 +45671 +45671 +45671 +45671 +45672 +45672 +45672 +45672 +45673 +45673 +45673 +45673 +45674 +45674 +45674 +45674 +45674 +45675 +45675 +45675 +45675 +45676 +45676 +45676 +45676 +45677 +45677 +45677 +45677 +45678 +45678 +45678 +45678 +45678 +45679 +45679 +45679 +45679 +45680 +45680 +45680 +45680 +45681 +45681 +45681 +45681 +45681 +45682 +45682 +45682 +45682 +45683 +45683 +45683 +45683 +45684 +45684 +45684 +45684 +45684 +45685 +45685 +45685 +45685 +45686 +45686 +45686 +45686 +45687 +45687 +45687 +45687 +45687 +45688 +45688 +45688 +45688 +45689 +45689 +45689 +45689 +45689 +45690 +45690 +45690 +45690 +45691 +45691 +45691 +45691 +45692 +45692 +45692 +45692 +45692 +45693 +45693 +45693 +45693 +45694 +45694 +45694 +45694 +45694 +45695 +45695 +45695 +45695 +45696 +45696 +45696 +45696 +45697 +45697 +45697 +45697 +45697 +45698 +45698 +45698 +45698 +45699 +45699 +45699 +45699 +45699 +45700 +45700 +45700 +45700 +45701 +45701 +45701 +45701 +45701 +45702 +45702 +45702 +45702 +45703 +45703 +45703 +45703 +45703 +45704 +45704 +45704 +45704 +45705 +45705 +45705 +45705 +45705 +45706 +45706 +45706 +45706 +45707 +45707 +45707 +45707 +45707 +45708 +45708 +45708 +45708 +45709 +45709 +45709 +45709 +45709 +45710 +45710 +45710 +45710 +45711 +45711 +45711 +45711 +45711 +45712 +45712 +45712 +45712 +45713 +45713 +45713 +45713 +45713 +45714 +45714 +45714 +45714 +45715 +45715 +45715 +45715 +45715 +45716 +45716 +45716 +45716 +45717 +45717 +45717 +45717 +45717 +45718 +45718 +45718 +45718 +45719 +45719 +45719 +45719 +45719 +45720 +45720 +45720 +45720 +45720 +45721 +45721 +45721 +45721 +45722 +45722 +45722 +45722 +45722 +45723 +45723 +45723 +45723 +45724 +45724 +45724 +45724 +45724 +45725 +45725 +45725 +45725 +45725 +45726 +45726 +45726 +45726 +45727 +45727 +45727 +45727 +45727 +45728 +45728 +45728 +45728 +45729 +45729 +45729 +45729 +45729 +45730 +45730 +45730 +45730 +45730 +45731 +45731 +45731 +45731 +45732 +45732 +45732 +45732 +45732 +45733 +45733 +45733 +45733 +45733 +45734 +45734 +45734 +45734 +45735 +45735 +45735 +45735 +45735 +45736 +45736 +45736 +45736 +45736 +45737 +45737 +45737 +45737 +45738 +45738 +45738 +45738 +45738 +45739 +45739 +45739 +45739 +45739 +45740 +45740 +45740 +45740 +45740 +45741 +45741 +45741 +45741 +45742 +45742 +45742 +45742 +45742 +45743 +45743 +45743 +45743 +45743 +45744 +45744 +45744 +45744 +45745 +45745 +45745 +45745 +45745 +45746 +45746 +45746 +45746 +45746 +45747 +45747 +45747 +45747 +45747 +45748 +45748 +45748 +45748 +45749 +45749 +45749 +45749 +45749 +45750 +45750 +45750 +45750 +45750 +45751 +45751 +45751 +45751 +45751 +45752 +45752 +45752 +45752 +45752 +45753 +45753 +45753 +45753 +45754 +45754 +45754 +45754 +45754 +45755 +45755 +45755 +45755 +45755 +45756 +45756 +45756 +45756 +45756 +45757 +45757 +45757 +45757 +45757 +45758 +45758 +45758 +45758 +45759 +45759 +45759 +45759 +45759 +45760 +45760 +45760 +45760 +45760 +45761 +45761 +45761 +45761 +45761 +45762 +45762 +45762 +45762 +45762 +45763 +45763 +45763 +45763 +45763 +45764 +45764 +45764 +45764 +45764 +45765 +45765 +45765 +45765 +45766 +45766 +45766 +45766 +45766 +45767 +45767 +45767 +45767 +45767 +45768 +45768 +45768 +45768 +45768 +45769 +45769 +45769 +45769 +45769 +45770 +45770 +45770 +45770 +45770 +45771 +45771 +45771 +45771 +45771 +45772 +45772 +45772 +45772 +45772 +45773 +45773 +45773 +45773 +45773 +45774 +45774 +45774 +45774 +45775 +45775 +45776 +45776 +45777 +45777 +45777 +45778 +45778 +45779 +45779 +45779 +45780 +45780 +45781 +45781 +45781 +45782 +45782 +45783 +45783 +45783 +45784 +45784 +45785 +45785 +45785 +45786 +45786 +45787 +45787 +45787 +45788 +45788 +45789 +45789 +45789 +45790 +45790 +45791 +45791 +45791 +45792 +45792 +45793 +45793 +45793 +45794 +45794 +45794 +45795 +45795 +45796 +45796 +45796 +45797 +45797 +45798 +45798 +45798 +45799 +45799 +45800 +45800 +45800 +45801 +45801 +45802 +45802 +45802 +45803 +45803 +45804 +45804 +45804 +45805 +45805 +45805 +45806 +45806 +45807 +45807 +45807 +45808 +45808 +45809 +45809 +45809 +45810 +45810 +45811 +45811 +45811 +45812 +45812 +45812 +45813 +45813 +45814 +45814 +45814 +45815 +45815 +45816 +45816 +45816 +45817 +45817 +45817 +45818 +45818 +45819 +45819 +45819 +45820 +45820 +45821 +45821 +45821 +45822 +45822 +45822 +45823 +45823 +45824 +45824 +45824 +45825 +45825 +45825 +45826 +45826 +45827 +45827 +45827 +45828 +45828 +45828 +45829 +45829 +45830 +45830 +45830 +45831 +45831 +45832 +45832 +45832 +45833 +45833 +45833 +45834 +45834 +45835 +45835 +45835 +45836 +45836 +45836 +45837 +45837 +45838 +45838 +45838 +45839 +45839 +45839 +45840 +45840 +45840 +45841 +45841 +45842 +45842 +45842 +45843 +45843 +45843 +45844 +45844 +45845 +45845 +45845 +45846 +45846 +45846 +45847 +45847 +45848 +45848 +45848 +45849 +45849 +45849 +45850 +45850 +45850 +45851 +45851 +45852 +45852 +45852 +45853 +45853 +45853 +45854 +45854 +45855 +45855 +45855 +45856 +45856 +45856 +45857 +45857 +45857 +45858 +45858 +45859 +45859 +45859 +45860 +45860 +45860 +45861 +45861 +45861 +45862 +45862 +45863 +45863 +45863 +45864 +45864 +45864 +45865 +45865 +45865 +45866 +45866 +45867 +45867 +45867 +45868 +45868 +45868 +45869 +45869 +45869 +45870 +45870 +45870 +45871 +45871 +45872 +45872 +45872 +45873 +45873 +45873 +45874 +45874 +45874 +45875 +45875 +45876 +45876 +45876 +45877 +45877 +45877 +45878 +45878 +45878 +45879 +45879 +45879 +45880 +45880 +45880 +45881 +45881 +45882 +45882 +45882 +45883 +45883 +45883 +45884 +45884 +45884 +45885 +45885 +45885 +45886 +45886 +45886 +45887 +45887 +45888 +45888 +45888 +45889 +45889 +45889 +45890 +45890 +45890 +45891 +45891 +45891 +45892 +45892 +45892 +45893 +45893 +45894 +45894 +45894 +45895 +45895 +45895 +45896 +45896 +45896 +45897 +45897 +45897 +45898 +45898 +45898 +45899 +45899 +45899 +45900 +45900 +45900 +45901 +45901 +45902 +45902 +45902 +45903 +45903 +45903 +45904 +45904 +45904 +45905 +45905 +45905 +45906 +45906 +45906 +45907 +45907 +45907 +45908 +45908 +45908 +45909 +45909 +45909 +45910 +45910 +45910 +45911 +45911 +45912 +45912 +45912 +45913 +45913 +45913 +45914 +45914 +45914 +45915 +45915 +45915 +45916 +45916 +45916 +45917 +45917 +45917 +45918 +45918 +45918 +45919 +45919 +45919 +45920 +45920 +45920 +45921 +45921 +45921 +45922 +45922 +45922 +45923 +45923 +45923 +45924 +45924 +45924 +45925 +45925 +45925 +45926 +45926 +45926 +45927 +45927 +45927 +45928 +45928 +45928 +45929 +45929 +45929 +45930 +45930 +45930 +45931 +45931 +45931 +45932 +45932 +45932 +45933 +45933 +45933 +45934 +45934 +45934 +45935 +45935 +45935 +45936 +45936 +45936 +45937 +45937 +45937 +45938 +45938 +45938 +45939 +45939 +45939 +45940 +45940 +45940 +45941 +45941 +45941 +45942 +45942 +45942 +45943 +45943 +45943 +45944 +45944 +45944 +45945 +45945 +45945 +45946 +45946 +45946 +45947 +45947 +45947 +45948 +45948 +45948 +45949 +45949 +45949 +45950 +45950 +45950 +45951 +45951 +45951 +45952 +45952 +45952 +45953 +45953 +45953 +45954 +45954 +45954 +45955 +45955 +45955 +45956 +45956 +45956 +45957 +45957 +45957 +45958 +45958 +45958 +45958 +45959 +45959 +45959 +45960 +45960 +45960 +45961 +45961 +45961 +45962 +45962 +45962 +45963 +45963 +45963 +45964 +45964 +45964 +45965 +45965 +45965 +45966 +45966 +45966 +45967 +45967 +45967 +45968 +45968 +45968 +45968 +45969 +45969 +45969 +45970 +45970 +45970 +45971 +45971 +45971 +45972 +45972 +45972 +45973 +45973 +45973 +45974 +45974 +45974 +45975 +45975 +45975 +45976 +45976 +45976 +45976 +45977 +45977 +45977 +45978 +45978 +45978 +45979 +45979 +45979 +45980 +45980 +45980 +45981 +45981 +45981 +45982 +45982 +45982 +45983 +45983 +45983 +45983 +45984 +45984 +45984 +45985 +45985 +45985 +45986 +45986 +45986 +45987 +45987 +45987 +45988 +45988 +45988 +45988 +45989 +45989 +45989 +45990 +45990 +45990 +45991 +45991 +45991 +45992 +45992 +45992 +45993 +45993 +45993 +45994 +45994 +45994 +45994 +45995 +45995 +45995 +45996 +45996 +45996 +45997 +45997 +45997 +45998 +45998 +45998 +45998 +45999 +45999 +45999 +46000 +46000 +46000 +46001 +46001 +46001 +46002 +46002 +46002 +46003 +46003 +46003 +46003 +46004 +46004 +46004 +46005 +46005 +46005 +46006 +46006 +46006 +46007 +46007 +46007 +46007 +46008 +46008 +46008 +46009 +46009 +46009 +46010 +46010 +46010 +46011 +46011 +46011 +46011 +46012 +46012 +46012 +46013 +46013 +46013 +46014 +46014 +46014 +46015 +46015 +46015 +46015 +46016 +46016 +46016 +46017 +46017 +46017 +46018 +46018 +46018 +46018 +46019 +46019 +46019 +46020 +46020 +46020 +46021 +46021 +46021 +46022 +46022 +46022 +46022 +46023 +46023 +46023 +46024 +46024 +46024 +46025 +46025 +46025 +46025 +46026 +46026 +46026 +46027 +46027 +46027 +46028 +46028 +46028 +46028 +46029 +46029 +46029 +46030 +46030 +46030 +46031 +46031 +46031 +46031 +46032 +46032 +46032 +46033 +46033 +46033 +46034 +46034 +46034 +46034 +46035 +46035 +46035 +46036 +46036 +46036 +46037 +46037 +46037 +46037 +46038 +46038 +46038 +46039 +46039 +46039 +46040 +46040 +46040 +46040 +46041 +46041 +46041 +46042 +46042 +46042 +46043 +46043 +46043 +46043 +46044 +46044 +46044 +46045 +46045 +46045 +46045 +46046 +46046 +46046 +46047 +46047 +46047 +46048 +46048 +46048 +46048 +46049 +46049 +46049 +46050 +46050 +46050 +46051 +46051 +46051 +46051 +46052 +46052 +46052 +46053 +46053 +46053 +46053 +46054 +46054 +46054 +46055 +46055 +46055 +46056 +46056 +46056 +46056 +46057 +46057 +46057 +46058 +46058 +46058 +46058 +46059 +46059 +46059 +46060 +46060 +46060 +46060 +46061 +46061 +46061 +46062 +46062 +46062 +46063 +46063 +46063 +46063 +46064 +46064 +46064 +46065 +46065 +46065 +46065 +46066 +46066 +46066 +46067 +46067 +46067 +46067 +46068 +46068 +46068 +46069 +46069 +46069 +46069 +46070 +46070 +46070 +46071 +46071 +46071 +46071 +46072 +46072 +46072 +46073 +46073 +46073 +46074 +46074 +46074 +46074 +46075 +46075 +46075 +46076 +46076 +46076 +46076 +46077 +46077 +46077 +46078 +46078 +46078 +46078 +46079 +46079 +46079 +46080 +46080 +46080 +46080 +46080 +46080 +46081 +46081 +46081 +46081 +46081 +46081 +46081 +46082 +46082 +46082 +46082 +46082 +46082 +46082 +46083 +46083 +46083 +46083 +46083 +46083 +46083 +46084 +46084 +46084 +46084 +46084 +46084 +46084 +46085 +46085 +46085 +46085 +46085 +46085 +46085 +46086 +46086 +46086 +46086 +46086 +46086 +46086 +46087 +46087 +46087 +46087 +46087 +46087 +46087 +46088 +46088 +46088 +46088 +46088 +46088 +46088 +46089 +46089 +46089 +46089 +46089 +46089 +46089 +46090 +46090 +46090 +46090 +46090 +46090 +46090 +46091 +46091 +46091 +46091 +46091 +46091 +46091 +46091 +46092 +46092 +46092 +46092 +46092 +46092 +46092 +46093 +46093 +46093 +46093 +46093 +46093 +46093 +46094 +46094 +46094 +46094 +46094 +46094 +46094 +46095 +46095 +46095 +46095 +46095 +46095 +46095 +46096 +46096 +46096 +46096 +46096 +46096 +46097 +46097 +46097 +46098 +46098 +46098 +46098 +46099 +46099 +46099 +46100 +46100 +46100 +46100 +46101 +46101 +46101 +46101 +46102 +46102 +46102 +46103 +46103 +46103 +46103 +46104 +46104 +46104 +46104 +46105 +46105 +46105 +46106 +46106 +46106 +46106 +46107 +46107 +46107 +46107 +46108 +46108 +46108 +46109 +46109 +46109 +46109 +46110 +46110 +46110 +46110 +46111 +46111 +46111 +46112 +46112 +46112 +46112 +46113 +46113 +46113 +46113 +46114 +46114 +46114 +46114 +46115 +46115 +46115 +46116 +46116 +46116 +46116 +46117 +46117 +46117 +46117 +46118 +46118 +46118 +46118 +46119 +46119 +46119 +46120 +46120 +46120 +46120 +46121 +46121 +46121 +46121 +46122 +46122 +46122 +46122 +46123 +46123 +46123 +46123 +46124 +46124 +46124 +46125 +46125 +46125 +46125 +46126 +46126 +46126 +46126 +46127 +46127 +46127 +46127 +46128 +46128 +46128 +46128 +46129 +46129 +46129 +46129 +46130 +46130 +46130 +46131 +46131 +46131 +46131 +46132 +46132 +46132 +46132 +46133 +46133 +46133 +46133 +46134 +46134 +46134 +46134 +46135 +46135 +46135 +46135 +46136 +46136 +46136 +46136 +46137 +46137 +46137 +46137 +46138 +46138 +46138 +46139 +46139 +46139 +46139 +46140 +46140 +46140 +46140 +46141 +46141 +46141 +46141 +46142 +46142 +46142 +46142 +46143 +46143 +46143 +46143 +46144 +46144 +46144 +46144 +46145 +46145 +46145 +46145 +46146 +46146 +46146 +46146 +46147 +46147 +46147 +46147 +46148 +46148 +46148 +46148 +46149 +46149 +46149 +46149 +46150 +46150 +46150 +46150 +46151 +46151 +46151 +46151 +46152 +46152 +46152 +46152 +46153 +46153 +46153 +46153 +46154 +46154 +46154 +46154 +46155 +46155 +46155 +46155 +46156 +46156 +46156 +46156 +46157 +46157 +46157 +46157 +46158 +46158 +46158 +46158 +46159 +46159 +46159 +46159 +46160 +46160 +46160 +46160 +46161 +46161 +46161 +46161 +46162 +46162 +46162 +46162 +46163 +46163 +46163 +46163 +46164 +46164 +46164 +46164 +46164 +46165 +46165 +46165 +46165 +46166 +46166 +46166 +46166 +46167 +46167 +46167 +46167 +46168 +46168 +46168 +46168 +46169 +46169 +46169 +46169 +46170 +46170 +46170 +46170 +46171 +46171 +46171 +46171 +46172 +46172 +46172 +46172 +46172 +46173 +46173 +46173 +46173 +46174 +46174 +46174 +46174 +46175 +46175 +46175 +46175 +46176 +46176 +46176 +46176 +46177 +46177 +46177 +46177 +46178 +46178 +46178 +46178 +46178 +46179 +46179 +46179 +46179 +46180 +46180 +46180 +46180 +46181 +46181 +46181 +46181 +46182 +46182 +46182 +46182 +46183 +46183 +46183 +46183 +46183 +46184 +46184 +46184 +46184 +46185 +46185 +46185 +46185 +46186 +46186 +46186 +46186 +46187 +46187 +46187 +46187 +46187 +46188 +46188 +46188 +46188 +46189 +46189 +46189 +46189 +46190 +46190 +46190 +46190 +46191 +46191 +46191 +46191 +46191 +46192 +46192 +46192 +46192 +46193 +46193 +46193 +46193 +46194 +46194 +46194 +46194 +46194 +46195 +46195 +46195 +46195 +46196 +46196 +46196 +46196 +46197 +46197 +46197 +46197 +46197 +46198 +46198 +46198 +46198 +46199 +46199 +46199 +46199 +46200 +46200 +46200 +46200 +46200 +46201 +46201 +46201 +46201 +46202 +46202 +46202 +46202 +46203 +46203 +46203 +46203 +46203 +46204 +46204 +46204 +46204 +46205 +46205 +46205 +46205 +46205 +46206 +46206 +46206 +46206 +46207 +46207 +46207 +46207 +46208 +46208 +46208 +46208 +46208 +46209 +46209 +46209 +46209 +46210 +46210 +46210 +46210 +46210 +46211 +46211 +46211 +46211 +46212 +46212 +46212 +46212 +46213 +46213 +46213 +46213 +46213 +46214 +46214 +46214 +46214 +46215 +46215 +46215 +46215 +46215 +46216 +46216 +46216 +46216 +46217 +46217 +46217 +46217 +46217 +46218 +46218 +46218 +46218 +46219 +46219 +46219 +46219 +46219 +46220 +46220 +46220 +46220 +46221 +46221 +46221 +46221 +46221 +46222 +46222 +46222 +46222 +46223 +46223 +46223 +46223 +46223 +46224 +46224 +46224 +46224 +46225 +46225 +46225 +46225 +46225 +46226 +46226 +46226 +46226 +46227 +46227 +46227 +46227 +46227 +46228 +46228 +46228 +46228 +46229 +46229 +46229 +46229 +46229 +46230 +46230 +46230 +46230 +46230 +46231 +46231 +46231 +46231 +46232 +46232 +46232 +46232 +46232 +46233 +46233 +46233 +46233 +46234 +46234 +46234 +46234 +46234 +46235 +46235 +46235 +46235 +46235 +46236 +46236 +46236 +46236 +46237 +46237 +46237 +46237 +46237 +46238 +46238 +46238 +46238 +46239 +46239 +46239 +46239 +46239 +46240 +46240 +46240 +46240 +46240 +46241 +46241 +46241 +46241 +46242 +46242 +46242 +46242 +46242 +46243 +46243 +46243 +46243 +46243 +46244 +46244 +46244 +46244 +46245 +46245 +46245 +46245 +46245 +46246 +46246 +46246 +46246 +46246 +46247 +46247 +46247 +46247 +46248 +46248 +46248 +46248 +46248 +46249 +46249 +46249 +46249 +46249 +46250 +46250 +46250 +46250 +46251 +46251 +46251 +46251 +46251 +46252 +46252 +46252 +46252 +46252 +46253 +46253 +46253 +46253 +46253 +46254 +46254 +46254 +46254 +46255 +46255 +46255 +46255 +46255 +46256 +46256 +46256 +46256 +46256 +46257 +46257 +46257 +46257 +46257 +46258 +46258 +46258 +46258 +46259 +46259 +46259 +46259 +46259 +46260 +46260 +46260 +46260 +46260 +46261 +46261 +46261 +46261 +46261 +46262 +46262 +46262 +46262 +46262 +46263 +46263 +46263 +46263 +46264 +46264 +46264 +46264 +46264 +46265 +46265 +46265 +46265 +46265 +46266 +46266 +46266 +46266 +46266 +46267 +46267 +46267 +46267 +46267 +46268 +46268 +46268 +46268 +46268 +46269 +46269 +46269 +46269 +46270 +46270 +46270 +46270 +46270 +46271 +46271 +46271 +46271 +46271 +46272 +46272 +46272 +46272 +46272 +46273 +46273 +46273 +46273 +46273 +46274 +46274 +46274 +46274 +46274 +46275 +46275 +46275 +46275 +46275 +46276 +46276 +46276 +46276 +46276 +46277 +46277 +46277 +46277 +46277 +46278 +46278 +46278 +46278 +46278 +46279 +46279 +46279 +46279 +46280 +46280 +46280 +46280 +46280 +46281 +46281 +46281 +46281 +46281 +46282 +46282 +46282 +46282 +46282 +46283 +46283 +46283 +46283 +46283 +46284 +46284 +46284 +46284 +46284 +46285 +46285 +46285 +46285 +46285 +46286 +46286 +46286 +46286 +46286 +46287 +46287 +46287 +46287 +46287 +46288 +46288 +46288 +46288 +46288 +46289 +46289 +46289 +46289 +46289 +46290 +46290 +46290 +46290 +46290 +46291 +46291 +46291 +46291 +46291 +46292 +46292 +46292 +46292 +46292 +46293 +46293 +46293 +46293 +46293 +46294 +46294 +46294 +46294 +46294 +46295 +46295 +46295 +46295 +46295 +46296 +46296 +46296 +46296 +46296 +46297 +46297 +46297 +46297 +46297 +46298 +46298 +46298 +46298 +46298 +46298 +46299 +46299 +46299 +46299 +46299 +46300 +46300 +46300 +46300 +46300 +46301 +46301 +46301 +46301 +46301 +46302 +46302 +46302 +46302 +46302 +46303 +46303 +46303 +46303 +46303 +46304 +46304 +46304 +46304 +46304 +46305 +46305 +46305 +46305 +46305 +46306 +46306 +46306 +46306 +46306 +46307 +46307 +46307 +46307 +46307 +46307 +46308 +46308 +46308 +46308 +46308 +46309 +46309 +46309 +46309 +46309 +46310 +46310 +46310 +46310 +46310 +46311 +46311 +46311 +46311 +46311 +46312 +46312 +46312 +46312 +46312 +46313 +46313 +46313 +46313 +46313 +46314 +46314 +46314 +46314 +46314 +46314 +46315 +46315 +46315 +46315 +46315 +46316 +46316 +46316 +46316 +46316 +46317 +46317 +46317 +46317 +46317 +46318 +46318 +46318 +46318 +46318 +46318 +46319 +46319 +46319 +46319 +46319 +46320 +46320 +46320 +46320 +46320 +46321 +46321 +46321 +46321 +46321 +46322 +46322 +46322 +46322 +46322 +46323 +46323 +46323 +46323 +46323 +46323 +46324 +46324 +46324 +46324 +46324 +46325 +46325 +46325 +46325 +46325 +46326 +46326 +46326 +46326 +46326 +46326 +46327 +46327 +46327 +46328 +46328 +46329 +46329 +46329 +46330 +46330 +46330 +46331 +46331 +46332 +46332 +46332 +46333 +46333 +46333 +46334 +46334 +46335 +46335 +46335 +46336 +46336 +46336 +46337 +46337 +46338 +46338 +46338 +46339 +46339 +46339 +46340 +46340 +46341 +46341 +46341 +46342 +46342 +46342 +46343 +46343 +46344 +46344 +46344 +46345 +46345 +46345 +46346 +46346 +46346 +46347 +46347 +46348 +46348 +46348 +46349 +46349 +46349 +46350 +46350 +46350 +46351 +46351 +46352 +46352 +46352 +46353 +46353 +46353 +46354 +46354 +46355 +46355 +46355 +46356 +46356 +46356 +46357 +46357 +46357 +46358 +46358 +46358 +46359 +46359 +46360 +46360 +46360 +46361 +46361 +46361 +46362 +46362 +46362 +46363 +46363 +46364 +46364 +46364 +46365 +46365 +46365 +46366 +46366 +46366 +46367 +46367 +46367 +46368 +46368 +46369 +46369 +46369 +46370 +46370 +46370 +46371 +46371 +46371 +46372 +46372 +46372 +46373 +46373 +46374 +46374 +46374 +46375 +46375 +46375 +46376 +46376 +46376 +46377 +46377 +46377 +46378 +46378 +46378 +46379 +46379 +46380 +46380 +46380 +46381 +46381 +46381 +46382 +46382 +46382 +46383 +46383 +46383 +46384 +46384 +46384 +46385 +46385 +46386 +46386 +46386 +46387 +46387 +46387 +46388 +46388 +46388 +46389 +46389 +46389 +46390 +46390 +46390 +46391 +46391 +46391 +46392 +46392 +46392 +46393 +46393 +46393 +46394 +46394 +46395 +46395 +46395 +46396 +46396 +46396 +46397 +46397 +46397 +46398 +46398 +46398 +46399 +46399 +46399 +46400 +46400 +46400 +46401 +46401 +46401 +46402 +46402 +46402 +46403 +46403 +46403 +46404 +46404 +46404 +46405 +46405 +46405 +46406 +46406 +46407 +46407 +46407 +46408 +46408 +46408 +46409 +46409 +46409 +46410 +46410 +46410 +46411 +46411 +46411 +46412 +46412 +46412 +46413 +46413 +46413 +46414 +46414 +46414 +46415 +46415 +46415 +46416 +46416 +46416 +46417 +46417 +46417 +46418 +46418 +46418 +46419 +46419 +46419 +46420 +46420 +46420 +46421 +46421 +46421 +46422 +46422 +46422 +46423 +46423 +46423 +46424 +46424 +46424 +46425 +46425 +46425 +46426 +46426 +46426 +46427 +46427 +46427 +46428 +46428 +46428 +46429 +46429 +46429 +46430 +46430 +46430 +46431 +46431 +46431 +46432 +46432 +46432 +46433 +46433 +46433 +46434 +46434 +46434 +46435 +46435 +46435 +46436 +46436 +46436 +46436 +46437 +46437 +46437 +46438 +46438 +46438 +46439 +46439 +46439 +46440 +46440 +46440 +46441 +46441 +46441 +46442 +46442 +46442 +46443 +46443 +46443 +46444 +46444 +46444 +46445 +46445 +46445 +46446 +46446 +46446 +46447 +46447 +46447 +46448 +46448 +46448 +46448 +46449 +46449 +46449 +46450 +46450 +46450 +46451 +46451 +46451 +46452 +46452 +46452 +46453 +46453 +46453 +46454 +46454 +46454 +46455 +46455 +46455 +46456 +46456 +46456 +46456 +46457 +46457 +46457 +46458 +46458 +46458 +46459 +46459 +46459 +46460 +46460 +46460 +46461 +46461 +46461 +46462 +46462 +46462 +46463 +46463 +46463 +46463 +46464 +46464 +46464 +46465 +46465 +46465 +46466 +46466 +46466 +46467 +46467 +46467 +46468 +46468 +46468 +46469 +46469 +46469 +46469 +46470 +46470 +46470 +46471 +46471 +46471 +46472 +46472 +46472 +46473 +46473 +46473 +46474 +46474 +46474 +46474 +46475 +46475 +46475 +46476 +46476 +46476 +46477 +46477 +46477 +46478 +46478 +46478 +46479 +46479 +46479 +46479 +46480 +46480 +46480 +46481 +46481 +46481 +46482 +46482 +46482 +46483 +46483 +46483 +46483 +46484 +46484 +46484 +46485 +46485 +46485 +46486 +46486 +46486 +46487 +46487 +46487 +46487 +46488 +46488 +46488 +46489 +46489 +46489 +46490 +46490 +46490 +46491 +46491 +46491 +46491 +46492 +46492 +46492 +46493 +46493 +46493 +46494 +46494 +46494 +46494 +46495 +46495 +46495 +46496 +46496 +46496 +46497 +46497 +46497 +46498 +46498 +46498 +46498 +46499 +46499 +46499 +46500 +46500 +46500 +46501 +46501 +46501 +46501 +46502 +46502 +46502 +46503 +46503 +46503 +46504 +46504 +46504 +46504 +46505 +46505 +46505 +46506 +46506 +46506 +46507 +46507 +46507 +46507 +46508 +46508 +46508 +46509 +46509 +46509 +46510 +46510 +46510 +46510 +46511 +46511 +46511 +46512 +46512 +46512 +46513 +46513 +46513 +46513 +46514 +46514 +46514 +46515 +46515 +46515 +46516 +46516 +46516 +46516 +46517 +46517 +46517 +46518 +46518 +46518 +46518 +46519 +46519 +46519 +46520 +46520 +46520 +46521 +46521 +46521 +46521 +46522 +46522 +46522 +46523 +46523 +46523 +46524 +46524 +46524 +46524 +46525 +46525 +46525 +46526 +46526 +46526 +46526 +46527 +46527 +46527 +46528 +46528 +46528 +46528 +46529 +46529 +46529 +46530 +46530 +46530 +46531 +46531 +46531 +46531 +46532 +46532 +46532 +46533 +46533 +46533 +46533 +46534 +46534 +46534 +46535 +46535 +46535 +46535 +46536 +46536 +46536 +46537 +46537 +46537 +46538 +46538 +46538 +46538 +46539 +46539 +46539 +46540 +46540 +46540 +46540 +46541 +46541 +46541 +46542 +46542 +46542 +46542 +46543 +46543 +46543 +46544 +46544 +46544 +46544 +46545 +46545 +46545 +46546 +46546 +46546 +46546 +46547 +46547 +46547 +46548 +46548 +46548 +46548 +46549 +46549 +46549 +46550 +46550 +46550 +46550 +46551 +46551 +46551 +46552 +46552 +46552 +46552 +46553 +46553 +46553 +46554 +46554 +46554 +46554 +46555 +46555 +46555 +46556 +46556 +46556 +46556 +46557 +46557 +46557 +46558 +46558 +46558 +46558 +46559 +46559 +46559 +46560 +46560 +46560 +46560 +46561 +46561 +46561 +46562 +46562 +46562 +46562 +46563 +46563 +46563 +46563 +46564 +46564 +46564 +46565 +46565 +46565 +46565 +46566 +46566 +46566 +46567 +46567 +46567 +46567 +46568 +46568 +46568 +46569 +46569 +46569 +46569 +46570 +46570 +46570 +46570 +46571 +46571 +46571 +46572 +46572 +46572 +46572 +46573 +46573 +46573 +46574 +46574 +46574 +46574 +46575 +46575 +46575 +46575 +46576 +46576 +46576 +46577 +46577 +46577 +46577 +46578 +46578 +46578 +46579 +46579 +46579 +46579 +46580 +46580 +46580 +46580 +46581 +46581 +46581 +46582 +46582 +46582 +46582 +46583 +46583 +46583 +46584 +46584 +46584 +46584 +46585 +46585 +46585 +46585 +46586 +46586 +46586 +46587 +46587 +46587 +46587 +46588 +46588 +46588 +46588 +46589 +46589 +46589 +46590 +46590 +46590 +46590 +46591 +46591 +46591 +46591 +46592 +46592 +46592 +46593 +46593 +46593 +46593 +46594 +46594 +46594 +46594 +46595 +46595 +46595 +46596 +46596 +46596 +46596 +46597 +46597 +46597 +46597 +46598 +46598 +46598 +46599 +46599 +46599 +46599 +46600 +46600 +46600 +46600 +46601 +46601 +46601 +46601 +46602 +46602 +46602 +46603 +46603 +46603 +46603 +46604 +46604 +46604 +46604 +46605 +46605 +46605 +46606 +46606 +46606 +46606 +46607 +46607 +46607 +46607 +46608 +46608 +46608 +46608 +46609 +46609 +46609 +46610 +46610 +46610 +46610 +46611 +46611 +46611 +46611 +46612 +46612 +46612 +46612 +46613 +46613 +46613 +46614 +46614 +46614 +46614 +46615 +46615 +46615 +46615 +46616 +46616 +46616 +46616 +46617 +46617 +46617 +46618 +46618 +46618 +46618 +46619 +46619 +46619 +46619 +46620 +46620 +46620 +46620 +46621 +46621 +46621 +46621 +46622 +46622 +46622 +46623 +46623 +46623 +46623 +46624 +46624 +46624 +46624 +46625 +46625 +46625 +46625 +46626 +46626 +46626 +46626 +46627 +46627 +46627 +46628 +46628 +46628 +46628 +46629 +46629 +46629 +46629 +46630 +46630 +46630 +46630 +46631 +46631 +46631 +46631 +46632 +46632 +46632 +46633 +46633 +46633 +46633 +46634 +46634 +46634 +46634 +46635 +46635 +46635 +46635 +46636 +46636 +46636 +46636 +46637 +46637 +46637 +46637 +46638 +46638 +46638 +46639 +46639 +46639 +46639 +46640 +46640 +46640 +46640 +46641 +46641 +46641 +46641 +46642 +46642 +46642 +46643 +46643 +46644 +46644 +46645 +46645 +46646 +46647 +46647 +46648 +46648 +46649 +46649 +46650 +46650 +46651 +46651 +46652 +46652 +46653 +46653 +46654 +46654 +46655 +46655 +46656 +46656 +46657 +46657 +46658 +46658 +46659 +46659 +46660 +46660 +46661 +46661 +46662 +46662 +46663 +46663 +46664 +46664 +46665 +46665 +46666 +46666 +46667 +46667 +46668 +46668 +46669 +46669 +46670 +46670 +46671 +46671 +46672 +46672 +46673 +46673 +46674 +46674 +46675 +46675 +46676 +46676 +46677 +46677 +46678 +46678 +46679 +46679 +46680 +46680 +46681 +46681 +46682 +46682 +46683 +46683 +46684 +46684 +46685 +46685 +46686 +46686 +46687 +46687 +46688 +46688 +46689 +46689 +46690 +46690 +46691 +46691 +46692 +46692 +46693 +46693 +46694 +46694 +46695 +46695 +46696 +46696 +46697 +46697 +46698 +46698 +46699 +46699 +46700 +46700 +46701 +46701 +46702 +46702 +46702 +46703 +46703 +46704 +46704 +46705 +46705 +46706 +46706 +46707 +46707 +46708 +46708 +46709 +46709 +46710 +46710 +46711 +46711 +46712 +46712 +46713 +46713 +46714 +46714 +46715 +46715 +46716 +46716 +46716 +46717 +46717 +46718 +46718 +46719 +46719 +46720 +46720 +46721 +46721 +46722 +46722 +46723 +46723 +46724 +46724 +46725 +46725 +46726 +46726 +46727 +46727 +46727 +46728 +46728 +46729 +46729 +46730 +46730 +46731 +46731 +46732 +46732 +46733 +46733 +46734 +46734 +46735 +46735 +46735 +46736 +46736 +46737 +46737 +46738 +46738 +46739 +46739 +46740 +46740 +46741 +46741 +46742 +46742 +46743 +46743 +46743 +46744 +46744 +46745 +46745 +46746 +46746 +46747 +46747 +46748 +46748 +46749 +46749 +46750 +46750 +46750 +46751 +46751 +46752 +46752 +46753 +46753 +46754 +46754 +46755 +46755 +46756 +46756 +46756 +46757 +46757 +46758 +46758 +46759 +46759 +46760 +46760 +46761 +46761 +46762 +46762 +46762 +46763 +46763 +46764 +46764 +46765 +46765 +46766 +46766 +46767 +46767 +46767 +46768 +46768 +46769 +46769 +46770 +46770 +46771 +46771 +46772 +46772 +46772 +46773 +46773 +46774 +46774 +46775 +46775 +46776 +46776 +46777 +46777 +46777 +46778 +46778 +46779 +46779 +46780 +46780 +46781 +46781 +46782 +46782 +46782 +46783 +46783 +46784 +46784 +46785 +46785 +46786 +46786 +46786 +46787 +46787 +46788 +46788 +46789 +46789 +46790 +46790 +46791 +46791 +46791 +46792 +46792 +46793 +46793 +46794 +46794 +46795 +46795 +46795 +46796 +46796 +46797 +46797 +46798 +46798 +46799 +46799 +46799 +46800 +46800 +46801 +46801 +46802 +46802 +46803 +46803 +46803 +46804 +46804 +46805 +46805 +46806 +46806 +46806 +46807 +46807 +46808 +46808 +46809 +46809 +46810 +46810 +46810 +46811 +46811 +46812 +46812 +46813 +46813 +46814 +46814 +46814 +46815 +46815 +46816 +46816 +46817 +46817 +46817 +46818 +46818 +46819 +46819 +46820 +46820 +46821 +46821 +46821 +46822 +46822 +46823 +46823 +46824 +46824 +46824 +46825 +46825 +46826 +46826 +46827 +46827 +46827 +46828 +46828 +46829 +46829 +46830 +46830 +46830 +46831 +46831 +46832 +46832 +46833 +46833 +46833 +46834 +46834 +46835 +46835 +46836 +46836 +46836 +46837 +46837 +46838 +46838 +46839 +46839 +46839 +46840 +46840 +46841 +46841 +46842 +46842 +46842 +46843 +46843 +46844 +46844 +46845 +46845 +46845 +46846 +46846 +46847 +46847 +46848 +46848 +46848 +46849 +46849 +46850 +46850 +46851 +46851 +46851 +46852 +46852 +46853 +46853 +46853 +46854 +46854 +46855 +46855 +46856 +46856 +46856 +46857 +46857 +46858 +46858 +46859 +46859 +46859 +46860 +46860 +46861 +46861 +46861 +46862 +46862 +46863 +46863 +46864 +46864 +46864 +46865 +46865 +46866 +46866 +46867 +46867 +46867 +46868 +46868 +46869 +46869 +46869 +46870 +46870 +46871 +46871 +46872 +46872 +46872 +46873 +46873 +46874 +46874 +46874 +46875 +46875 +46876 +46876 +46876 +46877 +46877 +46878 +46878 +46879 +46879 +46879 +46880 +46880 +46881 +46881 +46881 +46882 +46882 +46883 +46883 +46884 +46884 +46884 +46885 +46885 +46886 +46886 +46886 +46887 +46887 +46888 +46888 +46888 +46889 +46889 +46890 +46890 +46890 +46891 +46891 +46892 +46892 +46893 +46893 +46893 +46894 +46894 +46895 +46895 +46895 +46896 +46896 +46897 +46897 +46897 +46898 +46898 +46899 +46899 +46899 +46900 +46900 +46901 +46901 +46901 +46902 +46902 +46903 +46903 +46903 +46904 +46904 +46905 +46905 +46906 +46906 +46906 +46907 +46907 +46908 +46908 +46908 +46909 +46909 +46910 +46910 +46910 +46911 +46911 +46912 +46912 +46912 +46913 +46913 +46914 +46914 +46914 +46915 +46915 +46916 +46916 +46916 +46917 +46917 +46918 +46918 +46918 +46919 +46919 +46920 +46920 +46920 +46921 +46921 +46922 +46922 +46922 +46923 +46923 +46924 +46924 +46924 +46925 +46925 +46926 +46926 +46926 +46927 +46927 +46928 +46928 +46928 +46929 +46929 +46929 +46930 +46930 +46931 +46931 +46931 +46932 +46932 +46933 +46933 +46933 +46934 +46934 +46935 +46935 +46935 +46936 +46936 +46937 +46937 +46937 +46938 +46938 +46939 +46939 +46939 +46940 +46940 +46941 +46941 +46941 +46942 +46942 +46942 +46943 +46943 +46944 +46944 +46944 +46945 +46945 +46946 +46946 +46946 +46947 +46947 +46948 +46948 +46948 +46949 +46949 +46949 +46950 +46950 +46951 +46951 +46951 +46952 +46952 +46953 +46953 +46953 +46954 +46954 +46955 +46955 +46955 +46956 +46956 +46956 +46957 +46957 +46958 +46958 +46958 +46959 +46959 +46960 +46960 +46960 +46961 +46961 +46962 +46962 +46962 +46963 +46963 +46963 +46964 +46964 +46965 +46965 +46965 +46966 +46966 +46966 +46967 +46967 +46968 +46968 +46968 +46969 +46969 +46970 +46970 +46970 +46971 +46971 +46971 +46972 +46972 +46973 +46973 +46973 +46974 +46974 +46975 +46975 +46975 +46976 +46976 +46976 +46977 +46977 +46978 +46978 +46978 +46979 +46979 +46979 +46980 +46980 +46981 +46981 +46981 +46982 +46982 +46983 +46983 +46983 +46984 +46984 +46984 +46985 +46985 +46986 +46986 +46986 +46987 +46987 +46987 +46988 +46988 +46989 +46989 +46989 +46990 +46990 +46990 +46991 +46991 +46992 +46992 +46992 +46993 +46993 +46993 +46994 +46994 +46995 +46995 +46995 +46996 +46996 +46996 +46997 +46997 +46998 +46998 +46998 +46999 +46999 +46999 +47000 +47000 +47001 +47001 +47001 +47002 +47002 +47002 +47003 +47003 +47004 +47004 +47004 +47005 +47005 +47005 +47006 +47006 +47007 +47007 +47007 +47008 +47008 +47008 +47009 +47009 +47009 +47010 +47010 +47011 +47011 +47011 +47012 +47012 +47012 +47013 +47013 +47014 +47014 +47014 +47015 +47015 +47015 +47016 +47016 +47017 +47017 +47017 +47018 +47018 +47018 +47019 +47019 +47019 +47020 +47020 +47021 +47021 +47021 +47022 +47022 +47022 +47023 +47023 +47024 +47024 +47024 +47025 +47025 +47025 +47026 +47026 +47026 +47027 +47027 +47028 +47028 +47028 +47029 +47029 +47029 +47030 +47030 +47030 +47031 +47031 +47032 +47032 +47032 +47033 +47033 +47033 +47034 +47034 +47034 +47035 +47035 +47036 +47036 +47036 +47037 +47037 +47037 +47038 +47038 +47038 +47039 +47039 +47040 +47040 +47040 +47041 +47041 +47041 +47042 +47042 +47042 +47043 +47043 +47044 +47044 +47044 +47045 +47045 +47045 +47046 +47046 +47046 +47047 +47047 +47047 +47048 +47048 +47049 +47049 +47049 +47050 +47050 +47050 +47051 +47051 +47051 +47052 +47052 +47053 +47053 +47053 +47054 +47054 +47054 +47055 +47055 +47055 +47056 +47056 +47056 +47057 +47057 +47058 +47058 +47058 +47059 +47059 +47059 +47060 +47060 +47060 +47061 +47061 +47061 +47062 +47062 +47063 +47063 +47063 +47064 +47064 +47064 +47065 +47065 +47065 +47066 +47066 +47066 +47067 +47067 +47067 +47068 +47068 +47069 +47069 +47069 +47070 +47070 +47070 +47071 +47071 +47071 +47072 +47072 +47072 +47073 +47074 +47075 +47075 +47076 +47077 +47077 +47078 +47079 +47079 +47080 +47081 +47082 +47082 +47083 +47084 +47084 +47085 +47086 +47086 +47087 +47088 +47089 +47089 +47090 +47091 +47091 +47092 +47093 +47093 +47094 +47095 +47096 +47096 +47097 +47098 +47098 +47099 +47100 +47100 +47101 +47102 +47102 +47103 +47104 +47104 +47105 +47105 +47105 +47106 +47106 +47106 +47107 +47107 +47107 +47108 +47108 +47108 +47109 +47109 +47109 +47110 +47110 +47110 +47111 +47111 +47111 +47112 +47112 +47112 +47113 +47113 +47114 +47114 +47114 +47115 +47115 +47115 +47116 +47116 +47116 +47117 +47117 +47117 +47118 +47118 +47118 +47119 +47119 +47119 +47120 +47120 +47120 +47121 +47121 +47121 +47122 +47122 +47122 +47123 +47123 +47123 +47124 +47124 +47124 +47125 +47125 +47125 +47126 +47126 +47126 +47127 +47127 +47127 +47128 +47128 +47128 +47129 +47129 +47129 +47130 +47130 +47130 +47131 +47131 +47131 +47132 +47132 +47132 +47133 +47133 +47133 +47134 +47134 +47134 +47135 +47135 +47135 +47136 +47136 +47136 +47137 +47137 +47137 +47138 +47138 +47138 +47139 +47139 +47139 +47140 +47140 +47140 +47140 +47141 +47141 +47141 +47142 +47142 +47142 +47143 +47143 +47143 +47144 +47144 +47144 +47145 +47145 +47145 +47146 +47146 +47146 +47147 +47147 +47147 +47148 +47148 +47148 +47149 +47149 +47149 +47150 +47150 +47150 +47151 +47151 +47151 +47152 +47152 +47152 +47152 +47153 +47153 +47153 +47154 +47154 +47154 +47155 +47155 +47155 +47156 +47156 +47156 +47157 +47157 +47157 +47158 +47158 +47158 +47159 +47159 +47159 +47160 +47160 +47160 +47160 +47161 +47161 +47161 +47162 +47162 +47162 +47163 +47163 +47163 +47164 +47164 +47164 +47165 +47165 +47165 +47166 +47166 +47166 +47166 +47167 +47167 +47167 +47168 +47168 +47168 +47169 +47169 +47169 +47170 +47170 +47170 +47171 +47171 +47171 +47172 +47172 +47172 +47172 +47173 +47173 +47173 +47174 +47174 +47174 +47175 +47175 +47175 +47176 +47176 +47176 +47177 +47177 +47177 +47177 +47178 +47178 +47178 +47179 +47179 +47179 +47180 +47180 +47180 +47181 +47181 +47181 +47181 +47182 +47182 +47182 +47183 +47183 +47183 +47184 +47184 +47184 +47185 +47185 +47185 +47185 +47186 +47186 +47186 +47187 +47187 +47187 +47188 +47188 +47188 +47189 +47189 +47189 +47189 +47190 +47190 +47190 +47191 +47191 +47191 +47192 +47192 +47192 +47192 +47193 +47193 +47193 +47194 +47194 +47194 +47195 +47195 +47195 +47196 +47196 +47196 +47196 +47197 +47197 +47197 +47198 +47198 +47198 +47199 +47199 +47199 +47199 +47200 +47200 +47200 +47201 +47201 +47201 +47202 +47202 +47202 +47202 +47203 +47203 +47203 +47204 +47204 +47204 +47205 +47205 +47205 +47205 +47206 +47206 +47206 +47207 +47207 +47207 +47208 +47208 +47208 +47208 +47209 +47209 +47209 +47210 +47210 +47210 +47211 +47211 +47211 +47211 +47212 +47212 +47212 +47213 +47213 +47213 +47213 +47214 +47214 +47214 +47215 +47215 +47215 +47216 +47216 +47216 +47216 +47217 +47217 +47217 +47218 +47218 +47218 +47218 +47219 +47219 +47219 +47220 +47220 +47220 +47221 +47221 +47221 +47221 +47222 +47222 +47222 +47223 +47223 +47223 +47223 +47224 +47224 +47224 +47225 +47225 +47225 +47226 +47226 +47226 +47226 +47227 +47227 +47227 +47228 +47228 +47228 +47228 +47229 +47229 +47229 +47230 +47230 +47230 +47230 +47231 +47231 +47231 +47232 +47232 +47232 +47232 +47233 +47233 +47233 +47234 +47234 +47234 +47234 +47235 +47235 +47235 +47236 +47236 +47236 +47237 +47237 +47237 +47237 +47238 +47238 +47238 +47239 +47239 +47239 +47239 +47240 +47240 +47240 +47241 +47241 +47241 +47241 +47242 +47242 +47242 +47243 +47243 +47243 +47243 +47244 +47244 +47244 +47244 +47245 +47245 +47245 +47246 +47246 +47246 +47246 +47247 +47247 +47247 +47248 +47248 +47248 +47248 +47249 +47249 +47249 +47250 +47250 +47250 +47250 +47251 +47251 +47251 +47252 +47252 +47252 +47252 +47253 +47253 +47253 +47254 +47254 +47254 +47254 +47255 +47255 +47255 +47256 +47256 +47256 +47256 +47257 +47257 +47257 +47257 +47258 +47258 +47258 +47259 +47259 +47259 +47259 +47260 +47260 +47260 +47261 +47261 +47261 +47261 +47262 +47262 +47262 +47262 +47263 +47263 +47263 +47264 +47264 +47264 +47264 +47265 +47265 +47265 +47266 +47266 +47266 +47266 +47267 +47267 +47267 +47267 +47268 +47268 +47268 +47269 +47269 +47269 +47269 +47270 +47270 +47270 +47270 +47271 +47271 +47271 +47272 +47272 +47272 +47272 +47273 +47273 +47273 +47274 +47274 +47274 +47274 +47275 +47275 +47275 +47275 +47276 +47276 +47276 +47277 +47277 +47277 +47277 +47278 +47278 +47278 +47278 +47279 +47279 +47279 +47280 +47280 +47280 +47280 +47281 +47281 +47281 +47281 +47282 +47282 +47282 +47282 +47283 +47283 +47283 +47284 +47284 +47284 +47284 +47285 +47285 +47285 +47285 +47286 +47286 +47286 +47287 +47287 +47287 +47287 +47288 +47288 +47288 +47288 +47289 +47289 +47289 +47290 +47290 +47290 +47290 +47291 +47291 +47291 +47291 +47292 +47292 +47292 +47292 +47293 +47293 +47293 +47294 +47294 +47294 +47294 +47295 +47295 +47295 +47295 +47296 +47296 +47296 +47296 +47297 +47297 +47297 +47298 +47298 +47298 +47298 +47299 +47299 +47299 +47299 +47300 +47300 +47300 +47300 +47301 +47301 +47301 +47302 +47302 +47302 +47302 +47303 +47303 +47303 +47303 +47304 +47304 +47304 +47304 +47305 +47305 +47305 +47305 +47306 +47306 +47306 +47307 +47307 +47307 +47307 +47308 +47308 +47308 +47308 +47309 +47309 +47309 +47309 +47310 +47310 +47310 +47310 +47311 +47311 +47311 +47312 +47312 +47312 +47312 +47313 +47313 +47313 +47313 +47314 +47314 +47314 +47314 +47315 +47315 +47315 +47315 +47316 +47316 +47316 +47316 +47317 +47317 +47317 +47318 +47318 +47318 +47318 +47319 +47319 +47319 +47319 +47320 +47320 +47320 +47320 +47321 +47321 +47321 +47321 +47322 +47322 +47322 +47322 +47323 +47323 +47323 +47323 +47324 +47324 +47324 +47324 +47325 +47325 +47325 +47326 +47326 +47326 +47326 +47327 +47327 +47327 +47327 +47328 +47328 +47328 +47328 +47329 +47329 +47329 +47329 +47330 +47330 +47330 +47330 +47331 +47331 +47331 +47331 +47332 +47332 +47332 +47332 +47333 +47333 +47333 +47333 +47334 +47334 +47334 +47334 +47335 +47335 +47335 +47336 +47336 +47336 +47336 +47337 +47337 +47337 +47337 +47338 +47338 +47338 +47338 +47339 +47339 +47339 +47339 +47340 +47340 +47340 +47340 +47341 +47341 +47341 +47341 +47342 +47342 +47342 +47342 +47343 +47343 +47343 +47343 +47344 +47344 +47344 +47344 +47345 +47345 +47345 +47345 +47346 +47346 +47346 +47346 +47347 +47347 +47347 +47347 +47348 +47348 +47348 +47348 +47349 +47349 +47349 +47349 +47350 +47350 +47350 +47350 +47351 +47351 +47351 +47351 +47352 +47352 +47352 +47352 +47353 +47353 +47353 +47353 +47354 +47354 +47354 +47354 +47355 +47355 +47355 +47355 +47356 +47356 +47356 +47356 +47357 +47357 +47357 +47357 +47358 +47358 +47358 +47358 +47359 +47359 +47359 +47359 +47360 +47360 +47360 +47360 +47361 +47361 +47361 +47361 +47362 +47362 +47362 +47362 +47363 +47363 +47363 +47363 +47364 +47364 +47364 +47364 +47365 +47365 +47365 +47365 +47365 +47366 +47366 +47366 +47366 +47367 +47367 +47367 +47367 +47368 +47368 +47368 +47368 +47369 +47369 +47369 +47369 +47370 +47370 +47370 +47370 +47371 +47371 +47371 +47371 +47372 +47372 +47372 +47372 +47373 +47373 +47373 +47373 +47374 +47374 +47374 +47374 +47375 +47375 +47375 +47375 +47376 +47376 +47376 +47376 +47376 +47377 +47377 +47377 +47377 +47378 +47378 +47378 +47378 +47379 +47379 +47379 +47379 +47380 +47380 +47380 +47380 +47381 +47381 +47381 +47381 +47382 +47382 +47382 +47382 +47383 +47383 +47384 +47384 +47385 +47385 +47386 +47386 +47387 +47387 +47388 +47388 +47389 +47389 +47390 +47390 +47390 +47391 +47391 +47392 +47392 +47393 +47393 +47394 +47394 +47395 +47395 +47396 +47396 +47397 +47397 +47398 +47398 +47399 +47399 +47399 +47400 +47400 +47401 +47401 +47402 +47402 +47403 +47403 +47404 +47404 +47405 +47405 +47406 +47406 +47407 +47407 +47408 +47408 +47408 +47409 +47409 +47410 +47410 +47411 +47411 +47412 +47412 +47413 +47413 +47414 +47414 +47415 +47415 +47415 +47416 +47416 +47417 +47417 +47418 +47418 +47419 +47419 +47420 +47420 +47421 +47421 +47421 +47422 +47422 +47423 +47423 +47424 +47424 +47425 +47425 +47426 +47426 +47427 +47427 +47427 +47428 +47428 +47429 +47429 +47430 +47430 +47431 +47431 +47432 +47432 +47432 +47433 +47433 +47434 +47434 +47435 +47435 +47436 +47436 +47437 +47437 +47438 +47438 +47438 +47439 +47439 +47440 +47440 +47441 +47441 +47442 +47442 +47442 +47443 +47443 +47444 +47444 +47445 +47445 +47446 +47446 +47447 +47447 +47447 +47448 +47448 +47449 +47449 +47450 +47450 +47451 +47451 +47451 +47452 +47452 +47453 +47453 +47454 +47454 +47455 +47455 +47456 +47456 +47456 +47457 +47457 +47458 +47458 +47459 +47459 +47460 +47460 +47460 +47461 +47461 +47462 +47462 +47463 +47463 +47463 +47464 +47464 +47465 +47465 +47466 +47466 +47467 +47467 +47467 +47468 +47468 +47469 +47469 +47470 +47470 +47471 +47471 +47471 +47472 +47472 +47473 +47473 +47474 +47474 +47474 +47475 +47475 +47476 +47476 +47477 +47477 +47478 +47478 +47478 +47479 +47479 +47480 +47480 +47481 +47481 +47481 +47482 +47482 +47483 +47483 +47484 +47484 +47484 +47485 +47485 +47486 +47486 +47487 +47487 +47488 +47488 +47488 +47489 +47489 +47490 +47490 +47491 +47491 +47491 +47492 +47492 +47493 +47493 +47494 +47494 +47494 +47495 +47495 +47496 +47496 +47497 +47497 +47497 +47498 +47498 +47499 +47499 +47500 +47500 +47500 +47501 +47501 +47502 +47502 +47502 +47503 +47503 +47504 +47504 +47505 +47505 +47505 +47506 +47506 +47507 +47507 +47508 +47508 +47508 +47509 +47509 +47510 +47510 +47511 +47511 +47511 +47512 +47512 +47513 +47513 +47513 +47514 +47514 +47515 +47515 +47516 +47516 +47516 +47517 +47517 +47518 +47518 +47518 +47519 +47519 +47520 +47520 +47521 +47521 +47521 +47522 +47522 +47523 +47523 +47523 +47524 +47524 +47525 +47525 +47526 +47526 +47526 +47527 +47527 +47528 +47528 +47528 +47529 +47529 +47530 +47530 +47531 +47531 +47531 +47532 +47532 +47533 +47533 +47533 +47534 +47534 +47535 +47535 +47535 +47536 +47536 +47537 +47537 +47538 +47538 +47538 +47539 +47539 +47540 +47540 +47540 +47541 +47541 +47542 +47542 +47542 +47543 +47543 +47544 +47544 +47544 +47545 +47545 +47546 +47546 +47547 +47547 +47547 +47548 +47548 +47549 +47549 +47549 +47550 +47550 +47551 +47551 +47551 +47552 +47552 +47553 +47553 +47553 +47554 +47554 +47555 +47555 +47555 +47556 +47556 +47557 +47557 +47557 +47558 +47558 +47559 +47559 +47559 +47560 +47560 +47561 +47561 +47561 +47562 +47562 +47563 +47563 +47563 +47564 +47564 +47565 +47565 +47565 +47566 +47566 +47567 +47567 +47567 +47568 +47568 +47569 +47569 +47569 +47570 +47570 +47571 +47571 +47571 +47572 +47572 +47573 +47573 +47573 +47574 +47574 +47575 +47575 +47575 +47576 +47576 +47577 +47577 +47577 +47578 +47578 +47579 +47579 +47579 +47580 +47580 +47581 +47581 +47581 +47582 +47582 +47583 +47583 +47583 +47584 +47584 +47584 +47585 +47585 +47586 +47586 +47586 +47587 +47587 +47588 +47588 +47588 +47589 +47589 +47590 +47590 +47590 +47591 +47591 +47592 +47592 +47592 +47593 +47593 +47593 +47594 +47594 +47595 +47595 +47595 +47596 +47596 +47597 +47597 +47597 +47598 +47598 +47598 +47599 +47599 +47600 +47600 +47600 +47601 +47601 +47602 +47602 +47602 +47603 +47603 +47604 +47604 +47604 +47605 +47605 +47605 +47606 +47606 +47607 +47607 +47607 +47608 +47608 +47609 +47609 +47609 +47610 +47610 +47610 +47611 +47611 +47612 +47612 +47612 +47613 +47613 +47613 +47614 +47614 +47615 +47615 +47615 +47616 +47616 +47617 +47617 +47617 +47618 +47618 +47618 +47619 +47619 +47620 +47620 +47620 +47621 +47621 +47621 +47622 +47622 +47623 +47623 +47623 +47624 +47624 +47625 +47625 +47625 +47626 +47626 +47626 +47627 +47627 +47628 +47628 +47628 +47629 +47629 +47629 +47630 +47630 +47631 +47631 +47631 +47632 +47632 +47632 +47633 +47633 +47634 +47634 +47634 +47635 +47635 +47635 +47636 +47636 +47637 +47637 +47637 +47638 +47638 +47638 +47639 +47639 +47640 +47640 +47640 +47641 +47641 +47641 +47642 +47642 +47643 +47643 +47643 +47644 +47644 +47644 +47645 +47645 +47645 +47646 +47646 +47647 +47647 +47647 +47648 +47648 +47648 +47649 +47649 +47650 +47650 +47650 +47651 +47651 +47651 +47652 +47652 +47652 +47653 +47653 +47654 +47654 +47654 +47655 +47655 +47655 +47656 +47656 +47657 +47657 +47657 +47658 +47658 +47658 +47659 +47659 +47659 +47660 +47660 +47661 +47661 +47661 +47662 +47662 +47662 +47663 +47663 +47664 +47664 +47664 +47665 +47665 +47665 +47666 +47666 +47666 +47667 +47667 +47668 +47668 +47668 +47669 +47669 +47669 +47670 +47670 +47670 +47671 +47671 +47672 +47672 +47672 +47673 +47673 +47673 +47674 +47674 +47674 +47675 +47675 +47675 +47676 +47676 +47677 +47677 +47677 +47678 +47678 +47678 +47679 +47679 +47679 +47680 +47680 +47681 +47681 +47681 +47682 +47682 +47682 +47683 +47683 +47683 +47684 +47684 +47684 +47685 +47685 +47686 +47686 +47686 +47687 +47687 +47687 +47688 +47688 +47688 +47689 +47689 +47689 +47690 +47690 +47691 +47691 +47691 +47692 +47692 +47692 +47693 +47693 +47693 +47694 +47694 +47694 +47695 +47695 +47696 +47696 +47696 +47697 +47697 +47697 +47698 +47698 +47698 +47699 +47699 +47699 +47700 +47700 +47700 +47701 +47701 +47702 +47702 +47702 +47703 +47703 +47703 +47704 +47704 +47704 +47705 +47705 +47705 +47706 +47706 +47706 +47707 +47707 +47708 +47708 +47708 +47709 +47709 +47709 +47710 +47710 +47710 +47711 +47711 +47711 +47712 +47712 +47712 +47713 +47713 +47713 +47714 +47714 +47715 +47715 +47715 +47716 +47716 +47716 +47717 +47717 +47717 +47718 +47718 +47718 +47719 +47719 +47719 +47720 +47720 +47720 +47721 +47721 +47721 +47722 +47722 +47723 +47723 +47723 +47724 +47724 +47724 +47725 +47725 +47725 +47726 +47726 +47726 +47727 +47727 +47727 +47728 +47728 +47728 +47729 +47729 +47729 +47730 +47730 +47730 +47731 +47731 +47732 +47732 +47732 +47733 +47733 +47733 +47734 +47734 +47734 +47735 +47735 +47735 +47736 +47736 +47736 +47737 +47737 +47737 +47738 +47738 +47738 +47739 +47739 +47739 +47740 +47740 +47740 +47741 +47741 +47741 +47742 +47742 +47742 +47743 +47743 +47743 +47744 +47744 +47745 +47745 +47745 +47746 +47746 +47746 +47747 +47747 +47747 +47748 +47748 +47748 +47749 +47749 +47749 +47750 +47750 +47750 +47751 +47751 +47751 +47752 +47752 +47752 +47753 +47753 +47753 +47754 +47754 +47754 +47755 +47755 +47755 +47756 +47756 +47756 +47757 +47757 +47757 +47758 +47758 +47758 +47759 +47759 +47759 +47760 +47760 +47760 +47761 +47761 +47761 +47762 +47762 +47762 +47763 +47763 +47763 +47764 +47764 +47764 +47765 +47765 +47765 +47766 +47766 +47766 +47767 +47767 +47767 +47768 +47768 +47768 +47769 +47769 +47769 +47770 +47770 +47770 +47771 +47771 +47771 +47772 +47772 +47772 +47773 +47773 +47773 +47774 +47774 +47774 +47775 +47775 +47775 +47776 +47776 +47776 +47777 +47777 +47777 +47778 +47778 +47778 +47779 +47779 +47779 +47780 +47780 +47780 +47781 +47781 +47781 +47782 +47782 +47782 +47783 +47783 +47783 +47784 +47784 +47785 +47785 +47786 +47787 +47787 +47788 +47789 +47789 +47790 +47791 +47791 +47792 +47793 +47793 +47794 +47795 +47795 +47796 +47796 +47797 +47798 +47798 +47799 +47800 +47800 +47801 +47802 +47802 +47803 +47804 +47804 +47805 +47806 +47806 +47807 +47808 +47808 +47809 +47809 +47810 +47811 +47811 +47812 +47813 +47813 +47814 +47815 +47815 +47816 +47817 +47817 +47818 +47818 +47819 +47820 +47820 +47821 +47822 +47822 +47823 +47824 +47824 +47825 +47825 +47826 +47827 +47827 +47828 +47829 +47829 +47830 +47831 +47831 +47832 +47832 +47833 +47834 +47834 +47835 +47836 +47836 +47837 +47838 +47838 +47839 +47839 +47840 +47841 +47841 +47842 +47843 +47843 +47844 +47844 +47845 +47846 +47846 +47847 +47848 +47848 +47849 +47849 +47850 +47851 +47851 +47852 +47853 +47853 +47854 +47854 +47855 +47856 +47856 +47857 +47858 +47858 +47859 +47859 +47860 +47861 +47861 +47862 +47863 +47863 +47864 +47864 +47865 +47866 +47866 +47867 +47867 +47868 +47869 +47869 +47870 +47871 +47871 +47872 +47872 +47873 +47874 +47874 +47875 +47875 +47876 +47877 +47877 +47878 +47879 +47879 +47880 +47880 +47881 +47882 +47882 +47883 +47883 +47884 +47885 +47885 +47886 +47886 +47887 +47888 +47888 +47889 +47889 +47890 +47891 +47891 +47892 +47893 +47893 +47894 +47894 +47895 +47896 +47896 +47897 +47897 +47898 +47899 +47899 +47900 +47900 +47901 +47902 +47902 +47903 +47903 +47904 +47905 +47905 +47906 +47906 +47907 +47908 +47908 +47909 +47909 +47910 +47911 +47911 +47912 +47912 +47913 +47914 +47914 +47915 +47915 +47916 +47916 +47917 +47918 +47918 +47919 +47919 +47920 +47921 +47921 +47922 +47922 +47923 +47924 +47924 +47925 +47925 +47926 +47927 +47927 +47928 +47928 +47929 +47930 +47930 +47931 +47931 +47932 +47932 +47933 +47934 +47934 +47935 +47935 +47936 +47937 +47937 +47938 +47938 +47939 +47939 +47940 +47941 +47941 +47942 +47942 +47943 +47944 +47944 +47945 +47945 +47946 +47946 +47947 +47948 +47948 +47949 +47949 +47950 +47951 +47951 +47952 +47952 +47953 +47953 +47954 +47955 +47955 +47956 +47956 +47957 +47957 +47958 +47959 +47959 +47960 +47960 +47961 +47961 +47962 +47963 +47963 +47964 +47964 +47965 +47965 +47966 +47967 +47967 +47968 +47968 +47969 +47970 +47970 +47971 +47971 +47972 +47972 +47973 +47973 +47974 +47975 +47975 +47976 +47976 +47977 +47977 +47978 +47979 +47979 +47980 +47980 +47981 +47981 +47982 +47983 +47983 +47984 +47984 +47985 +47985 +47986 +47987 +47987 +47988 +47988 +47989 +47989 +47990 +47990 +47991 +47992 +47992 +47993 +47993 +47994 +47994 +47995 +47996 +47996 +47997 +47997 +47998 +47998 +47999 +47999 +48000 +48001 +48001 +48002 +48002 +48003 +48003 +48004 +48004 +48005 +48006 +48006 +48007 +48007 +48008 +48008 +48009 +48009 +48010 +48011 +48011 +48012 +48012 +48013 +48013 +48014 +48014 +48015 +48016 +48016 +48017 +48017 +48018 +48018 +48019 +48019 +48020 +48021 +48021 +48022 +48022 +48023 +48023 +48024 +48024 +48025 +48025 +48026 +48027 +48027 +48028 +48028 +48029 +48029 +48030 +48030 +48031 +48032 +48032 +48033 +48033 +48034 +48034 +48035 +48035 +48036 +48036 +48037 +48038 +48038 +48039 +48039 +48040 +48040 +48041 +48041 +48042 +48042 +48043 +48043 +48044 +48045 +48045 +48046 +48046 +48047 +48047 +48048 +48048 +48049 +48049 +48050 +48051 +48051 +48052 +48052 +48053 +48053 +48054 +48054 +48055 +48055 +48056 +48056 +48057 +48058 +48058 +48059 +48059 +48060 +48060 +48061 +48061 +48062 +48062 +48063 +48063 +48064 +48064 +48065 +48066 +48066 +48067 +48067 +48068 +48068 +48069 +48069 +48070 +48070 +48071 +48071 +48072 +48072 +48073 +48074 +48074 +48075 +48075 +48076 +48076 +48077 +48077 +48078 +48078 +48079 +48079 +48080 +48080 +48081 +48081 +48082 +48083 +48083 +48084 +48084 +48085 +48085 +48086 +48086 +48087 +48087 +48088 +48088 +48089 +48089 +48090 +48090 +48091 +48091 +48092 +48093 +48093 +48094 +48094 +48095 +48095 +48096 +48096 +48097 +48097 +48098 +48098 +48099 +48099 +48100 +48100 +48101 +48101 +48102 +48102 +48103 +48103 +48104 +48105 +48105 +48106 +48106 +48107 +48107 +48108 +48108 +48109 +48109 +48110 +48110 +48111 +48111 +48112 +48112 +48113 +48113 +48114 +48114 +48115 +48115 +48116 +48116 +48117 +48117 +48118 +48119 +48119 +48120 +48120 +48121 +48121 +48122 +48122 +48123 +48123 +48124 +48124 +48125 +48125 +48126 +48126 +48127 +48127 +48128 +48128 +48128 +48129 +48129 +48129 +48129 +48130 +48130 +48130 +48130 +48131 +48131 +48131 +48131 +48132 +48132 +48132 +48132 +48133 +48133 +48133 +48133 +48134 +48134 +48134 +48135 +48135 +48135 +48135 +48136 +48136 +48136 +48136 +48137 +48137 +48137 +48137 +48138 +48138 +48138 +48138 +48139 +48139 +48139 +48139 +48140 +48140 +48140 +48140 +48141 +48141 +48141 +48141 +48142 +48142 +48142 +48142 +48143 +48143 +48143 +48143 +48144 +48144 +48144 +48144 +48145 +48145 +48145 +48145 +48146 +48146 +48146 +48146 +48147 +48147 +48147 +48147 +48148 +48148 +48148 +48148 +48149 +48149 +48149 +48149 +48150 +48150 +48150 +48150 +48151 +48151 +48151 +48151 +48152 +48152 +48152 +48152 +48153 +48153 +48153 +48153 +48154 +48154 +48154 +48154 +48155 +48155 +48155 +48155 +48156 +48156 +48156 +48156 +48157 +48157 +48157 +48157 +48157 +48158 +48158 +48158 +48158 +48159 +48159 +48159 +48159 +48160 +48160 +48160 +48160 +48161 +48161 +48161 +48161 +48162 +48162 +48162 +48162 +48163 +48163 +48163 +48163 +48164 +48164 +48164 +48164 +48165 +48165 +48165 +48165 +48166 +48166 +48166 +48166 +48167 +48167 +48167 +48167 +48168 +48168 +48168 +48168 +48168 +48169 +48169 +48169 +48169 +48170 +48170 +48170 +48170 +48171 +48171 +48171 +48171 +48172 +48172 +48172 +48172 +48173 +48173 +48173 +48173 +48174 +48174 +48174 +48174 +48175 +48175 +48175 +48175 +48176 +48176 +48176 +48176 +48176 +48177 +48177 +48177 +48177 +48178 +48178 +48178 +48178 +48179 +48179 +48179 +48179 +48180 +48180 +48180 +48180 +48181 +48181 +48181 +48181 +48182 +48182 +48182 +48182 +48182 +48183 +48183 +48183 +48183 +48184 +48184 +48184 +48184 +48185 +48185 +48185 +48185 +48186 +48186 +48186 +48186 +48187 +48187 +48187 +48187 +48187 +48188 +48188 +48188 +48188 +48189 +48189 +48189 +48189 +48190 +48190 +48190 +48190 +48191 +48191 +48191 +48191 +48191 +48192 +48192 +48192 +48192 +48193 +48193 +48193 +48193 +48194 +48194 +48194 +48194 +48195 +48195 +48195 +48195 +48195 +48196 +48196 +48196 +48196 +48197 +48197 +48197 +48197 +48198 +48198 +48198 +48198 +48199 +48199 +48199 +48199 +48199 +48200 +48200 +48200 +48200 +48201 +48201 +48201 +48201 +48202 +48202 +48202 +48202 +48202 +48203 +48203 +48203 +48203 +48204 +48204 +48204 +48204 +48205 +48205 +48205 +48205 +48206 +48206 +48206 +48206 +48206 +48207 +48207 +48207 +48207 +48208 +48208 +48208 +48208 +48209 +48209 +48209 +48209 +48209 +48210 +48210 +48210 +48210 +48211 +48211 +48211 +48211 +48212 +48212 +48212 +48212 +48212 +48213 +48213 +48213 +48213 +48214 +48214 +48214 +48214 +48214 +48215 +48215 +48215 +48215 +48216 +48216 +48216 +48216 +48217 +48217 +48217 +48217 +48217 +48218 +48218 +48218 +48218 +48219 +48219 +48219 +48219 +48220 +48220 +48220 +48220 +48220 +48221 +48221 +48221 +48221 +48222 +48222 +48222 +48222 +48222 +48223 +48223 +48223 +48223 +48224 +48224 +48224 +48224 +48225 +48225 +48225 +48225 +48225 +48226 +48226 +48226 +48226 +48227 +48227 +48227 +48227 +48227 +48228 +48228 +48228 +48228 +48229 +48229 +48229 +48229 +48229 +48230 +48230 +48230 +48230 +48231 +48231 +48232 +48232 +48233 +48233 +48234 +48234 +48234 +48235 +48235 +48236 +48236 +48237 +48237 +48238 +48238 +48238 +48239 +48239 +48240 +48240 +48241 +48241 +48242 +48242 +48242 +48243 +48243 +48244 +48244 +48245 +48245 +48246 +48246 +48246 +48247 +48247 +48248 +48248 +48249 +48249 +48250 +48250 +48250 +48251 +48251 +48252 +48252 +48253 +48253 +48253 +48254 +48254 +48255 +48255 +48256 +48256 +48257 +48257 +48257 +48258 +48258 +48259 +48259 +48260 +48260 +48260 +48261 +48261 +48262 +48262 +48263 +48263 +48263 +48264 +48264 +48265 +48265 +48266 +48266 +48267 +48267 +48267 +48268 +48268 +48269 +48269 +48270 +48270 +48270 +48271 +48271 +48272 +48272 +48273 +48273 +48273 +48274 +48274 +48275 +48275 +48276 +48276 +48276 +48277 +48277 +48278 +48278 +48279 +48279 +48279 +48280 +48280 +48281 +48281 +48281 +48282 +48282 +48283 +48283 +48284 +48284 +48284 +48285 +48285 +48286 +48286 +48287 +48287 +48287 +48288 +48288 +48289 +48289 +48290 +48290 +48290 +48291 +48291 +48292 +48292 +48292 +48293 +48293 +48294 +48294 +48295 +48295 +48295 +48296 +48296 +48297 +48297 +48297 +48298 +48298 +48299 +48299 +48300 +48300 +48300 +48301 +48301 +48302 +48302 +48302 +48303 +48303 +48304 +48304 +48305 +48305 +48305 +48306 +48306 +48307 +48307 +48307 +48308 +48308 +48309 +48309 +48309 +48310 +48310 +48311 +48311 +48312 +48312 +48312 +48313 +48313 +48314 +48314 +48314 +48315 +48315 +48316 +48316 +48316 +48317 +48317 +48318 +48318 +48318 +48319 +48319 +48320 +48320 +48320 +48321 +48321 +48322 +48322 +48323 +48323 +48323 +48324 +48324 +48325 +48325 +48325 +48326 +48326 +48327 +48327 +48327 +48328 +48328 +48329 +48329 +48329 +48330 +48330 +48331 +48331 +48331 +48332 +48332 +48333 +48333 +48333 +48334 +48334 +48335 +48335 +48335 +48336 +48336 +48337 +48337 +48337 +48338 +48338 +48339 +48339 +48339 +48340 +48340 +48341 +48341 +48341 +48342 +48342 +48343 +48343 +48343 +48344 +48344 +48345 +48345 +48345 +48346 +48346 +48346 +48347 +48347 +48348 +48348 +48348 +48349 +48349 +48350 +48350 +48350 +48351 +48351 +48352 +48352 +48352 +48353 +48353 +48354 +48354 +48354 +48355 +48355 +48356 +48356 +48356 +48357 +48357 +48357 +48358 +48358 +48359 +48359 +48359 +48360 +48360 +48361 +48361 +48361 +48362 +48362 +48363 +48363 +48363 +48364 +48364 +48364 +48365 +48365 +48366 +48366 +48366 +48367 +48367 +48368 +48368 +48368 +48369 +48369 +48369 +48370 +48370 +48371 +48371 +48371 +48372 +48372 +48373 +48373 +48373 +48374 +48374 +48374 +48375 +48375 +48376 +48376 +48376 +48377 +48377 +48378 +48378 +48378 +48379 +48379 +48379 +48380 +48380 +48381 +48381 +48381 +48382 +48382 +48382 +48383 +48383 +48384 +48384 +48384 +48385 +48385 +48386 +48386 +48386 +48387 +48387 +48387 +48388 +48388 +48389 +48389 +48389 +48390 +48390 +48390 +48391 +48391 +48392 +48392 +48392 +48393 +48393 +48393 +48394 +48394 +48395 +48395 +48395 +48396 +48396 +48396 +48397 +48397 +48398 +48398 +48398 +48399 +48399 +48399 +48400 +48400 +48401 +48401 +48401 +48402 +48402 +48402 +48403 +48403 +48404 +48404 +48404 +48405 +48405 +48405 +48406 +48406 +48407 +48407 +48407 +48408 +48408 +48408 +48409 +48409 +48409 +48410 +48410 +48411 +48411 +48411 +48412 +48412 +48412 +48413 +48413 +48414 +48414 +48414 +48415 +48415 +48415 +48416 +48416 +48416 +48417 +48417 +48418 +48418 +48418 +48419 +48419 +48419 +48420 +48420 +48420 +48421 +48421 +48422 +48422 +48422 +48423 +48423 +48423 +48424 +48424 +48425 +48425 +48425 +48426 +48426 +48426 +48427 +48427 +48427 +48428 +48428 +48429 +48429 +48429 +48430 +48430 +48430 +48431 +48431 +48431 +48432 +48432 +48432 +48433 +48433 +48434 +48434 +48434 +48435 +48435 +48435 +48436 +48436 +48436 +48437 +48437 +48438 +48438 +48438 +48439 +48439 +48439 +48440 +48440 +48440 +48441 +48441 +48441 +48442 +48442 +48443 +48443 +48443 +48444 +48444 +48444 +48445 +48445 +48445 +48446 +48446 +48446 +48447 +48447 +48448 +48448 +48448 +48449 +48449 +48449 +48450 +48450 +48450 +48451 +48451 +48451 +48452 +48452 +48453 +48453 +48453 +48454 +48454 +48454 +48455 +48455 +48455 +48456 +48456 +48456 +48457 +48457 +48457 +48458 +48458 +48459 +48459 +48459 +48460 +48460 +48460 +48461 +48461 +48461 +48462 +48462 +48462 +48463 +48463 +48463 +48464 +48464 +48464 +48465 +48465 +48466 +48466 +48466 +48467 +48467 +48467 +48468 +48468 +48468 +48469 +48469 +48469 +48470 +48470 +48470 +48471 +48471 +48471 +48472 +48472 +48472 +48473 +48473 +48474 +48474 +48474 +48475 +48475 +48475 +48476 +48476 +48476 +48477 +48477 +48477 +48478 +48478 +48478 +48479 +48479 +48479 +48480 +48480 +48480 +48481 +48481 +48481 +48482 +48482 +48483 +48483 +48483 +48484 +48484 +48484 +48485 +48485 +48485 +48486 +48486 +48486 +48487 +48487 +48487 +48488 +48488 +48488 +48489 +48489 +48489 +48490 +48490 +48490 +48491 +48491 +48491 +48492 +48492 +48492 +48493 +48493 +48493 +48494 +48494 +48494 +48495 +48495 +48495 +48496 +48496 +48497 +48497 +48497 +48498 +48498 +48498 +48499 +48499 +48499 +48500 +48500 +48500 +48501 +48501 +48501 +48502 +48502 +48502 +48503 +48503 +48503 +48504 +48504 +48504 +48505 +48505 +48505 +48506 +48506 +48506 +48507 +48507 +48507 +48508 +48508 +48508 +48509 +48509 +48509 +48510 +48510 +48510 +48511 +48511 +48511 +48512 +48512 +48512 +48513 +48513 +48513 +48514 +48514 +48514 +48515 +48515 +48515 +48516 +48516 +48516 +48517 +48517 +48517 +48518 +48518 +48518 +48519 +48519 +48519 +48520 +48520 +48520 +48521 +48521 +48521 +48522 +48522 +48522 +48523 +48523 +48523 +48524 +48524 +48524 +48525 +48525 +48525 +48526 +48526 +48526 +48527 +48527 +48527 +48528 +48528 +48528 +48529 +48529 +48529 +48530 +48530 +48530 +48531 +48531 +48531 +48532 +48532 +48532 +48533 +48533 +48533 +48534 +48534 +48534 +48535 +48535 +48535 +48535 +48536 +48536 +48536 +48537 +48537 +48537 +48538 +48538 +48538 +48539 +48539 +48539 +48540 +48540 +48540 +48541 +48541 +48541 +48542 +48542 +48542 +48543 +48543 +48543 +48544 +48544 +48544 +48545 +48545 +48545 +48546 +48546 +48546 +48547 +48547 +48547 +48548 +48548 +48548 +48548 +48549 +48549 +48549 +48550 +48550 +48550 +48551 +48551 +48551 +48552 +48552 +48552 +48553 +48553 +48553 +48554 +48554 +48554 +48555 +48555 +48555 +48556 +48556 +48556 +48557 +48557 +48557 +48558 +48558 +48558 +48558 +48559 +48559 +48559 +48560 +48560 +48560 +48561 +48561 +48561 +48562 +48562 +48562 +48563 +48563 +48563 +48564 +48564 +48564 +48565 +48565 +48565 +48566 +48566 +48566 +48566 +48567 +48567 +48567 +48568 +48568 +48568 +48569 +48569 +48569 +48570 +48570 +48570 +48571 +48571 +48571 +48572 +48572 +48572 +48572 +48573 +48573 +48573 +48574 +48574 +48574 +48575 +48575 +48575 +48576 +48576 +48576 +48577 +48577 +48577 +48578 +48578 +48578 +48578 +48579 +48579 +48579 +48580 +48580 +48580 +48581 +48581 +48581 +48582 +48582 +48582 +48583 +48583 +48583 +48584 +48584 +48584 +48584 +48585 +48585 +48585 +48586 +48586 +48586 +48587 +48587 +48587 +48588 +48588 +48588 +48589 +48589 +48589 +48589 +48590 +48590 +48590 +48591 +48591 +48591 +48592 +48592 +48592 +48593 +48593 +48593 +48593 +48594 +48594 +48594 +48595 +48595 +48595 +48596 +48596 +48596 +48597 +48597 +48597 +48598 +48598 +48598 +48598 +48599 +48599 +48599 +48600 +48600 +48600 +48601 +48601 +48601 +48602 +48602 +48602 +48602 +48603 +48603 +48603 +48604 +48604 +48604 +48605 +48605 +48605 +48606 +48606 +48607 +48608 +48608 +48609 +48610 +48610 +48611 +48611 +48612 +48613 +48613 +48614 +48614 +48615 +48616 +48616 +48617 +48617 +48618 +48619 +48619 +48620 +48620 +48621 +48622 +48622 +48623 +48624 +48624 +48625 +48625 +48626 +48627 +48627 +48628 +48628 +48629 +48630 +48630 +48631 +48631 +48632 +48633 +48633 +48634 +48634 +48635 +48636 +48636 +48637 +48637 +48638 +48639 +48639 +48640 +48640 +48641 +48642 +48642 +48643 +48643 +48644 +48645 +48645 +48646 +48646 +48647 +48647 +48648 +48649 +48649 +48650 +48650 +48651 +48652 +48652 +48653 +48653 +48654 +48655 +48655 +48656 +48656 +48657 +48658 +48658 +48659 +48659 +48660 +48660 +48661 +48662 +48662 +48663 +48663 +48664 +48665 +48665 +48666 +48666 +48667 +48667 +48668 +48669 +48669 +48670 +48670 +48671 +48672 +48672 +48673 +48673 +48674 +48674 +48675 +48676 +48676 +48677 +48677 +48678 +48678 +48679 +48680 +48680 +48681 +48681 +48682 +48683 +48683 +48684 +48684 +48685 +48685 +48686 +48687 +48687 +48688 +48688 +48689 +48689 +48690 +48691 +48691 +48692 +48692 +48693 +48693 +48694 +48695 +48695 +48696 +48696 +48697 +48697 +48698 +48699 +48699 +48700 +48700 +48701 +48701 +48702 +48702 +48703 +48704 +48704 +48705 +48705 +48706 +48706 +48707 +48708 +48708 +48709 +48709 +48710 +48710 +48711 +48712 +48712 +48713 +48713 +48714 +48714 +48715 +48715 +48716 +48717 +48717 +48718 +48718 +48719 +48719 +48720 +48720 +48721 +48722 +48722 +48723 +48723 +48724 +48724 +48725 +48725 +48726 +48727 +48727 +48728 +48728 +48729 +48729 +48730 +48730 +48731 +48732 +48732 +48733 +48733 +48734 +48734 +48735 +48735 +48736 +48737 +48737 +48738 +48738 +48739 +48739 +48740 +48740 +48741 +48742 +48742 +48743 +48743 +48744 +48744 +48745 +48745 +48746 +48746 +48747 +48748 +48748 +48749 +48749 +48750 +48750 +48751 +48751 +48752 +48752 +48753 +48754 +48754 +48755 +48755 +48756 +48756 +48757 +48757 +48758 +48758 +48759 +48759 +48760 +48761 +48761 +48762 +48762 +48763 +48763 +48764 +48764 +48765 +48765 +48766 +48767 +48767 +48768 +48768 +48769 +48769 +48770 +48770 +48771 +48771 +48772 +48772 +48773 +48773 +48774 +48775 +48775 +48776 +48776 +48777 +48777 +48778 +48778 +48779 +48779 +48780 +48780 +48781 +48781 +48782 +48783 +48783 +48784 +48784 +48785 +48785 +48786 +48786 +48787 +48787 +48788 +48788 +48789 +48789 +48790 +48790 +48791 +48792 +48792 +48793 +48793 +48794 +48794 +48795 +48795 +48796 +48796 +48797 +48797 +48798 +48798 +48799 +48799 +48800 +48800 +48801 +48802 +48802 +48803 +48803 +48804 +48804 +48805 +48805 +48806 +48806 +48807 +48807 +48808 +48808 +48809 +48809 +48810 +48810 +48811 +48811 +48812 +48812 +48813 +48814 +48814 +48815 +48815 +48816 +48816 +48817 +48817 +48818 +48818 +48819 +48819 +48820 +48820 +48821 +48821 +48822 +48822 +48823 +48823 +48824 +48824 +48825 +48825 +48826 +48826 +48827 +48827 +48828 +48828 +48829 +48829 +48830 +48831 +48831 +48832 +48832 +48833 +48833 +48834 +48834 +48835 +48835 +48836 +48836 +48837 +48837 +48838 +48838 +48839 +48839 +48840 +48840 +48841 +48841 +48842 +48842 +48843 +48843 +48844 +48844 +48845 +48845 +48846 +48846 +48847 +48847 +48848 +48848 +48849 +48849 +48850 +48850 +48851 +48851 +48852 +48852 +48853 +48853 +48854 +48854 +48855 +48855 +48856 +48856 +48857 +48857 +48858 +48858 +48859 +48859 +48860 +48860 +48861 +48861 +48862 +48862 +48863 +48863 +48864 +48864 +48865 +48865 +48866 +48866 +48867 +48867 +48868 +48868 +48869 +48869 +48870 +48870 +48871 +48871 +48872 +48872 +48873 +48873 +48874 +48874 +48875 +48875 +48876 +48876 +48877 +48877 +48878 +48878 +48879 +48879 +48880 +48880 +48881 +48881 +48882 +48882 +48883 +48883 +48884 +48884 +48885 +48885 +48886 +48886 +48887 +48887 +48888 +48888 +48889 +48889 +48890 +48890 +48891 +48891 +48892 +48892 +48893 +48893 +48894 +48894 +48895 +48895 +48896 +48896 +48896 +48897 +48897 +48898 +48898 +48899 +48899 +48900 +48900 +48901 +48901 +48902 +48902 +48903 +48903 +48904 +48904 +48905 +48905 +48906 +48906 +48907 +48907 +48908 +48908 +48909 +48909 +48910 +48910 +48911 +48911 +48912 +48912 +48912 +48913 +48913 +48914 +48914 +48915 +48915 +48916 +48916 +48917 +48917 +48918 +48918 +48919 +48919 +48920 +48920 +48921 +48921 +48922 +48922 +48923 +48923 +48924 +48924 +48924 +48925 +48925 +48926 +48926 +48927 +48927 +48928 +48928 +48929 +48929 +48930 +48930 +48931 +48931 +48932 +48932 +48933 +48933 +48934 +48934 +48935 +48935 +48935 +48936 +48936 +48937 +48937 +48938 +48938 +48939 +48939 +48940 +48940 +48941 +48941 +48942 +48942 +48943 +48943 +48943 +48944 +48944 +48945 +48945 +48946 +48946 +48947 +48947 +48948 +48948 +48949 +48949 +48950 +48950 +48951 +48951 +48951 +48952 +48952 +48953 +48953 +48954 +48954 +48955 +48955 +48956 +48956 +48957 +48957 +48958 +48958 +48959 +48959 +48959 +48960 +48960 +48961 +48961 +48962 +48962 +48963 +48963 +48964 +48964 +48965 +48965 +48965 +48966 +48966 +48967 +48967 +48968 +48968 +48969 +48969 +48970 +48970 +48971 +48971 +48972 +48972 +48972 +48973 +48973 +48974 +48974 +48975 +48975 +48976 +48976 +48977 +48977 +48978 +48978 +48978 +48979 +48979 +48980 +48980 +48981 +48981 +48982 +48982 +48983 +48983 +48984 +48984 +48984 +48985 +48985 +48986 +48986 +48987 +48987 +48988 +48988 +48989 +48989 +48989 +48990 +48990 +48991 +48991 +48992 +48992 +48993 +48993 +48994 +48994 +48994 +48995 +48995 +48996 +48996 +48997 +48997 +48998 +48998 +48999 +48999 +48999 +49000 +49000 +49001 +49001 +49002 +49002 +49003 +49003 +49004 +49004 +49004 +49005 +49005 +49006 +49006 +49007 +49007 +49008 +49008 +49009 +49009 +49009 +49010 +49010 +49011 +49011 +49012 +49012 +49013 +49013 +49013 +49014 +49014 +49015 +49015 +49016 +49016 +49017 +49017 +49018 +49018 +49018 +49019 +49019 +49020 +49020 +49021 +49021 +49022 +49022 +49022 +49023 +49023 +49024 +49024 +49025 +49025 +49026 +49026 +49026 +49027 +49027 +49028 +49028 +49029 +49029 +49030 +49030 +49030 +49031 +49031 +49032 +49032 +49033 +49033 +49034 +49034 +49034 +49035 +49035 +49036 +49036 +49037 +49037 +49038 +49038 +49038 +49039 +49039 +49040 +49040 +49041 +49041 +49042 +49042 +49042 +49043 +49043 +49044 +49044 +49045 +49045 +49045 +49046 +49046 +49047 +49047 +49048 +49048 +49049 +49049 +49049 +49050 +49050 +49051 +49051 +49052 +49052 +49053 +49053 +49053 +49054 +49054 +49055 +49055 +49056 +49056 +49056 +49057 +49057 +49058 +49058 +49059 +49059 +49060 +49060 +49060 +49061 +49061 +49062 +49062 +49063 +49063 +49063 +49064 +49064 +49065 +49065 +49066 +49066 +49066 +49067 +49067 +49068 +49068 +49069 +49069 +49069 +49070 +49070 +49071 +49071 +49072 +49072 +49073 +49073 +49073 +49074 +49074 +49075 +49075 +49076 +49076 +49076 +49077 +49077 +49078 +49078 +49079 +49079 +49079 +49080 +49080 +49081 +49081 +49082 +49082 +49082 +49083 +49083 +49084 +49084 +49085 +49085 +49085 +49086 +49086 +49087 +49087 +49088 +49088 +49088 +49089 +49089 +49090 +49090 +49091 +49091 +49091 +49092 +49092 +49093 +49093 +49094 +49094 +49094 +49095 +49095 +49096 +49096 +49097 +49097 +49097 +49098 +49098 +49099 +49099 +49100 +49100 +49100 +49101 +49101 +49102 +49102 +49102 +49103 +49103 +49104 +49104 +49105 +49105 +49105 +49106 +49106 +49107 +49107 +49108 +49108 +49108 +49109 +49109 +49110 +49110 +49111 +49111 +49111 +49112 +49112 +49113 +49113 +49113 +49114 +49114 +49115 +49115 +49116 +49116 +49116 +49117 +49117 +49118 +49119 +49120 +49121 +49121 +49122 +49123 +49124 +49125 +49126 +49126 +49127 +49128 +49129 +49130 +49131 +49131 +49132 +49133 +49134 +49135 +49136 +49136 +49137 +49138 +49139 +49140 +49141 +49141 +49142 +49143 +49144 +49145 +49146 +49146 +49147 +49148 +49149 +49150 +49150 +49151 +49152 +49152 +49153 +49153 +49154 +49154 +49155 +49155 +49155 +49156 +49156 +49157 +49157 +49157 +49158 +49158 +49159 +49159 +49159 +49160 +49160 +49161 +49161 +49161 +49162 +49162 +49163 +49163 +49163 +49164 +49164 +49165 +49165 +49166 +49166 +49166 +49167 +49167 +49168 +49168 +49168 +49169 +49169 +49170 +49170 +49170 +49171 +49171 +49172 +49172 +49172 +49173 +49173 +49174 +49174 +49174 +49175 +49175 +49176 +49176 +49176 +49177 +49177 +49178 +49178 +49178 +49179 +49179 +49180 +49180 +49180 +49181 +49181 +49181 +49182 +49182 +49183 +49183 +49183 +49184 +49184 +49185 +49185 +49185 +49186 +49186 +49187 +49187 +49187 +49188 +49188 +49189 +49189 +49189 +49190 +49190 +49191 +49191 +49191 +49192 +49192 +49193 +49193 +49193 +49194 +49194 +49194 +49195 +49195 +49196 +49196 +49196 +49197 +49197 +49198 +49198 +49198 +49199 +49199 +49200 +49200 +49200 +49201 +49201 +49201 +49202 +49202 +49203 +49203 +49203 +49204 +49204 +49205 +49205 +49205 +49206 +49206 +49206 +49207 +49207 +49208 +49208 +49208 +49209 +49209 +49210 +49210 +49210 +49211 +49211 +49211 +49212 +49212 +49213 +49213 +49213 +49214 +49214 +49214 +49215 +49215 +49216 +49216 +49216 +49217 +49217 +49218 +49218 +49218 +49219 +49219 +49219 +49220 +49220 +49221 +49221 +49221 +49222 +49222 +49222 +49223 +49223 +49224 +49224 +49224 +49225 +49225 +49225 +49226 +49226 +49227 +49227 +49227 +49228 +49228 +49228 +49229 +49229 +49230 +49230 +49230 +49231 +49231 +49231 +49232 +49232 +49233 +49233 +49233 +49234 +49234 +49234 +49235 +49235 +49236 +49236 +49236 +49237 +49237 +49237 +49238 +49238 +49239 +49239 +49239 +49240 +49240 +49240 +49241 +49241 +49241 +49242 +49242 +49243 +49243 +49243 +49244 +49244 +49244 +49245 +49245 +49246 +49246 +49246 +49247 +49247 +49247 +49248 +49248 +49248 +49249 +49249 +49250 +49250 +49250 +49251 +49251 +49251 +49252 +49252 +49252 +49253 +49253 +49254 +49254 +49254 +49255 +49255 +49255 +49256 +49256 +49256 +49257 +49257 +49258 +49258 +49258 +49259 +49259 +49259 +49260 +49260 +49260 +49261 +49261 +49262 +49262 +49262 +49263 +49263 +49263 +49264 +49264 +49264 +49265 +49265 +49265 +49266 +49266 +49267 +49267 +49267 +49268 +49268 +49268 +49269 +49269 +49269 +49270 +49270 +49270 +49271 +49271 +49272 +49272 +49272 +49273 +49273 +49273 +49274 +49274 +49274 +49275 +49275 +49275 +49276 +49276 +49277 +49277 +49277 +49278 +49278 +49278 +49279 +49279 +49279 +49280 +49280 +49280 +49281 +49281 +49281 +49282 +49282 +49283 +49283 +49283 +49284 +49284 +49284 +49285 +49285 +49285 +49286 +49286 +49286 +49287 +49287 +49287 +49288 +49288 +49289 +49289 +49289 +49290 +49290 +49290 +49291 +49291 +49291 +49292 +49292 +49292 +49293 +49293 +49293 +49294 +49294 +49294 +49295 +49295 +49295 +49296 +49296 +49297 +49297 +49297 +49298 +49298 +49298 +49299 +49299 +49299 +49300 +49300 +49300 +49301 +49301 +49301 +49302 +49302 +49302 +49303 +49303 +49303 +49304 +49304 +49304 +49305 +49305 +49305 +49306 +49306 +49307 +49307 +49307 +49308 +49308 +49308 +49309 +49309 +49309 +49310 +49310 +49310 +49311 +49311 +49311 +49312 +49312 +49312 +49313 +49313 +49313 +49314 +49314 +49314 +49315 +49315 +49315 +49316 +49316 +49316 +49317 +49317 +49317 +49318 +49318 +49318 +49319 +49319 +49319 +49320 +49320 +49320 +49321 +49321 +49321 +49322 +49322 +49323 +49323 +49323 +49324 +49324 +49324 +49325 +49325 +49325 +49326 +49326 +49326 +49327 +49327 +49327 +49328 +49328 +49328 +49329 +49329 +49329 +49330 +49330 +49330 +49331 +49331 +49331 +49332 +49332 +49332 +49333 +49333 +49333 +49334 +49334 +49334 +49335 +49335 +49335 +49336 +49336 +49336 +49337 +49337 +49337 +49338 +49338 +49338 +49339 +49339 +49339 +49340 +49340 +49340 +49341 +49341 +49341 +49342 +49342 +49342 +49343 +49343 +49343 +49344 +49344 +49344 +49344 +49345 +49345 +49345 +49346 +49346 +49346 +49347 +49347 +49347 +49348 +49348 +49348 +49349 +49349 +49349 +49350 +49350 +49350 +49351 +49351 +49351 +49352 +49352 +49352 +49353 +49353 +49353 +49354 +49354 +49354 +49355 +49355 +49355 +49356 +49356 +49356 +49357 +49357 +49357 +49358 +49358 +49358 +49359 +49359 +49359 +49360 +49360 +49360 +49361 +49361 +49361 +49361 +49362 +49362 +49362 +49363 +49363 +49363 +49364 +49364 +49364 +49365 +49365 +49365 +49366 +49366 +49366 +49367 +49367 +49367 +49368 +49368 +49368 +49369 +49369 +49369 +49370 +49370 +49370 +49370 +49371 +49371 +49371 +49372 +49372 +49372 +49373 +49373 +49373 +49374 +49374 +49374 +49375 +49375 +49375 +49376 +49376 +49376 +49377 +49377 +49377 +49378 +49378 +49378 +49378 +49379 +49379 +49379 +49380 +49380 +49380 +49381 +49381 +49381 +49382 +49382 +49382 +49383 +49383 +49383 +49384 +49384 +49384 +49384 +49385 +49385 +49385 +49386 +49386 +49386 +49387 +49387 +49387 +49388 +49388 +49388 +49389 +49389 +49389 +49390 +49390 +49390 +49390 +49391 +49391 +49391 +49392 +49392 +49392 +49393 +49393 +49393 +49394 +49394 +49394 +49395 +49395 +49395 +49396 +49396 +49396 +49396 +49397 +49397 +49397 +49398 +49398 +49398 +49399 +49399 +49399 +49400 +49400 +49400 +49400 +49401 +49401 +49401 +49402 +49402 +49402 +49403 +49403 +49403 +49404 +49404 +49404 +49405 +49405 +49405 +49405 +49406 +49406 +49406 +49407 +49407 +49407 +49408 +49408 +49408 +49409 +49409 +49409 +49409 +49410 +49410 +49410 +49411 +49411 +49411 +49412 +49412 +49412 +49413 +49413 +49413 +49413 +49414 +49414 +49414 +49415 +49415 +49415 +49416 +49416 +49416 +49417 +49417 +49417 +49417 +49418 +49418 +49418 +49419 +49419 +49419 +49420 +49420 +49420 +49421 +49421 +49421 +49421 +49422 +49422 +49422 +49423 +49423 +49423 +49424 +49424 +49424 +49424 +49425 +49425 +49425 +49426 +49426 +49426 +49427 +49427 +49427 +49427 +49428 +49428 +49428 +49429 +49429 +49429 +49430 +49430 +49430 +49431 +49431 +49431 +49431 +49432 +49432 +49432 +49433 +49433 +49433 +49434 +49434 +49434 +49434 +49435 +49435 +49435 +49436 +49436 +49436 +49437 +49437 +49437 +49437 +49438 +49438 +49438 +49439 +49439 +49439 +49440 +49440 +49440 +49440 +49441 +49441 +49441 +49442 +49442 +49442 +49443 +49443 +49443 +49443 +49444 +49444 +49444 +49445 +49445 +49445 +49446 +49446 +49446 +49446 +49447 +49447 +49447 +49448 +49448 +49448 +49448 +49449 +49449 +49449 +49450 +49450 +49450 +49451 +49451 +49451 +49451 +49452 +49452 +49452 +49453 +49453 +49453 +49454 +49454 +49454 +49454 +49455 +49455 +49455 +49456 +49456 +49456 +49456 +49457 +49457 +49457 +49458 +49458 +49458 +49459 +49459 +49459 +49459 +49460 +49460 +49460 +49461 +49461 +49461 +49461 +49462 +49462 +49462 +49463 +49463 +49463 +49463 +49464 +49464 +49464 +49465 +49465 +49465 +49466 +49466 +49466 +49466 +49467 +49467 +49467 +49468 +49468 +49468 +49468 +49469 +49469 +49469 +49470 +49470 +49470 +49470 +49471 +49471 +49471 +49472 +49472 +49472 +49473 +49473 +49473 +49473 +49474 +49474 +49474 +49475 +49475 +49475 +49475 +49476 +49476 +49476 +49477 +49477 +49477 +49477 +49478 +49478 +49478 +49479 +49479 +49479 +49479 +49480 +49480 +49480 +49481 +49481 +49481 +49481 +49482 +49482 +49482 +49483 +49483 +49483 +49483 +49484 +49484 +49484 +49485 +49485 +49486 +49487 +49487 +49488 +49488 +49489 +49489 +49490 +49491 +49491 +49492 +49492 +49493 +49493 +49494 +49495 +49495 +49496 +49496 +49497 +49497 +49498 +49499 +49499 +49500 +49500 +49501 +49501 +49502 +49503 +49503 +49504 +49504 +49505 +49505 +49506 +49506 +49507 +49508 +49508 +49509 +49509 +49510 +49510 +49511 +49512 +49512 +49513 +49513 +49514 +49514 +49515 +49515 +49516 +49517 +49517 +49518 +49518 +49519 +49519 +49520 +49520 +49521 +49522 +49522 +49523 +49523 +49524 +49524 +49525 +49525 +49526 +49527 +49527 +49528 +49528 +49529 +49529 +49530 +49530 +49531 +49531 +49532 +49533 +49533 +49534 +49534 +49535 +49535 +49536 +49536 +49537 +49538 +49538 +49539 +49539 +49540 +49540 +49541 +49541 +49542 +49542 +49543 +49544 +49544 +49545 +49545 +49546 +49546 +49547 +49547 +49548 +49548 +49549 +49549 +49550 +49551 +49551 +49552 +49552 +49553 +49553 +49554 +49554 +49555 +49555 +49556 +49556 +49557 +49558 +49558 +49559 +49559 +49560 +49560 +49561 +49561 +49562 +49562 +49563 +49563 +49564 +49564 +49565 +49566 +49566 +49567 +49567 +49568 +49568 +49569 +49569 +49570 +49570 +49571 +49571 +49572 +49572 +49573 +49574 +49574 +49575 +49575 +49576 +49576 +49577 +49577 +49578 +49578 +49579 +49579 +49580 +49580 +49581 +49581 +49582 +49582 +49583 +49584 +49584 +49585 +49585 +49586 +49586 +49587 +49587 +49588 +49588 +49589 +49589 +49590 +49590 +49591 +49591 +49592 +49592 +49593 +49593 +49594 +49594 +49595 +49596 +49596 +49597 +49597 +49598 +49598 +49599 +49599 +49600 +49600 +49601 +49601 +49602 +49602 +49603 +49603 +49604 +49604 +49605 +49605 +49606 +49606 +49607 +49607 +49608 +49608 +49609 +49609 +49610 +49610 +49611 +49612 +49612 +49613 +49613 +49614 +49614 +49615 +49615 +49616 +49616 +49617 +49617 +49618 +49618 +49619 +49619 +49620 +49620 +49621 +49621 +49622 +49622 +49623 +49623 +49624 +49624 +49625 +49625 +49626 +49626 +49627 +49627 +49628 +49628 +49629 +49629 +49630 +49630 +49631 +49631 +49632 +49632 +49633 +49633 +49634 +49634 +49635 +49635 +49636 +49636 +49637 +49637 +49638 +49638 +49639 +49639 +49640 +49640 +49641 +49641 +49642 +49642 +49643 +49643 +49644 +49644 +49645 +49645 +49646 +49646 +49647 +49647 +49648 +49648 +49649 +49649 +49650 +49650 +49651 +49651 +49652 +49652 +49653 +49653 +49654 +49654 +49655 +49655 +49656 +49656 +49657 +49657 +49658 +49658 +49659 +49659 +49660 +49660 +49661 +49661 +49662 +49662 +49663 +49663 +49664 +49664 +49665 +49665 +49666 +49666 +49667 +49667 +49668 +49668 +49668 +49669 +49669 +49670 +49670 +49671 +49671 +49672 +49672 +49673 +49673 +49674 +49674 +49675 +49675 +49676 +49676 +49677 +49677 +49678 +49678 +49679 +49679 +49680 +49680 +49681 +49681 +49682 +49682 +49683 +49683 +49684 +49684 +49684 +49685 +49685 +49686 +49686 +49687 +49687 +49688 +49688 +49689 +49689 +49690 +49690 +49691 +49691 +49692 +49692 +49693 +49693 +49694 +49694 +49695 +49695 +49696 +49696 +49696 +49697 +49697 +49698 +49698 +49699 +49699 +49700 +49700 +49701 +49701 +49702 +49702 +49703 +49703 +49704 +49704 +49705 +49705 +49706 +49706 +49706 +49707 +49707 +49708 +49708 +49709 +49709 +49710 +49710 +49711 +49711 +49712 +49712 +49713 +49713 +49714 +49714 +49714 +49715 +49715 +49716 +49716 +49717 +49717 +49718 +49718 +49719 +49719 +49720 +49720 +49721 +49721 +49722 +49722 +49722 +49723 +49723 +49724 +49724 +49725 +49725 +49726 +49726 +49727 +49727 +49728 +49728 +49729 +49729 +49729 +49730 +49730 +49731 +49731 +49732 +49732 +49733 +49733 +49734 +49734 +49735 +49735 +49735 +49736 +49736 +49737 +49737 +49738 +49738 +49739 +49739 +49740 +49740 +49741 +49741 +49741 +49742 +49742 +49743 +49743 +49744 +49744 +49745 +49745 +49746 +49746 +49747 +49747 +49747 +49748 +49748 +49749 +49749 +49750 +49750 +49751 +49751 +49752 +49752 +49752 +49753 +49753 +49754 +49754 +49755 +49755 +49756 +49756 +49757 +49757 +49757 +49758 +49758 +49759 +49759 +49760 +49760 +49761 +49761 +49762 +49762 +49762 +49763 +49763 +49764 +49764 +49765 +49765 +49766 +49766 +49767 +49767 +49767 +49768 +49768 +49769 +49769 +49770 +49770 +49771 +49771 +49771 +49772 +49772 +49773 +49773 +49774 +49774 +49775 +49775 +49776 +49776 +49776 +49777 +49777 +49778 +49778 +49779 +49779 +49780 +49780 +49780 +49781 +49781 +49782 +49782 +49783 +49783 +49784 +49784 +49784 +49785 +49785 +49786 +49786 +49787 +49787 +49788 +49788 +49788 +49789 +49789 +49790 +49790 +49791 +49791 +49792 +49792 +49792 +49793 +49793 +49794 +49794 +49795 +49795 +49796 +49796 +49796 +49797 +49797 +49798 +49798 +49799 +49799 +49800 +49800 +49800 +49801 +49801 +49802 +49802 +49803 +49803 +49803 +49804 +49804 +49805 +49805 +49806 +49806 +49807 +49807 +49807 +49808 +49808 +49809 +49809 +49810 +49810 +49810 +49811 +49811 +49812 +49812 +49813 +49813 +49814 +49814 +49814 +49815 +49815 +49816 +49816 +49817 +49817 +49817 +49818 +49818 +49819 +49819 +49820 +49820 +49820 +49821 +49821 +49822 +49822 +49823 +49823 +49824 +49824 +49824 +49825 +49825 +49826 +49826 +49827 +49827 +49827 +49828 +49828 +49829 +49829 +49830 +49830 +49830 +49831 +49831 +49832 +49832 +49833 +49833 +49833 +49834 +49834 +49835 +49835 +49836 +49836 +49836 +49837 +49837 +49838 +49838 +49839 +49839 +49839 +49840 +49840 +49841 +49841 +49842 +49842 +49842 +49843 +49843 +49844 +49844 +49845 +49845 +49845 +49846 +49846 +49847 +49847 +49848 +49848 +49848 +49849 +49849 +49850 +49850 +49851 +49851 +49851 +49852 +49852 +49853 +49853 +49853 +49854 +49854 +49855 +49855 +49856 +49856 +49856 +49857 +49857 +49858 +49858 +49859 +49859 +49859 +49860 +49860 +49861 +49861 +49861 +49862 +49862 +49863 +49863 +49864 +49864 +49864 +49865 +49865 +49866 +49866 +49867 +49867 +49867 +49868 +49868 +49869 +49869 +49869 +49870 +49870 +49871 +49871 +49872 +49872 +49872 +49873 +49873 +49874 +49874 +49874 +49875 +49875 +49876 +49876 +49877 +49877 +49877 +49878 +49878 +49879 +49879 +49879 +49880 +49880 +49881 +49881 +49882 +49882 +49882 +49883 +49883 +49884 +49884 +49884 +49885 +49885 +49886 +49886 +49886 +49887 +49887 +49888 +49888 +49889 +49889 +49889 +49890 +49890 +49891 +49891 +49891 +49892 +49892 +49893 +49893 +49893 +49894 +49894 +49895 +49895 +49896 +49896 +49896 +49897 +49897 +49898 +49898 +49898 +49899 +49899 +49900 +49900 +49900 +49901 +49901 +49902 +49902 +49903 +49903 +49903 +49904 +49904 +49905 +49905 +49905 +49906 +49906 +49907 +49907 +49907 +49908 +49908 +49909 +49909 +49909 +49910 +49910 +49911 +49911 +49911 +49912 +49912 +49913 +49913 +49913 +49914 +49914 +49915 +49915 +49916 +49916 +49916 +49917 +49917 +49918 +49918 +49918 +49919 +49919 +49920 +49920 +49920 +49921 +49921 +49922 +49922 +49922 +49923 +49923 +49924 +49924 +49924 +49925 +49925 +49926 +49926 +49926 +49927 +49927 +49928 +49928 +49928 +49929 +49929 +49930 +49930 +49930 +49931 +49931 +49932 +49932 +49932 +49933 +49933 +49934 +49934 +49934 +49935 +49935 +49936 +49936 +49936 +49937 +49937 +49938 +49938 +49938 +49939 +49939 +49940 +49940 +49940 +49941 +49941 +49942 +49942 +49942 +49943 +49943 +49944 +49944 +49944 +49945 +49945 +49946 +49946 +49946 +49947 +49947 +49948 +49948 +49948 +49949 +49949 +49949 +49950 +49950 +49951 +49951 +49951 +49952 +49952 +49953 +49953 +49953 +49954 +49954 +49955 +49955 +49955 +49956 +49956 +49957 +49957 +49957 +49958 +49958 +49959 +49959 +49959 +49960 +49960 +49961 +49961 +49961 +49962 +49962 +49963 +49964 +49964 +49965 +49966 +49967 +49968 +49968 +49969 +49970 +49971 +49971 +49972 +49973 +49974 +49975 +49975 +49976 +49977 +49978 +49978 +49979 +49980 +49981 +49982 +49982 +49983 +49984 +49985 +49985 +49986 +49987 +49988 +49988 +49989 +49990 +49991 +49992 +49992 +49993 +49994 +49995 +49995 +49996 +49997 +49998 +49998 +49999 +50000 +50001 +50002 +50002 +50003 +50004 +50005 +50005 +50006 +50007 +50008 +50008 +50009 +50010 +50011 +50011 +50012 +50013 +50014 +50014 +50015 +50016 +50017 +50017 +50018 +50019 +50020 +50020 +50021 +50022 +50023 +50023 +50024 +50025 +50026 +50026 +50027 +50028 +50029 +50029 +50030 +50031 +50032 +50032 +50033 +50034 +50035 +50035 +50036 +50037 +50038 +50038 +50039 +50040 +50041 +50041 +50042 +50043 +50044 +50044 +50045 +50046 +50047 +50047 +50048 +50049 +50050 +50050 +50051 +50052 +50053 +50053 +50054 +50055 +50055 +50056 +50057 +50058 +50058 +50059 +50060 +50061 +50061 +50062 +50063 +50064 +50064 +50065 +50066 +50066 +50067 +50068 +50069 +50069 +50070 +50071 +50072 +50072 +50073 +50074 +50074 +50075 +50076 +50077 +50077 +50078 +50079 +50080 +50080 +50081 +50082 +50082 +50083 +50084 +50085 +50085 +50086 +50087 +50088 +50088 +50089 +50090 +50090 +50091 +50092 +50093 +50093 +50094 +50095 +50095 +50096 +50097 +50098 +50098 +50099 +50100 +50100 +50101 +50102 +50103 +50103 +50104 +50105 +50105 +50106 +50107 +50108 +50108 +50109 +50110 +50110 +50111 +50112 +50113 +50113 +50114 +50115 +50115 +50116 +50117 +50118 +50118 +50119 +50120 +50120 +50121 +50122 +50122 +50123 +50124 +50125 +50125 +50126 +50127 +50127 +50128 +50129 +50129 +50130 +50131 +50132 +50132 +50133 +50134 +50134 +50135 +50136 +50136 +50137 +50138 +50139 +50139 +50140 +50141 +50141 +50142 +50143 +50143 +50144 +50145 +50146 +50146 +50147 +50148 +50148 +50149 +50150 +50150 +50151 +50152 +50152 +50153 +50154 +50155 +50155 +50156 +50157 +50157 +50158 +50159 +50159 +50160 +50161 +50161 +50162 +50163 +50164 +50164 +50165 +50166 +50166 +50167 +50168 +50168 +50169 +50170 +50170 +50171 +50172 +50172 +50173 +50174 +50174 +50175 +50176 +50176 +50177 +50177 +50177 +50178 +50178 +50178 +50179 +50179 +50179 +50180 +50180 +50180 +50181 +50181 +50181 +50182 +50182 +50182 +50183 +50183 +50183 +50184 +50184 +50184 +50185 +50185 +50185 +50186 +50186 +50186 +50187 +50187 +50187 +50188 +50188 +50188 +50189 +50189 +50189 +50190 +50190 +50190 +50191 +50191 +50191 +50192 +50192 +50192 +50193 +50193 +50193 +50194 +50194 +50194 +50195 +50195 +50195 +50196 +50196 +50196 +50197 +50197 +50197 +50198 +50198 +50198 +50199 +50199 +50199 +50200 +50200 +50200 +50201 +50201 +50201 +50202 +50202 +50202 +50203 +50203 +50203 +50204 +50204 +50204 +50205 +50205 +50205 +50206 +50206 +50206 +50207 +50207 +50207 +50208 +50208 +50208 +50209 +50209 +50209 +50210 +50210 +50210 +50211 +50211 +50211 +50212 +50212 +50212 +50213 +50213 +50213 +50214 +50214 +50214 +50215 +50215 +50215 +50216 +50216 +50216 +50217 +50217 +50217 +50218 +50218 +50218 +50218 +50219 +50219 +50219 +50220 +50220 +50220 +50221 +50221 +50221 +50222 +50222 +50222 +50223 +50223 +50223 +50224 +50224 +50224 +50225 +50225 +50225 +50226 +50226 +50226 +50227 +50227 +50227 +50228 +50228 +50228 +50228 +50229 +50229 +50229 +50230 +50230 +50230 +50231 +50231 +50231 +50232 +50232 +50232 +50233 +50233 +50233 +50234 +50234 +50234 +50235 +50235 +50235 +50235 +50236 +50236 +50236 +50237 +50237 +50237 +50238 +50238 +50238 +50239 +50239 +50239 +50240 +50240 +50240 +50241 +50241 +50241 +50242 +50242 +50242 +50242 +50243 +50243 +50243 +50244 +50244 +50244 +50245 +50245 +50245 +50246 +50246 +50246 +50247 +50247 +50247 +50247 +50248 +50248 +50248 +50249 +50249 +50249 +50250 +50250 +50250 +50251 +50251 +50251 +50252 +50252 +50252 +50252 +50253 +50253 +50253 +50254 +50254 +50254 +50255 +50255 +50255 +50256 +50256 +50256 +50257 +50257 +50257 +50257 +50258 +50258 +50258 +50259 +50259 +50259 +50260 +50260 +50260 +50261 +50261 +50261 +50261 +50262 +50262 +50262 +50263 +50263 +50263 +50264 +50264 +50264 +50265 +50265 +50265 +50265 +50266 +50266 +50266 +50267 +50267 +50267 +50268 +50268 +50268 +50269 +50269 +50269 +50269 +50270 +50270 +50270 +50271 +50271 +50271 +50272 +50272 +50272 +50273 +50273 +50273 +50273 +50274 +50274 +50274 +50275 +50275 +50275 +50276 +50276 +50276 +50276 +50277 +50277 +50277 +50278 +50278 +50278 +50279 +50279 +50279 +50279 +50280 +50280 +50280 +50281 +50281 +50281 +50282 +50282 +50282 +50283 +50283 +50283 +50283 +50284 +50284 +50284 +50285 +50285 +50285 +50286 +50286 +50286 +50286 +50287 +50287 +50287 +50288 +50288 +50288 +50289 +50289 +50289 +50289 +50290 +50290 +50290 +50291 +50291 +50291 +50292 +50292 +50292 +50292 +50293 +50293 +50293 +50294 +50294 +50294 +50294 +50295 +50295 +50295 +50296 +50296 +50296 +50297 +50297 +50297 +50297 +50298 +50298 +50298 +50299 +50299 +50299 +50300 +50300 +50300 +50300 +50301 +50301 +50301 +50302 +50302 +50302 +50302 +50303 +50303 +50303 +50304 +50304 +50304 +50305 +50305 +50305 +50305 +50306 +50306 +50306 +50307 +50307 +50307 +50307 +50308 +50308 +50308 +50309 +50309 +50309 +50310 +50310 +50310 +50310 +50311 +50311 +50311 +50312 +50312 +50312 +50312 +50313 +50313 +50313 +50314 +50314 +50314 +50314 +50315 +50315 +50315 +50316 +50316 +50316 +50317 +50317 +50317 +50317 +50318 +50318 +50318 +50319 +50319 +50319 +50319 +50320 +50320 +50320 +50321 +50321 +50321 +50321 +50322 +50322 +50322 +50323 +50323 +50323 +50323 +50324 +50324 +50324 +50325 +50325 +50325 +50325 +50326 +50326 +50326 +50327 +50327 +50327 +50327 +50328 +50328 +50328 +50329 +50329 +50329 +50329 +50330 +50330 +50330 +50331 +50331 +50331 +50332 +50332 +50332 +50332 +50333 +50333 +50333 +50333 +50334 +50334 +50334 +50335 +50335 +50335 +50335 +50336 +50336 +50336 +50337 +50337 +50337 +50337 +50338 +50338 +50338 +50339 +50339 +50339 +50339 +50340 +50340 +50340 +50341 +50341 +50341 +50341 +50342 +50342 +50342 +50343 +50343 +50343 +50343 +50344 +50344 +50344 +50345 +50345 +50345 +50345 +50346 +50346 +50346 +50347 +50347 +50347 +50347 +50348 +50348 +50348 +50348 +50349 +50349 +50349 +50350 +50350 +50350 +50350 +50351 +50351 +50351 +50352 +50352 +50352 +50352 +50353 +50353 +50353 +50354 +50354 +50354 +50354 +50355 +50355 +50355 +50355 +50356 +50356 +50356 +50357 +50357 +50357 +50357 +50358 +50358 +50358 +50359 +50359 +50359 +50359 +50360 +50360 +50360 +50360 +50361 +50361 +50361 +50362 +50362 +50362 +50362 +50363 +50363 +50363 +50364 +50364 +50364 +50364 +50365 +50365 +50365 +50365 +50366 +50366 +50366 +50367 +50367 +50367 +50367 +50368 +50368 +50368 +50368 +50369 +50369 +50369 +50370 +50370 +50370 +50370 +50371 +50371 +50371 +50372 +50372 +50372 +50372 +50373 +50373 +50373 +50373 +50374 +50374 +50374 +50375 +50375 +50375 +50375 +50376 +50376 +50376 +50376 +50377 +50377 +50377 +50378 +50378 +50378 +50378 +50379 +50379 +50379 +50379 +50380 +50380 +50380 +50381 +50381 +50381 +50381 +50382 +50382 +50382 +50382 +50383 +50383 +50383 +50384 +50384 +50384 +50384 +50385 +50385 +50385 +50385 +50386 +50386 +50386 +50386 +50387 +50387 +50387 +50388 +50388 +50388 +50388 +50389 +50389 +50389 +50389 +50390 +50390 +50390 +50391 +50391 +50391 +50391 +50392 +50392 +50392 +50392 +50393 +50393 +50393 +50393 +50394 +50394 +50394 +50395 +50395 +50395 +50395 +50396 +50396 +50397 +50397 +50398 +50399 +50399 +50400 +50400 +50401 +50401 +50402 +50402 +50403 +50403 +50404 +50404 +50405 +50405 +50406 +50407 +50407 +50408 +50408 +50409 +50409 +50410 +50410 +50411 +50411 +50412 +50412 +50413 +50413 +50414 +50414 +50415 +50415 +50416 +50417 +50417 +50418 +50418 +50419 +50419 +50420 +50420 +50421 +50421 +50422 +50422 +50423 +50423 +50424 +50424 +50425 +50425 +50426 +50426 +50427 +50427 +50428 +50429 +50429 +50430 +50430 +50431 +50431 +50432 +50432 +50433 +50433 +50434 +50434 +50435 +50435 +50436 +50436 +50437 +50437 +50438 +50438 +50439 +50439 +50440 +50440 +50441 +50441 +50442 +50442 +50443 +50443 +50444 +50444 +50445 +50445 +50446 +50446 +50447 +50447 +50448 +50449 +50449 +50450 +50450 +50451 +50451 +50452 +50452 +50453 +50453 +50454 +50454 +50455 +50455 +50456 +50456 +50457 +50457 +50458 +50458 +50459 +50459 +50460 +50460 +50461 +50461 +50462 +50462 +50463 +50463 +50464 +50464 +50465 +50465 +50466 +50466 +50467 +50467 +50468 +50468 +50469 +50469 +50470 +50470 +50471 +50471 +50472 +50472 +50473 +50473 +50474 +50474 +50475 +50475 +50476 +50476 +50477 +50477 +50478 +50478 +50479 +50479 +50480 +50480 +50481 +50481 +50482 +50482 +50482 +50483 +50483 +50484 +50484 +50485 +50485 +50486 +50486 +50487 +50487 +50488 +50488 +50489 +50489 +50490 +50490 +50491 +50491 +50492 +50492 +50493 +50493 +50494 +50494 +50495 +50495 +50496 +50496 +50497 +50497 +50498 +50498 +50499 +50499 +50500 +50500 +50501 +50501 +50502 +50502 +50502 +50503 +50503 +50504 +50504 +50505 +50505 +50506 +50506 +50507 +50507 +50508 +50508 +50509 +50509 +50510 +50510 +50511 +50511 +50512 +50512 +50513 +50513 +50514 +50514 +50514 +50515 +50515 +50516 +50516 +50517 +50517 +50518 +50518 +50519 +50519 +50520 +50520 +50521 +50521 +50522 +50522 +50523 +50523 +50524 +50524 +50524 +50525 +50525 +50526 +50526 +50527 +50527 +50528 +50528 +50529 +50529 +50530 +50530 +50531 +50531 +50532 +50532 +50532 +50533 +50533 +50534 +50534 +50535 +50535 +50536 +50536 +50537 +50537 +50538 +50538 +50539 +50539 +50539 +50540 +50540 +50541 +50541 +50542 +50542 +50543 +50543 +50544 +50544 +50545 +50545 +50546 +50546 +50546 +50547 +50547 +50548 +50548 +50549 +50549 +50550 +50550 +50551 +50551 +50552 +50552 +50552 +50553 +50553 +50554 +50554 +50555 +50555 +50556 +50556 +50557 +50557 +50558 +50558 +50558 +50559 +50559 +50560 +50560 +50561 +50561 +50562 +50562 +50563 +50563 +50564 +50564 +50564 +50565 +50565 +50566 +50566 +50567 +50567 +50568 +50568 +50569 +50569 +50569 +50570 +50570 +50571 +50571 +50572 +50572 +50573 +50573 +50574 +50574 +50574 +50575 +50575 +50576 +50576 +50577 +50577 +50578 +50578 +50578 +50579 +50579 +50580 +50580 +50581 +50581 +50582 +50582 +50583 +50583 +50583 +50584 +50584 +50585 +50585 +50586 +50586 +50587 +50587 +50587 +50588 +50588 +50589 +50589 +50590 +50590 +50591 +50591 +50591 +50592 +50592 +50593 +50593 +50594 +50594 +50595 +50595 +50595 +50596 +50596 +50597 +50597 +50598 +50598 +50599 +50599 +50599 +50600 +50600 +50601 +50601 +50602 +50602 +50603 +50603 +50603 +50604 +50604 +50605 +50605 +50606 +50606 +50607 +50607 +50607 +50608 +50608 +50609 +50609 +50610 +50610 +50610 +50611 +50611 +50612 +50612 +50613 +50613 +50614 +50614 +50614 +50615 +50615 +50616 +50616 +50617 +50617 +50617 +50618 +50618 +50619 +50619 +50620 +50620 +50621 +50621 +50621 +50622 +50622 +50623 +50623 +50624 +50624 +50624 +50625 +50625 +50626 +50626 +50627 +50627 +50627 +50628 +50628 +50629 +50629 +50630 +50630 +50631 +50631 +50631 +50632 +50632 +50633 +50633 +50634 +50634 +50634 +50635 +50635 +50636 +50636 +50637 +50637 +50637 +50638 +50638 +50639 +50639 +50640 +50640 +50640 +50641 +50641 +50642 +50642 +50643 +50643 +50643 +50644 +50644 +50645 +50645 +50646 +50646 +50646 +50647 +50647 +50648 +50648 +50648 +50649 +50649 +50650 +50650 +50651 +50651 +50651 +50652 +50652 +50653 +50653 +50654 +50654 +50654 +50655 +50655 +50656 +50656 +50657 +50657 +50657 +50658 +50658 +50659 +50659 +50659 +50660 +50660 +50661 +50661 +50662 +50662 +50662 +50663 +50663 +50664 +50664 +50665 +50665 +50665 +50666 +50666 +50667 +50667 +50667 +50668 +50668 +50669 +50669 +50670 +50670 +50670 +50671 +50671 +50672 +50672 +50672 +50673 +50673 +50674 +50674 +50675 +50675 +50675 +50676 +50676 +50677 +50677 +50677 +50678 +50678 +50679 +50679 +50680 +50680 +50680 +50681 +50681 +50682 +50682 +50682 +50683 +50683 +50684 +50684 +50684 +50685 +50685 +50686 +50686 +50687 +50687 +50687 +50688 +50688 +50689 +50689 +50689 +50690 +50690 +50691 +50691 +50691 +50692 +50692 +50693 +50693 +50694 +50694 +50694 +50695 +50695 +50696 +50696 +50696 +50697 +50697 +50698 +50698 +50698 +50699 +50699 +50700 +50700 +50700 +50701 +50701 +50702 +50702 +50702 +50703 +50703 +50704 +50704 +50705 +50705 +50705 +50706 +50706 +50707 +50707 +50707 +50708 +50708 +50709 +50709 +50709 +50710 +50710 +50711 +50711 +50711 +50712 +50712 +50713 +50713 +50713 +50714 +50714 +50715 +50715 +50715 +50716 +50716 +50717 +50717 +50717 +50718 +50718 +50719 +50719 +50719 +50720 +50720 +50721 +50721 +50721 +50722 +50722 +50723 +50723 +50723 +50724 +50724 +50725 +50725 +50725 +50726 +50726 +50727 +50727 +50727 +50728 +50728 +50729 +50729 +50729 +50730 +50730 +50731 +50731 +50731 +50732 +50732 +50733 +50733 +50733 +50734 +50734 +50735 +50735 +50735 +50736 +50736 +50737 +50737 +50737 +50738 +50738 +50739 +50739 +50739 +50740 +50740 +50741 +50741 +50741 +50742 +50742 +50743 +50743 +50743 +50744 +50744 +50744 +50745 +50745 +50746 +50746 +50746 +50747 +50747 +50748 +50748 +50748 +50749 +50749 +50750 +50750 +50750 +50751 +50751 +50752 +50752 +50752 +50753 +50753 +50753 +50754 +50754 +50755 +50755 +50755 +50756 +50756 +50757 +50757 +50757 +50758 +50758 +50759 +50759 +50759 +50760 +50760 +50760 +50761 +50761 +50762 +50762 +50762 +50763 +50763 +50764 +50764 +50764 +50765 +50765 +50766 +50766 +50766 +50767 +50767 +50767 +50768 +50768 +50769 +50769 +50769 +50770 +50770 +50771 +50771 +50771 +50772 +50772 +50772 +50773 +50773 +50774 +50774 +50774 +50775 +50775 +50776 +50776 +50776 +50777 +50777 +50777 +50778 +50778 +50779 +50779 +50779 +50780 +50780 +50781 +50781 +50781 +50782 +50782 +50782 +50783 +50783 +50784 +50784 +50784 +50785 +50785 +50785 +50786 +50786 +50787 +50787 +50787 +50788 +50788 +50789 +50789 +50789 +50790 +50790 +50790 +50791 +50791 +50792 +50792 +50792 +50793 +50793 +50793 +50794 +50794 +50795 +50795 +50795 +50796 +50796 +50797 +50797 +50797 +50798 +50798 +50798 +50799 +50799 +50800 +50800 +50800 +50801 +50801 +50801 +50802 +50802 +50803 +50803 +50803 +50804 +50804 +50804 +50805 +50805 +50806 +50806 +50806 +50807 +50807 +50807 +50808 +50808 +50809 +50809 +50809 +50810 +50810 +50810 +50811 +50811 +50812 +50812 +50812 +50813 +50813 +50813 +50814 +50814 +50815 +50815 +50815 +50816 +50816 +50816 +50817 +50817 +50817 +50818 +50818 +50819 +50819 +50819 +50820 +50820 +50820 +50821 +50821 +50822 +50822 +50822 +50823 +50823 +50823 +50824 +50824 +50825 +50825 +50825 +50826 +50826 +50826 +50827 +50827 +50828 +50828 +50828 +50829 +50829 +50829 +50830 +50830 +50830 +50831 +50831 +50832 +50832 +50832 +50833 +50833 +50833 +50834 +50834 +50834 +50835 +50835 +50836 +50836 +50836 +50837 +50837 +50837 +50838 +50838 +50839 +50839 +50839 +50840 +50840 +50840 +50841 +50841 +50842 +50843 +50843 +50844 +50845 +50845 +50846 +50847 +50848 +50848 +50849 +50850 +50851 +50851 +50852 +50853 +50853 +50854 +50855 +50856 +50856 +50857 +50858 +50859 +50859 +50860 +50861 +50861 +50862 +50863 +50864 +50864 +50865 +50866 +50866 +50867 +50868 +50869 +50869 +50870 +50871 +50871 +50872 +50873 +50874 +50874 +50875 +50876 +50876 +50877 +50878 +50879 +50879 +50880 +50881 +50881 +50882 +50883 +50884 +50884 +50885 +50886 +50886 +50887 +50888 +50889 +50889 +50890 +50891 +50891 +50892 +50893 +50893 +50894 +50895 +50896 +50896 +50897 +50898 +50898 +50899 +50900 +50900 +50901 +50902 +50903 +50903 +50904 +50905 +50905 +50906 +50907 +50907 +50908 +50909 +50910 +50910 +50911 +50912 +50912 +50913 +50914 +50914 +50915 +50916 +50916 +50917 +50918 +50919 +50919 +50920 +50921 +50921 +50922 +50923 +50923 +50924 +50925 +50925 +50926 +50927 +50928 +50928 +50929 +50930 +50930 +50931 +50932 +50932 +50933 +50934 +50934 +50935 +50936 +50936 +50937 +50938 +50938 +50939 +50940 +50941 +50941 +50942 +50943 +50943 +50944 +50945 +50945 +50946 +50947 +50947 +50948 +50949 +50949 +50950 +50951 +50951 +50952 +50953 +50953 +50954 +50955 +50955 +50956 +50957 +50957 +50958 +50959 +50959 +50960 +50961 +50961 +50962 +50963 +50963 +50964 +50965 +50965 +50966 +50967 +50968 +50968 +50969 +50970 +50970 +50971 +50972 +50972 +50973 +50974 +50974 +50975 +50976 +50976 +50977 +50977 +50978 +50979 +50979 +50980 +50981 +50981 +50982 +50983 +50983 +50984 +50985 +50985 +50986 +50987 +50987 +50988 +50989 +50989 +50990 +50991 +50991 +50992 +50993 +50993 +50994 +50995 +50995 +50996 +50997 +50997 +50998 +50999 +50999 +51000 +51001 +51001 +51002 +51003 +51003 +51004 +51004 +51005 +51006 +51006 +51007 +51008 +51008 +51009 +51010 +51010 +51011 +51012 +51012 +51013 +51014 +51014 +51015 +51016 +51016 +51017 +51017 +51018 +51019 +51019 +51020 +51021 +51021 +51022 +51023 +51023 +51024 +51025 +51025 +51026 +51026 +51027 +51028 +51028 +51029 +51030 +51030 +51031 +51032 +51032 +51033 +51034 +51034 +51035 +51035 +51036 +51037 +51037 +51038 +51039 +51039 +51040 +51041 +51041 +51042 +51042 +51043 +51044 +51044 +51045 +51046 +51046 +51047 +51048 +51048 +51049 +51049 +51050 +51051 +51051 +51052 +51053 +51053 +51054 +51054 +51055 +51056 +51056 +51057 +51058 +51058 +51059 +51060 +51060 +51061 +51061 +51062 +51063 +51063 +51064 +51065 +51065 +51066 +51066 +51067 +51068 +51068 +51069 +51070 +51070 +51071 +51071 +51072 +51073 +51073 +51074 +51075 +51075 +51076 +51076 +51077 +51078 +51078 +51079 +51080 +51080 +51081 +51081 +51082 +51083 +51083 +51084 +51084 +51085 +51086 +51086 +51087 +51088 +51088 +51089 +51089 +51090 +51091 +51091 +51092 +51092 +51093 +51094 +51094 +51095 +51096 +51096 +51097 +51097 +51098 +51099 +51099 +51100 +51100 +51101 +51102 +51102 +51103 +51104 +51104 +51105 +51105 +51106 +51107 +51107 +51108 +51108 +51109 +51110 +51110 +51111 +51111 +51112 +51113 +51113 +51114 +51114 +51115 +51116 +51116 +51117 +51118 +51118 +51119 +51119 +51120 +51121 +51121 +51122 +51122 +51123 +51124 +51124 +51125 +51125 +51126 +51127 +51127 +51128 +51128 +51129 +51130 +51130 +51131 +51131 +51132 +51133 +51133 +51134 +51134 +51135 +51136 +51136 +51137 +51137 +51138 +51139 +51139 +51140 +51140 +51141 +51142 +51142 +51143 +51143 +51144 +51145 +51145 +51146 +51146 +51147 +51148 +51148 +51149 +51149 +51150 +51151 +51151 +51152 +51152 +51153 +51153 +51154 +51155 +51155 +51156 +51156 +51157 +51158 +51158 +51159 +51159 +51160 +51161 +51161 +51162 +51162 +51163 +51164 +51164 +51165 +51165 +51166 +51166 +51167 +51168 +51168 +51169 +51169 +51170 +51171 +51171 +51172 +51172 +51173 +51173 +51174 +51175 +51175 +51176 +51176 +51177 +51178 +51178 +51179 +51179 +51180 +51180 +51181 +51182 +51182 +51183 +51183 +51184 +51185 +51185 +51186 +51186 +51187 +51187 +51188 +51189 +51189 +51190 +51190 +51191 +51192 +51192 +51193 +51193 +51194 +51194 +51195 +51196 +51196 +51197 +51197 +51198 +51198 +51199 +51200 +51200 +51200 +51201 +51201 +51201 +51202 +51202 +51202 +51202 +51203 +51203 +51203 +51204 +51204 +51204 +51204 +51205 +51205 +51205 +51206 +51206 +51206 +51206 +51207 +51207 +51207 +51208 +51208 +51208 +51208 +51209 +51209 +51209 +51210 +51210 +51210 +51210 +51211 +51211 +51211 +51212 +51212 +51212 +51212 +51213 +51213 +51213 +51214 +51214 +51214 +51214 +51215 +51215 +51215 +51215 +51216 +51216 +51216 +51217 +51217 +51217 +51217 +51218 +51218 +51218 +51219 +51219 +51219 +51219 +51220 +51220 +51220 +51221 +51221 +51221 +51221 +51222 +51222 +51222 +51223 +51223 +51223 +51223 +51224 +51224 +51224 +51224 +51225 +51225 +51225 +51226 +51226 +51226 +51226 +51227 +51227 +51227 +51228 +51228 +51228 +51228 +51229 +51229 +51229 +51230 +51230 +51230 +51230 +51231 +51231 +51231 +51231 +51232 +51232 +51232 +51233 +51233 +51233 +51233 +51234 +51234 +51234 +51234 +51235 +51235 +51235 +51236 +51236 +51236 +51236 +51237 +51237 +51237 +51238 +51238 +51238 +51238 +51239 +51239 +51239 +51239 +51240 +51240 +51240 +51241 +51241 +51241 +51241 +51242 +51242 +51242 +51242 +51243 +51243 +51243 +51244 +51244 +51244 +51244 +51245 +51245 +51245 +51245 +51246 +51246 +51246 +51247 +51247 +51247 +51247 +51248 +51248 +51248 +51248 +51249 +51249 +51249 +51250 +51250 +51250 +51250 +51251 +51251 +51251 +51251 +51252 +51252 +51252 +51253 +51253 +51253 +51253 +51254 +51254 +51254 +51254 +51255 +51255 +51255 +51256 +51256 +51256 +51256 +51257 +51257 +51257 +51257 +51258 +51258 +51258 +51258 +51259 +51259 +51259 +51260 +51260 +51260 +51260 +51261 +51261 +51261 +51261 +51262 +51262 +51262 +51262 +51263 +51263 +51263 +51264 +51264 +51264 +51264 +51265 +51265 +51265 +51265 +51266 +51266 +51266 +51266 +51267 +51267 +51267 +51268 +51268 +51268 +51268 +51269 +51269 +51269 +51269 +51270 +51270 +51270 +51270 +51271 +51271 +51271 +51272 +51272 +51272 +51272 +51273 +51273 +51273 +51273 +51274 +51274 +51274 +51274 +51275 +51275 +51275 +51276 +51276 +51276 +51276 +51277 +51277 +51277 +51277 +51278 +51278 +51278 +51278 +51279 +51279 +51279 +51279 +51280 +51280 +51280 +51280 +51281 +51281 +51281 +51282 +51282 +51282 +51282 +51283 +51283 +51283 +51283 +51284 +51284 +51284 +51284 +51285 +51285 +51285 +51285 +51286 +51286 +51286 +51287 +51287 +51287 +51287 +51288 +51288 +51288 +51288 +51289 +51289 +51289 +51289 +51290 +51290 +51290 +51290 +51291 +51291 +51291 +51291 +51292 +51292 +51292 +51292 +51293 +51293 +51293 +51294 +51294 +51294 +51294 +51295 +51295 +51295 +51295 +51296 +51296 +51296 +51296 +51297 +51297 +51297 +51297 +51298 +51298 +51298 +51298 +51299 +51299 +51299 +51299 +51300 +51300 +51300 +51300 +51301 +51301 +51301 +51301 +51302 +51302 +51302 +51303 +51303 +51303 +51303 +51304 +51304 +51304 +51304 +51305 +51305 +51305 +51305 +51306 +51306 +51306 +51306 +51307 +51307 +51307 +51307 +51308 +51308 +51308 +51308 +51309 +51309 +51309 +51309 +51310 +51310 +51310 +51310 +51311 +51311 +51311 +51311 +51312 +51312 +51312 +51312 +51313 +51313 +51313 +51313 +51314 +51314 +51314 +51314 +51315 +51315 +51315 +51315 +51316 +51316 +51316 +51316 +51317 +51317 +51317 +51317 +51318 +51318 +51318 +51318 +51319 +51319 +51319 +51319 +51320 +51320 +51320 +51320 +51321 +51321 +51321 +51321 +51322 +51322 +51322 +51322 +51323 +51323 +51323 +51324 +51324 +51324 +51324 +51324 +51325 +51325 +51325 +51326 +51326 +51327 +51327 +51328 +51328 +51329 +51329 +51330 +51330 +51331 +51331 +51332 +51332 +51333 +51333 +51334 +51334 +51335 +51335 +51336 +51336 +51337 +51337 +51338 +51338 +51339 +51339 +51340 +51340 +51341 +51341 +51342 +51342 +51343 +51343 +51344 +51344 +51345 +51345 +51346 +51346 +51347 +51347 +51348 +51348 +51349 +51349 +51350 +51350 +51351 +51351 +51352 +51352 +51353 +51353 +51354 +51354 +51354 +51355 +51355 +51356 +51356 +51357 +51357 +51358 +51358 +51359 +51359 +51360 +51360 +51361 +51361 +51362 +51362 +51363 +51363 +51364 +51364 +51365 +51365 +51366 +51366 +51367 +51367 +51367 +51368 +51368 +51369 +51369 +51370 +51370 +51371 +51371 +51372 +51372 +51373 +51373 +51374 +51374 +51375 +51375 +51376 +51376 +51376 +51377 +51377 +51378 +51378 +51379 +51379 +51380 +51380 +51381 +51381 +51382 +51382 +51383 +51383 +51384 +51384 +51385 +51385 +51385 +51386 +51386 +51387 +51387 +51388 +51388 +51389 +51389 +51390 +51390 +51391 +51391 +51392 +51392 +51392 +51393 +51393 +51394 +51394 +51395 +51395 +51396 +51396 +51397 +51397 +51398 +51398 +51398 +51399 +51399 +51400 +51400 +51401 +51401 +51402 +51402 +51403 +51403 +51404 +51404 +51404 +51405 +51405 +51406 +51406 +51407 +51407 +51408 +51408 +51409 +51409 +51410 +51410 +51410 +51411 +51411 +51412 +51412 +51413 +51413 +51414 +51414 +51415 +51415 +51415 +51416 +51416 +51417 +51417 +51418 +51418 +51419 +51419 +51420 +51420 +51420 +51421 +51421 +51422 +51422 +51423 +51423 +51424 +51424 +51424 +51425 +51425 +51426 +51426 +51427 +51427 +51428 +51428 +51429 +51429 +51429 +51430 +51430 +51431 +51431 +51432 +51432 +51433 +51433 +51433 +51434 +51434 +51435 +51435 +51436 +51436 +51437 +51437 +51437 +51438 +51438 +51439 +51439 +51440 +51440 +51441 +51441 +51441 +51442 +51442 +51443 +51443 +51444 +51444 +51445 +51445 +51445 +51446 +51446 +51447 +51447 +51448 +51448 +51449 +51449 +51449 +51450 +51450 +51451 +51451 +51452 +51452 +51452 +51453 +51453 +51454 +51454 +51455 +51455 +51456 +51456 +51456 +51457 +51457 +51458 +51458 +51459 +51459 +51459 +51460 +51460 +51461 +51461 +51462 +51462 +51463 +51463 +51463 +51464 +51464 +51465 +51465 +51466 +51466 +51466 +51467 +51467 +51468 +51468 +51469 +51469 +51469 +51470 +51470 +51471 +51471 +51472 +51472 +51472 +51473 +51473 +51474 +51474 +51475 +51475 +51475 +51476 +51476 +51477 +51477 +51478 +51478 +51478 +51479 +51479 +51480 +51480 +51481 +51481 +51481 +51482 +51482 +51483 +51483 +51484 +51484 +51484 +51485 +51485 +51486 +51486 +51487 +51487 +51487 +51488 +51488 +51489 +51489 +51490 +51490 +51490 +51491 +51491 +51492 +51492 +51492 +51493 +51493 +51494 +51494 +51495 +51495 +51495 +51496 +51496 +51497 +51497 +51498 +51498 +51498 +51499 +51499 +51500 +51500 +51500 +51501 +51501 +51502 +51502 +51503 +51503 +51503 +51504 +51504 +51505 +51505 +51505 +51506 +51506 +51507 +51507 +51508 +51508 +51508 +51509 +51509 +51510 +51510 +51510 +51511 +51511 +51512 +51512 +51513 +51513 +51513 +51514 +51514 +51515 +51515 +51515 +51516 +51516 +51517 +51517 +51518 +51518 +51518 +51519 +51519 +51520 +51520 +51520 +51521 +51521 +51522 +51522 +51522 +51523 +51523 +51524 +51524 +51525 +51525 +51525 +51526 +51526 +51527 +51527 +51527 +51528 +51528 +51529 +51529 +51529 +51530 +51530 +51531 +51531 +51531 +51532 +51532 +51533 +51533 +51533 +51534 +51534 +51535 +51535 +51536 +51536 +51536 +51537 +51537 +51538 +51538 +51538 +51539 +51539 +51540 +51540 +51540 +51541 +51541 +51542 +51542 +51542 +51543 +51543 +51544 +51544 +51544 +51545 +51545 +51546 +51546 +51546 +51547 +51547 +51548 +51548 +51548 +51549 +51549 +51550 +51550 +51550 +51551 +51551 +51552 +51552 +51552 +51553 +51553 +51554 +51554 +51554 +51555 +51555 +51556 +51556 +51556 +51557 +51557 +51558 +51558 +51558 +51559 +51559 +51560 +51560 +51560 +51561 +51561 +51562 +51562 +51562 +51563 +51563 +51564 +51564 +51564 +51565 +51565 +51566 +51566 +51566 +51567 +51567 +51568 +51568 +51568 +51569 +51569 +51569 +51570 +51570 +51571 +51571 +51571 +51572 +51572 +51573 +51573 +51573 +51574 +51574 +51575 +51575 +51575 +51576 +51576 +51577 +51577 +51577 +51578 +51578 +51578 +51579 +51579 +51580 +51580 +51580 +51581 +51581 +51582 +51582 +51582 +51583 +51583 +51584 +51584 +51584 +51585 +51585 +51585 +51586 +51586 +51587 +51587 +51587 +51588 +51588 +51589 +51589 +51589 +51590 +51590 +51591 +51591 +51591 +51592 +51592 +51592 +51593 +51593 +51594 +51594 +51594 +51595 +51595 +51596 +51596 +51596 +51597 +51597 +51597 +51598 +51598 +51599 +51599 +51599 +51600 +51600 +51601 +51601 +51601 +51602 +51602 +51602 +51603 +51603 +51604 +51604 +51604 +51605 +51605 +51605 +51606 +51606 +51607 +51607 +51607 +51608 +51608 +51609 +51609 +51609 +51610 +51610 +51610 +51611 +51611 +51612 +51612 +51612 +51613 +51613 +51613 +51614 +51614 +51615 +51615 +51615 +51616 +51616 +51616 +51617 +51617 +51618 +51618 +51618 +51619 +51619 +51620 +51620 +51620 +51621 +51621 +51621 +51622 +51622 +51623 +51623 +51623 +51624 +51624 +51624 +51625 +51625 +51626 +51626 +51626 +51627 +51627 +51627 +51628 +51628 +51629 +51629 +51629 +51630 +51630 +51630 +51631 +51631 +51632 +51632 +51632 +51633 +51633 +51633 +51634 +51634 +51634 +51635 +51635 +51636 +51636 +51636 +51637 +51637 +51637 +51638 +51638 +51639 +51639 +51639 +51640 +51640 +51640 +51641 +51641 +51642 +51642 +51642 +51643 +51643 +51643 +51644 +51644 +51644 +51645 +51645 +51646 +51646 +51646 +51647 +51647 +51647 +51648 +51648 +51649 +51649 +51649 +51650 +51650 +51650 +51651 +51651 +51651 +51652 +51652 +51653 +51653 +51653 +51654 +51654 +51654 +51655 +51655 +51656 +51656 +51656 +51657 +51657 +51657 +51658 +51658 +51658 +51659 +51659 +51660 +51660 +51660 +51661 +51661 +51661 +51662 +51662 +51662 +51663 +51663 +51664 +51664 +51664 +51665 +51665 +51665 +51666 +51666 +51666 +51667 +51667 +51668 +51668 +51668 +51669 +51669 +51669 +51670 +51670 +51670 +51671 +51671 +51671 +51672 +51672 +51673 +51673 +51673 +51674 +51674 +51674 +51675 +51675 +51675 +51676 +51676 +51677 +51677 +51677 +51678 +51678 +51678 +51679 +51679 +51679 +51680 +51680 +51680 +51681 +51681 +51682 +51682 +51682 +51683 +51683 +51683 +51684 +51684 +51684 +51685 +51685 +51685 +51686 +51686 +51687 +51687 +51687 +51688 +51688 +51688 +51689 +51689 +51689 +51690 +51690 +51690 +51691 +51691 +51692 +51692 +51692 +51693 +51693 +51693 +51694 +51694 +51694 +51695 +51695 +51695 +51696 +51696 +51696 +51697 +51697 +51698 +51698 +51698 +51699 +51699 +51699 +51700 +51700 +51700 +51701 +51701 +51701 +51702 +51702 +51702 +51703 +51703 +51704 +51704 +51704 +51705 +51705 +51705 +51706 +51706 +51706 +51707 +51707 +51707 +51708 +51708 +51708 +51709 +51709 +51709 +51710 +51710 +51711 +51711 +51711 +51712 +51712 +51712 +51713 +51713 +51713 +51714 +51714 +51714 +51715 +51715 +51715 +51716 +51716 +51716 +51717 +51717 +51717 +51718 +51718 +51719 +51719 +51719 +51720 +51720 +51720 +51721 +51721 +51721 +51722 +51722 +51722 +51723 +51723 +51723 +51724 +51724 +51724 +51725 +51725 +51725 +51726 +51726 +51726 +51727 +51727 +51728 +51728 +51728 +51729 +51729 +51729 +51730 +51730 +51730 +51731 +51731 +51731 +51732 +51732 +51732 +51733 +51733 +51733 +51734 +51734 +51734 +51735 +51735 +51735 +51736 +51736 +51736 +51737 +51737 +51737 +51738 +51738 +51739 +51739 +51739 +51740 +51740 +51740 +51741 +51741 +51742 +51742 +51743 +51744 +51744 +51745 +51746 +51746 +51747 +51748 +51748 +51749 +51750 +51750 +51751 +51752 +51752 +51753 +51754 +51754 +51755 +51756 +51756 +51757 +51758 +51759 +51759 +51760 +51761 +51761 +51762 +51763 +51763 +51764 +51765 +51765 +51766 +51767 +51767 +51768 +51769 +51769 +51770 +51771 +51771 +51772 +51773 +51773 +51774 +51775 +51775 +51776 +51777 +51777 +51778 +51779 +51779 +51780 +51781 +51781 +51782 +51782 +51783 +51784 +51784 +51785 +51786 +51786 +51787 +51788 +51788 +51789 +51790 +51790 +51791 +51792 +51792 +51793 +51794 +51794 +51795 +51796 +51796 +51797 +51798 +51798 +51799 +51800 +51800 +51801 +51802 +51802 +51803 +51803 +51804 +51805 +51805 +51806 +51807 +51807 +51808 +51809 +51809 +51810 +51811 +51811 +51812 +51813 +51813 +51814 +51814 +51815 +51816 +51816 +51817 +51818 +51818 +51819 +51820 +51820 +51821 +51822 +51822 +51823 +51823 +51824 +51825 +51825 +51826 +51827 +51827 +51828 +51829 +51829 +51830 +51830 +51831 +51832 +51832 +51833 +51834 +51834 +51835 +51836 +51836 +51837 +51837 +51838 +51839 +51839 +51840 +51841 +51841 +51842 +51843 +51843 +51844 +51844 +51845 +51846 +51846 +51847 +51848 +51848 +51849 +51849 +51850 +51851 +51851 +51852 +51853 +51853 +51854 +51854 +51855 +51856 +51856 +51857 +51858 +51858 +51859 +51859 +51860 +51861 +51861 +51862 +51863 +51863 +51864 +51864 +51865 +51866 +51866 +51867 +51868 +51868 +51869 +51869 +51870 +51871 +51871 +51872 +51872 +51873 +51874 +51874 +51875 +51876 +51876 +51877 +51877 +51878 +51879 +51879 +51880 +51880 +51881 +51882 +51882 +51883 +51884 +51884 +51885 +51885 +51886 +51887 +51887 +51888 +51888 +51889 +51890 +51890 +51891 +51892 +51892 +51893 +51893 +51894 +51895 +51895 +51896 +51896 +51897 +51898 +51898 +51899 +51899 +51900 +51901 +51901 +51902 +51902 +51903 +51904 +51904 +51905 +51905 +51906 +51907 +51907 +51908 +51908 +51909 +51910 +51910 +51911 +51911 +51912 +51913 +51913 +51914 +51914 +51915 +51916 +51916 +51917 +51917 +51918 +51919 +51919 +51920 +51920 +51921 +51922 +51922 +51923 +51923 +51924 +51925 +51925 +51926 +51926 +51927 +51928 +51928 +51929 +51929 +51930 +51931 +51931 +51932 +51932 +51933 +51934 +51934 +51935 +51935 +51936 +51936 +51937 +51938 +51938 +51939 +51939 +51940 +51941 +51941 +51942 +51942 +51943 +51944 +51944 +51945 +51945 +51946 +51946 +51947 +51948 +51948 +51949 +51949 +51950 +51951 +51951 +51952 +51952 +51953 +51953 +51954 +51955 +51955 +51956 +51956 +51957 +51958 +51958 +51959 +51959 +51960 +51960 +51961 +51962 +51962 +51963 +51963 +51964 +51965 +51965 +51966 +51966 +51967 +51967 +51968 +51969 +51969 +51970 +51970 +51971 +51971 +51972 +51973 +51973 +51974 +51974 +51975 +51975 +51976 +51977 +51977 +51978 +51978 +51979 +51979 +51980 +51981 +51981 +51982 +51982 +51983 +51983 +51984 +51985 +51985 +51986 +51986 +51987 +51987 +51988 +51989 +51989 +51990 +51990 +51991 +51991 +51992 +51993 +51993 +51994 +51994 +51995 +51995 +51996 +51997 +51997 +51998 +51998 +51999 +51999 +52000 +52001 +52001 +52002 +52002 +52003 +52003 +52004 +52004 +52005 +52006 +52006 +52007 +52007 +52008 +52008 +52009 +52010 +52010 +52011 +52011 +52012 +52012 +52013 +52013 +52014 +52015 +52015 +52016 +52016 +52017 +52017 +52018 +52018 +52019 +52020 +52020 +52021 +52021 +52022 +52022 +52023 +52023 +52024 +52025 +52025 +52026 +52026 +52027 +52027 +52028 +52028 +52029 +52030 +52030 +52031 +52031 +52032 +52032 +52033 +52033 +52034 +52035 +52035 +52036 +52036 +52037 +52037 +52038 +52038 +52039 +52040 +52040 +52041 +52041 +52042 +52042 +52043 +52043 +52044 +52044 +52045 +52046 +52046 +52047 +52047 +52048 +52048 +52049 +52049 +52050 +52050 +52051 +52052 +52052 +52053 +52053 +52054 +52054 +52055 +52055 +52056 +52056 +52057 +52058 +52058 +52059 +52059 +52060 +52060 +52061 +52061 +52062 +52062 +52063 +52064 +52064 +52065 +52065 +52066 +52066 +52067 +52067 +52068 +52068 +52069 +52069 +52070 +52071 +52071 +52072 +52072 +52073 +52073 +52074 +52074 +52075 +52075 +52076 +52076 +52077 +52078 +52078 +52079 +52079 +52080 +52080 +52081 +52081 +52082 +52082 +52083 +52083 +52084 +52085 +52085 +52086 +52086 +52087 +52087 +52088 +52088 +52089 +52089 +52090 +52090 +52091 +52091 +52092 +52092 +52093 +52094 +52094 +52095 +52095 +52096 +52096 +52097 +52097 +52098 +52098 +52099 +52099 +52100 +52100 +52101 +52102 +52102 +52103 +52103 +52104 +52104 +52105 +52105 +52106 +52106 +52107 +52107 +52108 +52108 +52109 +52109 +52110 +52110 +52111 +52112 +52112 +52113 +52113 +52114 +52114 +52115 +52115 +52116 +52116 +52117 +52117 +52118 +52118 +52119 +52119 +52120 +52120 +52121 +52121 +52122 +52122 +52123 +52124 +52124 +52125 +52125 +52126 +52126 +52127 +52127 +52128 +52128 +52129 +52129 +52130 +52130 +52131 +52131 +52132 +52132 +52133 +52133 +52134 +52134 +52135 +52135 +52136 +52137 +52137 +52138 +52138 +52139 +52139 +52140 +52140 +52141 +52141 +52142 +52142 +52143 +52143 +52144 +52144 +52145 +52145 +52146 +52146 +52147 +52147 +52148 +52148 +52149 +52149 +52150 +52150 +52151 +52151 +52152 +52152 +52153 +52153 +52154 +52154 +52155 +52156 +52156 +52157 +52157 +52158 +52158 +52159 +52159 +52160 +52160 +52161 +52161 +52162 +52162 +52163 +52163 +52164 +52164 +52165 +52165 +52166 +52166 +52167 +52167 +52168 +52168 +52169 +52169 +52170 +52170 +52171 +52171 +52172 +52172 +52173 +52173 +52174 +52174 +52175 +52175 +52176 +52176 +52177 +52177 +52178 +52178 +52179 +52179 +52180 +52180 +52181 +52181 +52182 +52182 +52183 +52183 +52184 +52184 +52185 +52185 +52186 +52186 +52187 +52187 +52188 +52188 +52189 +52189 +52190 +52190 +52191 +52191 +52192 +52192 +52193 +52193 +52194 +52194 +52195 +52195 +52196 +52196 +52197 +52197 +52198 +52198 +52199 +52199 +52200 +52200 +52201 +52201 +52202 +52202 +52203 +52203 +52204 +52204 +52205 +52205 +52206 +52206 +52207 +52207 +52208 +52208 +52209 +52209 +52210 +52210 +52211 +52211 +52212 +52212 +52213 +52213 +52214 +52214 +52215 +52215 +52216 +52216 +52217 +52217 +52218 +52218 +52219 +52219 +52220 +52220 +52221 +52221 +52222 +52222 +52223 +52223 +52224 +52224 +52224 +52225 +52225 +52225 +52225 +52225 +52226 +52226 +52226 +52226 +52227 +52227 +52227 +52227 +52228 +52228 +52228 +52228 +52229 +52229 +52229 +52229 +52230 +52230 +52230 +52230 +52231 +52231 +52231 +52231 +52232 +52232 +52232 +52232 +52233 +52233 +52233 +52233 +52234 +52234 +52234 +52234 +52234 +52235 +52235 +52235 +52235 +52236 +52236 +52236 +52236 +52237 +52237 +52237 +52237 +52238 +52238 +52238 +52238 +52239 +52239 +52239 +52239 +52240 +52240 +52240 +52240 +52240 +52241 +52241 +52241 +52241 +52242 +52242 +52242 +52242 +52243 +52243 +52243 +52243 +52244 +52244 +52244 +52244 +52245 +52245 +52245 +52245 +52246 +52246 +52246 +52246 +52246 +52247 +52247 +52247 +52247 +52248 +52248 +52248 +52248 +52249 +52249 +52249 +52249 +52250 +52250 +52250 +52250 +52251 +52251 +52251 +52251 +52251 +52252 +52252 +52252 +52252 +52253 +52253 +52253 +52253 +52254 +52254 +52254 +52254 +52255 +52255 +52255 +52255 +52255 +52256 +52256 +52256 +52256 +52257 +52257 +52257 +52257 +52258 +52258 +52258 +52258 +52259 +52259 +52259 +52259 +52259 +52260 +52260 +52260 +52260 +52261 +52261 +52261 +52261 +52262 +52262 +52262 +52262 +52263 +52263 +52263 +52263 +52263 +52264 +52264 +52264 +52264 +52265 +52265 +52265 +52265 +52266 +52266 +52266 +52266 +52267 +52267 +52267 +52268 +52268 +52269 +52269 +52270 +52270 +52271 +52271 +52272 +52272 +52273 +52273 +52273 +52274 +52274 +52275 +52275 +52276 +52276 +52277 +52277 +52278 +52278 +52279 +52279 +52279 +52280 +52280 +52281 +52281 +52282 +52282 +52283 +52283 +52284 +52284 +52284 +52285 +52285 +52286 +52286 +52287 +52287 +52288 +52288 +52289 +52289 +52289 +52290 +52290 +52291 +52291 +52292 +52292 +52293 +52293 +52294 +52294 +52294 +52295 +52295 +52296 +52296 +52297 +52297 +52298 +52298 +52299 +52299 +52299 +52300 +52300 +52301 +52301 +52302 +52302 +52303 +52303 +52303 +52304 +52304 +52305 +52305 +52306 +52306 +52307 +52307 +52307 +52308 +52308 +52309 +52309 +52310 +52310 +52311 +52311 +52311 +52312 +52312 +52313 +52313 +52314 +52314 +52315 +52315 +52315 +52316 +52316 +52317 +52317 +52318 +52318 +52319 +52319 +52319 +52320 +52320 +52321 +52321 +52322 +52322 +52322 +52323 +52323 +52324 +52324 +52325 +52325 +52326 +52326 +52326 +52327 +52327 +52328 +52328 +52329 +52329 +52329 +52330 +52330 +52331 +52331 +52332 +52332 +52332 +52333 +52333 +52334 +52334 +52335 +52335 +52335 +52336 +52336 +52337 +52337 +52338 +52338 +52339 +52339 +52339 +52340 +52340 +52341 +52341 +52342 +52342 +52342 +52343 +52343 +52344 +52344 +52345 +52345 +52345 +52346 +52346 +52347 +52347 +52347 +52348 +52348 +52349 +52349 +52350 +52350 +52350 +52351 +52351 +52352 +52352 +52353 +52353 +52353 +52354 +52354 +52355 +52355 +52356 +52356 +52356 +52357 +52357 +52358 +52358 +52359 +52359 +52359 +52360 +52360 +52361 +52361 +52361 +52362 +52362 +52363 +52363 +52364 +52364 +52364 +52365 +52365 +52366 +52366 +52366 +52367 +52367 +52368 +52368 +52369 +52369 +52369 +52370 +52370 +52371 +52371 +52371 +52372 +52372 +52373 +52373 +52374 +52374 +52374 +52375 +52375 +52376 +52376 +52376 +52377 +52377 +52378 +52378 +52378 +52379 +52379 +52380 +52380 +52381 +52381 +52381 +52382 +52382 +52383 +52383 +52383 +52384 +52384 +52385 +52385 +52385 +52386 +52386 +52387 +52387 +52388 +52388 +52388 +52389 +52389 +52390 +52390 +52390 +52391 +52391 +52392 +52392 +52392 +52393 +52393 +52394 +52394 +52394 +52395 +52395 +52396 +52396 +52396 +52397 +52397 +52398 +52398 +52398 +52399 +52399 +52400 +52400 +52400 +52401 +52401 +52402 +52402 +52403 +52403 +52403 +52404 +52404 +52405 +52405 +52405 +52406 +52406 +52407 +52407 +52407 +52408 +52408 +52409 +52409 +52409 +52410 +52410 +52411 +52411 +52411 +52412 +52412 +52412 +52413 +52413 +52414 +52414 +52414 +52415 +52415 +52416 +52416 +52416 +52417 +52417 +52418 +52418 +52418 +52419 +52419 +52420 +52420 +52420 +52421 +52421 +52422 +52422 +52422 +52423 +52423 +52424 +52424 +52424 +52425 +52425 +52426 +52426 +52426 +52427 +52427 +52428 +52428 +52428 +52429 +52429 +52429 +52430 +52430 +52431 +52431 +52431 +52432 +52432 +52433 +52433 +52433 +52434 +52434 +52435 +52435 +52435 +52436 +52436 +52436 +52437 +52437 +52438 +52438 +52438 +52439 +52439 +52440 +52440 +52440 +52441 +52441 +52442 +52442 +52442 +52443 +52443 +52443 +52444 +52444 +52445 +52445 +52445 +52446 +52446 +52447 +52447 +52447 +52448 +52448 +52448 +52449 +52449 +52450 +52450 +52450 +52451 +52451 +52452 +52452 +52452 +52453 +52453 +52453 +52454 +52454 +52455 +52455 +52455 +52456 +52456 +52456 +52457 +52457 +52458 +52458 +52458 +52459 +52459 +52460 +52460 +52460 +52461 +52461 +52461 +52462 +52462 +52463 +52463 +52463 +52464 +52464 +52464 +52465 +52465 +52466 +52466 +52466 +52467 +52467 +52467 +52468 +52468 +52469 +52469 +52469 +52470 +52470 +52470 +52471 +52471 +52472 +52472 +52472 +52473 +52473 +52473 +52474 +52474 +52475 +52475 +52475 +52476 +52476 +52476 +52477 +52477 +52478 +52478 +52478 +52479 +52479 +52479 +52480 +52480 +52481 +52481 +52481 +52482 +52482 +52482 +52483 +52483 +52484 +52484 +52484 +52485 +52485 +52485 +52486 +52486 +52487 +52487 +52487 +52488 +52488 +52488 +52489 +52489 +52489 +52490 +52490 +52491 +52491 +52491 +52492 +52492 +52492 +52493 +52493 +52494 +52494 +52494 +52495 +52495 +52495 +52496 +52496 +52496 +52497 +52497 +52498 +52498 +52498 +52499 +52499 +52499 +52500 +52500 +52500 +52501 +52501 +52502 +52502 +52502 +52503 +52503 +52503 +52504 +52504 +52504 +52505 +52505 +52506 +52506 +52506 +52507 +52507 +52507 +52508 +52508 +52508 +52509 +52509 +52510 +52510 +52510 +52511 +52511 +52511 +52512 +52512 +52512 +52513 +52513 +52514 +52514 +52514 +52515 +52515 +52515 +52516 +52516 +52516 +52517 +52517 +52517 +52518 +52518 +52519 +52519 +52519 +52520 +52520 +52520 +52521 +52521 +52521 +52522 +52522 +52523 +52523 +52523 +52524 +52524 +52524 +52525 +52525 +52525 +52526 +52526 +52526 +52527 +52527 +52528 +52528 +52528 +52529 +52529 +52529 +52530 +52530 +52530 +52531 +52531 +52531 +52532 +52532 +52532 +52533 +52533 +52534 +52534 +52534 +52535 +52535 +52535 +52536 +52536 +52536 +52537 +52537 +52537 +52538 +52538 +52538 +52539 +52539 +52540 +52540 +52540 +52541 +52541 +52541 +52542 +52542 +52542 +52543 +52543 +52543 +52544 +52544 +52544 +52545 +52545 +52546 +52546 +52546 +52547 +52547 +52547 +52548 +52548 +52548 +52549 +52549 +52549 +52550 +52550 +52550 +52551 +52551 +52551 +52552 +52552 +52552 +52553 +52553 +52554 +52554 +52554 +52555 +52555 +52555 +52556 +52556 +52556 +52557 +52557 +52557 +52558 +52558 +52558 +52559 +52559 +52559 +52560 +52560 +52560 +52561 +52561 +52562 +52562 +52562 +52563 +52563 +52563 +52564 +52564 +52564 +52565 +52565 +52565 +52566 +52566 +52566 +52567 +52567 +52567 +52568 +52568 +52568 +52569 +52569 +52569 +52570 +52570 +52570 +52571 +52571 +52571 +52572 +52572 +52572 +52573 +52573 +52574 +52574 +52574 +52575 +52575 +52575 +52576 +52576 +52576 +52577 +52577 +52577 +52578 +52578 +52578 +52579 +52579 +52579 +52580 +52580 +52580 +52581 +52581 +52581 +52582 +52582 +52582 +52583 +52583 +52583 +52584 +52584 +52584 +52585 +52585 +52585 +52586 +52586 +52586 +52587 +52587 +52587 +52588 +52588 +52588 +52589 +52589 +52589 +52590 +52590 +52590 +52591 +52591 +52591 +52592 +52592 +52592 +52593 +52593 +52593 +52594 +52594 +52594 +52595 +52595 +52595 +52596 +52596 +52596 +52597 +52597 +52598 +52598 +52598 +52599 +52599 +52599 +52600 +52600 +52600 +52601 +52601 +52601 +52602 +52602 +52602 +52603 +52603 +52603 +52604 +52604 +52604 +52604 +52605 +52605 +52605 +52606 +52606 +52606 +52607 +52607 +52607 +52608 +52608 +52608 +52609 +52609 +52609 +52610 +52610 +52610 +52611 +52611 +52611 +52612 +52612 +52612 +52613 +52613 +52613 +52614 +52614 +52614 +52615 +52615 +52615 +52616 +52616 +52616 +52617 +52617 +52617 +52618 +52618 +52618 +52619 +52619 +52619 +52620 +52620 +52620 +52621 +52621 +52621 +52622 +52622 +52622 +52623 +52623 +52623 +52624 +52624 +52624 +52625 +52625 +52625 +52626 +52626 +52626 +52627 +52627 +52627 +52628 +52628 +52628 +52628 +52629 +52629 +52629 +52630 +52630 +52630 +52631 +52631 +52631 +52632 +52632 +52632 +52633 +52633 +52633 +52634 +52634 +52634 +52635 +52635 +52635 +52636 +52636 +52636 +52637 +52637 +52637 +52638 +52638 +52638 +52639 +52639 +52639 +52640 +52640 +52640 +52640 +52641 +52641 +52641 +52642 +52642 +52642 +52643 +52643 +52643 +52644 +52644 +52644 +52645 +52645 +52645 +52646 +52646 +52646 +52647 +52647 +52647 +52648 +52648 +52648 +52648 +52649 +52649 +52649 +52650 +52650 +52650 +52651 +52651 +52651 +52652 +52652 +52652 +52653 +52653 +52653 +52654 +52654 +52654 +52655 +52655 +52656 +52656 +52657 +52658 +52658 +52659 +52660 +52660 +52661 +52662 +52662 +52663 +52663 +52664 +52665 +52665 +52666 +52667 +52667 +52668 +52668 +52669 +52670 +52670 +52671 +52672 +52672 +52673 +52673 +52674 +52675 +52675 +52676 +52677 +52677 +52678 +52678 +52679 +52680 +52680 +52681 +52682 +52682 +52683 +52683 +52684 +52685 +52685 +52686 +52687 +52687 +52688 +52688 +52689 +52690 +52690 +52691 +52692 +52692 +52693 +52693 +52694 +52695 +52695 +52696 +52696 +52697 +52698 +52698 +52699 +52700 +52700 +52701 +52701 +52702 +52703 +52703 +52704 +52704 +52705 +52706 +52706 +52707 +52707 +52708 +52709 +52709 +52710 +52711 +52711 +52712 +52712 +52713 +52714 +52714 +52715 +52715 +52716 +52717 +52717 +52718 +52718 +52719 +52720 +52720 +52721 +52721 +52722 +52723 +52723 +52724 +52724 +52725 +52726 +52726 +52727 +52727 +52728 +52729 +52729 +52730 +52730 +52731 +52732 +52732 +52733 +52733 +52734 +52735 +52735 +52736 +52736 +52737 +52738 +52738 +52739 +52739 +52740 +52741 +52741 +52742 +52742 +52743 +52743 +52744 +52745 +52745 +52746 +52746 +52747 +52748 +52748 +52749 +52749 +52750 +52751 +52751 +52752 +52752 +52753 +52753 +52754 +52755 +52755 +52756 +52756 +52757 +52758 +52758 +52759 +52759 +52760 +52761 +52761 +52762 +52762 +52763 +52763 +52764 +52765 +52765 +52766 +52766 +52767 +52768 +52768 +52769 +52769 +52770 +52770 +52771 +52772 +52772 +52773 +52773 +52774 +52774 +52775 +52776 +52776 +52777 +52777 +52778 +52778 +52779 +52780 +52780 +52781 +52781 +52782 +52783 +52783 +52784 +52784 +52785 +52785 +52786 +52787 +52787 +52788 +52788 +52789 +52789 +52790 +52791 +52791 +52792 +52792 +52793 +52793 +52794 +52795 +52795 +52796 +52796 +52797 +52797 +52798 +52798 +52799 +52800 +52800 +52801 +52801 +52802 +52802 +52803 +52804 +52804 +52805 +52805 +52806 +52806 +52807 +52808 +52808 +52809 +52809 +52810 +52810 +52811 +52811 +52812 +52813 +52813 +52814 +52814 +52815 +52815 +52816 +52816 +52817 +52818 +52818 +52819 +52819 +52820 +52820 +52821 +52822 +52822 +52823 +52823 +52824 +52824 +52825 +52825 +52826 +52827 +52827 +52828 +52828 +52829 +52829 +52830 +52830 +52831 +52832 +52832 +52833 +52833 +52834 +52834 +52835 +52835 +52836 +52836 +52837 +52838 +52838 +52839 +52839 +52840 +52840 +52841 +52841 +52842 +52843 +52843 +52844 +52844 +52845 +52845 +52846 +52846 +52847 +52847 +52848 +52849 +52849 +52850 +52850 +52851 +52851 +52852 +52852 +52853 +52853 +52854 +52855 +52855 +52856 +52856 +52857 +52857 +52858 +52858 +52859 +52859 +52860 +52860 +52861 +52862 +52862 +52863 +52863 +52864 +52864 +52865 +52865 +52866 +52866 +52867 +52868 +52868 +52869 +52869 +52870 +52870 +52871 +52871 +52872 +52872 +52873 +52873 +52874 +52874 +52875 +52876 +52876 +52877 +52877 +52878 +52878 +52879 +52879 +52880 +52880 +52881 +52881 +52882 +52882 +52883 +52884 +52884 +52885 +52885 +52886 +52886 +52887 +52887 +52888 +52888 +52889 +52889 +52890 +52890 +52891 +52892 +52892 +52893 +52893 +52894 +52894 +52895 +52895 +52896 +52896 +52897 +52897 +52898 +52898 +52899 +52899 +52900 +52900 +52901 +52902 +52902 +52903 +52903 +52904 +52904 +52905 +52905 +52906 +52906 +52907 +52907 +52908 +52908 +52909 +52909 +52910 +52910 +52911 +52911 +52912 +52912 +52913 +52914 +52914 +52915 +52915 +52916 +52916 +52917 +52917 +52918 +52918 +52919 +52919 +52920 +52920 +52921 +52921 +52922 +52922 +52923 +52923 +52924 +52924 +52925 +52925 +52926 +52926 +52927 +52928 +52928 +52929 +52929 +52930 +52930 +52931 +52931 +52932 +52932 +52933 +52933 +52934 +52934 +52935 +52935 +52936 +52936 +52937 +52937 +52938 +52938 +52939 +52939 +52940 +52940 +52941 +52941 +52942 +52942 +52943 +52943 +52944 +52944 +52945 +52945 +52946 +52946 +52947 +52947 +52948 +52948 +52949 +52950 +52950 +52951 +52951 +52952 +52952 +52953 +52953 +52954 +52954 +52955 +52955 +52956 +52956 +52957 +52957 +52958 +52958 +52959 +52959 +52960 +52960 +52961 +52961 +52962 +52962 +52963 +52963 +52964 +52964 +52965 +52965 +52966 +52966 +52967 +52967 +52968 +52968 +52969 +52969 +52970 +52970 +52971 +52971 +52972 +52972 +52973 +52973 +52974 +52974 +52975 +52975 +52976 +52976 +52977 +52977 +52978 +52978 +52979 +52979 +52980 +52980 +52981 +52981 +52982 +52982 +52983 +52983 +52984 +52984 +52985 +52985 +52986 +52986 +52987 +52987 +52988 +52988 +52989 +52989 +52990 +52990 +52991 +52991 +52992 +52992 +52992 +52993 +52993 +52994 +52994 +52995 +52995 +52996 +52996 +52997 +52997 +52998 +52998 +52999 +52999 +53000 +53000 +53001 +53001 +53002 +53002 +53003 +53003 +53004 +53004 +53005 +53005 +53006 +53006 +53007 +53007 +53008 +53008 +53009 +53009 +53010 +53010 +53011 +53011 +53012 +53012 +53013 +53013 +53014 +53014 +53014 +53015 +53015 +53016 +53016 +53017 +53017 +53018 +53018 +53019 +53019 +53020 +53020 +53021 +53021 +53022 +53022 +53023 +53023 +53024 +53024 +53025 +53025 +53026 +53026 +53027 +53027 +53028 +53028 +53028 +53029 +53029 +53030 +53030 +53031 +53031 +53032 +53032 +53033 +53033 +53034 +53034 +53035 +53035 +53036 +53036 +53037 +53037 +53038 +53038 +53039 +53039 +53040 +53040 +53040 +53041 +53041 +53042 +53042 +53043 +53043 +53044 +53044 +53045 +53045 +53046 +53046 +53047 +53047 +53048 +53048 +53049 +53049 +53049 +53050 +53050 +53051 +53051 +53052 +53052 +53053 +53053 +53054 +53054 +53055 +53055 +53056 +53056 +53057 +53057 +53058 +53058 +53058 +53059 +53059 +53060 +53060 +53061 +53061 +53062 +53062 +53063 +53063 +53064 +53064 +53065 +53065 +53066 +53066 +53066 +53067 +53067 +53068 +53068 +53069 +53069 +53070 +53070 +53071 +53071 +53072 +53072 +53073 +53073 +53073 +53074 +53074 +53075 +53075 +53076 +53076 +53077 +53077 +53078 +53078 +53079 +53079 +53080 +53080 +53080 +53081 +53081 +53082 +53082 +53083 +53083 +53084 +53084 +53085 +53085 +53086 +53086 +53086 +53087 +53087 +53088 +53088 +53089 +53089 +53090 +53090 +53091 +53091 +53092 +53092 +53092 +53093 +53093 +53094 +53094 +53095 +53095 +53096 +53096 +53097 +53097 +53098 +53098 +53098 +53099 +53099 +53100 +53100 +53101 +53101 +53102 +53102 +53103 +53103 +53103 +53104 +53104 +53105 +53105 +53106 +53106 +53107 +53107 +53108 +53108 +53109 +53109 +53109 +53110 +53110 +53111 +53111 +53112 +53112 +53113 +53113 +53114 +53114 +53114 +53115 +53115 +53116 +53116 +53117 +53117 +53118 +53118 +53119 +53119 +53119 +53120 +53120 +53121 +53121 +53122 +53122 +53123 +53123 +53124 +53124 +53124 +53125 +53125 +53126 +53126 +53127 +53127 +53128 +53128 +53128 +53129 +53129 +53130 +53130 +53131 +53131 +53132 +53132 +53133 +53133 +53133 +53134 +53134 +53135 +53135 +53136 +53136 +53137 +53137 +53137 +53138 +53138 +53139 +53139 +53140 +53140 +53141 +53141 +53141 +53142 +53142 +53143 +53143 +53144 +53144 +53145 +53145 +53145 +53146 +53146 +53147 +53147 +53148 +53148 +53149 +53149 +53149 +53150 +53150 +53151 +53151 +53152 +53152 +53153 +53153 +53153 +53154 +53154 +53155 +53155 +53156 +53156 +53157 +53157 +53157 +53158 +53158 +53159 +53159 +53160 +53160 +53161 +53161 +53161 +53162 +53162 +53163 +53163 +53164 +53164 +53165 +53165 +53165 +53166 +53166 +53167 +53167 +53168 +53168 +53168 +53169 +53169 +53170 +53170 +53171 +53171 +53172 +53172 +53172 +53173 +53173 +53174 +53174 +53175 +53175 +53175 +53176 +53176 +53177 +53177 +53178 +53178 +53179 +53179 +53179 +53180 +53180 +53181 +53181 +53182 +53182 +53182 +53183 +53183 +53184 +53184 +53185 +53186 +53186 +53187 +53188 +53189 +53190 +53191 +53192 +53192 +53193 +53194 +53195 +53196 +53197 +53198 +53198 +53199 +53200 +53201 +53202 +53203 +53204 +53205 +53205 +53206 +53207 +53208 +53209 +53210 +53211 +53211 +53212 +53213 +53214 +53215 +53216 +53216 +53217 +53218 +53219 +53220 +53221 +53222 +53222 +53223 +53224 +53225 +53226 +53227 +53228 +53228 +53229 +53230 +53231 +53232 +53233 +53233 +53234 +53235 +53236 +53237 +53238 +53239 +53239 +53240 +53241 +53242 +53243 +53244 +53244 +53245 +53246 +53247 +53248 +53248 +53249 +53249 +53250 +53250 +53250 +53251 +53251 +53252 +53252 +53252 +53253 +53253 +53254 +53254 +53255 +53255 +53255 +53256 +53256 +53257 +53257 +53257 +53258 +53258 +53259 +53259 +53259 +53260 +53260 +53261 +53261 +53262 +53262 +53262 +53263 +53263 +53264 +53264 +53264 +53265 +53265 +53266 +53266 +53266 +53267 +53267 +53268 +53268 +53269 +53269 +53269 +53270 +53270 +53271 +53271 +53271 +53272 +53272 +53273 +53273 +53273 +53274 +53274 +53275 +53275 +53275 +53276 +53276 +53277 +53277 +53277 +53278 +53278 +53279 +53279 +53279 +53280 +53280 +53281 +53281 +53281 +53282 +53282 +53283 +53283 +53283 +53284 +53284 +53285 +53285 +53286 +53286 +53286 +53287 +53287 +53288 +53288 +53288 +53289 +53289 +53289 +53290 +53290 +53291 +53291 +53291 +53292 +53292 +53293 +53293 +53293 +53294 +53294 +53295 +53295 +53295 +53296 +53296 +53297 +53297 +53297 +53298 +53298 +53299 +53299 +53299 +53300 +53300 +53301 +53301 +53301 +53302 +53302 +53303 +53303 +53303 +53304 +53304 +53305 +53305 +53305 +53306 +53306 +53306 +53307 +53307 +53308 +53308 +53308 +53309 +53309 +53310 +53310 +53310 +53311 +53311 +53312 +53312 +53312 +53313 +53313 +53313 +53314 +53314 +53315 +53315 +53315 +53316 +53316 +53317 +53317 +53317 +53318 +53318 +53318 +53319 +53319 +53320 +53320 +53320 +53321 +53321 +53322 +53322 +53322 +53323 +53323 +53323 +53324 +53324 +53325 +53325 +53325 +53326 +53326 +53327 +53327 +53327 +53328 +53328 +53328 +53329 +53329 +53330 +53330 +53330 +53331 +53331 +53331 +53332 +53332 +53333 +53333 +53333 +53334 +53334 +53335 +53335 +53335 +53336 +53336 +53336 +53337 +53337 +53338 +53338 +53338 +53339 +53339 +53339 +53340 +53340 +53341 +53341 +53341 +53342 +53342 +53342 +53343 +53343 +53344 +53344 +53344 +53345 +53345 +53345 +53346 +53346 +53347 +53347 +53347 +53348 +53348 +53348 +53349 +53349 +53350 +53350 +53350 +53351 +53351 +53351 +53352 +53352 +53353 +53353 +53353 +53354 +53354 +53354 +53355 +53355 +53355 +53356 +53356 +53357 +53357 +53357 +53358 +53358 +53358 +53359 +53359 +53360 +53360 +53360 +53361 +53361 +53361 +53362 +53362 +53362 +53363 +53363 +53364 +53364 +53364 +53365 +53365 +53365 +53366 +53366 +53367 +53367 +53367 +53368 +53368 +53368 +53369 +53369 +53369 +53370 +53370 +53371 +53371 +53371 +53372 +53372 +53372 +53373 +53373 +53373 +53374 +53374 +53375 +53375 +53375 +53376 +53376 +53376 +53377 +53377 +53377 +53378 +53378 +53379 +53379 +53379 +53380 +53380 +53380 +53381 +53381 +53381 +53382 +53382 +53382 +53383 +53383 +53384 +53384 +53384 +53385 +53385 +53385 +53386 +53386 +53386 +53387 +53387 +53388 +53388 +53388 +53389 +53389 +53389 +53390 +53390 +53390 +53391 +53391 +53391 +53392 +53392 +53392 +53393 +53393 +53394 +53394 +53394 +53395 +53395 +53395 +53396 +53396 +53396 +53397 +53397 +53397 +53398 +53398 +53399 +53399 +53399 +53400 +53400 +53400 +53401 +53401 +53401 +53402 +53402 +53402 +53403 +53403 +53403 +53404 +53404 +53405 +53405 +53405 +53406 +53406 +53406 +53407 +53407 +53407 +53408 +53408 +53408 +53409 +53409 +53409 +53410 +53410 +53410 +53411 +53411 +53412 +53412 +53412 +53413 +53413 +53413 +53414 +53414 +53414 +53415 +53415 +53415 +53416 +53416 +53416 +53417 +53417 +53417 +53418 +53418 +53418 +53419 +53419 +53420 +53420 +53420 +53421 +53421 +53421 +53422 +53422 +53422 +53423 +53423 +53423 +53424 +53424 +53424 +53425 +53425 +53425 +53426 +53426 +53426 +53427 +53427 +53427 +53428 +53428 +53428 +53429 +53429 +53429 +53430 +53430 +53431 +53431 +53431 +53432 +53432 +53432 +53433 +53433 +53433 +53434 +53434 +53434 +53435 +53435 +53435 +53436 +53436 +53436 +53437 +53437 +53437 +53438 +53438 +53438 +53439 +53439 +53439 +53440 +53440 +53440 +53441 +53441 +53441 +53442 +53442 +53442 +53443 +53443 +53443 +53444 +53444 +53444 +53445 +53445 +53445 +53446 +53446 +53446 +53447 +53447 +53447 +53448 +53448 +53448 +53449 +53449 +53449 +53450 +53450 +53450 +53451 +53451 +53452 +53452 +53452 +53453 +53453 +53453 +53454 +53454 +53454 +53455 +53455 +53455 +53456 +53456 +53456 +53457 +53457 +53457 +53458 +53458 +53458 +53459 +53459 +53459 +53460 +53460 +53460 +53461 +53461 +53461 +53461 +53462 +53462 +53462 +53463 +53463 +53463 +53464 +53464 +53464 +53465 +53465 +53465 +53466 +53466 +53466 +53467 +53467 +53467 +53468 +53468 +53468 +53469 +53469 +53469 +53470 +53470 +53470 +53471 +53471 +53471 +53472 +53472 +53472 +53473 +53473 +53473 +53474 +53474 +53474 +53475 +53475 +53475 +53476 +53476 +53476 +53477 +53477 +53477 +53478 +53478 +53478 +53479 +53479 +53479 +53480 +53480 +53480 +53481 +53481 +53481 +53482 +53482 +53482 +53483 +53483 +53483 +53483 +53484 +53484 +53484 +53485 +53485 +53485 +53486 +53486 +53486 +53487 +53487 +53487 +53488 +53488 +53488 +53489 +53489 +53489 +53490 +53490 +53490 +53491 +53491 +53491 +53492 +53492 +53492 +53493 +53493 +53493 +53493 +53494 +53494 +53494 +53495 +53495 +53495 +53496 +53496 +53496 +53497 +53497 +53497 +53498 +53498 +53498 +53499 +53499 +53499 +53500 +53500 +53500 +53501 +53501 +53501 +53501 +53502 +53502 +53502 +53503 +53503 +53503 +53504 +53504 +53504 +53505 +53505 +53505 +53506 +53506 +53506 +53507 +53507 +53507 +53508 +53508 +53508 +53508 +53509 +53509 +53509 +53510 +53510 +53510 +53511 +53511 +53511 +53512 +53512 +53512 +53513 +53513 +53513 +53514 +53514 +53514 +53514 +53515 +53515 +53515 +53516 +53516 +53516 +53517 +53517 +53517 +53518 +53518 +53518 +53519 +53519 +53519 +53520 +53520 +53520 +53520 +53521 +53521 +53521 +53522 +53522 +53522 +53523 +53523 +53523 +53524 +53524 +53524 +53525 +53525 +53525 +53525 +53526 +53526 +53526 +53527 +53527 +53527 +53528 +53528 +53528 +53529 +53529 +53529 +53529 +53530 +53530 +53530 +53531 +53531 +53531 +53532 +53532 +53532 +53533 +53533 +53533 +53534 +53534 +53534 +53534 +53535 +53535 +53535 +53536 +53536 +53536 +53537 +53537 +53537 +53538 +53538 +53538 +53538 +53539 +53539 +53539 +53540 +53540 +53540 +53541 +53541 +53541 +53542 +53542 +53542 +53542 +53543 +53543 +53543 +53544 +53544 +53544 +53545 +53545 +53545 +53546 +53546 +53546 +53546 +53547 +53547 +53547 +53548 +53548 +53548 +53549 +53549 +53549 +53549 +53550 +53550 +53550 +53551 +53551 +53551 +53552 +53552 +53552 +53553 +53553 +53553 +53553 +53554 +53554 +53554 +53555 +53555 +53555 +53556 +53556 +53556 +53556 +53557 +53557 +53557 +53558 +53558 +53558 +53559 +53559 +53559 +53560 +53560 +53560 +53560 +53561 +53561 +53561 +53562 +53562 +53562 +53563 +53563 +53563 +53563 +53564 +53564 +53564 +53565 +53565 +53565 +53566 +53566 +53566 +53566 +53567 +53567 +53567 +53568 +53568 +53568 +53569 +53569 +53569 +53569 +53570 +53570 +53570 +53571 +53571 +53571 +53572 +53572 +53572 +53572 +53573 +53573 +53573 +53574 +53574 +53574 +53575 +53575 +53575 +53575 +53576 +53576 +53576 +53577 +53577 +53577 +53577 +53578 +53578 +53578 +53579 +53580 +53580 +53581 +53581 +53582 +53583 +53583 +53584 +53584 +53585 +53585 +53586 +53587 +53587 +53588 +53588 +53589 +53590 +53590 +53591 +53591 +53592 +53593 +53593 +53594 +53594 +53595 +53595 +53596 +53597 +53597 +53598 +53598 +53599 +53600 +53600 +53601 +53601 +53602 +53602 +53603 +53604 +53604 +53605 +53605 +53606 +53607 +53607 +53608 +53608 +53609 +53609 +53610 +53611 +53611 +53612 +53612 +53613 +53613 +53614 +53615 +53615 +53616 +53616 +53617 +53617 +53618 +53619 +53619 +53620 +53620 +53621 +53621 +53622 +53623 +53623 +53624 +53624 +53625 +53625 +53626 +53627 +53627 +53628 +53628 +53629 +53629 +53630 +53631 +53631 +53632 +53632 +53633 +53633 +53634 +53635 +53635 +53636 +53636 +53637 +53637 +53638 +53638 +53639 +53640 +53640 +53641 +53641 +53642 +53642 +53643 +53644 +53644 +53645 +53645 +53646 +53646 +53647 +53647 +53648 +53649 +53649 +53650 +53650 +53651 +53651 +53652 +53652 +53653 +53654 +53654 +53655 +53655 +53656 +53656 +53657 +53657 +53658 +53659 +53659 +53660 +53660 +53661 +53661 +53662 +53662 +53663 +53664 +53664 +53665 +53665 +53666 +53666 +53667 +53667 +53668 +53669 +53669 +53670 +53670 +53671 +53671 +53672 +53672 +53673 +53673 +53674 +53675 +53675 +53676 +53676 +53677 +53677 +53678 +53678 +53679 +53679 +53680 +53681 +53681 +53682 +53682 +53683 +53683 +53684 +53684 +53685 +53685 +53686 +53686 +53687 +53688 +53688 +53689 +53689 +53690 +53690 +53691 +53691 +53692 +53692 +53693 +53693 +53694 +53695 +53695 +53696 +53696 +53697 +53697 +53698 +53698 +53699 +53699 +53700 +53700 +53701 +53702 +53702 +53703 +53703 +53704 +53704 +53705 +53705 +53706 +53706 +53707 +53707 +53708 +53708 +53709 +53709 +53710 +53711 +53711 +53712 +53712 +53713 +53713 +53714 +53714 +53715 +53715 +53716 +53716 +53717 +53717 +53718 +53718 +53719 +53720 +53720 +53721 +53721 +53722 +53722 +53723 +53723 +53724 +53724 +53725 +53725 +53726 +53726 +53727 +53727 +53728 +53728 +53729 +53729 +53730 +53731 +53731 +53732 +53732 +53733 +53733 +53734 +53734 +53735 +53735 +53736 +53736 +53737 +53737 +53738 +53738 +53739 +53739 +53740 +53740 +53741 +53741 +53742 +53742 +53743 +53743 +53744 +53745 +53745 +53746 +53746 +53747 +53747 +53748 +53748 +53749 +53749 +53750 +53750 +53751 +53751 +53752 +53752 +53753 +53753 +53754 +53754 +53755 +53755 +53756 +53756 +53757 +53757 +53758 +53758 +53759 +53759 +53760 +53760 +53761 +53761 +53762 +53762 +53763 +53763 +53764 +53764 +53765 +53765 +53766 +53766 +53767 +53767 +53768 +53768 +53769 +53770 +53770 +53771 +53771 +53772 +53772 +53773 +53773 +53774 +53774 +53775 +53775 +53776 +53776 +53777 +53777 +53778 +53778 +53779 +53779 +53780 +53780 +53781 +53781 +53782 +53782 +53783 +53783 +53784 +53784 +53785 +53785 +53786 +53786 +53787 +53787 +53788 +53788 +53789 +53789 +53790 +53790 +53791 +53791 +53792 +53792 +53793 +53793 +53794 +53794 +53795 +53795 +53796 +53796 +53796 +53797 +53797 +53798 +53798 +53799 +53799 +53800 +53800 +53801 +53801 +53802 +53802 +53803 +53803 +53804 +53804 +53805 +53805 +53806 +53806 +53807 +53807 +53808 +53808 +53809 +53809 +53810 +53810 +53811 +53811 +53812 +53812 +53813 +53813 +53814 +53814 +53815 +53815 +53816 +53816 +53817 +53817 +53818 +53818 +53819 +53819 +53820 +53820 +53821 +53821 +53821 +53822 +53822 +53823 +53823 +53824 +53824 +53825 +53825 +53826 +53826 +53827 +53827 +53828 +53828 +53829 +53829 +53830 +53830 +53831 +53831 +53832 +53832 +53833 +53833 +53834 +53834 +53835 +53835 +53835 +53836 +53836 +53837 +53837 +53838 +53838 +53839 +53839 +53840 +53840 +53841 +53841 +53842 +53842 +53843 +53843 +53844 +53844 +53845 +53845 +53846 +53846 +53846 +53847 +53847 +53848 +53848 +53849 +53849 +53850 +53850 +53851 +53851 +53852 +53852 +53853 +53853 +53854 +53854 +53855 +53855 +53855 +53856 +53856 +53857 +53857 +53858 +53858 +53859 +53859 +53860 +53860 +53861 +53861 +53862 +53862 +53863 +53863 +53863 +53864 +53864 +53865 +53865 +53866 +53866 +53867 +53867 +53868 +53868 +53869 +53869 +53870 +53870 +53871 +53871 +53871 +53872 +53872 +53873 +53873 +53874 +53874 +53875 +53875 +53876 +53876 +53877 +53877 +53878 +53878 +53878 +53879 +53879 +53880 +53880 +53881 +53881 +53882 +53882 +53883 +53883 +53884 +53884 +53884 +53885 +53885 +53886 +53886 +53887 +53887 +53888 +53888 +53889 +53889 +53890 +53890 +53890 +53891 +53891 +53892 +53892 +53893 +53893 +53894 +53894 +53895 +53895 +53896 +53896 +53896 +53897 +53897 +53898 +53898 +53899 +53899 +53900 +53900 +53901 +53901 +53901 +53902 +53902 +53903 +53903 +53904 +53904 +53905 +53905 +53906 +53906 +53906 +53907 +53907 +53908 +53908 +53909 +53909 +53910 +53910 +53911 +53911 +53911 +53912 +53912 +53913 +53913 +53914 +53914 +53915 +53915 +53916 +53916 +53916 +53917 +53917 +53918 +53918 +53919 +53919 +53920 +53920 +53921 +53921 +53921 +53922 +53922 +53923 +53923 +53924 +53924 +53925 +53925 +53925 +53926 +53926 +53927 +53927 +53928 +53928 +53929 +53929 +53930 +53930 +53930 +53931 +53931 +53932 +53932 +53933 +53933 +53934 +53934 +53934 +53935 +53935 +53936 +53936 +53937 +53937 +53938 +53938 +53938 +53939 +53939 +53940 +53940 +53941 +53941 +53942 +53942 +53942 +53943 +53943 +53944 +53944 +53945 +53945 +53946 +53946 +53946 +53947 +53947 +53948 +53948 +53949 +53949 +53950 +53950 +53950 +53951 +53951 +53952 +53952 +53953 +53953 +53953 +53954 +53954 +53955 +53955 +53956 +53956 +53957 +53957 +53957 +53958 +53958 +53959 +53959 +53960 +53960 +53961 +53961 +53961 +53962 +53962 +53963 +53963 +53964 +53964 +53964 +53965 +53965 +53966 +53966 +53967 +53967 +53967 +53968 +53968 +53969 +53969 +53970 +53970 +53971 +53971 +53971 +53972 +53972 +53973 +53973 +53974 +53974 +53974 +53975 +53975 +53976 +53976 +53977 +53977 +53977 +53978 +53978 +53979 +53979 +53980 +53980 +53981 +53981 +53981 +53982 +53982 +53983 +53983 +53984 +53984 +53984 +53985 +53985 +53986 +53986 +53987 +53987 +53987 +53988 +53988 +53989 +53989 +53990 +53990 +53990 +53991 +53991 +53992 +53992 +53993 +53993 +53993 +53994 +53994 +53995 +53995 +53996 +53996 +53996 +53997 +53997 +53998 +53998 +53999 +53999 +53999 +54000 +54000 +54001 +54001 +54002 +54002 +54002 +54003 +54003 +54004 +54004 +54004 +54005 +54005 +54006 +54006 +54007 +54007 +54007 +54008 +54008 +54009 +54009 +54010 +54010 +54010 +54011 +54011 +54012 +54012 +54013 +54013 +54013 +54014 +54014 +54015 +54015 +54015 +54016 +54016 +54017 +54017 +54018 +54018 +54018 +54019 +54019 +54020 +54020 +54021 +54021 +54021 +54022 +54022 +54023 +54023 +54023 +54024 +54024 +54025 +54025 +54026 +54026 +54026 +54027 +54027 +54028 +54028 +54029 +54029 +54029 +54030 +54030 +54031 +54031 +54031 +54032 +54032 +54033 +54033 +54034 +54034 +54034 +54035 +54035 +54036 +54036 +54036 +54037 +54037 +54038 +54038 +54039 +54039 +54039 +54040 +54040 +54041 +54041 +54041 +54042 +54042 +54043 +54043 +54043 +54044 +54044 +54045 +54045 +54046 +54046 +54046 +54047 +54047 +54048 +54048 +54048 +54049 +54049 +54050 +54050 +54050 +54051 +54051 +54052 +54052 +54053 +54053 +54053 +54054 +54054 +54055 +54055 +54055 +54056 +54056 +54057 +54057 +54057 +54058 +54058 +54059 +54059 +54060 +54060 +54060 +54061 +54061 +54062 +54062 +54062 +54063 +54063 +54064 +54064 +54064 +54065 +54065 +54066 +54066 +54066 +54067 +54067 +54068 +54068 +54068 +54069 +54069 +54070 +54070 +54071 +54071 +54071 +54072 +54072 +54073 +54073 +54074 +54075 +54075 +54076 +54077 +54078 +54079 +54079 +54080 +54081 +54082 +54083 +54083 +54084 +54085 +54086 +54087 +54087 +54088 +54089 +54090 +54091 +54092 +54092 +54093 +54094 +54095 +54096 +54096 +54097 +54098 +54099 +54099 +54100 +54101 +54102 +54103 +54103 +54104 +54105 +54106 +54107 +54107 +54108 +54109 +54110 +54111 +54111 +54112 +54113 +54114 +54115 +54115 +54116 +54117 +54118 +54119 +54119 +54120 +54121 +54122 +54122 +54123 +54124 +54125 +54126 +54126 +54127 +54128 +54129 +54129 +54130 +54131 +54132 +54133 +54133 +54134 +54135 +54136 +54137 +54137 +54138 +54139 +54140 +54140 +54141 +54142 +54143 +54143 +54144 +54145 +54146 +54147 +54147 +54148 +54149 +54150 +54150 +54151 +54152 +54153 +54154 +54154 +54155 +54156 +54157 +54157 +54158 +54159 +54160 +54160 +54161 +54162 +54163 +54164 +54164 +54165 +54166 +54167 +54167 +54168 +54169 +54170 +54170 +54171 +54172 +54173 +54173 +54174 +54175 +54176 +54176 +54177 +54178 +54179 +54179 +54180 +54181 +54182 +54183 +54183 +54184 +54185 +54186 +54186 +54187 +54188 +54189 +54189 +54190 +54191 +54192 +54192 +54193 +54194 +54195 +54195 +54196 +54197 +54198 +54198 +54199 +54200 +54201 +54201 +54202 +54203 +54204 +54204 +54205 +54206 +54207 +54207 +54208 +54209 +54210 +54210 +54211 +54212 +54212 +54213 +54214 +54215 +54215 +54216 +54217 +54218 +54218 +54219 +54220 +54221 +54221 +54222 +54223 +54224 +54224 +54225 +54226 +54227 +54227 +54228 +54229 +54229 +54230 +54231 +54232 +54232 +54233 +54234 +54235 +54235 +54236 +54237 +54238 +54238 +54239 +54240 +54240 +54241 +54242 +54243 +54243 +54244 +54245 +54246 +54246 +54247 +54248 +54248 +54249 +54250 +54251 +54251 +54252 +54253 +54254 +54254 +54255 +54256 +54256 +54257 +54258 +54259 +54259 +54260 +54261 +54261 +54262 +54263 +54264 +54264 +54265 +54266 +54266 +54267 +54268 +54269 +54269 +54270 +54271 +54272 +54272 +54272 +54273 +54273 +54274 +54274 +54274 +54275 +54275 +54275 +54276 +54276 +54276 +54277 +54277 +54277 +54278 +54278 +54279 +54279 +54279 +54280 +54280 +54280 +54281 +54281 +54281 +54282 +54282 +54282 +54283 +54283 +54283 +54284 +54284 +54285 +54285 +54285 +54286 +54286 +54286 +54287 +54287 +54287 +54288 +54288 +54288 +54289 +54289 +54289 +54290 +54290 +54291 +54291 +54291 +54292 +54292 +54292 +54293 +54293 +54293 +54294 +54294 +54294 +54295 +54295 +54295 +54296 +54296 +54296 +54297 +54297 +54297 +54298 +54298 +54299 +54299 +54299 +54300 +54300 +54300 +54301 +54301 +54301 +54302 +54302 +54302 +54303 +54303 +54303 +54304 +54304 +54304 +54305 +54305 +54305 +54306 +54306 +54306 +54307 +54307 +54308 +54308 +54308 +54309 +54309 +54309 +54310 +54310 +54310 +54311 +54311 +54311 +54312 +54312 +54312 +54313 +54313 +54313 +54314 +54314 +54314 +54315 +54315 +54315 +54316 +54316 +54316 +54317 +54317 +54317 +54318 +54318 +54318 +54319 +54319 +54319 +54320 +54320 +54320 +54321 +54321 +54321 +54322 +54322 +54322 +54323 +54323 +54323 +54324 +54324 +54324 +54325 +54325 +54326 +54326 +54326 +54327 +54327 +54327 +54328 +54328 +54328 +54329 +54329 +54329 +54330 +54330 +54330 +54331 +54331 +54331 +54332 +54332 +54332 +54333 +54333 +54333 +54334 +54334 +54334 +54335 +54335 +54335 +54336 +54336 +54336 +54337 +54337 +54337 +54338 +54338 +54338 +54339 +54339 +54339 +54340 +54340 +54340 +54341 +54341 +54341 +54341 +54342 +54342 +54342 +54343 +54343 +54343 +54344 +54344 +54344 +54345 +54345 +54345 +54346 +54346 +54346 +54347 +54347 +54347 +54348 +54348 +54348 +54349 +54349 +54349 +54350 +54350 +54350 +54351 +54351 +54351 +54352 +54352 +54352 +54353 +54353 +54353 +54354 +54354 +54354 +54355 +54355 +54355 +54356 +54356 +54356 +54357 +54357 +54357 +54358 +54358 +54358 +54359 +54359 +54359 +54359 +54360 +54360 +54360 +54361 +54361 +54361 +54362 +54362 +54362 +54363 +54363 +54363 +54364 +54364 +54364 +54365 +54365 +54365 +54366 +54366 +54366 +54367 +54367 +54367 +54368 +54368 +54368 +54368 +54369 +54369 +54369 +54370 +54370 +54370 +54371 +54371 +54371 +54372 +54372 +54372 +54373 +54373 +54373 +54374 +54374 +54374 +54375 +54375 +54375 +54376 +54376 +54376 +54376 +54377 +54377 +54377 +54378 +54378 +54378 +54379 +54379 +54379 +54380 +54380 +54380 +54381 +54381 +54381 +54382 +54382 +54382 +54382 +54383 +54383 +54383 +54384 +54384 +54384 +54385 +54385 +54385 +54386 +54386 +54386 +54387 +54387 +54387 +54388 +54388 +54388 +54388 +54389 +54389 +54389 +54390 +54390 +54390 +54391 +54391 +54391 +54392 +54392 +54392 +54393 +54393 +54393 +54393 +54394 +54394 +54394 +54395 +54395 +54395 +54396 +54396 +54396 +54397 +54397 +54397 +54398 +54398 +54398 +54398 +54399 +54399 +54399 +54400 +54400 +54400 +54401 +54401 +54401 +54402 +54402 +54402 +54402 +54403 +54403 +54403 +54404 +54404 +54404 +54405 +54405 +54405 +54406 +54406 +54406 +54406 +54407 +54407 +54407 +54408 +54408 +54408 +54409 +54409 +54409 +54410 +54410 +54410 +54410 +54411 +54411 +54411 +54412 +54412 +54412 +54413 +54413 +54413 +54414 +54414 +54414 +54414 +54415 +54415 +54415 +54416 +54416 +54416 +54417 +54417 +54417 +54417 +54418 +54418 +54418 +54419 +54419 +54419 +54420 +54420 +54420 +54421 +54421 +54421 +54421 +54422 +54422 +54422 +54423 +54423 +54423 +54424 +54424 +54424 +54424 +54425 +54425 +54425 +54426 +54426 +54426 +54427 +54427 +54427 +54427 +54428 +54428 +54428 +54429 +54429 +54429 +54430 +54430 +54430 +54430 +54431 +54431 +54431 +54432 +54432 +54432 +54433 +54433 +54433 +54433 +54434 +54434 +54434 +54435 +54435 +54435 +54436 +54436 +54436 +54436 +54437 +54437 +54437 +54438 +54438 +54438 +54439 +54439 +54439 +54439 +54440 +54440 +54440 +54441 +54441 +54441 +54442 +54442 +54442 +54442 +54443 +54443 +54443 +54444 +54444 +54444 +54444 +54445 +54445 +54445 +54446 +54446 +54446 +54447 +54447 +54447 +54447 +54448 +54448 +54448 +54449 +54449 +54449 +54450 +54450 +54450 +54450 +54451 +54451 +54451 +54452 +54452 +54452 +54452 +54453 +54453 +54453 +54454 +54454 +54454 +54454 +54455 +54455 +54455 +54456 +54456 +54456 +54457 +54457 +54457 +54457 +54458 +54458 +54458 +54459 +54459 +54459 +54459 +54460 +54460 +54460 +54461 +54461 +54461 +54461 +54462 +54462 +54462 +54463 +54463 +54463 +54464 +54464 +54464 +54464 +54465 +54465 +54465 +54466 +54466 +54466 +54466 +54467 +54467 +54467 +54468 +54468 +54468 +54468 +54469 +54469 +54469 +54470 +54470 +54470 +54470 +54471 +54471 +54471 +54472 +54472 +54472 +54472 +54473 +54473 +54473 +54474 +54474 +54474 +54474 +54475 +54475 +54475 +54476 +54476 +54476 +54476 +54477 +54477 +54477 +54478 +54478 +54478 +54479 +54479 +54479 +54479 +54480 +54480 +54480 +54480 +54481 +54481 +54481 +54482 +54482 +54482 +54482 +54483 +54483 +54483 +54484 +54484 +54484 +54484 +54485 +54485 +54485 +54486 +54486 +54486 +54486 +54487 +54487 +54487 +54488 +54488 +54488 +54488 +54489 +54489 +54489 +54490 +54490 +54490 +54490 +54491 +54491 +54491 +54492 +54492 +54492 +54492 +54493 +54493 +54493 +54494 +54494 +54494 +54494 +54495 +54495 +54495 +54496 +54496 +54496 +54496 +54497 +54497 +54497 +54497 +54498 +54498 +54498 +54499 +54499 +54499 +54499 +54500 +54500 +54500 +54501 +54501 +54501 +54501 +54502 +54502 +54502 +54503 +54503 +54503 +54503 +54504 +54504 +54504 +54504 +54505 +54505 +54505 +54506 +54506 +54506 +54506 +54507 +54507 +54507 +54508 +54508 +54508 +54508 +54509 +54509 +54509 +54509 +54510 +54510 +54510 +54511 +54511 +54512 +54513 +54513 +54514 +54514 +54515 +54515 +54516 +54516 +54517 +54517 +54518 +54519 +54519 +54520 +54520 +54521 +54521 +54522 +54522 +54523 +54524 +54524 +54525 +54525 +54526 +54526 +54527 +54527 +54528 +54528 +54529 +54530 +54530 +54531 +54531 +54532 +54532 +54533 +54533 +54534 +54534 +54535 +54535 +54536 +54537 +54537 +54538 +54538 +54539 +54539 +54540 +54540 +54541 +54541 +54542 +54542 +54543 +54544 +54544 +54545 +54545 +54546 +54546 +54547 +54547 +54548 +54548 +54549 +54549 +54550 +54551 +54551 +54552 +54552 +54553 +54553 +54554 +54554 +54555 +54555 +54556 +54556 +54557 +54557 +54558 +54558 +54559 +54560 +54560 +54561 +54561 +54562 +54562 +54563 +54563 +54564 +54564 +54565 +54565 +54566 +54566 +54567 +54567 +54568 +54568 +54569 +54570 +54570 +54571 +54571 +54572 +54572 +54573 +54573 +54574 +54574 +54575 +54575 +54576 +54576 +54577 +54577 +54578 +54578 +54579 +54579 +54580 +54580 +54581 +54582 +54582 +54583 +54583 +54584 +54584 +54585 +54585 +54586 +54586 +54587 +54587 +54588 +54588 +54589 +54589 +54590 +54590 +54591 +54591 +54592 +54592 +54593 +54593 +54594 +54594 +54595 +54595 +54596 +54596 +54597 +54597 +54598 +54598 +54599 +54599 +54600 +54601 +54601 +54602 +54602 +54603 +54603 +54604 +54604 +54605 +54605 +54606 +54606 +54607 +54607 +54608 +54608 +54609 +54609 +54610 +54610 +54611 +54611 +54612 +54612 +54613 +54613 +54614 +54614 +54615 +54615 +54616 +54616 +54617 +54617 +54618 +54618 +54619 +54619 +54620 +54620 +54621 +54621 +54622 +54622 +54623 +54623 +54624 +54624 +54625 +54625 +54626 +54626 +54627 +54627 +54628 +54628 +54629 +54629 +54630 +54630 +54631 +54631 +54632 +54632 +54633 +54633 +54634 +54634 +54635 +54635 +54636 +54636 +54637 +54637 +54638 +54638 +54639 +54639 +54640 +54640 +54641 +54641 +54641 +54642 +54642 +54643 +54643 +54644 +54644 +54645 +54645 +54646 +54646 +54647 +54647 +54648 +54648 +54649 +54649 +54650 +54650 +54651 +54651 +54652 +54652 +54653 +54653 +54654 +54654 +54655 +54655 +54656 +54656 +54657 +54657 +54658 +54658 +54659 +54659 +54660 +54660 +54660 +54661 +54661 +54662 +54662 +54663 +54663 +54664 +54664 +54665 +54665 +54666 +54666 +54667 +54667 +54668 +54668 +54669 +54669 +54670 +54670 +54671 +54671 +54672 +54672 +54672 +54673 +54673 +54674 +54674 +54675 +54675 +54676 +54676 +54677 +54677 +54678 +54678 +54679 +54679 +54680 +54680 +54681 +54681 +54682 +54682 +54682 +54683 +54683 +54684 +54684 +54685 +54685 +54686 +54686 +54687 +54687 +54688 +54688 +54689 +54689 +54690 +54690 +54691 +54691 +54691 +54692 +54692 +54693 +54693 +54694 +54694 +54695 +54695 +54696 +54696 +54697 +54697 +54698 +54698 +54698 +54699 +54699 +54700 +54700 +54701 +54701 +54702 +54702 +54703 +54703 +54704 +54704 +54705 +54705 +54705 +54706 +54706 +54707 +54707 +54708 +54708 +54709 +54709 +54710 +54710 +54711 +54711 +54711 +54712 +54712 +54713 +54713 +54714 +54714 +54715 +54715 +54716 +54716 +54717 +54717 +54717 +54718 +54718 +54719 +54719 +54720 +54720 +54721 +54721 +54722 +54722 +54723 +54723 +54723 +54724 +54724 +54725 +54725 +54726 +54726 +54727 +54727 +54728 +54728 +54728 +54729 +54729 +54730 +54730 +54731 +54731 +54732 +54732 +54733 +54733 +54733 +54734 +54734 +54735 +54735 +54736 +54736 +54737 +54737 +54738 +54738 +54738 +54739 +54739 +54740 +54740 +54741 +54741 +54742 +54742 +54743 +54743 +54743 +54744 +54744 +54745 +54745 +54746 +54746 +54747 +54747 +54747 +54748 +54748 +54749 +54749 +54750 +54750 +54751 +54751 +54752 +54752 +54752 +54753 +54753 +54754 +54754 +54755 +54755 +54756 +54756 +54756 +54757 +54757 +54758 +54758 +54759 +54759 +54760 +54760 +54760 +54761 +54761 +54762 +54762 +54763 +54763 +54764 +54764 +54764 +54765 +54765 +54766 +54766 +54767 +54767 +54768 +54768 +54768 +54769 +54769 +54770 +54770 +54771 +54771 +54771 +54772 +54772 +54773 +54773 +54774 +54774 +54775 +54775 +54775 +54776 +54776 +54777 +54777 +54778 +54778 +54778 +54779 +54779 +54780 +54780 +54781 +54781 +54782 +54782 +54782 +54783 +54783 +54784 +54784 +54785 +54785 +54785 +54786 +54786 +54787 +54787 +54788 +54788 +54789 +54789 +54789 +54790 +54790 +54791 +54791 +54792 +54792 +54792 +54793 +54793 +54794 +54794 +54795 +54795 +54795 +54796 +54796 +54797 +54797 +54798 +54798 +54798 +54799 +54799 +54800 +54800 +54801 +54801 +54801 +54802 +54802 +54803 +54803 +54804 +54804 +54804 +54805 +54805 +54806 +54806 +54807 +54807 +54807 +54808 +54808 +54809 +54809 +54810 +54810 +54810 +54811 +54811 +54812 +54812 +54813 +54813 +54813 +54814 +54814 +54815 +54815 +54816 +54816 +54816 +54817 +54817 +54818 +54818 +54819 +54819 +54819 +54820 +54820 +54821 +54821 +54822 +54822 +54822 +54823 +54823 +54824 +54824 +54824 +54825 +54825 +54826 +54826 +54827 +54827 +54827 +54828 +54828 +54829 +54829 +54830 +54830 +54830 +54831 +54831 +54832 +54832 +54832 +54833 +54833 +54834 +54834 +54835 +54835 +54835 +54836 +54836 +54837 +54837 +54837 +54838 +54838 +54839 +54839 +54840 +54840 +54840 +54841 +54841 +54842 +54842 +54843 +54843 +54843 +54844 +54844 +54845 +54845 +54845 +54846 +54846 +54847 +54847 +54847 +54848 +54848 +54849 +54849 +54850 +54850 +54850 +54851 +54851 +54852 +54852 +54852 +54853 +54853 +54854 +54854 +54855 +54855 +54855 +54856 +54856 +54857 +54857 +54857 +54858 +54858 +54859 +54859 +54859 +54860 +54860 +54861 +54861 +54862 +54862 +54862 +54863 +54863 +54864 +54864 +54864 +54865 +54865 +54866 +54866 +54866 +54867 +54867 +54868 +54868 +54868 +54869 +54869 +54870 +54870 +54871 +54871 +54871 +54872 +54872 +54873 +54873 +54873 +54874 +54874 +54875 +54875 +54875 +54876 +54876 +54877 +54877 +54877 +54878 +54878 +54879 +54879 +54879 +54880 +54880 +54881 +54881 +54881 +54882 +54882 +54883 +54883 +54883 +54884 +54884 +54885 +54885 +54885 +54886 +54886 +54887 +54887 +54888 +54888 +54888 +54889 +54889 +54890 +54890 +54890 +54891 +54891 +54892 +54892 +54892 +54893 +54893 +54894 +54894 +54894 +54895 +54895 +54896 +54896 +54896 +54897 +54897 +54898 +54898 +54898 +54899 +54899 +54900 +54900 +54900 +54901 +54901 +54902 +54902 +54902 +54903 +54903 +54904 +54904 +54904 +54905 +54905 +54905 +54906 +54906 +54907 +54907 +54907 +54908 +54908 +54909 +54909 +54909 +54910 +54910 +54911 +54911 +54911 +54912 +54912 +54913 +54913 +54913 +54914 +54914 +54915 +54915 +54915 +54916 +54916 +54917 +54917 +54917 +54918 +54918 +54919 +54919 +54919 +54920 +54920 +54920 +54921 +54921 +54922 +54922 +54922 +54923 +54923 +54924 +54924 +54924 +54925 +54925 +54926 +54926 +54926 +54927 +54927 +54928 +54928 +54928 +54929 +54929 +54929 +54930 +54930 +54931 +54931 +54931 +54932 +54932 +54933 +54933 +54933 +54934 +54934 +54935 +54935 +54935 +54936 +54936 +54937 +54937 +54937 +54938 +54938 +54938 +54939 +54939 +54940 +54940 +54940 +54941 +54941 +54942 +54942 +54942 +54943 +54943 +54943 +54944 +54944 +54945 +54945 +54945 +54946 +54946 +54947 +54947 +54947 +54948 +54948 +54948 +54949 +54949 +54950 +54950 +54950 +54951 +54951 +54952 +54952 +54952 +54953 +54953 +54953 +54954 +54954 +54955 +54955 +54955 +54956 +54956 +54957 +54957 +54957 +54958 +54958 +54958 +54959 +54959 +54960 +54960 +54960 +54961 +54961 +54962 +54962 +54962 +54963 +54963 +54963 +54964 +54964 +54965 +54965 +54965 +54966 +54966 +54966 +54967 +54967 +54968 +54968 +54968 +54969 +54969 +54969 +54970 +54970 +54971 +54971 +54971 +54972 +54973 +54973 +54974 +54975 +54976 +54976 +54977 +54978 +54979 +54979 +54980 +54981 +54982 +54982 +54983 +54984 +54985 +54985 +54986 +54987 +54988 +54988 +54989 +54990 +54991 +54991 +54992 +54993 +54994 +54994 +54995 +54996 +54997 +54997 +54998 +54999 +54999 +55000 +55001 +55002 +55002 +55003 +55004 +55005 +55005 +55006 +55007 +55008 +55008 +55009 +55010 +55011 +55011 +55012 +55013 +55014 +55014 +55015 +55016 +55016 +55017 +55018 +55019 +55019 +55020 +55021 +55022 +55022 +55023 +55024 +55024 +55025 +55026 +55027 +55027 +55028 +55029 +55030 +55030 +55031 +55032 +55033 +55033 +55034 +55035 +55035 +55036 +55037 +55038 +55038 +55039 +55040 +55040 +55041 +55042 +55043 +55043 +55044 +55045 +55046 +55046 +55047 +55048 +55048 +55049 +55050 +55051 +55051 +55052 +55053 +55053 +55054 +55055 +55056 +55056 +55057 +55058 +55058 +55059 +55060 +55061 +55061 +55062 +55063 +55063 +55064 +55065 +55065 +55066 +55067 +55068 +55068 +55069 +55070 +55070 +55071 +55072 +55073 +55073 +55074 +55075 +55075 +55076 +55077 +55078 +55078 +55079 +55080 +55080 +55081 +55082 +55082 +55083 +55084 +55085 +55085 +55086 +55087 +55087 +55088 +55089 +55089 +55090 +55091 +55092 +55092 +55093 +55094 +55094 +55095 +55096 +55096 +55097 +55098 +55098 +55099 +55100 +55101 +55101 +55102 +55103 +55103 +55104 +55105 +55105 +55106 +55107 +55107 +55108 +55109 +55110 +55110 +55111 +55112 +55112 +55113 +55114 +55114 +55115 +55116 +55116 +55117 +55118 +55118 +55119 +55120 +55121 +55121 +55122 +55123 +55123 +55124 +55125 +55125 +55126 +55127 +55127 +55128 +55129 +55129 +55130 +55131 +55131 +55132 +55133 +55133 +55134 +55135 +55135 +55136 +55137 +55138 +55138 +55139 +55140 +55140 +55141 +55142 +55142 +55143 +55144 +55144 +55145 +55146 +55146 +55147 +55148 +55148 +55149 +55150 +55150 +55151 +55152 +55152 +55153 +55154 +55154 +55155 +55156 +55156 +55157 +55158 +55158 +55159 +55160 +55160 +55161 +55162 +55162 +55163 +55164 +55164 +55165 +55166 +55166 +55167 +55168 +55168 +55169 +55170 +55170 +55171 +55172 +55172 +55173 +55174 +55174 +55175 +55176 +55176 +55177 +55178 +55178 +55179 +55180 +55180 +55181 +55182 +55182 +55183 +55184 +55184 +55185 +55185 +55186 +55187 +55187 +55188 +55189 +55189 +55190 +55191 +55191 +55192 +55193 +55193 +55194 +55195 +55195 +55196 +55197 +55197 +55198 +55199 +55199 +55200 +55200 +55201 +55202 +55202 +55203 +55204 +55204 +55205 +55206 +55206 +55207 +55208 +55208 +55209 +55210 +55210 +55211 +55211 +55212 +55213 +55213 +55214 +55215 +55215 +55216 +55217 +55217 +55218 +55219 +55219 +55220 +55221 +55221 +55222 +55222 +55223 +55224 +55224 +55225 +55226 +55226 +55227 +55228 +55228 +55229 +55229 +55230 +55231 +55231 +55232 +55233 +55233 +55234 +55235 +55235 +55236 +55236 +55237 +55238 +55238 +55239 +55240 +55240 +55241 +55242 +55242 +55243 +55243 +55244 +55245 +55245 +55246 +55247 +55247 +55248 +55249 +55249 +55250 +55250 +55251 +55252 +55252 +55253 +55254 +55254 +55255 +55255 +55256 +55257 +55257 +55258 +55259 +55259 +55260 +55260 +55261 +55262 +55262 +55263 +55264 +55264 +55265 +55265 +55266 +55267 +55267 +55268 +55269 +55269 +55270 +55270 +55271 +55272 +55272 +55273 +55274 +55274 +55275 +55275 +55276 +55277 +55277 +55278 +55279 +55279 +55280 +55280 +55281 +55282 +55282 +55283 +55283 +55284 +55285 +55285 +55286 +55287 +55287 +55288 +55288 +55289 +55290 +55290 +55291 +55291 +55292 +55293 +55293 +55294 +55295 +55295 +55296 +55296 +55296 +55297 +55297 +55297 +55298 +55298 +55298 +55299 +55299 +55299 +55300 +55300 +55300 +55300 +55301 +55301 +55301 +55302 +55302 +55302 +55303 +55303 +55303 +55304 +55304 +55304 +55304 +55305 +55305 +55305 +55306 +55306 +55306 +55307 +55307 +55307 +55307 +55308 +55308 +55308 +55309 +55309 +55309 +55310 +55310 +55310 +55310 +55311 +55311 +55311 +55312 +55312 +55312 +55313 +55313 +55313 +55313 +55314 +55314 +55314 +55315 +55315 +55315 +55316 +55316 +55316 +55316 +55317 +55317 +55317 +55318 +55318 +55318 +55319 +55319 +55319 +55319 +55320 +55320 +55320 +55321 +55321 +55321 +55322 +55322 +55322 +55322 +55323 +55323 +55323 +55324 +55324 +55324 +55325 +55325 +55325 +55325 +55326 +55326 +55326 +55327 +55327 +55327 +55327 +55328 +55328 +55328 +55329 +55329 +55329 +55330 +55330 +55330 +55330 +55331 +55331 +55331 +55332 +55332 +55332 +55332 +55333 +55333 +55333 +55334 +55334 +55334 +55335 +55335 +55335 +55335 +55336 +55336 +55336 +55337 +55337 +55337 +55337 +55338 +55338 +55338 +55339 +55339 +55339 +55339 +55340 +55340 +55340 +55341 +55341 +55341 +55342 +55342 +55342 +55342 +55343 +55343 +55343 +55344 +55344 +55344 +55344 +55345 +55345 +55345 +55346 +55346 +55346 +55346 +55347 +55347 +55347 +55348 +55348 +55348 +55348 +55349 +55349 +55349 +55350 +55350 +55350 +55350 +55351 +55351 +55351 +55352 +55352 +55352 +55352 +55353 +55353 +55353 +55354 +55354 +55354 +55355 +55355 +55355 +55355 +55356 +55356 +55356 +55357 +55357 +55357 +55357 +55358 +55358 +55358 +55359 +55359 +55359 +55359 +55360 +55360 +55360 +55360 +55361 +55361 +55361 +55362 +55362 +55362 +55362 +55363 +55363 +55363 +55364 +55364 +55364 +55364 +55365 +55365 +55365 +55366 +55366 +55366 +55366 +55367 +55367 +55367 +55368 +55368 +55368 +55368 +55369 +55369 +55369 +55370 +55370 +55370 +55370 +55371 +55371 +55371 +55372 +55372 +55372 +55372 +55373 +55373 +55373 +55373 +55374 +55374 +55374 +55375 +55375 +55375 +55375 +55376 +55376 +55376 +55377 +55377 +55377 +55377 +55378 +55378 +55378 +55379 +55379 +55379 +55379 +55380 +55380 +55380 +55380 +55381 +55381 +55381 +55382 +55382 +55382 +55382 +55383 +55383 +55383 +55384 +55384 +55384 +55384 +55385 +55385 +55385 +55385 +55386 +55386 +55386 +55387 +55387 +55387 +55387 +55388 +55388 +55388 +55388 +55389 +55389 +55389 +55390 +55390 +55390 +55390 +55391 +55391 +55391 +55392 +55392 +55392 +55392 +55393 +55393 +55393 +55393 +55394 +55394 +55394 +55395 +55395 +55395 +55395 +55396 +55396 +55396 +55396 +55397 +55397 +55397 +55398 +55398 +55398 +55398 +55399 +55399 +55399 +55399 +55400 +55400 +55400 +55401 +55401 +55401 +55401 +55402 +55402 +55402 +55402 +55403 +55403 +55403 +55404 +55404 +55404 +55404 +55405 +55405 +55405 +55405 +55406 +55406 +55406 +55407 +55407 +55407 +55407 +55408 +55408 +55408 +55408 +55409 +55409 +55409 +55409 +55410 +55410 +55410 +55411 +55411 +55411 +55411 +55412 +55412 +55412 +55412 +55413 +55413 +55413 +55414 +55414 +55414 +55414 +55415 +55415 +55415 +55415 +55416 +55416 +55416 +55416 +55417 +55417 +55417 +55418 +55418 +55418 +55418 +55419 +55419 +55419 +55419 +55420 +55420 +55420 +55420 +55421 +55421 +55421 +55422 +55422 +55422 +55422 +55423 +55423 +55423 +55423 +55424 +55424 +55424 +55424 +55425 +55425 +55425 +55426 +55426 +55426 +55426 +55427 +55427 +55427 +55427 +55428 +55428 +55428 +55428 +55429 +55429 +55429 +55429 +55430 +55430 +55430 +55431 +55431 +55431 +55431 +55432 +55432 +55432 +55432 +55433 +55433 +55433 +55433 +55434 +55434 +55434 +55434 +55435 +55435 +55435 +55436 +55436 +55436 +55436 +55437 +55437 +55437 +55437 +55438 +55438 +55438 +55438 +55439 +55439 +55439 +55439 +55440 +55440 +55440 +55440 +55441 +55441 +55441 +55442 +55442 +55442 +55442 +55443 +55443 +55443 +55443 +55444 +55444 +55444 +55444 +55445 +55445 +55445 +55445 +55446 +55446 +55446 +55446 +55447 +55447 +55447 +55448 +55448 +55448 +55448 +55449 +55449 +55449 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 + + + + diff --git a/tests/python/GpuShaderDescTest.py b/tests/python/GpuShaderDescTest.py index a81dc4c2c1..dc8b21c691 100644 --- a/tests/python/GpuShaderDescTest.py +++ b/tests/python/GpuShaderDescTest.py @@ -17,7 +17,7 @@ import PyOpenColorIO as OCIO -from UnitTestUtils import STRING_TYPES +from UnitTestUtils import STRING_TYPES, TEST_DATAFILES_DIR class GpuShaderDescTest(unittest.TestCase): @@ -29,7 +29,7 @@ def test_shader_creator_interface(self): desc.setFunctionName("foo123") self.assertEqual("foo123", desc.getFunctionName()) desc.finalize() - self.assertEqual("glsl_1.3 foo123 ocio outColor 0 6001c324468d497f99aa06d3014798d8", + self.assertEqual("glsl_1.3 foo123 ocio outColor 0 0 1 6001c324468d497f99aa06d3014798d8", desc.getCacheID()) def test_uniform(self): @@ -132,14 +132,17 @@ def test_texture(self): desc = OCIO.GpuShaderDesc.CreateShaderDesc() buf = np.array([0,0.1,0.2,0.3,0.4,0.5]).astype(np.float32) - desc.addTexture('tex', 'sampler', 2, 3, - OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, - OCIO.GpuShaderDesc.TEXTURE_2D, - OCIO.INTERP_DEFAULT, buf) - desc.addTexture(textureName='tex2', samplerName='sampler2', width=3, height=2, - channel=OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, - dimensions=OCIO.GpuShaderDesc.TEXTURE_2D, - interpolation=OCIO.INTERP_DEFAULT, values=buf) + textureShaderBindingIndex = desc.addTexture('tex', 'sampler', 2, 3, + OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, + OCIO.GpuShaderDesc.TEXTURE_2D, + OCIO.INTERP_DEFAULT, buf) + self.assertEqual(textureShaderBindingIndex, 1) + textureShaderBindingIndex = desc.addTexture(textureName='tex2', samplerName='sampler2', + width=3, height=2, + channel=OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, + dimensions=OCIO.GpuShaderDesc.TEXTURE_2D, + interpolation=OCIO.INTERP_DEFAULT, values=buf) + self.assertEqual(textureShaderBindingIndex, 2) textures = desc.getTextures() self.assertEqual(len(textures), 2) t1 = next(textures) @@ -183,12 +186,14 @@ def test_texture_3d(self): desc = OCIO.GpuShaderDesc.CreateShaderDesc() buf = np.linspace(0, 1, num=8*3).astype(np.float32) bufTest1 = buf[3] - desc.add3DTexture('tex', 'sampler', 2, - OCIO.INTERP_DEFAULT, buf) + textureShaderBindingIndex = desc.add3DTexture('tex', 'sampler', 2, + OCIO.INTERP_DEFAULT, buf) + self.assertEqual(textureShaderBindingIndex, 1) buf = np.linspace(0, 1, num=27*3).astype(np.float32) bufTest2 = buf[42] - desc.add3DTexture('tex2', 'sampler2', 3, - OCIO.INTERP_DEFAULT, buf) + textureShaderBindingIndex = desc.add3DTexture('tex2', 'sampler2', 3, + OCIO.INTERP_DEFAULT, buf) + self.assertEqual(textureShaderBindingIndex, 2) textures = desc.get3DTextures() self.assertEqual(len(textures), 2) @@ -208,3 +213,67 @@ def test_texture_3d(self): v2 = t2.getValues() self.assertEqual(len(v2), 3*27) self.assertEqual(v2[42], bufTest2) + + def test_vulkan(self): + # Test texture binding functionality. + import os + + config = OCIO.Config.CreateRaw() + test_file = os.path.join(TEST_DATAFILES_DIR, 'clf', 'lut1d_lut3d_lut1d.clf') + file_tr = OCIO.FileTransform(src=test_file) + processor = config.getProcessor(file_tr) + + desc = OCIO.GpuShaderDesc.CreateShaderDesc() + desc.setDescriptorSetIndex(2, 10) + self.assertEqual(desc.getDescriptorSetIndex(), 2) + self.assertEqual(desc.getTextureBindingStart(), 10) + gpu_proc = processor.getDefaultGPUProcessor() + gpu_proc.extractGpuShaderInfo(desc) + + # Test 1D textures. + + textures = desc.getTextures() + self.assertEqual(len(textures), 2) + + t1 = next(textures) + self.assertEqual(t1.textureName, 'ocio_lut1d_0') + self.assertEqual(t1.samplerName, 'ocio_lut1d_0Sampler') + self.assertEqual(t1.width, 65) + self.assertEqual(t1.height, 1) + self.assertEqual(t1.channel, OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL) + self.assertEqual(t1.dimensions, OCIO.GpuShaderDesc.TEXTURE_1D) + self.assertEqual(t1.interpolation, OCIO.INTERP_LINEAR) + self.assertEqual(t1.textureShaderBindingIndex, 10) + if np: + v1 = t1.getValues() + self.assertEqual(len(v1), 65) + self.assertEqual(v1[0], np.float32(-0.25)) # -1023.75 / 4095 + + t2 = next(textures) + self.assertEqual(t2.textureName, 'ocio_lut1d_2') + self.assertEqual(t2.samplerName, 'ocio_lut1d_2Sampler') + self.assertEqual(t2.width, 4096) + self.assertEqual(t2.height, 17) + self.assertEqual(t2.channel, OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL) + self.assertEqual(t2.dimensions, OCIO.GpuShaderDesc.TEXTURE_2D) + self.assertEqual(t2.interpolation, OCIO.INTERP_LINEAR) + self.assertEqual(t2.textureShaderBindingIndex, 12) + if np: + v2 = t2.getValues() + self.assertEqual(len(v2), 69632) # 4096 x 17 + self.assertEqual(v2[0], np.float32(-0.0999755859375)) # halfToFloat(44646) + + # Test 3D textures. + + textures = desc.get3DTextures() + self.assertEqual(len(textures), 1) + t1 = next(textures) + self.assertEqual(t1.textureName, 'ocio_lut3d_1') + self.assertEqual(t1.samplerName, 'ocio_lut3d_1Sampler') + self.assertEqual(t1.edgeLen, 3) + self.assertEqual(t1.interpolation, OCIO.INTERP_LINEAR) + self.assertEqual(t1.textureShaderBindingIndex, 11) + if np: + v1 = t1.getValues() + self.assertEqual(len(v1), 3*3*3*3) + self.assertEqual(v1[0], np.float32(-0.05865102639296188)) # -60.0 / 1023 From 449d1f2beee3af75cd84b994cb5fd0b969437d6e Mon Sep 17 00:00:00 2001 From: Kevin Wheatley Date: Mon, 12 Jan 2026 00:02:10 +0000 Subject: [PATCH 08/37] Bug/2220 array subscript out of range exception can be thrown under a floating point rounding edge case (#2227) * Add test to reproduce bug 2220 Code incorrectly deals with edge cases where atan2() returns end of range [-pi, pi] Signed-off-by: Kevin Wheatley * Extend tables to have an additonal entry to allow for boundary condition to not over flow table bounds during lookup All tables are now 1 entry larger and should have valid data wrapped into the extra entries Signed-off-by: Kevin Wheatley * Clarify ACES OT 2.0 edge-case test comments around hue-angle table access bug Signed-off-by: Kevin Wheatley --------- Signed-off-by: Kevin Wheatley Co-authored-by: Doug Walker --- .../ops/fixedfunction/ACES2/Common.h | 7 +++-- .../ops/fixedfunction/ACES2/Transform.cpp | 30 +++++++++++------- .../FixedFunctionOpCPU_tests.cpp | 31 +++++++++++++++++++ 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h b/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h index 18f0123636..2bfa79c90a 100644 --- a/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h +++ b/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h @@ -47,10 +47,11 @@ inline float from_radians(const float v) { return wrap_to_hue_limit(v); }; struct TableBase { - static constexpr unsigned int _TABLE_ADDITION_ENTRIES = 2; - static constexpr unsigned int base_index = 1; + static constexpr unsigned int _TABLE_ADDITION_LOWER_ENTRIES = 1; + static constexpr unsigned int _TABLE_ADDITION_UPPER_ENTRIES = 2; + static constexpr unsigned int base_index = _TABLE_ADDITION_LOWER_ENTRIES; static constexpr unsigned int nominal_size = 360; - static constexpr unsigned int total_size = nominal_size + _TABLE_ADDITION_ENTRIES; + static constexpr unsigned int total_size = nominal_size + _TABLE_ADDITION_LOWER_ENTRIES + _TABLE_ADDITION_UPPER_ENTRIES; static constexpr unsigned int lower_wrap_index = 0; static constexpr unsigned int upper_wrap_index = base_index + nominal_size; diff --git a/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp b/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp index d3bd1771ee..889c2a90be 100644 --- a/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp +++ b/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp @@ -730,8 +730,9 @@ void build_hue_table(Table1D &hue_table, const std::array find_display_cusp_for_hue(float hue, const std::array& RGB_corners, const std::array& JMh_corners, @@ -820,12 +821,15 @@ Table3D build_cusp_table(const Table1D& hue_table, const std::array input_32f = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.742242277f, 0.0931933373f, 0.321542144f, 1.0f // Bug #2220: related to hue angle calculation + // triggering an out of bounds access in the tables + // at exactly 360 degrees + }; + constexpr std::array expected_32f = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.74736571311951f, -0.0019352473318577f, 0.19451357424259f, 1.0f, // Note: exact output value is not + // significant to the test as the bug + // was in the internal table access logic + }; + + OCIO::FixedFunctionOpData::Params params = { + // Peak luminance + 100.f, + // Rec709 gamut + 0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, 0.3127, 0.3290 + }; + + OCIO::ConstFixedFunctionOpDataRcPtr funcData + = std::make_shared(OCIO::FixedFunctionOpData::ACES_OUTPUT_TRANSFORM_20_FWD, + params); + + ApplyFixedFunction(input_32f.data(), expected_32f.data(), test_cases, funcData, 1e-4f, __LINE__); +} + OCIO_ADD_TEST(FixedFunctionOpCPU, aces_ot_20_p3d65_100n_rt) { const int lut_size = 8; From 6a1dff6ee2b044632d4432fa186fffbab8f15200 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Sun, 11 Jan 2026 19:46:07 -0500 Subject: [PATCH 09/37] Adsk Contrib - Fix interop ID issue in ociocheck (#2204) * Fix ociocheck Signed-off-by: Doug Walker * Minor improvements Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- src/OpenColorIO/Config.cpp | 2 +- src/OpenColorIO/ViewingRules.cpp | 2 +- src/apps/ociocheck/main.cpp | 73 +++++++++++++++++++++++++------- tests/cpu/ColorSpace_tests.cpp | 2 +- 4 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 7072c50df9..2ac0572443 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -1461,7 +1461,7 @@ void Config::validate() const os << "Config failed color space validation. "; os << "The color space '" << name << "' "; os << "refers to an interop ID, '" << interop << "', "; - os << "which is not defined in this config."; + os << "which is not a color space name or alias."; getImpl()->m_validationtext = os.str(); throw Exception(getImpl()->m_validationtext.c_str()); } diff --git a/src/OpenColorIO/ViewingRules.cpp b/src/OpenColorIO/ViewingRules.cpp index bbe27172c1..2db7d1e499 100644 --- a/src/OpenColorIO/ViewingRules.cpp +++ b/src/OpenColorIO/ViewingRules.cpp @@ -91,7 +91,7 @@ class ViewingRule os << "The rule '" << m_name << "' "; os << "refers to encoding '" << std::string(encName); os << "' that is not used by any of the color spaces."; - LogWarning(os.str()); + LogInfo(os.str()); } } if (numCS + numEnc == 0) diff --git a/src/apps/ociocheck/main.cpp b/src/apps/ociocheck/main.cpp index 5c66a7eba0..5a0c24524a 100644 --- a/src/apps/ociocheck/main.cpp +++ b/src/apps/ociocheck/main.cpp @@ -28,7 +28,7 @@ const char * DESC_STRING = "\n\n" "that has been manually edited, using the '-o' option.\n"; -// returns true if the interopID is valid +// Returns true if the interopID is valid. bool isValidInteropID(const std::string& id) { // See https://github.com/AcademySoftwareFoundation/ColorInterop for the details. @@ -56,7 +56,7 @@ bool isValidInteropID(const std::string& id) "srgb_rec709_display", "g24_rec709_display", "srgb_p3d65_display", - "srgbx_p3d65_display", + "srgbe_p3d65_display", "pq_p3d65_display", "pq_rec2020_display", "hlg_rec2020_display", @@ -70,15 +70,15 @@ bool isValidInteropID(const std::string& id) if (id.empty()) return true; - // Check if has a namespace. + // Check if the ID has a namespace. size_t pos = id.find(':'); if (pos == std::string::npos) { - // No namespace, so id must be in the Color Interop Forum ID list. + // No namespace, so the ID must be in the Color Interop Forum ID list. if (cifTextureIDs.count(id) == 0 && cifDisplayIDs.count(id)==0) { - std::cout << "ERROR: InteropID '" << id << "' is not valid. " - "It should either be one of Color Interop Forum standard IDs or " + std::cout << "WARNING: InteropID '" << id << "' is not valid. " + "It should either be one of the Color Interop Forum standard IDs or " "it must contain a namespace followed by ':', e.g. 'mycompany:mycolorspace'." << std::endl; return false; @@ -86,21 +86,21 @@ bool isValidInteropID(const std::string& id) } else { - // Namespace found, split into namespace and id. + // Namespace found, split into namespace and ID. std::string ns = id.substr(0, pos); std::string cs = id.substr(pos+1); - // Id should not be in the Color Interop Forum ID list. + // The ID should not be in the Color Interop Forum ID list. if (cifTextureIDs.count(cs) > 0 || cifDisplayIDs.count(cs)> 0) { - std::cout << "ERROR: InteropID '" << id << "' is not valid. " - "The ID part must not be one of the Color Interop Forum standard IDs when a namespace is used." << - std::endl; + std::cout << "WARNING: InteropID '" << id << "' is not valid. " + "The ID part must not be one of the Color Interop Forum standard IDs " + "when a namespace is used." << std::endl; return false; } } - // all clear. + // All clear. return true; } @@ -108,6 +108,7 @@ int main(int argc, const char **argv) { bool help = false; int errorcount = 0; + int warningcount = 0; std::string inputconfig; std::string outputconfig; @@ -357,6 +358,7 @@ int main(int argc, const char **argv) if(!cs) { std::cout << "WARNING: NOT DEFINED (" << role << ")" << std::endl; + warningcount += 1; } } } @@ -369,6 +371,9 @@ int main(int argc, const char **argv) OCIO::SEARCH_REFERENCE_SPACE_ALL, // Iterate over scene & display color spaces. OCIO::COLORSPACE_ALL); // Iterate over active & inactive color spaces. + bool foundCategory = false; + bool foundNoCategory = false; + for(int i=0; igetColorSpace(config->getColorSpaceNameByIndex( @@ -381,10 +386,16 @@ int main(int argc, const char **argv) { if (!isValidInteropID(interopID)) { - errorcount += 1; + warningcount += 1; } } + if(!config->isInactiveColorSpace(cs->getName())) + { + if(cs->getNumCategories() > 0) foundCategory = true; + else foundNoCategory = true; + } + // Try to load the transform for the to_ref direction -- this will load any LUTs. bool toRefOK = true; std::string toRefErrorText; @@ -440,6 +451,14 @@ int main(int argc, const char **argv) std::cout << cs->getName() << std::endl; } } + + if(foundCategory && foundNoCategory) + { + // Categories should either be missing in all, or present in all active items. + std::cout << "\nWARNING: The config has some color spaces " + "where the categories are not set.\n"; + warningcount += 1; + } } { @@ -453,11 +472,20 @@ int main(int argc, const char **argv) std::cout << "no named transforms defined" << std::endl; } + bool foundCategory = false; + bool foundNoCategory = false; + for(int i = 0; igetNamedTransform( config->getNamedTransformNameByIndex(OCIO::NAMEDTRANSFORM_ALL, i)); + if(!config->isInactiveColorSpace(nt->getName())) + { + if(nt->getNumCategories() > 0) foundCategory = true; + else foundNoCategory = true; + } + // Try to load the transform -- this will load any LUTs. bool fwdOK = true; std::string fwdErrorText; @@ -513,6 +541,14 @@ int main(int argc, const char **argv) std::cout << nt->getName() << std::endl; } } + + if(foundCategory && foundNoCategory) + { + // Categories should either be missing in all, or present in all active items. + std::cout << "\nWARNING: The config has some named transforms " + "where the categories are not set.\n"; + warningcount += 1; + } } { @@ -605,11 +641,11 @@ int main(int argc, const char **argv) StringUtils::StringVec svec = StringUtils::SplitByLines(logGuard.output()); if (!StringUtils::Contain(svec, "[OpenColorIO Error]")) { - std::cout << "passed" << std::endl; + std::cout << "Validation: passed" << std::endl; } else { - std::cout << "failed" << std::endl; + std::cout << "Validation: failed" << std::endl; errorcount += 1; } } @@ -618,7 +654,7 @@ int main(int argc, const char **argv) std::cout << "ERROR:" << std::endl; errorcount += 1; std::cout << exception.what() << std::endl; - std::cout << "failed" << std::endl; + std::cout << "Validation: failed" << std::endl; } std::cout << std::endl; @@ -657,6 +693,11 @@ int main(int argc, const char **argv) return 1; } + if(warningcount > 0) + { + std::cout << "\nWarnings encountered: " << warningcount << std::endl; + } + std::cout << std::endl; if(errorcount == 0) { diff --git a/tests/cpu/ColorSpace_tests.cpp b/tests/cpu/ColorSpace_tests.cpp index 6bdbaa77ad..09819632e6 100644 --- a/tests/cpu/ColorSpace_tests.cpp +++ b/tests/cpu/ColorSpace_tests.cpp @@ -715,7 +715,7 @@ active_views: [] OCIO_CHECK_THROW_WHAT(config->validate(), OCIO::Exception, "Config failed color space validation. The color space 'raw' refers " - "to an interop ID, 'data', which is not defined in this config."); + "to an interop ID, 'data', which is not a color space name or alias."); } // Test that the interop id can be found in another color space. From 61c4e08c9a0e1d058673ab666f1fc2ce9468012e Mon Sep 17 00:00:00 2001 From: Pavan Madduri Date: Sun, 11 Jan 2026 22:22:22 -0600 Subject: [PATCH 10/37] Add Dependabot configuration for automated dependency updates (#2230) Add dependabot.yml to enable automated dependency updates for: - GitHub Actions workflows (weekly) - Python pip packages (weekly) This follows OpenSSF Best Practices Badge recommendations and is part of the Step Security hardening measures. Part of #2035 Signed-off-by: pmady Co-authored-by: Doug Walker --- .github/dependabot.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..f8e1c539cd --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. + +version: 2 + +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" From 181303ef32b61531d5c0e4a5e498bcd0b521496c Mon Sep 17 00:00:00 2001 From: Pavan Madduri Date: Mon, 12 Jan 2026 19:26:55 -0600 Subject: [PATCH 11/37] Add release signing workflow using Sigstore (#2229) This adds a GitHub Actions workflow that signs release artifacts using Sigstore, following the OpenSSF Best Practices Badge recommendations. The workflow is triggered on release publication and: 1. Creates a .tar.gz archive of the source tree 2. Signs the archive using sigstore/gh-action-sigstore-python 3. Uploads both the tarball and .sigstore.json credential bundle Based on the OpenEXR release-sign.yml workflow template. Closes #2034 Signed-off-by: pmady Co-authored-by: Doug Walker --- .github/workflows/release-sign.yml | 67 ++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/release-sign.yml diff --git a/.github/workflows/release-sign.yml b/.github/workflows/release-sign.yml new file mode 100644 index 0000000000..9946326199 --- /dev/null +++ b/.github/workflows/release-sign.yml @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. + +# +# Releases are signed via https://github.com/sigstore/sigstore-python. +# See https://docs.sigstore.dev for information about sigstore. +# +# This action creates a .tar.gz of the complete OpenColorIO source tree at +# the given release tag, signs it via sigstore, and uploads the +# .tar.gz and the associated .tar.gz.sigstore credential bundle. +# +# To verify a downloaded release at a given tag: +# +# % pip install sigstore +# % sigstore verify github --cert-identity https://github.com/AcademySoftwareFoundation/OpenColorIO/.github/workflows/release-sign.yml@refs/tags/ OpenColorIO-.tar.gz +# + +name: Sign Release + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + release: + name: Sign & upload release artifacts + runs-on: ubuntu-latest + + env: + TAG: ${{ github.ref_name }} + permissions: + contents: write + id-token: write + repository-projects: write + + steps: + + - name: Set Prefix + # The tag name begins with a 'v', e.g. "v2.4.0", but the prefix + # should omit the 'v', so the tarball "OpenColorIO-2.4.0.tar.gz" + # extracts files into "OpenColorIO-2.4.0/...". This matches + # the GitHub release page autogenerated artifact conventions. + run: | + echo OCIO_PREFIX=OpenColorIO-${TAG//v}/ >> $GITHUB_ENV + echo OCIO_TARBALL=OpenColorIO-${TAG//v}.tar.gz >> $GITHUB_ENV + shell: bash + + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Create archive + run: git archive --format=tar.gz -o ${OCIO_TARBALL} --prefix ${OCIO_PREFIX} ${TAG} + + - name: Sign archive with Sigstore + uses: sigstore/gh-action-sigstore-python@a5caf349bc536fbef3668a10ed7f5cd309a4b53d # v3.2.0 + with: + inputs: ${{ env.OCIO_TARBALL }} + upload-signing-artifacts: false + release-signing-artifacts: false + + - name: Upload release archive + env: + GH_TOKEN: ${{ github.token }} + run: gh release upload ${TAG} ${OCIO_TARBALL} ${OCIO_TARBALL}.sigstore.json From 2a8b59e8a51126130518b64b30e537bcaa1011a9 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Fri, 23 Jan 2026 16:51:12 -0500 Subject: [PATCH 12/37] Update 2.5 documentation (#2252) Signed-off-by: Doug Walker --- docs/releases/ocio_2_5.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/releases/ocio_2_5.rst b/docs/releases/ocio_2_5.rst index 593076e3af..5cc1be20d4 100644 --- a/docs/releases/ocio_2_5.rst +++ b/docs/releases/ocio_2_5.rst @@ -39,6 +39,15 @@ For Developers * Please see the section below about version updates to required third-party dependencies. +Library Version ++++++++++++++++ + +* The 2.5.1 release is not ABI compatible with 2.5.0 for clients that use the GPU renderer + API due to a change made to correct an issue with the Vulkan support introduced in 2.5.0. + Because the SOVERSION of both libraries remains "2.5", applications using the GPU API that + were compiled with the 2.5.0 release must be recompiled to use the 2.5.1 library. Any + further releases in the 2.5.x series will be ABI-compatible with 2.5.1. + New Feature Guide ================= From 205d53b6c359cfa13325dca6c9883b4270e67ff7 Mon Sep 17 00:00:00 2001 From: KATO ELVIS Date: Mon, 2 Feb 2026 22:57:59 +0300 Subject: [PATCH 13/37] add LF trademark disclaimer to site footer (#2253) Signed-off-by: ELVIS-KATO --- docs/site/homepage/config.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/site/homepage/config.toml b/docs/site/homepage/config.toml index 8b072d2a2d..7f7e82d351 100644 --- a/docs/site/homepage/config.toml +++ b/docs/site/homepage/config.toml @@ -143,7 +143,7 @@ languageCode = "en-us" contentDir = "content/english" weight = 1 home = "Home" -copyright = "copyright © 2020 OpenColorIO Contributors" +copyright = "Copyright © OpenColorIO a Series of LF Projects, LLC. For web site terms of use, trademark policy and other project policies please see https://lfprojects.org/." ################################ France Language ######################## [Languages.fr] @@ -152,4 +152,4 @@ languageCode = "fr-fr" contentDir = "content/french" weight = 2 home = "Accueil" -copyright = "copyright © 2020 [gethugothemes](https://gethugothemes.com) tous droits réservés" +copyright = "Copyright © OpenColorIO, a Series of LF Projects, LLC. Pour les conditions d'utilisation du site Web, la politique sur les marques et autres politiques de projet, voir https://lfprojects.org/." From 9bb14559e78c6f5ac49e946af0a23b2eb1179a40 Mon Sep 17 00:00:00 2001 From: Thomas Mansencal Date: Tue, 3 Feb 2026 09:44:48 +1300 Subject: [PATCH 14/37] Implement support for Astral's uv. (#2097) Signed-off-by: Thomas Mansencal --- .gitignore | 6 +- src/apps/ocioview/pyproject.toml | 116 ++++++++++++++++++----------- src/apps/ocioview/requirements.txt | 3 +- 3 files changed, 76 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index 53ca1bc274..827d8df759 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ dist* mastercopy *.pyc !*.yml -.vscode +.idea/ +.venv/ +.vscode/ -src/apps/ocioview/poetry.lock +src/apps/ocioview/uv.lock diff --git a/src/apps/ocioview/pyproject.toml b/src/apps/ocioview/pyproject.toml index 858223b4d5..10ec8d460f 100644 --- a/src/apps/ocioview/pyproject.toml +++ b/src/apps/ocioview/pyproject.toml @@ -1,49 +1,75 @@ -[tool.poetry] +[project] name = "ocioview" version = "0.1.0" description = "OpenColorIO config visual editor application" -license = "BSD-3-Clause" -authors = ["Contributors to the OpenColorIO Project"] +requires-python = ">=3.10,<3.14" +authors = [ + { name = "Contributors to the OpenColorIO Project" } +] +maintainers = [ + { name = "Contributors to the OpenColorIO Project" } +] +license = { text = "BSD-3-Clause" } +classifiers = [ + "Development Status :: 3 - Alpha", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Topic :: Scientific/Engineering", + "Topic :: Software Development", +] +dependencies = [ + "colour-science>=0.4.5,<0.5", + "colour-visuals", + "imageio>=2,< 3", + "networkx>=3,<4", + "numpy>=1.24,<3", + "opencolorio>=2,<3", + "pygfx>=0.1,<0.3", + "pygments", + "pyopengl", + "pyside6", + "qtawesome", + "scipy>=1.10,<2", +] + +[tool.uv.sources] +"colour-visuals" = { git = "https://github.com/colour-science/colour-visuals.git" } -[tool.poetry.dependencies] -python = ">= 3.9, < 3.12" -colour-science = {git = "https://github.com/colour-science/colour.git"} -colour-visuals = {git = "https://github.com/colour-science/colour-visuals.git"} -imageio = ">= 2, < 3" -networkx = ">= 2.7, < 3" -numpy = ">= 1.22, < 2" -opencolorio = "*" -pygfx = "*" -pygments = "*" -pyopengl = "*" -pyside6 = "*" -qtawesome = "*" -scipy = ">= 1.8, < 2" -wpgu = "*" +[project.optional-dependencies] +docs = [ + "restructuredtext-lint", + "sphinx", +] -[tool.poetry.group.dev.dependencies] -black = "*" -blackdoc = "*" -coverage = "!= 6.3" -coveralls = "*" -flynt = "*" -invoke = "*" -jupyter = "*" -pre-commit = "*" -pyright = "*" -pytest = "*" -pytest-cov = "*" -pytest-qt = "*" -pytest-xdist = "*" -ruff = "*" -toml = "*" -twine = "*" +[tool.uv] +package = true +dev-dependencies = [ + "black", + "coverage", + "coveralls", + "hatch", + "invoke", + "jupyter", + "pre-commit", + "pyright", + "pytest", + "pytest-cov", + "pytest-xdist", + "toml", + "twine", +] -[tool.poetry.group.docs.dependencies] -pydata-sphinx-theme = "*" -restructuredtext-lint = "*" -sphinx = "*" -sphinxcontrib-bibtex = "*" +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = [ "ocioview" ] [tool.black] line-length = 79 @@ -85,7 +111,7 @@ filterwarnings = [ ] [tool.ruff] -target-version = "py39" +target-version = "py310" line-length = 88 select = [ "A", # flake8-builtins @@ -128,7 +154,7 @@ select = [ "TRY", # tryceratops "UP", # pyupgrade "W", # pydocstyle - "YTT" # flake8-2020 + "YTT", # flake8-2020 ] ignore = [ "B008", @@ -162,6 +188,7 @@ ignore = [ "RET508", "TRY003", "TRY300", + "UP038", ] typing-modules = ["colour.hints"] fixable = ["B", "C", "E", "F", "PIE", "RUF", "SIM", "UP", "W"] @@ -172,6 +199,5 @@ convention = "numpy" [tool.ruff.per-file-ignores] "docs/*" = ["INP"] -[build-system] -requires = ["poetry_core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +[tool.ruff.format] +docstring-code-format = true diff --git a/src/apps/ocioview/requirements.txt b/src/apps/ocioview/requirements.txt index 124acd49da..ec6b8bca1e 100644 --- a/src/apps/ocioview/requirements.txt +++ b/src/apps/ocioview/requirements.txt @@ -1,4 +1,4 @@ -colour-science @ git+https://github.com/colour-science/colour.git +colour-science colour-visuals @ git+https://github.com/colour-science/colour-visuals.git imageio networkx @@ -10,4 +10,3 @@ PyOpenGL PySide6 QtAwesome scipy -wgpu From f390b9d2047038b8334e9ab3f88b90bba17f5293 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 11 Feb 2026 00:05:48 -0500 Subject: [PATCH 15/37] Add more info to the documentation overview page (#2264) Signed-off-by: Doug Walker --- docs/index.rst | 73 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index f87ffb2d79..07749aa274 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -36,19 +36,52 @@ best leverage them. We have an OCIO User Experience (UX) working group that is gradually working on more coverage. The documentation is a work-in-progress and we would love to have your help to -improve it! An easy way to get involved is to join the #docs or #ux channel on +improve it! An easy way to get involved is to join the #opencolorio channel on :ref:`slack`. +Roadmap +======= + +The project attempts to maintain a roadmap to give the community insight into +upcoming development. The items are grouped into "Now", "Next", and "Later" categories. +"Now" indicates work that is currently in-progress. "Next" indicates work that is being +planned for imminent development (meaning now would be a good time to provide your input). +The roadmap is available `here. `_ + + Community ========= +.. _meetings: + +Meetings +******** + +The OpenColorIO project has a Technical Steering Committee meeting on Zoom every two weeks +at noon LA time. The Zoom link is available from the `OCIO Calendar. `_ + +There is a general working group and "office hours" meeting once a month in the same +time slot. The Zoom link is available from the `OCIO Calendar. `_ + +These meetings are open to anyone! + + +.. _slack: + +Slack +***** + +Join us on the `ASWF Slack `_ in the channels +`#opencolorio` and `#opencolor-configs`. + + .. _mailing_lists: Mailing Lists ************* -There are two mailing lists associated with OpenColorIO: +Most of the conversation happens on Slack, but there are two mailing lists associated with OpenColorIO: `ocio-user `__\ ``@lists.aswf.io`` For end users (artists, often) interested in OCIO profile design, @@ -57,14 +90,40 @@ There are two mailing lists associated with OpenColorIO: `ocio-dev `__\ ``@lists.aswf.io`` For developers interested OCIO APIs, code integration, compilation, etc. -.. _slack: -Slack -***** +Related Projects +================ + +.. _cif: + +ASWF Color Interop Forum +************************ + +The CIF is an open, cross-project forum for discussing color interoperability across varying workflows +and standards. The aim isn’t necessarily to develop new standards, but rather to make recommendations +for how to improve color accuracy through the existing infrastructure. + +Recommendations are published on the `ColorInterop GitHub. `_ + +The forum has a monthly Zoom meeting on Mondays at noon LA time, as posted on the +`OCIO Calendar. `_ + +Discussion happens in the `#color-interop-forum` channel on the ASWF Slack. + + +.. _nano: + +NanoColor +********* + +NanoColor is a collaboration between OpenUSD, MaterialX, and OpenColorIO to ensure that there +is interoperable and flexible color management among those projects and related projects in +the computer graphics world. -There is an OpenColorIO Slack workspace at: ``_. +The working group has a Zoom meeting every two weeks on Mondays at 1:00 pm LA time, as posted on the +`OCIO Calendar. `_ -New users may join the workspace from `here `_. +Discussion happens in the `#nanocolor` channel on the ASWF Slack. Search From a1ab61ec634b308b1cbac58f8d16bc6b4a8a4153 Mon Sep 17 00:00:00 2001 From: Kevin Wheatley Date: Thu, 12 Feb 2026 05:02:36 +0000 Subject: [PATCH 16/37] Remove redundant unit_test_failures declaration (#2261) Removed the declaration of 'unit_test_failures' from UnitTest.h. Signed-off-by: Kevin Wheatley Co-authored-by: Doug Walker --- tests/testutils/UnitTest.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/testutils/UnitTest.h b/tests/testutils/UnitTest.h index f4bb339ee4..f9d69829b1 100644 --- a/tests/testutils/UnitTest.h +++ b/tests/testutils/UnitTest.h @@ -63,8 +63,6 @@ typedef std::vector UnitTests; UnitTests & GetUnitTests(); -extern int unit_test_failures; - struct AddTest { explicit AddTest(const OCIOTestRcPtr & test) From eaa028171a8e74d029b0c139a3a8588d15fd00af Mon Sep 17 00:00:00 2001 From: Cuneyt Ozdas Date: Wed, 18 Feb 2026 00:31:03 -0800 Subject: [PATCH 17/37] Adsk Contrib - Add Support for SMPTE ST 2036-1 compliant CLF files (#2265) * Adding reading and writing support for SMPTE ST 2036-1 compliant CLF files. - Added "Id" element support per the spec. - Extended the CTFVersion class to handle non-numeric formats per the spec (which uses xmlns as the version) - CLF xml parser now strips the namespaces from the elements by default. This makes it possible to parse files with simple name spaces but complex name-spaced clf files may still fail. There is an internal switch to turn on/off the name space stripping. This way elements which need to retain the name spaces (such as the Info element) can still get the un-stripped names. - Extended the Input and Output Descriptor collection to hold multiple entries (similar to Description field) - CLF writer now writes the SMPTE xmlns version as well as the CompCLFVersion attribute. The resulting files can be read both by the Academy CLF parsers and SMPTE CLF parsers. - Generated cache hash IDs are now in the 8-4-4-4-12 UUID format to help complying with SMPTE id requirements - ociomakeclf tool now takes "--generateid" switch to for inserting newly added "Id element" into the target clf file. TODO: - Description and Descriptor elements need to collect the language attribute. - non-default namespace attributes (e.g. xmlns:foo) needs to be collected as root level attributes. - Those two TODO items need some re-factoring in the data collection code. Signed-off-by: cuneyt.ozdas * - Per the code review, exposing the newly added constant METADATA_ID_ELEMENT in python too. Signed-off-by: cuneyt.ozdas * - re-worked some part of the CLF parser and the CTFReaderTransform class to be able to collect richer metadata. - Now collecting the language attribute of the Description, input and output descriptor elements. - Also collecting the non-default xmlns attributes at the root level. - Updated the tests accordingly. - Replaced clf/pre-smpte_only/matrix_example.clf with clf/matrix_example_utf8.clf in some for some Reference tests. - Added format information to the ociomakeclf tool's help text. Signed-off-by: cuneyt.ozdas * - nmake the compilers happy. Signed-off-by: cuneyt.ozdas * - make the compilers happy pt2 Signed-off-by: cuneyt.ozdas * - make the compilers happy pt3 (we need to make Windows compiler settings as picky as other platforms) Signed-off-by: cuneyt.ozdas --------- Signed-off-by: cuneyt.ozdas Co-authored-by: Doug Walker --- include/OpenColorIO/OpenColorTypes.h | 7 + src/OpenColorIO/HashUtils.cpp | 24 + src/OpenColorIO/HashUtils.h | 4 + src/OpenColorIO/Processor.cpp | 12 +- src/OpenColorIO/fileformats/FileFormatCTF.cpp | 176 +- .../fileformats/FormatMetadata.cpp | 17 + src/OpenColorIO/fileformats/FormatMetadata.h | 3 + src/OpenColorIO/fileformats/cdl/CDLParser.h | 2 +- .../fileformats/cdl/CDLReaderHelper.cpp | 5 +- .../fileformats/cdl/CDLReaderHelper.h | 14 +- .../fileformats/ctf/CTFReaderHelper.cpp | 153 +- .../fileformats/ctf/CTFReaderHelper.h | 118 +- .../fileformats/ctf/CTFReaderUtils.cpp | 16 + .../fileformats/ctf/CTFReaderUtils.h | 3 + .../fileformats/ctf/CTFTransform.cpp | 364 +- .../fileformats/ctf/CTFTransform.h | 118 +- .../fileformats/xmlutils/XMLReaderHelper.cpp | 3 +- .../fileformats/xmlutils/XMLReaderHelper.h | 25 +- .../fileformats/xmlutils/XMLReaderUtils.h | 27 +- src/OpenColorIO/ops/cdl/CDLOpCPU.cpp | 12 +- .../gradingprimary/GradingPrimaryOpCPU.cpp | 6 +- src/OpenColorIO/transforms/CDLTransform.cpp | 1 - src/apps/ociomakeclf/main.cpp | 25 +- src/bindings/python/PyTypes.cpp | 1 + tests/cpu/OpOptimizers_tests.cpp | 8 +- tests/cpu/Processor_tests.cpp | 18 +- .../apphelpers/MergeConfigsHelpers_tests.cpp | 2 +- tests/cpu/fileformats/FileFormatCTF_tests.cpp | 905 +- .../fileformats/ctf/CTFTransform_tests.cpp | 175 +- .../ops/reference/ReferenceOpData_tests.cpp | 2 +- tests/cpu/transforms/FileTransform_tests.cpp | 2 +- .../files/clf/aces_to_video_with_look.clf | 2 +- tests/data/files/clf/bit_depth_identity.clf | 25 + tests/data/files/clf/cdl_all_styles.clf | 2 +- tests/data/files/clf/cdl_clamp_fwd.clf | 2 +- tests/data/files/clf/cdl_missing_sat.clf | 2 +- tests/data/files/clf/cdl_missing_sop.clf | 2 +- tests/data/files/clf/cdl_missing_style.clf | 2 +- tests/data/files/clf/difficult_syntax.clf | 29 +- tests/data/files/clf/exponent_all_styles.clf | 2 +- .../files/clf/illegal/array_bad_dimension.clf | 2 +- .../files/clf/illegal/array_bad_value.clf | 2 +- .../clf/illegal/array_missing_values.clf | 2 +- .../clf/illegal/array_too_many_values.clf | 2 +- .../data/files/clf/illegal/cdl_bad_power.clf | 2 +- tests/data/files/clf/illegal/cdl_bad_sat.clf | 2 +- .../data/files/clf/illegal/cdl_bad_slope.clf | 2 +- .../data/files/clf/illegal/cdl_bad_style.clf | 2 +- .../files/clf/illegal/cdl_missing_offset.clf | 2 +- .../files/clf/illegal/cdl_missing_power.clf | 2 +- .../files/clf/illegal/cdl_missing_slope.clf | 2 +- .../files/clf/illegal/exponent_bad_param.clf | 2 +- .../files/clf/illegal/exponent_bad_value.clf | 2 +- .../data/files/clf/illegal/indexMap_test2.clf | 2 +- .../data/files/clf/illegal/log_bad_param.clf | 2 +- .../data/files/clf/illegal/log_bad_style.clf | 2 +- .../clf/illegal/log_missing_breakpnt.clf | 2 +- .../lut1d_half_domain_missing_values.clf | 2 +- .../illegal/lut1d_half_domain_set_false.clf | 2 +- .../clf/illegal/lut1d_raw_half_set_false.clf | 2 +- .../files/clf/illegal/lut3d_unequal_size.clf | 2 +- .../files/clf/illegal/matrix_end_missing.clf | 2 +- .../clf/illegal/process_list_missing.clf | 2 +- .../files/clf/illegal/range_bad_noclamp.clf | 4 +- .../files/clf/illegal/range_bad_values.clf | 2 +- tests/data/files/clf/illegal/range_empty.clf | 2 +- .../clf/illegal/range_nonmatching_clamp.clf | 2 +- .../clf/illegal/transform_bad_outdepth.clf | 2 +- .../illegal/transform_bitdepth_mismatch.clf | 6 +- .../clf/illegal/transform_corrupted_tag.clf | 4 +- .../illegal/transform_element_end_missing.clf | 4 +- .../files/clf/illegal/transform_empty.clf | 4 +- .../files/clf/illegal/transform_id_empty.clf | 5 - .../clf/illegal/transform_missing_id.clf | 5 - .../illegal/transform_missing_inbitdepth.clf | 2 +- .../illegal/transform_missing_outbitdepth.clf | 2 +- .../files/clf/illegal/unknown_elements.clf | 4 +- tests/data/files/clf/info_example.clf | 4 +- tests/data/files/clf/inverseOf_id_test.clf | 2 +- tests/data/files/clf/log_all_styles.clf | 2 +- tests/data/files/clf/lut1d_32f_example.clf | 2 +- tests/data/files/clf/lut1d_comp.clf | 2 +- tests/data/files/clf/lut1d_example.clf | 2 +- .../clf/lut1d_half_domain_raw_half_set.clf | 6 +- tests/data/files/clf/lut1d_long.clf | 2 +- tests/data/files/clf/lut1d_lut3d_lut1d.clf | 2 +- .../data/files/clf/lut3d_17x17x17_10i_12i.clf | 2 +- tests/data/files/clf/lut3d_as_matrix.clf | 2 +- tests/data/files/clf/lut3d_bizarre.clf | 2 +- .../data/files/clf/lut3d_identity_12i_16f.clf | 2 +- .../files/clf/lut3d_preview_tier_test.clf | 2 +- tests/data/files/clf/matrix_3x4_example.clf | 2 +- tests/data/files/clf/matrix_example_utf8.clf | 2 +- tests/data/files/clf/matrix_no_newlines.clf | 2 +- tests/data/files/clf/matrix_windows.clf | 4 +- tests/data/files/clf/multiple_ops.clf | 2 +- .../illegal/log_bad_version.clf | 2 +- .../illegal/process_list_bad_version.clf | 2 +- .../illegal/process_list_higher_version.clf | 2 +- .../illegal/transform_id_empty.clf | 5 + .../illegal/transform_missing_id.clf | 5 + .../{ => pre-smpte_only}/matrix_example.clf | 2 +- .../process_list_v3_namespace.clf | 11 + tests/data/files/clf/range.clf | 2 +- tests/data/files/clf/range_test1_clamp.clf | 2 +- tests/data/files/clf/range_test1_noclamp.clf | 2 +- tests/data/files/clf/range_test2.clf | 4 +- .../smpte_only/broadcast_profile_lut33.clf | 35996 ++++++++++++++++ .../clf/smpte_only/illegal/id_bad_value.clf | 25 + .../process_list_higher_ns_version.clf | 11 + .../data/files/clf/smpte_only/namespaces.clf | 14 + tests/data/files/clf/tabulation_support.clf | 2 +- tests/data/files/clf/xyz_to_rgb.clf | 2 +- .../process_list_conflicting_versions.ctf | 12 + tests/data/files/reference_nested_2.ctf | 2 +- tests/data/files/reference_one_matrix.ctf | 2 +- tests/data/files/references_same_twice.ctf | 4 +- tests/python/ConstantsTest.py | 1 + tests/python/GroupTransformTest.py | 2 +- tests/python/ProcessorTest.py | 2 +- tests/testutils/UnitTest.h | 3 + 121 files changed, 37775 insertions(+), 798 deletions(-) create mode 100644 tests/data/files/clf/bit_depth_identity.clf delete mode 100644 tests/data/files/clf/illegal/transform_id_empty.clf delete mode 100644 tests/data/files/clf/illegal/transform_missing_id.clf rename tests/data/files/clf/{ => pre-smpte_only}/illegal/log_bad_version.clf (80%) rename tests/data/files/clf/{ => pre-smpte_only}/illegal/process_list_bad_version.clf (82%) rename tests/data/files/clf/{ => pre-smpte_only}/illegal/process_list_higher_version.clf (80%) create mode 100644 tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf create mode 100644 tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf rename tests/data/files/clf/{ => pre-smpte_only}/matrix_example.clf (83%) create mode 100644 tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf create mode 100644 tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf create mode 100644 tests/data/files/clf/smpte_only/illegal/id_bad_value.clf create mode 100644 tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf create mode 100644 tests/data/files/clf/smpte_only/namespaces.clf create mode 100644 tests/data/files/process_list_conflicting_versions.ctf diff --git a/include/OpenColorIO/OpenColorTypes.h b/include/OpenColorIO/OpenColorTypes.h index 8fa5833749..39a181c467 100644 --- a/include/OpenColorIO/OpenColorTypes.h +++ b/include/OpenColorIO/OpenColorTypes.h @@ -977,6 +977,13 @@ extern OCIOEXPORT const char * METADATA_NAME; */ extern OCIOEXPORT const char * METADATA_ID; +/** + * An ID when stored as an XML element rather than as an attribute. This is the + * preferred mechanism in the SMPTE ST 2036-1 version of the CLF format. If + * present, it is only available from the top-level FormatMetadata. + */ + extern OCIOEXPORT const char * METADATA_ID_ELEMENT; + /*!rst:: Caches ****** diff --git a/src/OpenColorIO/HashUtils.cpp b/src/OpenColorIO/HashUtils.cpp index 15f775faa0..627ab20661 100644 --- a/src/OpenColorIO/HashUtils.cpp +++ b/src/OpenColorIO/HashUtils.cpp @@ -2,6 +2,7 @@ // Copyright Contributors to the OpenColorIO Project. #include +#include #include @@ -25,4 +26,27 @@ std::string CacheIDHash(const char * array, std::size_t size) return oss.str(); } +std::string CacheIDHashUUID(const char * array, std::size_t size) +{ + XXH128_hash_t hash = XXH3_128bits(array, size); + + // Make sure that we have full, zero-padded 32 chars. + std::stringstream oss; + oss << std::hex << std::setfill('0'); + oss << std::setw(16) << hash.high64; + oss << std::setw(16) << hash.low64; + + // Format into 8-4-4-4-12 form. + std::string hex = oss.str(); + std::string uuid = + hex.substr(0, 8) + "-" + + hex.substr(8, 4) + "-" + + hex.substr(12, 4) + "-" + + hex.substr(16, 4) + "-" + + hex.substr(20, 12); + + return uuid; +} + + } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/HashUtils.h b/src/OpenColorIO/HashUtils.h index 66c3b6e3fd..cf53ab1cba 100644 --- a/src/OpenColorIO/HashUtils.h +++ b/src/OpenColorIO/HashUtils.h @@ -14,6 +14,10 @@ namespace OCIO_NAMESPACE std::string CacheIDHash(const char * array, std::size_t size); +// Generates 128 bit UUID in the form of 8-4-4-4-12 using the hash of the passed +// string. +std::string CacheIDHashUUID(const char * array, std::size_t size); + } // namespace OCIO_NAMESPACE #endif diff --git a/src/OpenColorIO/Processor.cpp b/src/OpenColorIO/Processor.cpp index dab0287dfb..83b8468b75 100755 --- a/src/OpenColorIO/Processor.cpp +++ b/src/OpenColorIO/Processor.cpp @@ -330,15 +330,9 @@ const char * Processor::Impl::getCacheID() const if(!m_cacheID.empty()) return m_cacheID.c_str(); - if(m_ops.empty()) - { - m_cacheID = ""; - } - else - { - const std::string fullstr = m_ops.getCacheID(); - m_cacheID = CacheIDHash(fullstr.c_str(), fullstr.size()); - } + // Note: empty ops vector will also create a UUID. + const std::string fullstr = m_ops.getCacheID(); + m_cacheID = CacheIDHashUUID(fullstr.c_str(), fullstr.size()); return m_cacheID.c_str(); } diff --git a/src/OpenColorIO/fileformats/FileFormatCTF.cpp b/src/OpenColorIO/fileformats/FileFormatCTF.cpp index b1f0393038..d4a0e7e42e 100644 --- a/src/OpenColorIO/fileformats/FileFormatCTF.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCTF.cpp @@ -28,6 +28,7 @@ #include "TransformBuilder.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" +#include "HashUtils.h" /* @@ -40,7 +41,14 @@ to agree on a common LUT format for this industry. Support for CLF is a requirement in order to obtain ACES Logo Certification from the Academy (in several product categories). CLF files are expressed using XML. The spec, AMPAS S-2014-006, is available from: - + + +In 2026, SMPTE will publish ST 2136-1 to standardize the Academy/ASC format. +The main change is how versions are declared. The SMPTE spec sets the xmlns +attribute of the ProcessList to a specific value rather than using the +compCLFversion attribute. Since the differences are so minimal, OCIO writes +both the xmlns and compCLFversion in order to maximize compatibility with +different readers. The Autodesk CTF format is based on the Academy/ASC CLF format and adds several operators that allow higher quality results by avoiding the need to bake @@ -146,27 +154,36 @@ class LocalFileFormat : public FileFormat void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { - FormatInfo info; - info.name = FILEFORMAT_CLF; - info.extension = "clf"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | - FORMAT_CAPABILITY_BAKE | - FORMAT_CAPABILITY_WRITE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); - formatInfoVec.push_back(info); - - FormatInfo info2; - info2.name = FILEFORMAT_CTF; - info2.extension = "ctf"; - info2.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | - FORMAT_CAPABILITY_BAKE | - FORMAT_CAPABILITY_WRITE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); - formatInfoVec.push_back(info2); + // CLF - Academy/ASC & SMPTE uses the same format + { + FormatInfo info; + info.name = FILEFORMAT_CLF; + info.extension = "clf"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | + FORMAT_CAPABILITY_BAKE | + FORMAT_CAPABILITY_WRITE); + + info.bake_capabilities = FormatBakeFlags( FORMAT_BAKE_CAPABILITY_3DLUT | + FORMAT_BAKE_CAPABILITY_1DLUT | + FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + formatInfoVec.push_back(info); + } + + // CTF + { + FormatInfo info; + info.name = FILEFORMAT_CTF; + info.extension = "ctf"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | + FORMAT_CAPABILITY_BAKE | + FORMAT_CAPABILITY_WRITE); + + info.bake_capabilities = FormatBakeFlags( FORMAT_BAKE_CAPABILITY_3DLUT | + FORMAT_BAKE_CAPABILITY_1DLUT | + FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + + formatInfoVec.push_back(info); + } } class XMLParserHelper @@ -227,7 +244,7 @@ class XMLParserHelper throwMessage(error); } - if (pT->getOps().empty()) + if (pT->getOpDataVec().empty()) { static const std::string error( "CTF/CLF parsing error: No color operator in file."); @@ -420,7 +437,7 @@ class XMLParserHelper // Start the parsing of one element. static void StartElementHandler(void * userData, - const XML_Char * name, + const XML_Char * name_full, const XML_Char ** atts) { static const std::vector rangeSubElements = { @@ -478,7 +495,7 @@ class XMLParserHelper XMLParserHelper * pImpl = (XMLParserHelper*)userData; - if (!pImpl || !name || !*name) + if (!pImpl || !name_full || !*name_full) { if (!pImpl) { @@ -490,6 +507,14 @@ class XMLParserHelper } } + // Strip the name spaces + const char *name = name_full; + if (pImpl->m_keepNamespaces <= 0) + { + name = strrchr(name_full, ':'); + name = name ? (name+1) : name_full; + } + if (!pImpl->m_elms.empty()) { // Check if we are still processing a metadata structure. @@ -711,12 +736,22 @@ class XMLParserHelper SupportedElement(name, pElt, METADATA_VIEWING_DESCRIPTION, TAG_CDL, recognizedName)) { pImpl->m_elms.push_back( - std::make_shared( + std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); + } + else if (SupportedElement(name, pElt, TAG_ID, "", recognizedName)) + { + pImpl->m_elms.push_back( + std::make_shared( name, pContainer, pImpl->getXmLineNumber(), pImpl->getXmlFilename())); } + // Dynamic Property is valid under any operator parent. First // test if the tag is supported to set the recognizedName // accordingly, without testing for parents. Test for the @@ -790,6 +825,8 @@ class XMLParserHelper else if (SupportedElement(name, pElt, TAG_INFO, TAG_PROCESS_LIST, recognizedName)) { + pImpl->m_keepNamespaces++; + pImpl->m_elms.push_back( std::make_shared( name, @@ -801,7 +838,7 @@ class XMLParserHelper TAG_PROCESS_LIST, recognizedName)) { pImpl->m_elms.push_back( - std::make_shared( + std::make_shared( name, pContainer, pImpl->getXmLineNumber(), @@ -838,7 +875,7 @@ class XMLParserHelper TAG_PROCESS_LIST, recognizedName)) { pImpl->m_elms.push_back( - std::make_shared( + std::make_shared( name, pContainer, pImpl->getXmLineNumber(), @@ -992,14 +1029,22 @@ class XMLParserHelper // End the parsing of one element. static void EndElementHandler(void * userData, - const XML_Char * name) + const XML_Char * name_full) { XMLParserHelper * pImpl = (XMLParserHelper*)userData; - if (!pImpl || !name || !*name) + if (!pImpl || !name_full || !*name_full) { throw Exception("CTF/CLF internal parsing error."); } + // Strip the name spaces + const char *name = name_full; + if (pImpl->m_keepNamespaces <= 0) + { + name = strrchr(name_full, ':'); + name = name ? (name+1) : name_full; + } + // Is the expected element present? auto pElt(pImpl->m_elms.back()); if (!pElt.get()) @@ -1054,6 +1099,12 @@ class XMLParserHelper } } + // Exiting the info element; decrease keep namespace counter. + if(std::dynamic_pointer_cast(pElt)) + { + pImpl->m_keepNamespaces--; + } + pElt->end(); } @@ -1086,15 +1137,29 @@ class XMLParserHelper pImpl->throwMessage(oss.str()); } - auto pDescriptionElt = - std::dynamic_pointer_cast(pElt); - if (pDescriptionElt) + // TODO: Fix this special case handling where description elements want + // leading and trailing white space retained. + if (auto pDescriptionElt = std::dynamic_pointer_cast(pElt)) { pDescriptionElt->setRawData(s, len, pImpl->getXmLineNumber()); } + if (auto pDescElt = std::dynamic_pointer_cast(pElt)) + { + pDescElt->setRawData(s, len, pImpl->getXmLineNumber()); + } else { // Strip white spaces. + + // TODO: Need to change this. CharacterDataHandler() may be called + // multiple times for a single element, and we may end up stripping + // white spaces that are actually part of the data. Other parts of + // the code already anticipate partial text reception, this part is + // not handling that possibility. White space removal should be done by + // the element handlers at the end. Also the special case handling + // doesn't belong here. This part is dispatching the strings to the + // elements, it shouldn't know the identities of the handlers and + // should not change the behavior accordingly. size_t start = 0; size_t end = len; FindSubString(s, len, start, end); @@ -1160,6 +1225,7 @@ class XMLParserHelper bool m_isCLF; XmlReaderElementStack m_elms; // Parsing stack CTFReaderTransformPtr m_transform; + int m_keepNamespaces = 0; // if >0, name spaces will be preserved }; @@ -1167,8 +1233,10 @@ bool isLoadableCTF(std::istream & istream) { std::streampos curPos = istream.tellg(); - const unsigned limit(5 * 1024); // 5 kilobytes. - const char *pattern = "m_transform->toMetadata(processorData); // Resolve reference path using context and load referenced files. - const ConstOpDataVec & opDataVec = cachedFile->m_transform->getOps(); + const ConstOpDataVec & opDataVec = cachedFile->m_transform->getOpDataVec(); // Try to use the FileTransform interpolation for any Lut1D or Lut3D that does not specify // an interpolation in the CTF itself. If the interpolation can not be used, ignore it. @@ -1558,14 +1633,19 @@ void LocalFileFormat::write(const ConstConfigRcPtr & config, const std::string & formatName, std::ostream & ostream) const { - bool isCLF = false; + + TransformWriter::SubFormat subFormat{TransformWriter::SubFormat::FORMAT_UNKNOWN}; + if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CLF) == 0) { - isCLF = true; - } - else if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CTF) != 0) + subFormat = TransformWriter::SubFormat::FORMAT_CLF; + } + else if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CTF) == 0) + { + subFormat = TransformWriter::SubFormat::FORMAT_CTF; + } + else { - // Neither a clf nor a ctf. std::ostringstream os; os << "Error: CLF/CTF writer does not also write format " << formatName << "."; throw Exception(os.str().c_str()); @@ -1583,11 +1663,21 @@ void LocalFileFormat::write(const ConstConfigRcPtr & config, const FormatMetadataImpl & metadata = group.getFormatMetadata(); CTFReaderTransformPtr transform = std::make_shared(ops, metadata); + // It it doesn't have an id, create one based on the op list. + if (transform->getID().empty()) + { + std::string opId = ops.getCacheID(); + + std::ostringstream ss; + ss << "urn:uuid:" << CacheIDHashUUID(opId.c_str(), opId.size()); + transform->setID(ss.str().c_str()); + } + // Write XML Header. ostream << "" << std::endl; XmlFormatter fmt(ostream); - TransformWriter writer(fmt, transform, isCLF); + TransformWriter writer(fmt, transform, subFormat); writer.write(); } diff --git a/src/OpenColorIO/fileformats/FormatMetadata.cpp b/src/OpenColorIO/fileformats/FormatMetadata.cpp index 8b5fe1cfad..345cb1bf38 100644 --- a/src/OpenColorIO/fileformats/FormatMetadata.cpp +++ b/src/OpenColorIO/fileformats/FormatMetadata.cpp @@ -19,6 +19,9 @@ const char * METADATA_INFO = "Info"; const char * METADATA_INPUT_DESCRIPTOR = "InputDescriptor"; const char * METADATA_OUTPUT_DESCRIPTOR = "OutputDescriptor"; +// CLF XML elements described in ST2136-1 +const char * METADATA_ID_ELEMENT = "Id"; + // NAME and ID are CLF XML attributes described in S-2014-006. const char * METADATA_NAME = "name"; const char * METADATA_ID = "id"; @@ -216,6 +219,20 @@ int FormatMetadataImpl::getFirstChildIndex(const std::string & name) const noexc return -1; } +FormatMetadataImpl::Elements FormatMetadataImpl::getChildrenElements( + const std::string & name) const noexcept +{ + Elements subElements; + for (auto & it : m_elements) + { + if (0 == Platform::Strcasecmp(name.c_str(), it.getElementName())) + { + subElements.push_back(it); + } + } + return subElements; +} + int FormatMetadataImpl::findNamedAttribute(const std::string & name) const noexcept { int i = 0; diff --git a/src/OpenColorIO/fileformats/FormatMetadata.h b/src/OpenColorIO/fileformats/FormatMetadata.h index 35c8cb2e01..6f26f2afb2 100644 --- a/src/OpenColorIO/fileformats/FormatMetadata.h +++ b/src/OpenColorIO/fileformats/FormatMetadata.h @@ -55,6 +55,9 @@ class FormatMetadataImpl : public FormatMetadata // Retrieve the vector of elements under the metadata. Elements & getChildrenElements() noexcept; const Elements & getChildrenElements() const noexcept; + + // Returns all of the children elements matching the given name. + Elements getChildrenElements(const std::string & name) const noexcept; // Merge rhs into this. Expected to be used on root FormatMetadataImpl for ops. void combine(const FormatMetadataImpl & rhs); diff --git a/src/OpenColorIO/fileformats/cdl/CDLParser.h b/src/OpenColorIO/fileformats/cdl/CDLParser.h index 0e5471b005..ddeee5a262 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLParser.h +++ b/src/OpenColorIO/fileformats/cdl/CDLParser.h @@ -20,7 +20,7 @@ class CDLParser { public: explicit CDLParser(const std::string& xmlFile); - virtual ~CDLParser(); + ~CDLParser(); void parse(std::istream & istream) const; diff --git a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp index 38eaab76dd..c85d7b160e 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp @@ -77,11 +77,10 @@ void CDLReaderColorCorrectionElt::setCDLParsingInfo(const CDLParsingInfoRcPtr & m_parsingInfo = pTransformList; } -void CDLReaderColorCorrectionElt::appendMetadata(const std::string & name, const std::string & value) +void CDLReaderColorCorrectionElt::appendMetadata(FormatMetadataImpl& metadata) { // Keeps description as metadata with supplied name. - FormatMetadataImpl item(name, value); - m_transformData->getFormatMetadata().getChildrenElements().push_back(item); + m_transformData->getFormatMetadata().getChildrenElements().push_back(metadata); } } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h index b67e4e2144..4b3b613e7f 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h +++ b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h @@ -54,9 +54,9 @@ class CDLReaderColorDecisionListElt : public XmlReaderContainerElt return m_parsingInfo; } - void appendMetadata(const std::string & name, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { - m_parsingInfo->m_metadata.addChildElement(name.c_str(), value.c_str()); + m_parsingInfo->m_metadata.getChildrenElements().push_back(metadata); } const FormatMetadataImpl & getMetadata() const @@ -89,9 +89,9 @@ class CDLReaderColorDecisionElt : public XmlReaderComplexElt { } - void appendMetadata(const std::string & name, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { - m_metadata.addChildElement(name.c_str(), value.c_str()); + m_metadata.getChildrenElements().push_back(metadata); } @@ -138,9 +138,9 @@ class CDLReaderColorCorrectionCollectionElt : public XmlReaderContainerElt return m_parsingInfo; } - void appendMetadata(const std::string & name, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { - m_parsingInfo->m_metadata.addChildElement(name.c_str(), value.c_str()); + m_parsingInfo->m_metadata.getChildrenElements().push_back(metadata); } const FormatMetadataImpl & getMetadata() const @@ -169,7 +169,7 @@ class CDLReaderColorCorrectionElt : public XmlReaderComplexElt void setCDLParsingInfo(const CDLParsingInfoRcPtr & parsingInfo); - void appendMetadata(const std::string & name, const std::string & value) override; + void appendMetadata(FormatMetadataImpl& metadata) override; private: CDLParsingInfoRcPtr m_parsingInfo; diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp index 79393fc489..f8ecd7eb6e 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp @@ -60,6 +60,7 @@ void CTFReaderTransformElt::start(const char ** atts) bool isIdFound = false; bool isVersionFound = false; bool isCLFVersionFound = false; + bool isSMPTEVersionFound = false; CTFVersion requestedVersion(0, 0); CTFVersion requestedCLFVersion(0, 0); @@ -70,12 +71,40 @@ void CTFReaderTransformElt::start(const char ** atts) { if (!atts[i + 1] || !*atts[i + 1]) { - throwMessage("Required attribute 'id' does not have a value."); + throwMessage("Attribute 'id' does not have a value."); } - m_transform->setID(atts[i + 1]); + m_transform->getFormatMetadata().addAttribute(ATTR_ID, atts[i + 1]); isIdFound = true; } + else if (0 == Platform::Strcasecmp(ATTR_XMLNS, atts[i])) + { + if (!atts[i + 1] || !*atts[i + 1]) + { + throwMessage("Attribute 'xmlns' does not have a value."); + } + + // Check if xmlns atrribute holds a SMPTE version string. + try + { + auto version = CTFVersion(atts[i + 1], CTFVersion::StringFormat::VERSION_SMPTE_XMLNS); + requestedVersion = CTF_PROCESS_LIST_VERSION_2_0; + requestedCLFVersion = version; + isSMPTEVersionFound = true; + m_isCLF = true; + } + catch (Exception& /*e*/) + { + // Ignore other xmlns attribute strings. + } + + // Disallow Version and version-holding xmlns appering togather. + // Note that compCLFversion can appear together with xmlns. + if (isVersionFound && isSMPTEVersionFound) + { + throwMessage("SMPTE 'xmlns' version and 'Version' attribute cannot both be present."); + } + } else if (0 == Platform::Strcasecmp(ATTR_NAME, atts[i])) { if (!atts[i + 1] || !*atts[i + 1]) @@ -83,7 +112,7 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("If the attribute 'name' is present, it must have a value."); } - m_transform->setName(atts[i + 1]); + m_transform->getFormatMetadata().addAttribute(ATTR_NAME, atts[i + 1]); } else if (0 == Platform::Strcasecmp(ATTR_INVERSE_OF, atts[i])) { @@ -92,7 +121,7 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("If the attribute 'inverseOf' is present, it must have a value."); } - m_transform->setInverseOfId(atts[i + 1]); + m_transform->getFormatMetadata().addAttribute(ATTR_INVERSE_OF, atts[i + 1]); } else if (0 == Platform::Strcasecmp(ATTR_VERSION, atts[i])) { @@ -100,6 +129,10 @@ void CTFReaderTransformElt::start(const char ** atts) { throwMessage("'compCLFversion' and 'Version' cannot both be present."); } + if (isSMPTEVersionFound) + { + throwMessage("SMPTE 'xmlns' version and 'Version' attribute cannot both be present."); + } if (isVersionFound) { throwMessage("'Version' can only be there once."); @@ -114,7 +147,7 @@ void CTFReaderTransformElt::start(const char ** atts) try { const std::string verString(pVer); - CTFVersion::ReadVersion(verString, requestedVersion); + requestedVersion = CTFVersion(verString); } catch (Exception& ce) { @@ -134,6 +167,9 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("'compCLFversion' and 'Version' cannot be both present."); } + // Note: compCLFversion can appear together with xmlns for SMPTE CLF + // files. + const char* pVer = atts[i + 1]; if (!pVer || !*pVer) { @@ -143,7 +179,7 @@ void CTFReaderTransformElt::start(const char ** atts) try { std::string verString(pVer); - CTFVersion::ReadVersion(verString, requestedCLFVersion); + requestedCLFVersion = CTFVersion(verString, CTFVersion::StringFormat::VERSION_SMPTE_CLF); } catch (Exception& ce) { @@ -168,14 +204,18 @@ void CTFReaderTransformElt::start(const char ** atts) requestedVersion = CTF_PROCESS_LIST_VERSION_2_0; } - isVersionFound = true; isCLFVersionFound = true; // Handle as CLF. m_isCLF = true; } - else if (0 == Platform::Strcasecmp("xmlns", atts[i])) + else if(StringUtils::StartsWith(std::string(atts[i]),"xmlns:")) { - // Ignore. + // push as metadata attribute. + if (!atts[i + 1] || !*atts[i + 1]) + { + throwMessage("If the attribute 'xmlns:*' is present, it must have a value."); + } + m_transform->getFormatMetadata().addAttribute(atts[i], atts[i + 1]); } else { @@ -185,29 +225,27 @@ void CTFReaderTransformElt::start(const char ** atts) i += 2; } - // Check mandatory elements. - if (!isIdFound) + // Check mandatory id keyword for non-SMPTE variants. + if (!isIdFound && !isSMPTEVersionFound) { throwMessage("Required attribute 'id' is missing."); } // Transform file format with no version means that // the CTF format is 1.2. - if (!isVersionFound) + if (!(isVersionFound || isCLFVersionFound || isSMPTEVersionFound )) { - if (m_isCLF && !isCLFVersionFound) + if (m_isCLF) { - throwMessage("Required attribute 'compCLFversion' is missing."); + throwMessage("No valid 'version', 'compCLFversion', or 'xmlns' attributes were found; " + "at least one of them is required."); } setVersion(CTF_PROCESS_LIST_VERSION_1_2); } else { setVersion(requestedVersion); - if (m_isCLF) - { - setCLFVersion(requestedCLFVersion); - } + setCLFVersion(requestedCLFVersion); } } @@ -215,9 +253,9 @@ void CTFReaderTransformElt::end() { } -void CTFReaderTransformElt::appendMetadata(const std::string & /*name*/, const std::string & value) +void CTFReaderTransformElt::appendMetadata(FormatMetadataImpl& metadata) { - getTransform()->getDescriptions().push_back(value); + getTransform()->getFormatMetadata().getChildrenElements().push_back(metadata); } const CTFReaderTransformPtr & CTFReaderTransformElt::getTransform() const @@ -260,6 +298,25 @@ bool CTFReaderTransformElt::isCLF() const return getTransform()->isCLF(); } +////////////////////////////////////////////////////////// +void CTFReaderIdElt::end() +{ + if(!ValidateSMPTEId(m_id)) + { + // We allow non-compliant Id values with a warning. + std::ostringstream ss; + ss << getXmlFile().c_str() << "(" << getXmlLineNumber() << "): "; + ss << "'" << m_id << "' is not a SMPTE ST 2136-1 compliant Id value."; + LogWarning(ss.str().c_str()); + } + + if(!m_id.empty()) + { + FormatMetadataImpl metadata(getName(), m_id); + getParent()->appendMetadata(metadata); + } +} + ////////////////////////////////////////////////////////// CTFReaderArrayElt::CTFReaderArrayElt(const std::string & name, @@ -799,6 +856,43 @@ void CTFReaderInfoElt::end() ////////////////////////////////////////////////////////// +void CTFReaderDescElt::start(const char ** atttributes ) +{ + m_desc = {}; + m_language = {}; + + const char ** attr = atttributes; + while (*attr) + { + if (0 == Platform::Strcasecmp(ATTR_LANGUAGE, *attr)) + { + if (!attr || !(attr + 1)) + { + throwMessage("Attribute 'language' does not have a value."); + } + + m_language = *(attr + 1); + } + + attr += 2; + } +} + +void CTFReaderDescElt::end() +{ + FormatMetadataImpl metadata(getName(), m_desc); + if(!m_language.empty()) + { + metadata.addAttribute(ATTR_LANGUAGE, m_language.c_str()); + } + getParent()->appendMetadata(metadata); +} + +////////////////////////////////////////////////////////// + + + + CTFReaderOpElt::CTFReaderOpElt() : XmlReaderContainerElt("", 0, "") { @@ -828,10 +922,9 @@ const std::string & CTFReaderOpElt::getIdentifier() const return getOp()->getID(); } -void CTFReaderOpElt::appendMetadata(const std::string & name, const std::string & value) +void CTFReaderOpElt::appendMetadata(FormatMetadataImpl& metadata) { - FormatMetadataImpl item(name, value); - getOp()->getFormatMetadata().getChildrenElements().push_back(item); + getOp()->getFormatMetadata().getChildrenElements().push_back(metadata); } void CTFReaderOpElt::start(const char ** atts) @@ -844,7 +937,7 @@ void CTFReaderOpElt::start(const char ** atts) // Add a pointer to an empty op of the appropriate child class to the // end of the opvec. No data is copied since the parameters of the op // have not been filled in yet. - m_transform->getOps().push_back(getOp()); + m_transform->getOpDataVec().push_back(getOp()); enum BitDepthFlags { @@ -4363,9 +4456,9 @@ void CTFReaderLut1DElt_1_7::end() // This code assumes that the current LUT is at the end of the opList. // In other words, that this LUT's end() method will be called before // any other Op's start(). - const size_t len = m_transform->getOps().size(); + const size_t len = m_transform->getOpDataVec().size(); const size_t pos = len - 1; - m_transform->getOps().insert(m_transform->getOps().begin() + pos, pRng); + m_transform->getOpDataVec().insert(m_transform->getOpDataVec().begin() + pos, pRng); } } @@ -4530,9 +4623,9 @@ void CTFReaderLut3DElt_1_7::end() // This code assumes that the current LUT is at the end of the opList. // In other words, that this LUT's end() method will be called before // any other Op's start(). - const unsigned long len = (unsigned long)m_transform->getOps().size(); + const unsigned long len = (unsigned long)m_transform->getOpDataVec().size(); const unsigned long pos = len - 1; - m_transform->getOps().insert(m_transform->getOps().begin() + pos, pRng); + m_transform->getOpDataVec().insert(m_transform->getOpDataVec().begin() + pos, pRng); } } @@ -4908,12 +5001,12 @@ void CTFReaderRangeElt_1_7::end() // This code assumes that the current Range is at the end of the opList. // In other words, that this Op's end() method will be called before // any other Op's start(). - const size_t len = m_transform->getOps().size(); + const size_t len = m_transform->getOpDataVec().size(); const size_t pos = len - 1; // Replace the range appended to m_transform in OpElt::start // with the matrix. - m_transform->getOps()[pos].swap(pMtx); + m_transform->getOpDataVec()[pos].swap(pMtx); } } diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h index e4e1bacecd..5b7d48a4b8 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h @@ -47,7 +47,7 @@ class CTFReaderTransformElt : public XmlReaderContainerElt void end() override; - void appendMetadata(const std::string & name, const std::string & value) override; + void appendMetadata(FormatMetadataImpl& metadata) override; // Get its parent which is a Transform. const CTFReaderTransformPtr & getTransform() const; @@ -71,11 +71,48 @@ class CTFReaderTransformElt : public XmlReaderContainerElt // The associated Transform. CTFReaderTransformPtr m_transform; // Is it a clf file? Or is a clf parser requested. - bool m_isCLF; + bool m_isCLF = false; +}; + +// Class for the Id element. +class CTFReaderIdElt : public XmlReaderPlainElt +{ +public: + CTFReaderIdElt() = delete; + CTFReaderIdElt(const std::string & name, + ContainerEltRcPtr & pParent, + unsigned int xmlLocation, + const std::string & xmlFile) + : XmlReaderPlainElt(name, pParent, xmlLocation, xmlFile) + { + } + + ~CTFReaderIdElt() + { + } + + void start(const char ** /* atts */) override + { + m_id = {}; + } + + void end() override; + + void setRawData(const char * str, size_t len, unsigned int /* xmlLine */) override + { + // This function can receive the text in small pieces, so keep adding to + // the string. + m_id += std::string(str, len); + } + +private: + std::string m_id; }; typedef OCIO_SHARED_PTR CTFReaderTransformEltRcPtr; +// Note: This class is used only for adding metadata to other info metadata +// elements, not to the transform. class CTFReaderMetadataElt : public XmlReaderComplexElt { public: @@ -117,76 +154,37 @@ class CTFReaderInfoElt : public CTFReaderMetadataElt void end() override; }; -class CTFReaderInputDescriptorElt : public XmlReaderPlainElt +// This class is used for collecting descriptions, input descriptors and output +// descriptors. It also collects the language attribute for those if provided. +// Appends the found elements to the format metadata of the transform. +class CTFReaderDescElt : public XmlReaderPlainElt { public: - CTFReaderInputDescriptorElt() = delete; - CTFReaderInputDescriptorElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CTFReaderDescElt() = delete; + CTFReaderDescElt(const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } - ~CTFReaderInputDescriptorElt() + ~CTFReaderDescElt() { } - void start(const char ** /* atts */) override - { - } - - void end() override - { - } + void start(const char ** atts ) override; + void end() override; void setRawData(const char * str, size_t len, unsigned int /*xmlLine*/) override { - CTFReaderTransformElt* pTransform - = dynamic_cast(getParent().get()); - - std::string s = pTransform->getTransform()->getInputDescriptor(); - s += std::string(str, len); - - pTransform->getTransform()->setInputDescriptor(s); - } -}; - -class CTFReaderOutputDescriptorElt : public XmlReaderPlainElt -{ -public: - CTFReaderOutputDescriptorElt() = delete; - CTFReaderOutputDescriptorElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) - : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) - { - } - - ~CTFReaderOutputDescriptorElt() - { - } - - void start(const char ** /* atts */) override - { - } - - void end() override - { - } - - void setRawData(const char* str, size_t len, unsigned int /* xmlLine */) override - { - CTFReaderTransformElt* pTransform - = dynamic_cast(getParent().get()); - - std::string s = pTransform->getTransform()->getOutputDescriptor(); - s += std::string(str, len); - - pTransform->getTransform()->setOutputDescriptor(s); + // This function may receive the text in small pieces, so keep adding to + // the string. + m_desc += std::string(str, len); } +private: + std::string m_desc; + std::string m_language; }; class CTFReaderArrayElt : public XmlReaderPlainElt @@ -348,7 +346,7 @@ class CTFReaderOpElt : public XmlReaderContainerElt virtual const OpDataRcPtr getOp() const = 0; - void appendMetadata(const std::string & name, const std::string & value) override; + void appendMetadata(FormatMetadataImpl& metadata) override; void start(const char ** atts) override; diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp index ffd73cbd43..89eb7f9f71 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "fileformats/ctf/CTFReaderUtils.h" #include "Platform.h" @@ -173,4 +174,19 @@ const char * ConvertGradingStyleAndDirToString(GradingStyle style, TransformDire throw Exception(os.str().c_str()); } + +bool ValidateSMPTEId(const std::string& id) +{ + static const std::regex clf_id_regex( + "^urn:uuid:" + "[0-9a-fA-F]{8}-" + "[0-9a-fA-F]{4}-" + "[0-9a-fA-F]{4}-" + "[0-9a-fA-F]{4}-" + "[0-9a-fA-F]{12}$"); + + return std::regex_match(id, clf_id_regex); +} + + } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h index 805e95bb12..f58b47d0d2 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h @@ -18,6 +18,7 @@ void ConvertStringToGradingStyleAndDir(const char * str, TransformDirection & dir); const char * ConvertGradingStyleAndDirToString(GradingStyle style, TransformDirection dir); +bool ValidateSMPTEId(const std::string& id); static constexpr char TAG_ACES[] = "ACES"; static constexpr char TAG_ACES_PARAMS[] = "ACESParams"; @@ -42,6 +43,7 @@ static constexpr char TAG_FIXED_FUNCTION[] = "FixedFunction"; static constexpr char TAG_FUNCTION[] = "Function"; static constexpr char TAG_GAMMA[] = "Gamma"; static constexpr char TAG_GAMMA_PARAMS[] = "GammaParams"; +static constexpr char TAG_ID[] = "Id"; static constexpr char TAG_INDEX_MAP[] = "IndexMap"; static constexpr char TAG_INFO[] = "Info"; static constexpr char TAG_INVLUT1D[] = "InverseLUT1D"; @@ -114,6 +116,7 @@ static constexpr char ATTR_HUE_ADJUST[] = "hueAdjust"; static constexpr char ATTR_INTERPOLATION[] = "interpolation"; static constexpr char ATTR_INVERSE_OF[] = "inverseOf"; static constexpr char ATTR_IS_INVERTED[] = "inverted"; +static constexpr char ATTR_LANGUAGE[] = "language"; static constexpr char ATTR_LINEARSLOPE[] = "linearSlope"; static constexpr char ATTR_LINSIDEBREAK[] = "linSideBreak"; static constexpr char ATTR_LINSIDESLOPE[] = "linSideSlope"; diff --git a/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp b/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp index 5a21b6cb1d..55f6877adf 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp @@ -2,12 +2,12 @@ // Copyright Contributors to the OpenColorIO Project. #include +#include #include "BitDepthUtils.h" #include "fileformats/ctf/CTFReaderUtils.h" #include "fileformats/ctf/CTFTransform.h" #include "fileformats/xmlutils/XMLReaderUtils.h" -#include "HashUtils.h" #include "ops/cdl/CDLOpData.h" #include "ops/exponent/ExponentOp.h" #include "ops/exposurecontrast/ExposureContrastOpData.h" @@ -38,9 +38,37 @@ namespace OCIO_NAMESPACE // This results in less pretty output and also causes problems for some unit tests. static constexpr unsigned DOUBLE_PRECISION = 15; +static constexpr const char* SMPTE_XMLNS_URL = "http://www.smpte-ra.org/ns/2136-1/2024"; -void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & versionOut) +CTFVersion::CTFVersion(const std::string & versionString, StringFormat acceptedFormat) { + // Parse the version string to see if that matches the SMPTE + // namespace/version patterns. If so store the version string and consider + // equivalent to v3.0. + if (acceptedFormat & ( VERSION_SMPTE_XMLNS | VERSION_SMPTE_CLF)) + { + bool res = false; + if (acceptedFormat & VERSION_SMPTE_XMLNS) + { + res = (0 == Platform::Strcasecmp(versionString.c_str(), + SMPTE_XMLNS_URL)); + } + + if (!res && acceptedFormat & VERSION_SMPTE_CLF) + { + res = (0 == Platform::Strcasecmp(versionString.c_str(), + "ST2136-1:2024")); + } + + if (res) + { + m_version_string = versionString; + m_major = 3; + return; + } + } + + // For non-SMPTE namespace versions, parse as MAJOR[.MINOR[.REVISION]] unsigned int numDot = 0; unsigned int numInt = 0; bool canBeDot = false; @@ -73,19 +101,19 @@ void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & ver std::ostringstream os; os << "'"; os << versionString; - os << "' is not a valid version. "; - os << "Expecting MAJOR[.MINOR[.REVISION]] "; + os << "' is not a valid version. Expecting "; + if (acceptedFormat & VERSION_SMPTE_CLF) + os << "'ST2136-1:2024' or "; + if (acceptedFormat & VERSION_SMPTE_XMLNS) + os << "'" << SMPTE_XMLNS_URL << "' or "; + os << "MAJOR[.MINOR[.REVISION]] "; throw Exception(os.str().c_str()); } - versionOut.m_major = 0; - versionOut.m_minor = 0; - versionOut.m_revision = 0; - sscanf(versionString.c_str(), "%d.%d.%d", - &versionOut.m_major, - &versionOut.m_minor, - &versionOut.m_revision); + &m_major, + &m_minor, + &m_revision); } CTFVersion & CTFVersion::operator=(const CTFVersion & rhs) @@ -95,6 +123,7 @@ CTFVersion & CTFVersion::operator=(const CTFVersion & rhs) m_major = rhs.m_major; m_minor = rhs.m_minor; m_revision = rhs.m_revision; + m_version_string = rhs.m_version_string; } return *this; } @@ -385,7 +414,7 @@ CTFVersion GetOpMinimumVersion(const ConstOpDataRcPtr & op) CTFVersion GetMinimumVersion(const ConstCTFReaderTransformPtr & transform) { - auto & opList = transform->getOps(); + auto & opList = transform->getOpDataVec(); // Need to specify the minimum version here. Some test transforms have no ops. CTFVersion minimumVersion = CTF_PROCESS_LIST_VERSION_1_3; @@ -402,59 +431,93 @@ CTFVersion GetMinimumVersion(const ConstCTFReaderTransformPtr & transform) return minimumVersion; } -const char * GetFirstElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) +const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) { - for (auto & it : elements) + for (auto it = elements.rbegin(); it != elements.rend(); ++it) { - if (0 == Platform::Strcasecmp(name.c_str(), it.getElementName())) + if (0 == Platform::Strcasecmp(name.c_str(), it->getElementName())) { - return it.getElementValue(); + return it->getElementValue(); } } return ""; } -const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) +void CopyNonEmptyAttribute(FormatMetadataImpl& dest,const FormatMetadataImpl& source, const char * attrname) { - for (auto it = elements.rbegin(); it != elements.rend(); ++it) + const std::string value = source.getAttributeValueString(attrname); + if (!value.empty()) { - if (0 == Platform::Strcasecmp(name.c_str(), it->getElementName())) - { - return it->getElementValue(); - } + dest.addAttribute(attrname, value.c_str()); } - return ""; } + +void AddNonEmptyElement(FormatMetadataImpl & metadata, const char * name, const std::string & value) +{ + if (!value.empty()) + { + metadata.addChildElement(name, value.c_str()); + } } +} // namespace + // This method copies the metadata from the argument into the transform object. // Only attributes and elements that are expected parts of the CLF spec are // preserved. This corresponds to the top level metadata in the CLF ProcessList, // note that any metadata in the individual process nodes are stored separately // in their opData. Here is what is preserved: // -- ProcessList attributes "name", "id", and "inverseOf". Other attributes are ignored. +// -- ProcessList sub-element "Id". // -- ProcessList sub-elements "InputDescriptor" and "OutputDescriptor". The value -// of these elements is preserved but no additional attributes or sub-elements. -// Only the first InputDescriptor and last OutputDescriptor in the metadata is preserved. +// of these elements is preserved with the language attrib, but no sub-elements. // -- ProcessList "Description" sub-elements. All of these elements are preserved, -// but only their value strings, no attributes or sub-elements. +// but only their value strings and language attributes. // -- ProcessList "Info" sub-elements. If there is more than one, they are merged into // a single Info element. All attributes and sub-elements are preserved. // -- Any other sub-elements or attributes are ignored. void CTFReaderTransform::fromMetadata(const FormatMetadataImpl & metadata) { - // Name & id handled as attributes of the root metadata. - m_name = metadata.getAttributeValueString(METADATA_NAME); - m_id = metadata.getAttributeValueString(METADATA_ID); - m_inverseOfId = metadata.getAttributeValueString(ATTR_INVERSE_OF); + // Attributes + CopyNonEmptyAttribute(m_formatMetadata, metadata, METADATA_ID); + CopyNonEmptyAttribute(m_formatMetadata, metadata, METADATA_NAME); + CopyNonEmptyAttribute(m_formatMetadata, metadata, ATTR_INVERSE_OF); + + // all "xmlns:*" attributes needs to be copied too. + for (int i = 0; i < metadata.getNumAttributes(); ++i) + { + const std::string attrName = metadata.getAttributeName(i); + if (StringUtils::StartsWith(attrName.c_str(), "xmlns:")) + { + CopyNonEmptyAttribute(m_formatMetadata, metadata, attrName.c_str()); + } + } + + // Id Element + AddNonEmptyElement(m_formatMetadata, METADATA_ID_ELEMENT, + GetLastElementValue(metadata.getChildrenElements(), METADATA_ID_ELEMENT)); + + // Description, input and output descriptors + auto copyDescs = [&](const char * elementName) + { + for (auto desc : metadata.getChildrenElements(elementName)) + { + FormatMetadataImpl newEl(desc.getElementName(), desc.getElementValue()); + auto lang = desc.getAttributeValueString("language"); + if (!lang.empty()) + { + newEl.addAttribute("language", lang.c_str()); + } + m_formatMetadata.getChildrenElements().push_back(newEl); + } + }; - // Preserve first InputDescriptor, last OutputDescriptor, and all Descriptions. - m_inDescriptor = GetFirstElementValue(metadata.getChildrenElements(), METADATA_INPUT_DESCRIPTOR); - m_outDescriptor = GetLastElementValue(metadata.getChildrenElements(), METADATA_OUTPUT_DESCRIPTOR); - GetElementsValues(metadata.getChildrenElements(), METADATA_DESCRIPTION, m_descriptions); + copyDescs(METADATA_DESCRIPTION); + copyDescs(METADATA_INPUT_DESCRIPTOR); + copyDescs(METADATA_OUTPUT_DESCRIPTOR); // Combine all Info elements. - for (auto elt : metadata.getChildrenElements()) + for (auto & elt : metadata.getChildrenElements()) { if (0 == Platform::Strcasecmp(elt.getElementName(), METADATA_INFO)) { @@ -463,38 +526,51 @@ void CTFReaderTransform::fromMetadata(const FormatMetadataImpl & metadata) } } -namespace -{ -void AddNonEmptyElement(FormatMetadataImpl & metadata, const char * name, const std::string & value) -{ - if (!value.empty()) - { - metadata.addChildElement(name, value.c_str()); - } -} -void AddNonEmptyAttribute(FormatMetadataImpl & metadata, const char * name, const std::string & value) -{ - if (!value.empty()) - { - metadata.addAttribute(name, value.c_str()); - } -} -} void CTFReaderTransform::toMetadata(FormatMetadataImpl & metadata) const { // Put CTF processList information into the FormatMetadata. - AddNonEmptyAttribute(metadata, METADATA_NAME, getName()); - AddNonEmptyAttribute(metadata, METADATA_ID, getID()); - AddNonEmptyAttribute(metadata, ATTR_INVERSE_OF, getInverseOfId()); - AddNonEmptyElement(metadata, METADATA_INPUT_DESCRIPTOR, getInputDescriptor()); - AddNonEmptyElement(metadata, METADATA_OUTPUT_DESCRIPTOR, getOutputDescriptor()); - for (auto & desc : m_descriptions) + // Attributes + CopyNonEmptyAttribute(metadata, m_formatMetadata, METADATA_ID); + CopyNonEmptyAttribute(metadata, m_formatMetadata, METADATA_NAME); + CopyNonEmptyAttribute(metadata, m_formatMetadata, ATTR_INVERSE_OF); + + // all "xmlns:*" attributes needs to be copied too. + for (int i = 0; i < m_formatMetadata.getNumAttributes(); ++i) { - metadata.addChildElement(METADATA_DESCRIPTION, desc.c_str()); + const std::string attrName = m_formatMetadata.getAttributeName(i); + if (StringUtils::StartsWith(attrName.c_str(), "xmlns:")) + { + CopyNonEmptyAttribute(metadata, m_formatMetadata, attrName.c_str()); + } } + + // Child Elements + AddNonEmptyElement(metadata, METADATA_ID_ELEMENT, + GetLastElementValue(m_formatMetadata.getChildrenElements(), METADATA_ID_ELEMENT)); + + // Description, Input and Output Descriptor Elements. + auto copyDescs = [&](const char * elementName) + { + for (auto desc : m_formatMetadata.getChildrenElements(elementName)) + { + FormatMetadataImpl newEl(desc.getElementName(), desc.getElementValue()); + auto lang = desc.getAttributeValueString("language"); + if (!lang.empty()) + { + newEl.addAttribute("language", lang.c_str()); + } + metadata.getChildrenElements().push_back(newEl); + } + }; + + copyDescs(METADATA_DESCRIPTION); + copyDescs(METADATA_INPUT_DESCRIPTOR); + copyDescs(METADATA_OUTPUT_DESCRIPTOR); + + // Info Metadata. const std::string infoValue(m_infoMetadata.getElementValue()); if (m_infoMetadata.getNumAttributes() || m_infoMetadata.getNumChildrenElements() || !infoValue.empty()) @@ -508,14 +584,23 @@ void CTFReaderTransform::toMetadata(FormatMetadataImpl & metadata) const namespace { -void WriteDescriptions(XmlFormatter & fmt, const char * tag, const StringUtils::StringVec & descriptions) +void WriteTagStringVec(XmlFormatter & fmt, const char * tag, const StringUtils::StringVec & strVec) { - for (auto & it : descriptions) + for (auto & it : strVec) { fmt.writeContentTag(tag, it); } } +// Writes the given list of elements along with their attributes. +void WriteTagElementVec(XmlFormatter & fmt, const FormatMetadataImpl::Elements & elVec) +{ + for (auto & el : elVec) + { + fmt.writeContentTag(el.getElementName(), el.getAttributes(), el.getElementValue()); + } +} + template typename std::enable_if::value, void>::type WriteValue(T value, std::ostream& stream) { @@ -737,7 +822,7 @@ void OpWriter::writeFormatMetadata() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), TAG_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); } const char * BitDepthToCLFString(BitDepth bitDepth) @@ -879,7 +964,7 @@ void CDLWriter::writeContent() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_SOP_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); oss.str(""); params = m_cdl->getSlopeParams(); @@ -906,7 +991,7 @@ void CDLWriter::writeContent() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_SAT_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); oss.str(""); oss << m_cdl->getSaturation(); @@ -921,15 +1006,15 @@ void CDLWriter::writeFormatMetadata() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); desc.clear(); GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_INPUT_DESCRIPTION, desc); - WriteDescriptions(m_formatter, METADATA_INPUT_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, METADATA_INPUT_DESCRIPTION, desc); desc.clear(); GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_VIEWING_DESCRIPTION, desc); - WriteDescriptions(m_formatter, METADATA_VIEWING_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, METADATA_VIEWING_DESCRIPTION, desc); } /////////////////////////////////////////////////////////////////////////////// @@ -2517,10 +2602,10 @@ void RangeWriter::writeContent() const TransformWriter::TransformWriter(XmlFormatter & formatter, ConstCTFReaderTransformPtr transform, - bool isCLF) + SubFormat subFormat) : XmlElementWriter(formatter) , m_transform(transform) - , m_isCLF(isCLF) + , m_subFormat(subFormat) { } @@ -2534,68 +2619,115 @@ void TransformWriter::write() const XmlFormatter::Attributes attributes; - CTFVersion writeVersion{ CTF_PROCESS_LIST_VERSION_2_0 }; - - std::ostringstream fversion; - if (m_isCLF) + CTFVersion writeVersion; // This controls the available ops + switch(m_subFormat) { - // Save with CLF version 3. - fversion << 3; - attributes.push_back(XmlFormatter::Attribute(ATTR_COMP_CLF_VERSION, - fversion.str())); + case SubFormat::FORMAT_UNKNOWN: + throw Exception("Cannot write transform with unknown sub-format."); + break; - } - else - { - writeVersion = GetMinimumVersion(m_transform); - fversion << writeVersion; + case SubFormat::FORMAT_CLF: + // For CLF, we're writing versions per both the Academy and SMPTE + // requirements. + writeVersion = CTF_PROCESS_LIST_VERSION_2_0; + attributes.push_back(XmlFormatter::Attribute( + ATTR_COMP_CLF_VERSION, "3")); + attributes.push_back(XmlFormatter::Attribute( + ATTR_XMLNS, SMPTE_XMLNS_URL)); + break; + + case SubFormat::FORMAT_CTF: + writeVersion = GetMinimumVersion(m_transform); - attributes.push_back(XmlFormatter::Attribute(ATTR_VERSION, - fversion.str())); + std::ostringstream fversion; + fversion << writeVersion; + attributes.push_back(XmlFormatter::Attribute( + ATTR_VERSION, fversion.str())); + break; } + auto & metada = m_transform->getFormatMetadata(); + + // Id attribute std::string id = m_transform->getID(); if (id.empty()) { - auto & ops = m_transform->getOps(); - for (auto op : ops) - { - id += op->getCacheID(); - } - - id = CacheIDHash(id.c_str(), id.size()); + throw Exception("Internal error; at this point the transform should have an id"); } attributes.push_back(XmlFormatter::Attribute(ATTR_ID, id)); - + + // Name attribute const std::string& name = m_transform->getName(); if (!name.empty()) { attributes.push_back(XmlFormatter::Attribute(ATTR_NAME, name)); } - const std::string & inverseOfId = m_transform->getInverseOfId(); - if (!inverseOfId.empty()) + // inverseOf attribute + const char * inverseOf = metada.getAttributeValue(ATTR_INVERSE_OF); + if (inverseOf && *inverseOf) + { + attributes.push_back(XmlFormatter::Attribute( + ATTR_INVERSE_OF, inverseOf)); + } + + // Non-default namespace attributes. + for (int i = 0; i < metada.getNumAttributes(); ++i) { - attributes.push_back(XmlFormatter::Attribute(ATTR_INVERSE_OF, inverseOfId)); + const char * attrName = metada.getAttributeName(i); + if (attrName && StringUtils::StartsWith(attrName, "xmlns:")) + { + const char * attrValue = metada.getAttributeValue(i); + if (attrValue && *attrValue) + { + attributes.push_back(XmlFormatter::Attribute(attrName, attrValue)); + } + } } m_formatter.writeStartTag(processListTag, attributes); { XmlScopeIndent scopeIndent(m_formatter); + + // Id element, won't generate if not provided but the format is + // enforced. + auto idIdx = m_transform->getFormatMetadata() + .getFirstChildIndex(METADATA_ID_ELEMENT); + if(idIdx>=0) + { + const char * idVal = m_transform->getFormatMetadata().getChildElement(idIdx).getElementValue(); + if (idVal && *idVal) + { + if (m_subFormat == SubFormat::FORMAT_CLF && !ValidateSMPTEId(idVal)) + { + std::ostringstream ss; + ss << "'" << idVal << "' is not a SMPTE ST 2136-1 compliant Id value."; + throw Exception(ss.str().c_str()); + } + m_formatter.writeContentTag(TAG_ID, idVal); + } + } - WriteDescriptions(m_formatter, TAG_DESCRIPTION, m_transform->getDescriptions()); + // Descriptions. + { + auto desc = m_transform->getFormatMetadata() + .getChildrenElements(METADATA_DESCRIPTION); + WriteTagElementVec(m_formatter, desc); + } - const std::string & inputDesc = m_transform->getInputDescriptor(); - if (!inputDesc.empty()) + // Input Descriptors. { - m_formatter.writeContentTag(METADATA_INPUT_DESCRIPTOR, inputDesc); + auto desc = m_transform->getFormatMetadata() + .getChildrenElements(METADATA_INPUT_DESCRIPTOR); + WriteTagElementVec(m_formatter, desc); } - const std::string & outputDesc = m_transform->getOutputDescriptor(); - if (!outputDesc.empty()) + // Output Descriptors. { - m_formatter.writeContentTag(METADATA_OUTPUT_DESCRIPTOR, outputDesc); + auto desc = m_transform->getFormatMetadata() + .getChildrenElements(METADATA_OUTPUT_DESCRIPTOR); + WriteTagElementVec(m_formatter, desc); } const FormatMetadataImpl & info = m_transform->getInfoMetadata(); @@ -2629,7 +2761,7 @@ void TransformWriter::writeProcessListMetadata(const FormatMetadataImpl& m) cons m_formatter.writeContent(m.getElementValue()); } - const auto items = m.getChildrenElements(); + const auto & items = m.getChildrenElements(); for (auto it = items.begin(), end = items.end(); it != end; ++it) { XmlScopeIndent scopeIndent(m_formatter); @@ -2699,8 +2831,8 @@ void TransformWriter::writeOps(const CTFVersion & version) const // values on write. Otherwise, default to 32f. BitDepth inBD = BIT_DEPTH_F32; BitDepth outBD = BIT_DEPTH_F32; - - auto & ops = m_transform->getOps(); + bool isCLF = m_subFormat == SubFormat::FORMAT_CLF; + auto & ops = m_transform->getOpDataVec(); size_t numOps = ops.size(); size_t numSavedOps = 0; if (numOps) @@ -2762,7 +2894,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const paramR, paramG, paramB, paramA); gammaData->getFormatMetadata() = exp->getFormatMetadata(); - if (m_isCLF && !gammaData->isAlphaComponentIdentity()) + if (isCLF && !gammaData->isAlphaComponentIdentity()) { ThrowWriteOp("Exponent with alpha"); } @@ -2775,7 +2907,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::ExposureContrastType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("ExposureContrast"); } @@ -2789,7 +2921,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::FixedFunctionType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("FixedFunction"); } @@ -2804,7 +2936,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const case OpData::GammaType: { auto gamma = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (!gamma->isAlphaComponentIdentity()) { @@ -2820,7 +2952,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingPrimaryType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingPrimary"); } @@ -2834,7 +2966,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingRGBCurveType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingRGBCurve"); } @@ -2848,7 +2980,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingHueCurveType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingHueCurve"); } @@ -2862,7 +2994,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingToneType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingTone"); } @@ -2886,7 +3018,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const case OpData::Lut1DType: { auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (lut->getDirection() != TRANSFORM_DIR_FORWARD) { @@ -2910,7 +3042,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const case OpData::Lut3DType: { auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (lut->getDirection() != TRANSFORM_DIR_FORWARD) { @@ -2935,7 +3067,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const { auto matSrc = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (matSrc->hasAlpha()) { diff --git a/src/OpenColorIO/fileformats/ctf/CTFTransform.h b/src/OpenColorIO/fileformats/ctf/CTFTransform.h index f8fb741c26..dec4c71532 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFTransform.h +++ b/src/OpenColorIO/fileformats/ctf/CTFTransform.h @@ -22,16 +22,20 @@ namespace OCIO_NAMESPACE class CTFVersion { public: + enum StringFormat + { + VERSION_NUMERIC = 0, // Numeric version is always accepted. + VERSION_SMPTE_XMLNS = 1 << 1, + VERSION_SMPTE_CLF = 1 << 2 + }; + // Will throw if versionString is not formatted like a version. - static void ReadVersion(const std::string & versionString, - CTFVersion & versionOut); + explicit CTFVersion(const std::string & versionString, StringFormat acceptedFormat = VERSION_NUMERIC); CTFVersion() - : m_major(0) - , m_minor(0) - , m_revision(0) { } + CTFVersion(unsigned int major, unsigned int minor, unsigned int revision) : m_major(major) , m_minor(minor) @@ -41,7 +45,6 @@ class CTFVersion CTFVersion(unsigned int major, unsigned int minor) : m_major(major) , m_minor(minor) - , m_revision(0) { } @@ -49,6 +52,7 @@ class CTFVersion : m_major(otherVersion.m_major) , m_minor(otherVersion.m_minor) , m_revision(otherVersion.m_revision) + , m_version_string(otherVersion.m_version_string) { } @@ -65,22 +69,33 @@ class CTFVersion friend std::ostream & operator<< (std::ostream & stream, const CTFVersion & rhs) { - stream << rhs.m_major; - if (rhs.m_minor != 0 || rhs.m_revision != 0) + if (!rhs.m_version_string.empty()) { - stream << "." << rhs.m_minor; - if (rhs.m_revision != 0) + stream << rhs.m_version_string; + } + else + { + stream << rhs.m_major; + if (rhs.m_minor != 0 || rhs.m_revision != 0) { - stream << "." << rhs.m_revision; + stream << "." << rhs.m_minor; + if (rhs.m_revision != 0) + { + stream << "." << rhs.m_revision; + } } } return stream; } private: - unsigned int m_major; - unsigned int m_minor; - unsigned int m_revision; + // CTF and Academy/ASC CLF uses the numeric version system. + unsigned int m_major = 0; + unsigned int m_minor = 0; + unsigned int m_revision = 0; + + // SMPTE CLF uses a non-numeric xmlns version system. + std::string m_version_string; }; // @@ -151,28 +166,22 @@ class CTFReaderTransform const std::string & getID() const { - return m_id; + return m_formatMetadata.getAttributeValueString(METADATA_ID); } void setID(const char * id) { - m_id = id; + m_formatMetadata.addAttribute(METADATA_ID, id); } + const std::string & getName() const { - return m_name; + return m_formatMetadata.getAttributeValueString(METADATA_NAME); } void setName(const char * name) { - m_name = name; - } - const std::string & getInverseOfId() const - { - return m_inverseOfId; - } - void setInverseOfId(const char * id) - { - m_inverseOfId = id; + m_formatMetadata.addAttribute(METADATA_NAME, name); } + FormatMetadataImpl & getInfoMetadata() { return m_infoMetadata; @@ -181,41 +190,23 @@ class CTFReaderTransform { return m_infoMetadata; } - const ConstOpDataVec & getOps() const - { - return m_ops; - } - ConstOpDataVec & getOps() - { - return m_ops; - } - const StringUtils::StringVec & getDescriptions() const - { - return m_descriptions; - } - StringUtils::StringVec & getDescriptions() - { - return m_descriptions; - } - const std::string & getInputDescriptor() const + FormatMetadataImpl & getFormatMetadata() { - return m_inDescriptor; + return m_formatMetadata; } - - void setInputDescriptor(const std::string & in) + const FormatMetadataImpl & getFormatMetadata() const { - m_inDescriptor = in; + return m_formatMetadata; } - const std::string & getOutputDescriptor() const + const ConstOpDataVec & getOpDataVec() const { - return m_outDescriptor; + return m_ops; } - - void setOutputDescriptor(const std::string & out) + ConstOpDataVec & getOpDataVec() { - m_outDescriptor = out; + return m_ops; } void setCTFVersion(const CTFVersion & ver); @@ -239,15 +230,10 @@ class CTFReaderTransform } private: - std::string m_id; - std::string m_name; - std::string m_inverseOfId; - std::string m_inDescriptor; - std::string m_outDescriptor; FormatMetadataImpl m_infoMetadata; + FormatMetadataImpl m_formatMetadata; ConstOpDataVec m_ops; - StringUtils::StringVec m_descriptions; // CTF version used even for CLF files. // CLF versions <= 2.0 are interpreted as CTF version 1.7. @@ -265,14 +251,22 @@ typedef OCIO_SHARED_PTR ConstCTFReaderTransformPtr; class TransformWriter : public XmlElementWriter { -public: + public: + enum class SubFormat : uint8_t + { + FORMAT_UNKNOWN, + FORMAT_CLF, + FORMAT_CTF + }; + + public: TransformWriter() = delete; TransformWriter(const TransformWriter &) = delete; TransformWriter& operator=(const TransformWriter &) = delete; TransformWriter(XmlFormatter & formatter, ConstCTFReaderTransformPtr transform, - bool isCLF); + SubFormat SubFormat); virtual ~TransformWriter(); @@ -284,8 +278,8 @@ class TransformWriter : public XmlElementWriter void writeOps(const CTFVersion & version) const; private: - ConstCTFReaderTransformPtr m_transform; - bool m_isCLF; + ConstCTFReaderTransformPtr m_transform; + SubFormat m_subFormat = SubFormat::FORMAT_UNKNOWN; }; diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp index d5b5be5dcf..2bb71c895b 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp @@ -101,7 +101,8 @@ void XmlReaderDescriptionElt::end() { // Note: eXpat automatically replaces escaped characters with // their original values. - getParent()->appendMetadata(getIdentifier(), m_description); + FormatMetadataImpl metadata(getIdentifier(), m_description); + getParent()->appendMetadata(metadata); } } diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h index 203d3bcdfc..bc1abf4ce8 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h @@ -34,9 +34,6 @@ class XmlReaderElement // End the parsing of the element. virtual void end() = 0; - // Is it a container which means if it can hold other elements. - virtual bool isContainer() const = 0; - const std::string & getName() const { return m_name; @@ -64,6 +61,9 @@ class XmlReaderElement { return false; } + + // Is it a container which means if it can hold other elements. + virtual bool isContainer() const = 0; void throwMessage(const std::string & error) const; @@ -135,7 +135,7 @@ class XmlReaderContainerElt : public XmlReaderElement return true; } - virtual void appendMetadata(const std::string & name, const std::string & value) = 0; + virtual void appendMetadata(FormatMetadataImpl& metadata) = 0; private: XmlReaderContainerElt() = delete; @@ -211,7 +211,7 @@ class XmlReaderDummyElt : public XmlReaderPlainElt { } - void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override + void appendMetadata(FormatMetadataImpl& /*metadata*/) override { } @@ -288,6 +288,7 @@ class XmlReaderDescriptionElt : public XmlReaderPlainElt void start(const char ** /* atts */) override { + // TODO: collect language attr. m_description.resize(0); m_changed = false; } @@ -339,7 +340,7 @@ class XmlReaderComplexElt : public XmlReaderContainerElt return getName().c_str(); } - void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override + void appendMetadata(FormatMetadataImpl& /*metadata*/) override { } @@ -392,11 +393,11 @@ class XmlReaderSOPNodeBaseElt : public XmlReaderComplexElt void setIsOffsetInit(bool status) { m_isOffsetInit = status; } void setIsPowerInit(bool status) { m_isPowerInit = status; } - void appendMetadata(const std::string & /* name */, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { // Add description to parent and override name. - FormatMetadataImpl item(METADATA_SOP_DESCRIPTION, value); - getCDL()->getFormatMetadata().getChildrenElements().push_back(item); + metadata.setElementName(METADATA_SOP_DESCRIPTION); + getCDL()->getFormatMetadata().getChildrenElements().push_back(metadata); } private: @@ -452,11 +453,11 @@ class XmlReaderSatNodeBaseElt : public XmlReaderComplexElt virtual const CDLOpDataRcPtr & getCDL() const = 0; - void appendMetadata(const std::string & /* name */, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { // Add description to parent and override name. - FormatMetadataImpl item(METADATA_SAT_DESCRIPTION, value); - getCDL()->getFormatMetadata().getChildrenElements().push_back(item); + metadata.setElementName(METADATA_SAT_DESCRIPTION); + getCDL()->getFormatMetadata().getChildrenElements().push_back(metadata); } diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h index 9a813a2551..895771fa87 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h @@ -23,19 +23,20 @@ namespace OCIO_NAMESPACE // Strings used by CDL and CLF parsers or writers. -static constexpr char ATTR_ID[] = "id"; -static constexpr char ATTR_NAME[] = "name"; - -static constexpr char CDL_TAG_COLOR_CORRECTION[] = "ColorCorrection"; - -static constexpr char TAG_DESCRIPTION[] = "Description"; -static constexpr char TAG_OFFSET[] = "Offset"; -static constexpr char TAG_POWER[] = "Power"; -static constexpr char TAG_SATNODE[] = "SatNode"; -static constexpr char TAG_SATNODEALT[] = "SATNode"; -static constexpr char TAG_SATURATION[] = "Saturation"; -static constexpr char TAG_SLOPE[] = "Slope"; -static constexpr char TAG_SOPNODE[] = "SOPNode"; +static constexpr const char* ATTR_ID = "id"; +static constexpr const char* ATTR_NAME = "name"; +static constexpr const char* ATTR_XMLNS = "xmlns"; + +static constexpr const char* CDL_TAG_COLOR_CORRECTION = "ColorCorrection"; + +static constexpr const char* TAG_DESCRIPTION = "Description"; +static constexpr const char* TAG_OFFSET = "Offset"; +static constexpr const char* TAG_POWER = "Power"; +static constexpr const char* TAG_SATNODE = "SatNode"; +static constexpr const char* TAG_SATNODEALT = "SATNode"; +static constexpr const char* TAG_SATURATION = "Saturation"; +static constexpr const char* TAG_SLOPE = "Slope"; +static constexpr const char* TAG_SOPNODE = "SOPNode"; // This method truncates a string (mainly used for display purpose). diff --git a/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp b/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp index 982e992f14..ddb1f8eabc 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp +++ b/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp @@ -132,7 +132,7 @@ inline void ApplyClamp(__m128&) { } -// Apply the power component to the the pixel's values. +// Apply the power component to the pixel's values. // When the template argument is true, the values in pix // are clamped to the range [0,1] and the power operation is // applied. When the argument is false, the values in pix are @@ -154,7 +154,7 @@ inline void ApplyPower(__m128& pix, const __m128& power) pix = sseSelect(negMask, pix, pixPower); } -// Apply the saturation component to the the pixel's values +// Apply the saturation component to the pixel's values inline void ApplySaturation(__m128& pix, const __m128 saturation) { // Compute luma: dot product of pixel values and the luma weights @@ -179,7 +179,7 @@ inline void ApplyScale(float * pix, const float scale) pix[2] = pix[2] * scale; } -// Apply the slope component to the the pixel's values +// Apply the slope component to the pixel's values inline void ApplySlope(float * pix, const float * slope) { pix[0] = pix[0] * slope[0]; @@ -187,7 +187,7 @@ inline void ApplySlope(float * pix, const float * slope) pix[2] = pix[2] * slope[2]; } -// Apply the offset component to the the pixel's values +// Apply the offset component to the pixel's values inline void ApplyOffset(float * pix, const float * offset) { pix[0] = pix[0] + offset[0]; @@ -195,7 +195,7 @@ inline void ApplyOffset(float * pix, const float * offset) pix[2] = pix[2] + offset[2]; } -// Apply the saturation component to the the pixel's values +// Apply the saturation component to the pixel's values inline void ApplySaturation(float * pix, const float saturation) { const float srcpix[3] = { pix[0], pix[1], pix[2] }; @@ -232,7 +232,7 @@ inline void ApplyClamp(float *) { } -// Apply the power component to the the pixel's values. +// Apply the power component to the pixel's values. // When the template argument is true, the values in pix // are clamped to the range [0,1] and the power operation is // applied. When the argument is false, the values in pix are diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp index f0e73d648f..760bd78b60 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp @@ -190,7 +190,7 @@ inline void ApplyLinContrast(float * pix, const float * contrast, const float pi pix[2] = std::pow(std::abs(pix[2] / pivot), contrast[2]) * std::copysign(pivot, pix[2]); } -// Apply the slope component to the the pixel's values +// Apply the slope component to the pixel's values inline void ApplySlope(float * pix, const float * slope) { pix[0] = pix[0] * slope[0]; @@ -198,7 +198,7 @@ inline void ApplySlope(float * pix, const float * slope) pix[2] = pix[2] * slope[2]; } -// Apply the offset component to the the pixel's values. +// Apply the offset component to the pixel's values. inline void ApplyOffset(float * pix, const float * m_offset) { pix[0] = pix[0] + m_offset[0]; @@ -216,7 +216,7 @@ inline void ApplyGamma(float * pix, const float * gamma, float blackPivot, float std::copysign(1.f, pix[2] - blackPivot) * (whitePivot - blackPivot) + blackPivot; } -// Apply the saturation component to the the pixel's values. +// Apply the saturation component to the pixel's values. inline void ApplySaturation(float * pix, const float m_saturation) { if (m_saturation != 1.f) diff --git a/src/OpenColorIO/transforms/CDLTransform.cpp b/src/OpenColorIO/transforms/CDLTransform.cpp index 393bec4dbe..a6ac91891b 100755 --- a/src/OpenColorIO/transforms/CDLTransform.cpp +++ b/src/OpenColorIO/transforms/CDLTransform.cpp @@ -7,7 +7,6 @@ #include -#include "fileformats/cdl/CDLParser.h" #include "Logging.h" #include "MathUtils.h" #include "Mutex.h" diff --git a/src/apps/ociomakeclf/main.cpp b/src/apps/ociomakeclf/main.cpp index b79c771328..32bef97994 100644 --- a/src/apps/ociomakeclf/main.cpp +++ b/src/apps/ociomakeclf/main.cpp @@ -31,7 +31,7 @@ static int parse_end_args(int argc, const char * argv[]) return 0; } -void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTransformRcPtr transform) +void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTransformRcPtr transform, bool generateId) { // Get the processor. @@ -55,7 +55,15 @@ void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTra try { const auto group = optProcessor->createGroupTransform(); - group->write(config, "Academy/ASC Common LUT Format", outfs); + + if(generateId) + { + std::ostringstream ss; + ss << "urn:uuid:" << optProcessor->getCacheID(); + group->getFormatMetadata().addChildElement("Id", ss.str().c_str()); + } + + group->write(config, "Academy/ASC Common LUT Format", outfs); } catch (const OCIO::Exception &) { @@ -79,11 +87,17 @@ void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTra int main(int argc, const char ** argv) { - bool help = false, verbose = false, measure = false, listCSCColorSpaces = false; + bool help = false; + bool verbose = false; + bool measure = false; + bool listCSCColorSpaces = false; + bool generateId = false; std::string cscColorSpace; ArgParse ap; ap.options("ociomakeclf -- Convert a LUT into CLF format and optionally add conversions from/to ACES2065-1 to make it an LMT.\n" + " The generated file should be compatible with both SMPTE ST 2136-1 as well as the previous\n" + " Academy/ASC v3 version.\n" " If the csc argument is used, the CLF will contain the transforms:\n" " [ACES2065-1 to CSC space] [the LUT] [CSC space to ACES2065-1].\n\n" "usage: ociomakeclf inLutFilepath outLutFilepath --csc cscColorSpace\n" @@ -96,6 +110,7 @@ int main(int argc, const char ** argv) "--measure", &measure, "Measure (in ms) the CLF write", "--list", &listCSCColorSpaces, "List of the supported CSC color spaces", "--csc %s", &cscColorSpace, "The color space that the input LUT expects and produces", + "--generateid",&generateId, "Generates an id based on content and writes in SMPTE Id element format", nullptr); if (ap.parse(argc, argv) < 0) @@ -266,12 +281,12 @@ int main(int argc, const char ** argv) m.resume(); // Create the CLF file. - CreateOutputLutFile(outLutFilepath, grp); + CreateOutputLutFile(outLutFilepath, grp, generateId); } else { // Create the CLF file. - CreateOutputLutFile(outLutFilepath, grp); + CreateOutputLutFile(outLutFilepath, grp, generateId); } } catch (OCIO::Exception & ex) diff --git a/src/bindings/python/PyTypes.cpp b/src/bindings/python/PyTypes.cpp index 3305bdbf18..e109708c35 100644 --- a/src/bindings/python/PyTypes.cpp +++ b/src/bindings/python/PyTypes.cpp @@ -971,6 +971,7 @@ void bindPyTypes(py::module & m) m.attr("METADATA_OUTPUT_DESCRIPTOR") = METADATA_OUTPUT_DESCRIPTOR; m.attr("METADATA_NAME") = METADATA_NAME; m.attr("METADATA_ID") = METADATA_ID; + m.attr("METADATA_ID_ELEMENT") = METADATA_ID_ELEMENT; // Caches m.attr("OCIO_DISABLE_ALL_CACHES") = OCIO_DISABLE_ALL_CACHES; diff --git a/tests/cpu/OpOptimizers_tests.cpp b/tests/cpu/OpOptimizers_tests.cpp index bffb1b6ad1..5b2f771a72 100644 --- a/tests/cpu/OpOptimizers_tests.cpp +++ b/tests/cpu/OpOptimizers_tests.cpp @@ -729,7 +729,7 @@ OCIO_ADD_TEST(OpOptimizers, lut1d_identity_replacement_order) OCIO::OpRcPtrVec optOps = fwd_inv_ops.clone(); OCIO_CHECK_NO_THROW(optOps.finalize()); OCIO_CHECK_NO_THROW(optOps.optimize(OCIO::OPTIMIZATION_DEFAULT)); - OCIO_CHECK_EQUAL(optOps.size(), 1); + OCIO_REQUIRE_EQUAL(optOps.size(), 1); OCIO_CHECK_EQUAL(optOps[0]->getInfo(), ""); // Compare renders. @@ -748,7 +748,7 @@ OCIO_ADD_TEST(OpOptimizers, lut1d_identity_replacement_order) OCIO::OpRcPtrVec optOps = inv_fwd_ops.clone(); OCIO_CHECK_NO_THROW(optOps.finalize()); OCIO_CHECK_NO_THROW(optOps.optimize(OCIO::OPTIMIZATION_DEFAULT)); - OCIO_CHECK_EQUAL(optOps.size(), 1); + OCIO_REQUIRE_EQUAL(optOps.size(), 1); OCIO_CHECK_EQUAL(optOps[0]->getInfo(), ""); // Compare renders. @@ -1052,7 +1052,7 @@ OCIO_ADD_TEST(OpOptimizers, gamma_comp) OCIO_CHECK_NO_THROW(optOps_noComp.finalize()); OCIO_CHECK_NO_THROW(optOps_noComp.optimize(AllBut(OCIO::OPTIMIZATION_COMP_GAMMA))); // Identity matrix is removed but gamma are not combined. - OCIO_CHECK_EQUAL(optOps_noComp.size(), 3); + OCIO_REQUIRE_EQUAL(optOps_noComp.size(), 3); OCIO_CHECK_EQUAL(optOps_noComp[0]->getInfo(), ""); OCIO_CHECK_EQUAL(optOps_noComp[1]->getInfo(), ""); OCIO_CHECK_EQUAL(optOps_noComp[2]->getInfo(), ""); @@ -1100,7 +1100,7 @@ OCIO_ADD_TEST(OpOptimizers, gamma_comp_test2) OCIO_CHECK_NO_THROW(optOps_noComp.finalize()); // NB: The op->apply function used here hard-codes OPTIMIZATION_FAST_LOG_EXP_POW to off. OCIO_CHECK_NO_THROW(optOps_noComp.optimize(AllBut(OCIO::OPTIMIZATION_COMP_GAMMA))); - OCIO_CHECK_EQUAL(optOps_noComp.size(), 2); + OCIO_REQUIRE_EQUAL(optOps_noComp.size(), 2); OCIO_CHECK_EQUAL(optOps_noComp[0]->getInfo(), ""); OCIO_CHECK_EQUAL(optOps_noComp[1]->getInfo(), ""); diff --git a/tests/cpu/Processor_tests.cpp b/tests/cpu/Processor_tests.cpp index d2e0087251..3188bb6b4b 100644 --- a/tests/cpu/Processor_tests.cpp +++ b/tests/cpu/Processor_tests.cpp @@ -19,7 +19,7 @@ OCIO_ADD_TEST(Processor, basic_cache) auto processorEmptyGroup = config->getProcessor(group); OCIO_CHECK_EQUAL(processorEmptyGroup->getNumTransforms(), 0); - OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), ""); + OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), "99aa06d3-0147-98d8-6001-c324468d497f"); auto mat = OCIO::MatrixTransform::Create(); double matrix[16]{ @@ -34,26 +34,26 @@ OCIO_ADD_TEST(Processor, basic_cache) auto processorMat = config->getProcessor(mat); OCIO_CHECK_EQUAL(processorMat->getNumTransforms(), 1); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1b1880136f7669351adb0dcae0f4f9fd"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1adb0dca-e0f4-f9fd-1b18-80136f766935"); // Check behaviour of the cacheID offset[0] = 0.0; mat->setOffset(offset); processorMat = config->getProcessor(mat); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "675ca29c0f7d28fbdc865818c8cf5c4c"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "dc865818-c8cf-5c4c-675c-a29c0f7d28fb"); matrix[0] = 2.0; mat->setMatrix(matrix); processorMat = config->getProcessor(mat); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1ebac7d1c2d833943e1d1d3c26a7eb18"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "3e1d1d3c-26a7-eb18-1eba-c7d1c2d83394"); offset[0] = 0.1; matrix[0] = 1.0; mat->setOffset(offset); mat->setMatrix(matrix); processorMat = config->getProcessor(mat); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1b1880136f7669351adb0dcae0f4f9fd"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1adb0dca-e0f4-f9fd-1b18-80136f766935"); } OCIO_ADD_TEST(Processor, basic_cache_lut) @@ -63,7 +63,7 @@ OCIO_ADD_TEST(Processor, basic_cache_lut) auto processorEmptyGroup = config->getProcessor(group); OCIO_CHECK_EQUAL(processorEmptyGroup->getNumTransforms(), 0); - OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), ""); + OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), "99aa06d3-0147-98d8-6001-c324468d497f"); auto lut = OCIO::Lut3DTransform::Create(3); // Make sure it's not an identity. @@ -71,19 +71,19 @@ OCIO_ADD_TEST(Processor, basic_cache_lut) auto processorLut = config->getProcessor(lut); OCIO_CHECK_EQUAL(processorLut->getNumTransforms(), 1); - OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "2b26d0097cdcf8f141fe3b3d6e21b5ec"); + OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "41fe3b3d-6e21-b5ec-2b26-d0097cdcf8f1"); // Check behaviour of the cacheID // Change a value and check that the cacheID changes. lut->setValue(2, 2, 2, 1.f, 3.f, 4.f); processorLut = config->getProcessor(lut); - OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "288ec8ea132adaca5b5aed24a296a1a2"); + OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "5b5aed24-a296-a1a2-288e-c8ea132adaca"); // Restore the original value, check that the cache ID matches what it used to be. lut->setValue(2, 2, 2, 2.f, 3.f, 4.f); processorLut = config->getProcessor(lut); - OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "2b26d0097cdcf8f141fe3b3d6e21b5ec"); + OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "41fe3b3d-6e21-b5ec-2b26-d0097cdcf8f1"); } OCIO_ADD_TEST(Processor, unique_dynamic_properties) diff --git a/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp b/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp index 26dd83acc0..2114a9054a 100644 --- a/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp +++ b/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp @@ -2318,7 +2318,7 @@ OCIO_ADD_TEST(MergeConfigs, view_transforms_section) constexpr char PREFIX[] { "The Input config contains a value that would override the Base config: " }; - // Test that an error is thrown when the the input values are different. + // Test that an error is thrown when the input values are different. { OCIO::MergeHandlerOptions options = { baseConfig, inputConfig, params, mergedConfig }; checkForLogOrException(LOG_TYPE_ERROR, __LINE__, diff --git a/tests/cpu/fileformats/FileFormatCTF_tests.cpp b/tests/cpu/fileformats/FileFormatCTF_tests.cpp index 4dc12578a0..fad4d45ba6 100644 --- a/tests/cpu/fileformats/FileFormatCTF_tests.cpp +++ b/tests/cpu/fileformats/FileFormatCTF_tests.cpp @@ -27,6 +27,27 @@ OCIO::LocalCachedFileRcPtr LoadCLFFile(const std::string & fileName) return OCIO::LoadTestFile( fileName, std::ios_base::in); } + +const OCIO::FormatMetadataImpl::Elements getChildrenMetadata( + const OCIO::CTFReaderTransformPtr transform, + const char* elementName) +{ + return transform->getFormatMetadata().getChildrenElements(elementName); +} + +OCIO::LocalCachedFileRcPtr ParseString(const std::string & str) +{ + std::istringstream ctf; + ctf.str(str); + + // Parse stream. + std::string emptyString; + OCIO::LocalFileFormat tester; + OCIO::CachedFileRcPtr file = tester.read(ctf, emptyString, OCIO::INTERP_DEFAULT); + + return OCIO_DYNAMIC_POINTER_CAST(file); +} + } OCIO_ADD_TEST(FileFormatCTF, missing_file) @@ -49,10 +70,11 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example lut1d"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exlut1"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], + auto descriptions = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_DESCRIPTION); + OCIO_REQUIRE_EQUAL(descriptions.size(), 1); + OCIO_CHECK_EQUAL_STR(descriptions[0].getElementValue(), "1D LUT with legal out of range values"); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getType(), OCIO::OpData::Lut1DType); OCIO_CHECK_EQUAL(opList[0]->getName(), "65valueLut"); @@ -75,10 +97,10 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example lut3d"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exlut2"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - " 3D LUT example "); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + auto descriptions = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_DESCRIPTION); + OCIO_REQUIRE_EQUAL(descriptions.size(), 1); + OCIO_CHECK_EQUAL_STR(descriptions[0].getElementValue(), " 3D LUT example "); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getName(), "identity"); OCIO_CHECK_EQUAL(opList[0]->getID(), "lut-24"); @@ -100,12 +122,15 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example matrix"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exmat1"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - " Matrix example "); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[1], - " Used by unit tests "); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 2); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), " Matrix example "); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), " Used by unit tests "); + + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getName(), "colorspace conversion"); OCIO_CHECK_EQUAL(opList[0]->getID(), "mat-25"); @@ -167,10 +192,15 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example lut IndexMap"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exlut3"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - " IndexMap LUT example from spec "); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 1); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), + " IndexMap LUT example from spec "); + + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -205,13 +235,18 @@ OCIO_ADD_TEST(FileFormatCTF, matrix4x4) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_2 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getInputDescriptor() == "XYZ"); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getOutputDescriptor() == "RGB"); + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "XYZ"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "RGB"); OCIO_CHECK_EQUAL(pMatrix->getFileInputBitDepth(), OCIO::BIT_DEPTH_F32); OCIO_CHECK_EQUAL(pMatrix->getFileOutputBitDepth(), OCIO::BIT_DEPTH_F32); @@ -266,7 +301,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_with_offset) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_EQUAL(OCIO::CTF_PROCESS_LIST_VERSION_1_2, ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -324,13 +359,18 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_3x3) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getInputDescriptor() == "XYZ"); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getOutputDescriptor() == "RGB"); + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "XYZ"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "RGB"); OCIO_CHECK_EQUAL(pMatrix->getFileInputBitDepth(), OCIO::BIT_DEPTH_UINT10); OCIO_CHECK_EQUAL(pMatrix->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT10); @@ -382,7 +422,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_4x4) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -434,7 +474,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_offsets) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -485,7 +525,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_alpha_offsets) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -534,7 +574,8 @@ void CheckIdentity(std::istringstream & ctfStream, unsigned line) OCIO::CachedFileRcPtr file; OCIO_CHECK_NO_THROW_FROM(file = tester.read(ctfStream, emptyString, OCIO::INTERP_DEFAULT), line); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); - const auto & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL_FROM(fileOps.size(), 1, line); const auto op = fileOps[0]; @@ -639,12 +680,25 @@ OCIO_ADD_TEST(FileFormatCTF, lut_1d) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "1d-lut example"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "9843a859-e41e-40a8-a51c-840889c3774e"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - "Apply a 1/2.2 gamma."); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getInputDescriptor(), "RGB"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getOutputDescriptor(), "RGB"); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 3); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(),"Apply a 1/2.2 gamma."); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(),"RGB"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementValue(),"RGB"); + + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "RGB"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "RGB"); + + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -695,7 +749,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut_1d) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut); @@ -717,7 +771,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut_3by1d_with_nan_infinity) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut1d = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut1d); @@ -769,7 +823,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_half_domain_raw_half_set) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut1d = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut1d); @@ -806,7 +860,7 @@ OCIO_ADD_TEST(FileFormatCTF, 3by1d_lut) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 3); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -875,7 +929,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_long_lut) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut); @@ -895,7 +949,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_inv) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -966,7 +1020,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_inv_scaling) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -991,22 +1045,6 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_inv_scaling) OCIO_CHECK_CLOSE(a2.getValues()[31743 * 3], 0.84031434f, error); } -namespace -{ -OCIO::LocalCachedFileRcPtr ParseString(const std::string & str) -{ - std::istringstream ctf; - ctf.str(str); - - // Parse stream. - std::string emptyString; - OCIO::LocalFileFormat tester; - OCIO::CachedFileRcPtr file = tester.read(ctf, emptyString, OCIO::INTERP_DEFAULT); - - return OCIO_DYNAMIC_POINTER_CAST(file); -} -} - OCIO_ADD_TEST(FileFormatCTF, invlut1d_clf) { const std::string clf{ R"( @@ -1045,7 +1083,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut3d) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -1086,7 +1124,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut3d_inv) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -1134,7 +1172,8 @@ OCIO_ADD_TEST(FileFormatCTF, tabluation_support) // series of numbers. const std::string ctfFile("clf/tabulation_support.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "e0a0ae4b-adc2-4c25-ad70-fa6f31ba219d"); OCIO_REQUIRE_EQUAL(opList.size(), 1); @@ -1179,7 +1218,8 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_windows_eol) // with the ?xml header. const std::string ctfFile("clf/matrix_windows.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "42"); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getType(), OCIO::OpData::MatrixType); @@ -1192,7 +1232,8 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_no_newlines) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("clf/matrix_no_newlines.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getType(), OCIO::OpData::MatrixType); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1229,7 +1270,7 @@ OCIO_ADD_TEST(FileFormatCTF, check_utf8) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); StringUtils::StringVec descList; GetElementsValues(opList[0]->getFormatMetadata().getChildrenElements(), @@ -1245,6 +1286,87 @@ OCIO_ADD_TEST(FileFormatCTF, check_utf8) } +OCIO_ADD_TEST(FileFormatCTF, smpte_id_element) +{ + const std::string ctfFile("clf/bit_depth_identity.clf"); + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT((bool)cachedFile); + OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7"); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 3); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), + "Id"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), + "urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), + "Identity transform illustrating Array bit depth scaling"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementValue(), + "Can be loaded by either SMPTE or CLF v3 parsers"); + + // Check the ops. + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + OCIO_REQUIRE_EQUAL(opList.size(), 3); + + auto mat1 = OCIO::DynamicPtrCast(opList[0]); + OCIO_REQUIRE_ASSERT(mat1); + OCIO_CHECK_EQUAL(mat1->getFileInputBitDepth(), OCIO::BIT_DEPTH_UINT8); + OCIO_CHECK_EQUAL(mat1->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT16); + + auto lut = OCIO::DynamicPtrCast(opList[1]); + OCIO_REQUIRE_ASSERT(lut); + OCIO_CHECK_EQUAL(lut->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT16); + + auto mat2 = OCIO::DynamicPtrCast(opList[2]); + OCIO_REQUIRE_ASSERT(mat2); + OCIO_CHECK_EQUAL(mat2->getFileInputBitDepth(), OCIO::BIT_DEPTH_UINT16); + OCIO_CHECK_EQUAL(mat2->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT16); + + // Check identity. + // Using float bit-depths returns a Range clamping at [0,1], due to the + // LUT1D. Thus setting arbitrary integer in and out depths to avoid the + // Range and allow isIdentity to be true. + OCIO::ConstProcessorRcPtr processor; + OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); + OCIO_REQUIRE_ASSERT(processor); + auto procOpt = processor->getOptimizedCPUProcessor( + OCIO::BIT_DEPTH_UINT10, + OCIO::BIT_DEPTH_UINT12, + OCIO::OPTIMIZATION_DEFAULT); + OCIO_CHECK_ASSERT(procOpt->isIdentity()); + + // Check the Id element + auto& meta = processor->getFormatMetadata(); + OCIO_REQUIRE_ASSERT(meta.getNumChildrenElements() == 3); + auto& idElement = meta.getChildElement(0); + OCIO_CHECK_EQUAL_STR(idElement.getElementName(), "Id"); + OCIO_CHECK_EQUAL_STR(idElement.getElementValue(), "urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7"); +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_id_bad_value) +{ + const std::string ctfFile("clf/smpte_only/illegal/id_bad_value.clf"); + + // Add a log guard to catch warnings. + OCIO::LogGuard guard; + OCIO::SetLoggingLevel(OCIO::LOGGING_LEVEL_WARNING); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT((bool)cachedFile); + + // Check the expected warning. + static constexpr char Warning[1024] = + "id_bad_value.clf(3): '3bae2da8' is not a SMPTE ST 2136-1 compliant Id value."; + OCIO_CHECK_NE(std::string::npos, + StringUtils::Find( StringUtils::RightTrim(guard.output()), Warning )); +} + OCIO_ADD_TEST(FileFormatCTF, info_example) { OCIO::LocalCachedFileRcPtr cachedFile; @@ -1252,18 +1374,19 @@ OCIO_ADD_TEST(FileFormatCTF, info_example) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - "Example of using the Info element"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[1], - "A second description"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getInputDescriptor(), - "input desc"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getOutputDescriptor(), - "output desc"); + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 4); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), "Example of using the Info element"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), "A second description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementValue(), "input desc"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(3).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(3).getElementValue(), "output desc"); // Ensure ops were not affected by metadata parsing. - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = @@ -1278,45 +1401,45 @@ OCIO_ADD_TEST(FileFormatCTF, info_example) // Check element values. // - OCIO_CHECK_EQUAL(std::string(info.getElementName()), OCIO::METADATA_INFO); + OCIO_CHECK_EQUAL_STR(info.getElementName(), OCIO::METADATA_INFO); auto items = info.getChildrenElements(); OCIO_REQUIRE_EQUAL(items.size(), 6); - OCIO_CHECK_EQUAL(std::string(items[0].getElementName()), "Copyright"); - OCIO_CHECK_EQUAL(std::string(items[0].getElementValue()), + OCIO_CHECK_EQUAL_STR(items[0].getElementName(), "Copyright"); + OCIO_CHECK_EQUAL_STR(items[0].getElementValue(), "Copyright Contributors to the OpenColorIO Project."); - OCIO_CHECK_EQUAL(std::string(items[1].getElementName()), "AppRelease"); - OCIO_CHECK_EQUAL(std::string(items[1].getElementValue()), "2020.0.63"); - OCIO_CHECK_EQUAL(std::string(items[2].getElementName()), "Revision"); - OCIO_CHECK_EQUAL(std::string(items[2].getElementValue()), "1"); + OCIO_CHECK_EQUAL_STR(items[1].getElementName(), "AppRelease"); + OCIO_CHECK_EQUAL_STR(items[1].getElementValue(), "2020.0.63"); + OCIO_CHECK_EQUAL_STR(items[2].getElementName(), "Revision"); + OCIO_CHECK_EQUAL_STR(items[2].getElementValue(), "1"); - OCIO_CHECK_EQUAL(std::string(items[3].getElementName()), "Category"); - OCIO_CHECK_EQUAL(std::string(items[3].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(items[3].getElementName(), "Category"); + OCIO_CHECK_EQUAL_STR(items[3].getElementValue(), ""); auto catItems = items[3].getChildrenElements(); OCIO_REQUIRE_EQUAL(catItems.size(), 1); - OCIO_CHECK_EQUAL(std::string(catItems[0].getElementName()), "Tags"); + OCIO_CHECK_EQUAL_STR(catItems[0].getElementName(), "Tags"); auto tagsItems = catItems[0].getChildrenElements(); OCIO_REQUIRE_EQUAL(tagsItems.size(), 2); - OCIO_CHECK_EQUAL(std::string(tagsItems[0].getElementName()), "SceneLinearWorkingSpace"); - OCIO_CHECK_EQUAL(std::string(tagsItems[0].getElementValue()), ""); - OCIO_CHECK_EQUAL(std::string(tagsItems[1].getElementName()), "Input"); - OCIO_CHECK_EQUAL(std::string(tagsItems[1].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(tagsItems[0].getElementName(), "SceneLinearWorkingSpace"); + OCIO_CHECK_EQUAL_STR(tagsItems[0].getElementValue(), ""); + OCIO_CHECK_EQUAL_STR(tagsItems[1].getElementName(), "Input"); + OCIO_CHECK_EQUAL_STR(tagsItems[1].getElementValue(), ""); - OCIO_CHECK_EQUAL(std::string(items[4].getElementName()), "InputColorSpace"); - OCIO_CHECK_EQUAL(std::string(items[4].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(items[4].getElementName(), "InputColorSpace"); + OCIO_CHECK_EQUAL_STR(items[4].getElementValue(), ""); auto icItems = items[4].getChildrenElements(); OCIO_REQUIRE_EQUAL(icItems.size(), 4); - OCIO_CHECK_EQUAL(std::string(icItems[0].getElementName()), OCIO::METADATA_DESCRIPTION); - OCIO_CHECK_EQUAL(std::string(icItems[0].getElementValue()), "Input color space description"); - OCIO_CHECK_EQUAL(std::string(icItems[1].getElementName()), "ImageState"); - OCIO_CHECK_EQUAL(std::string(icItems[1].getElementValue()), "video"); - OCIO_CHECK_EQUAL(std::string(icItems[2].getElementName()), "ShortName"); - OCIO_CHECK_EQUAL(std::string(icItems[2].getElementValue()), "no_version"); - OCIO_CHECK_EQUAL(std::string(icItems[3].getElementName()), "ID"); - OCIO_CHECK_EQUAL(std::string(icItems[3].getElementValue()), + OCIO_CHECK_EQUAL_STR(icItems[0].getElementName(), OCIO::METADATA_DESCRIPTION); + OCIO_CHECK_EQUAL_STR(icItems[0].getElementValue(), "Input color space description"); + OCIO_CHECK_EQUAL_STR(icItems[1].getElementName(), "ImageState"); + OCIO_CHECK_EQUAL_STR(icItems[1].getElementValue(), "video"); + OCIO_CHECK_EQUAL_STR(icItems[2].getElementName(), "ShortName"); + OCIO_CHECK_EQUAL_STR(icItems[2].getElementValue(), "no_version"); + OCIO_CHECK_EQUAL_STR(icItems[3].getElementName(), "ID"); + OCIO_CHECK_EQUAL_STR(icItems[3].getElementValue(), "387b23d1-f1ce-3f69-8544-e5601f45f78b"); - OCIO_CHECK_EQUAL(std::string(items[5].getElementName()), "OutputColorSpace"); - OCIO_CHECK_EQUAL(std::string(items[5].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(items[5].getElementName(), "OutputColorSpace"); + OCIO_CHECK_EQUAL_STR(items[5].getElementValue(), ""); auto ocItems = items[5].getChildrenElements(); OCIO_REQUIRE_EQUAL(ocItems.size(), 3); auto attribs = items[5].getAttributes(); @@ -1325,12 +1448,200 @@ OCIO_ADD_TEST(FileFormatCTF, info_example) OCIO_CHECK_EQUAL(attribs[0].second, "test1"); OCIO_CHECK_EQUAL(attribs[1].first, "att2"); OCIO_CHECK_EQUAL(attribs[1].second, "test2"); - OCIO_CHECK_EQUAL(std::string(ocItems[0].getElementName()), "ImageState"); - OCIO_CHECK_EQUAL(std::string(ocItems[0].getElementValue()), "scene"); - OCIO_CHECK_EQUAL(std::string(ocItems[1].getElementName()), "ShortName"); - OCIO_CHECK_EQUAL(std::string(ocItems[1].getElementValue()), "ACES"); - OCIO_CHECK_EQUAL(std::string(ocItems[2].getElementName()), "ID"); - OCIO_CHECK_EQUAL(std::string(ocItems[2].getElementValue()), "1"); + OCIO_CHECK_EQUAL_STR(ocItems[0].getElementName(), "ImageState"); + OCIO_CHECK_EQUAL_STR(ocItems[0].getElementValue(), "scene"); + OCIO_CHECK_EQUAL_STR(ocItems[1].getElementName(), "ShortName"); + OCIO_CHECK_EQUAL_STR(ocItems[1].getElementValue(), "ACES"); + OCIO_CHECK_EQUAL_STR(ocItems[2].getElementName(), "ID"); + OCIO_CHECK_EQUAL_STR(ocItems[2].getElementValue(), "1"); +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_all_metadata) +{ + // Function to check children elements and their attributes. + auto checkCommonMetadata = [](const OCIO::FormatMetadataImpl& md) + { + auto & items = md.getChildrenElements(); + OCIO_REQUIRE_EQUAL(items.size(), 9); + OCIO_CHECK_EQUAL_STR(items[0].getElementName(), "Id"); + OCIO_CHECK_EQUAL_STR(items[0].getElementValue(), "urn:uuid:a8f91bfa-b79f-5d4d-b750-a411c476bb47"); + + OCIO_CHECK_EQUAL_STR(items[1].getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(items[1].getElementValue(), "Demo Advanced LUT with dummy values"); + OCIO_CHECK_EQUAL_STR(items[1].getAttributeValue("language"), "en"); + + OCIO_CHECK_EQUAL_STR(items[2].getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(items[2].getElementValue(), "Démonstration d'une LUT avancée avec des valeurs factices"); + OCIO_CHECK_EQUAL_STR(items[2].getAttributeValue("language"), "fr"); + + OCIO_CHECK_EQUAL_STR(items[3].getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(items[3].getElementValue(), "Demo Erweiterte LUT mit Dummy-Werten"); + OCIO_CHECK_EQUAL_STR(items[3].getAttributeValue("language"), "de"); + + OCIO_CHECK_EQUAL_STR(items[4].getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[4].getElementValue(), "ITU-R BT.709"); + OCIO_CHECK_EQUAL_STR(items[4].getAttributeValue("language"), "en-GB"); + + OCIO_CHECK_EQUAL_STR(items[5].getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[5].getElementValue(), "Same as Input"); + OCIO_CHECK_EQUAL_STR(items[5].getAttributeValue("language"), "en-US"); + + OCIO_CHECK_EQUAL_STR(items[6].getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[6].getElementValue(), "Identique à l'entrée"); + OCIO_CHECK_EQUAL_STR(items[6].getAttributeValue("language"), "fr"); + + OCIO_CHECK_EQUAL_STR(items[7].getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[7].getElementValue(), "Gleiches wie Eingabe"); + OCIO_CHECK_EQUAL_STR(items[7].getAttributeValue("language"), "de"); + + OCIO_CHECK_EQUAL_STR(items[8].getElementName(), "Info"); + OCIO_CHECK_EQUAL_STR(items[8].getElementValue(), ""); + + // Info block (name spaces are retained) + auto & info = items[8].getChildrenElements(); + OCIO_REQUIRE_EQUAL(info.size(), 9); + OCIO_CHECK_EQUAL_STR(info[0].getElementName(), "Profile"); + OCIO_CHECK_EQUAL_STR(info[0].getElementValue(), "http://www.smpte-ra.org/ns/2136-10/2026#Live_Broadcast_LUT33"); + + OCIO_CHECK_EQUAL_STR(info[1].getElementName(), "AppRelease"); + OCIO_CHECK_EQUAL_STR(info[1].getElementValue(), "SMPTE_2136-10_Example"); + + OCIO_CHECK_EQUAL_STR(info[2].getElementName(), "Copyright"); + OCIO_CHECK_EQUAL_STR(info[2].getElementValue(), "OCIO contributors"); + + OCIO_CHECK_EQUAL_STR(info[3].getElementName(), "Revision"); + OCIO_CHECK_EQUAL_STR(info[3].getElementValue(), "1.0"); + + OCIO_CHECK_EQUAL_STR(info[4].getElementName(), "clfbp:InputCharacteristics"); + OCIO_CHECK_EQUAL_STR(info[4].getElementValue(), ""); + + OCIO_CHECK_EQUAL_STR(info[5].getElementName(), "clfbp:OutputCharacteristics"); + OCIO_CHECK_EQUAL_STR(info[5].getElementValue(), ""); + + OCIO_CHECK_EQUAL_STR(info[6].getElementName(), "clfbp:OutputVideoSignalClipping"); + OCIO_CHECK_EQUAL_STR(info[6].getElementValue(), "sdiClip"); + + OCIO_CHECK_EQUAL_STR(info[7].getElementName(), "Keywords"); + OCIO_CHECK_EQUAL_STR(info[7].getElementValue(), "Test, Display-light"); + + OCIO_CHECK_EQUAL_STR(info[8].getElementName(), "clfbp:ContactEmail"); + OCIO_CHECK_EQUAL_STR(info[8].getElementValue(), "fake-email@ocio.org"); + + // Info / InputCharacteristics + auto & input = info[4].getChildrenElements(); + OCIO_REQUIRE_EQUAL(input.size(), 3); + OCIO_CHECK_EQUAL_STR(input[0].getElementName(), "clfbp:ColorPrimaries"); + OCIO_CHECK_EQUAL_STR(input[0].getElementValue(), "ColorPrimaries_ITU709"); + + OCIO_CHECK_EQUAL_STR(input[1].getElementName(), "clfbp:TransferCharacteristic"); + OCIO_CHECK_EQUAL_STR(input[1].getElementValue(), "TransferCharacteristic_ITU709"); + + OCIO_CHECK_EQUAL_STR(input[2].getElementName(), "clfbp:CodingEquations"); + OCIO_CHECK_EQUAL_STR(input[2].getElementValue(), "CodingEquations_ITU709"); + + // Info / OutputCharacteristics + auto & output = info[5].getChildrenElements(); + OCIO_REQUIRE_EQUAL(output.size(), 3); + OCIO_CHECK_EQUAL_STR(output[0].getElementName(), "clfbp:ColorPrimaries"); + OCIO_CHECK_EQUAL_STR(output[0].getElementValue(), "ColorPrimaries_ITU2020"); + + OCIO_CHECK_EQUAL_STR(output[1].getElementName(), "clfbp:TransferCharacteristic"); + OCIO_CHECK_EQUAL_STR(output[1].getElementValue(), "TransferCharacteristic_SMPTEST2084"); + + OCIO_CHECK_EQUAL_STR(output[2].getElementName(), "clfbp:CodingEquations"); + OCIO_CHECK_EQUAL_STR(output[2].getElementValue(), "CodingEquations_ITU2100_ICtCp"); + }; + + // Read the file and check the metadata content. + const std::string ctfFile("clf/smpte_only/broadcast_profile_lut33.clf"); + OCIO::ConstProcessorRcPtr processor; + OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); + OCIO_REQUIRE_ASSERT(processor); + + // Check the metadata + { + const auto& md1 = dynamic_cast( + processor->getFormatMetadata()); + + // Root attributes. + OCIO_REQUIRE_EQUAL(md1.getNumAttributes(), 2); + + OCIO_CHECK_EQUAL_STR(md1.getAttributeName(0), "name"); + OCIO_CHECK_EQUAL_STR(md1.getAttributeValue(0),"SMPTE Example Live Broadcast LUT33 Profile"); + + OCIO_CHECK_EQUAL_STR(md1.getAttributeName(1), "xmlns:clfbp"); + OCIO_CHECK_EQUAL_STR(md1.getAttributeValue(1),"http://www.smpte-ra.org/ns/2136-10/2026"); + + // Child nodes. + checkCommonMetadata(md1); + } + + // Write, read back and check if metadata survives the roundtrip. + { + std::ostringstream oss; + const auto group = processor->createGroupTransform(); + OCIO::ConstConfigRcPtr config = OCIO::Config::CreateRaw(); + OCIO_CHECK_NO_THROW(group->write(config, "Academy/ASC Common LUT Format", oss)); + auto str = oss.str(); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = ParseString(str)); + + // Get the combined metadata from the the transform. + OCIO::FormatMetadataImpl md2; + cachedFile->m_transform->toMetadata(md2); + + // Root Attributes (will be different as id is added) + OCIO_REQUIRE_EQUAL(md2.getNumAttributes(), 3); + + OCIO_CHECK_EQUAL_STR(md2.getAttributeName(0), "id"); + OCIO_CHECK_EQUAL_STR(md2.getAttributeValue(0), "urn:uuid:9656a363-bf0a-c5f9-debe-8a083b88107f"); + + OCIO_CHECK_EQUAL_STR(md2.getAttributeName(1), "name"); + OCIO_CHECK_EQUAL_STR(md2.getAttributeValue(1), "SMPTE Example Live Broadcast LUT33 Profile"); + + OCIO_CHECK_EQUAL_STR(md2.getAttributeName(2), "xmlns:clfbp"); + OCIO_CHECK_EQUAL_STR(md2.getAttributeValue(2), "http://www.smpte-ra.org/ns/2136-10/2026"); + + // Child nodes should be identical. + checkCommonMetadata(md2); + } +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_namespaces) +{ + const std::string ctfFile("clf/smpte_only/namespaces.clf"); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + + // Check the op. + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + OCIO_REQUIRE_EQUAL(opList.size(), 1); + + auto lut1d = OCIO::DynamicPtrCast(opList[0]); + OCIO_CHECK_ASSERT(lut1d); + + // Check the meta data. + OCIO::ConstProcessorRcPtr processor; + OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); + OCIO_REQUIRE_ASSERT(processor); + const auto& md = processor->getFormatMetadata(); + + // Attributes. + OCIO_REQUIRE_EQUAL(md.getNumAttributes(), 3); + OCIO_CHECK_EQUAL_STR(md.getAttributeName(0), "id"); + OCIO_CHECK_EQUAL_STR(md.getAttributeValue(0),"pl1"); + OCIO_CHECK_EQUAL_STR(md.getAttributeName(1), "xmlns:clf"); + OCIO_CHECK_EQUAL_STR(md.getAttributeValue(1),"http://www.smpte-ra.org/ns/2136-1/2024"); + OCIO_CHECK_EQUAL_STR(md.getAttributeName(2), "xmlns:ds"); + OCIO_CHECK_EQUAL_STR(md.getAttributeValue(2),"http://www.w3.org/2000/09/xmldsig#"); + + // Name-spaced description will be available without the namespace prefix. + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 1); + const auto& desc = md.getChildElement(0); + OCIO_CHECK_EQUAL_STR(desc.getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(desc.getElementValue(),"Example CLF file using namespaces."); } OCIO_ADD_TEST(FileFormatCTF, difficult_syntax) @@ -1341,30 +1652,45 @@ OCIO_ADD_TEST(FileFormatCTF, difficult_syntax) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("clf/difficult_syntax.clf"); + // Add a log guard to catch warnings. + OCIO::LogGuard guard; + OCIO::SetLoggingLevel(OCIO::LOGGING_LEVEL_WARNING); + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); + // Check the expected warning. + static constexpr char Warning[1024] = + "difficult_syntax.clf(41): Unrecognized attribute 'unknown' of 'LUT1D'."; + OCIO_CHECK_NE(std::string::npos, + StringUtils::Find( StringUtils::RightTrim(guard.output()), Warning )); + const OCIO::CTFVersion clfVersion = cachedFile->m_transform->getCLFVersion(); - const OCIO::CTFVersion ver(3, 0, 0); + const OCIO::CTFVersion ver("http://www.smpte-ra.org/ns/2136-1/2024", OCIO::CTFVersion::VERSION_SMPTE_XMLNS); OCIO_CHECK_EQUAL(clfVersion, ver); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "id1"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - "This is the ProcessList description."); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[1], - "yet 'another' \"valid\" desc"); + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 2); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), + "This is the ProcessList description."); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), + "yet 'another' \"valid\" desc"); const OCIO::FormatMetadataImpl & info = cachedFile->m_transform->getInfoMetadata(); - OCIO_CHECK_EQUAL(std::string(info.getElementName()), OCIO::METADATA_INFO); + OCIO_CHECK_EQUAL_STR(info.getElementName(), OCIO::METADATA_INFO); auto items = info.getChildrenElements(); OCIO_REQUIRE_EQUAL(items.size(), 1); - OCIO_CHECK_EQUAL(std::string(items[0].getElementName()), "Stuff"); - OCIO_CHECK_EQUAL(std::string(items[0].getElementValue()), + OCIO_CHECK_EQUAL_STR(items[0].getElementName(), "Stuff"); + OCIO_CHECK_EQUAL_STR(items[0].getElementValue(), "This is a \"difficult\" but 'legal' color transform file."); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); { auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1480,7 +1806,7 @@ OCIO_ADD_TEST(FileFormatCTF, difficult_xml_unknown_elements) const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_2 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1564,7 +1890,7 @@ OCIO_ADD_TEST(FileFormatCTF, unknown_elements) } } - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 4); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1673,7 +1999,7 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_invalid_version) OCIO_ADD_TEST(FileFormatCTF, clf_process_list_bad_version) { - std::string fileName("clf/illegal/process_list_bad_version.clf"); + std::string fileName("clf/pre-smpte_only/illegal/process_list_bad_version.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(fileName), OCIO::Exception, "is not a valid version"); @@ -1684,12 +2010,29 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_valid_version) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("process_list_valid_version.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT(cachedFile); const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_EQUAL(ctfVersion, OCIO::CTF_PROCESS_LIST_VERSION_1_4); } +OCIO_ADD_TEST(FileFormatCTF, non_smpte_xmlns) +{ + const std::string ctfFile("clf/pre-smpte_only/process_list_v3_namespace.clf"); + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + + // Check the op. + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + OCIO_REQUIRE_EQUAL(opList.size(), 1); + + auto mat = OCIO::DynamicPtrCast(opList[0]); + OCIO_REQUIRE_ASSERT(mat); + OCIO_CHECK_EQUAL(mat->getFileInputBitDepth(), OCIO::BIT_DEPTH_F32); + OCIO_CHECK_EQUAL(mat->getFileOutputBitDepth(), OCIO::BIT_DEPTH_F32); +} + OCIO_ADD_TEST(FileFormatCTF, process_list_higher_version) { const std::string ctfFile("process_list_higher_version.ctf"); @@ -1700,7 +2043,7 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_higher_version) OCIO_ADD_TEST(FileFormatCTF, clf_process_list_higher_version) { - const std::string ctfFile("clf/illegal/process_list_higher_version.clf"); + const std::string ctfFile("clf/pre-smpte_only/illegal/process_list_higher_version.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(ctfFile), OCIO::Exception, "Unsupported transform file version"); @@ -1711,6 +2054,7 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_version_revision) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("process_list_version_revision.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT(cachedFile); const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); @@ -1725,12 +2069,34 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_no_version) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("process_list_no_version.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT(cachedFile); const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_EQUAL(ctfVersion, OCIO::CTF_PROCESS_LIST_VERSION_1_2); } +OCIO_ADD_TEST(FileFormatCTF, smpte_conflicting_version) +{ + const std::string ctfFile("process_list_conflicting_versions.ctf"); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_THROW_WHAT(cachedFile = LoadCLFFile(ctfFile), + OCIO::Exception, + "SMPTE 'xmlns' version and 'Version' attribute cannot both be present.") +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_higher_ns_version) +{ + const std::string ctfFile("clf/smpte_only/illegal/process_list_higher_ns_version.clf"); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_THROW_WHAT(cachedFile = LoadCLFFile(ctfFile), + OCIO::Exception, + "No valid 'version', 'compCLFversion', or 'xmlns' attributes " + "were found; at least one of them is required."); +} + OCIO_ADD_TEST(FileFormatCTF, info_element_version_test) { // VALID - No Version. @@ -1788,7 +2154,7 @@ OCIO_ADD_TEST(FileFormatCTF, transform_element_end_missing) OCIO_ADD_TEST(FileFormatCTF, transform_missing_id) { - const std::string ctfFile("clf/illegal/transform_missing_id.clf"); + const std::string ctfFile("clf/pre-smpte_only/illegal/transform_missing_id.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(ctfFile), OCIO::Exception, "Required attribute 'id'"); @@ -1884,10 +2250,10 @@ OCIO_ADD_TEST(FileFormatCTF, transform_empty) OCIO_ADD_TEST(FileFormatCTF, transform_id_empty) { - const std::string ctfFile("clf/illegal/transform_id_empty.clf"); + const std::string ctfFile("clf/pre-smpte_only/illegal/transform_id_empty.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(ctfFile), OCIO::Exception, - "Required attribute 'id' does not have a value"); + "Attribute 'id' does not have a value"); } OCIO_ADD_TEST(FileFormatCTF, transform_with_bitdepth_mismatch) @@ -1908,8 +2274,11 @@ OCIO_ADD_TEST(FileFormatCTF, inverse_of_id_test) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getInverseOfId() == - "inverseOfIdTest"); + + auto& meta = cachedFile->m_transform->getFormatMetadata(); + + OCIO_CHECK_EQUAL_STR(meta.getAttributeValue("inverseOf"), + "inverseOfIdTest"); } OCIO_ADD_TEST(FileFormatCTF, range_default) @@ -1920,7 +2289,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_default) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -1945,7 +2314,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_test1_clamp) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -1970,7 +2339,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_test1_noclamp) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); // Check that the noClamp style Range became a Matrix. @@ -2018,7 +2387,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_test2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -2074,7 +2443,7 @@ OCIO_ADD_TEST(FileFormatCTF, indexMap_test1_clfv2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -2101,7 +2470,7 @@ OCIO_ADD_TEST(FileFormatCTF, indexMap_test2_clfv2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -2159,10 +2528,12 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test1) OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "id"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], "2.4 gamma"); + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 1); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(),"2.4 gamma"); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2191,7 +2562,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2222,7 +2593,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test3) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2252,7 +2623,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test4) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2299,7 +2670,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test6) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2321,7 +2692,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test1) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2352,7 +2723,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2388,7 +2759,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test3) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2420,7 +2791,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test4) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2461,7 +2832,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test5) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2517,7 +2888,8 @@ OCIO_ADD_TEST(FileFormatCTF, exponent_all_styles) OCIO::LocalCachedFileRcPtr cachedFile; const std::string fileName("clf/exponent_all_styles.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 12); { // Op 0 == basicFwd. @@ -2703,11 +3075,16 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_clamp_fwd) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getInputDescriptor(), - "inputDesc"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getOutputDescriptor(), - "outputDesc"); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "inputDesc"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "outputDesc"); + OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2742,7 +3119,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_missing_style) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2766,7 +3143,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_all_styles) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 4); auto pCDL = std::dynamic_pointer_cast(opList[0]); @@ -2842,7 +3219,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_missing_sop) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2863,7 +3240,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_missing_sat) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2886,7 +3263,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_various_in_ctf) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 8); auto pCDL = std::dynamic_pointer_cast(opList[0]); @@ -2927,7 +3304,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_all_styles) OCIO::LocalCachedFileRcPtr cachedFile; const std::string fileName("clf/log_all_styles.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 11); double error = 1e-9; @@ -3098,7 +3476,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_logtolin) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("log_logtolin.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; auto log = std::dynamic_pointer_cast(op); @@ -3125,7 +3504,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_logtolinv2) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("log_logtolinv2.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; auto log = std::dynamic_pointer_cast(op); @@ -3151,7 +3531,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_lintolog_3chan) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("log_lintolog_3chan.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; auto log = std::dynamic_pointer_cast(op); @@ -3194,7 +3575,7 @@ OCIO_ADD_TEST(FileFormatCTF, log_bad_style) OCIO_ADD_TEST(FileFormatCTF, log_bad_version) { - std::string fileName("clf/illegal/log_bad_version.clf"); + std::string fileName("clf/pre-smpte_only/illegal/log_bad_version.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(fileName), OCIO::Exception, "CLF file version '2' does not support operator 'Log'"); } @@ -3227,7 +3608,7 @@ OCIO_ADD_TEST(FileFormatCTF, log_ocio_params_channels) strebuf << "\n"; OCIO::LocalCachedFileRcPtr cachedFile = ParseString(strebuf.str()); - OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; @@ -3280,7 +3661,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_default_params) OCIO::LocalCachedFileRcPtr cachedFile; OCIO_CHECK_NO_THROW(cachedFile = ParseString(strebuf.str())); - OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 2); auto op = fileOps[0]; @@ -3314,7 +3696,8 @@ OCIO_ADD_TEST(FileFormatCTF, multiple_ops) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("clf/multiple_ops.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 9); { // Op 0 == CDL. @@ -3427,7 +3810,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_alias) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("reference_alias.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; @@ -3446,7 +3830,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_path) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("reference_path_missing_file.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; @@ -3464,7 +3849,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_multiple) // File contains 2 references, 1 range and 1 reference. std::string fileName("references_some_inverted.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); OCIO::ConstOpDataRcPtr op0 = fileOps[0]; @@ -3500,7 +3886,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_path_utf8) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("reference_utf8.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstReferenceOpDataRcPtr ref = std::dynamic_pointer_cast(op); @@ -3524,7 +3911,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_video) const std::string ctfFile("exposure_contrast_video.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); @@ -3557,7 +3944,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_log) const std::string ctfFile("exposure_contrast_log.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); @@ -3594,7 +3981,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_linear) const std::string ctfFile("exposure_contrast_linear.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); @@ -3631,7 +4018,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_no_gamma) const std::string ctfFile("exposure_contrast_no_gamma.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); @@ -3703,7 +4090,7 @@ OCIO_ADD_TEST(FileFormatCTF, attribute_float_parse_leading_spaces) OCIO::CachedFileRcPtr file; OCIO_CHECK_NO_THROW(file = tester.read(ctf, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); const auto op = fileOps[0]; @@ -3718,7 +4105,8 @@ OCIO_ADD_TEST(FileFormatCTF, load_deprecated_ops_file) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("deprecated_ops.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 3); @@ -3761,7 +4149,8 @@ OCIO_ADD_TEST(FileFormatCTF, load_fixed_function_file) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("fixed_function.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 2); @@ -3829,7 +4218,8 @@ void ValidateFixedFunctionStyle(OCIO::FixedFunctionOpData::Style style, // Test parsing. OCIO::LocalCachedFileRcPtr cachedFile; OCIO_CHECK_NO_THROW_FROM(cachedFile = ParseString(strebuf.str()), lineNo); - OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL_FROM(fileOps.size(), 1, lineNo); auto opData = fileOps[0]; @@ -4050,7 +4440,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_primary_log) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); const auto op0 = fileOps[0]; @@ -4154,7 +4544,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_primary_lin) OCIO_CHECK_NO_THROW(file = tester.read(ctfLin, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); const auto op0 = fileOps[0]; @@ -4255,7 +4645,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_primary_video) OCIO_CHECK_NO_THROW(file = tester.read(ctfVideo, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); const auto op0 = fileOps[0]; @@ -4454,7 +4844,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_rgbcurves_lin) OCIO_CHECK_NO_THROW(file = tester.read(ctfLin, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 3); const auto op0 = fileOps[0]; @@ -4542,7 +4932,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_rgbcurves_log) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); const auto op0 = fileOps[0]; @@ -4640,7 +5030,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_huecurves_log) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); const auto op0 = fileOps[0]; @@ -4848,7 +5238,7 @@ OCIO_ADD_TEST(CTFTransform, load_grading_tone) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 6); @@ -4937,7 +5327,7 @@ OCIO_ADD_TEST(CTFTransform, load_grading_tone_errors) OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix) { - const std::string ctfFile("clf/matrix_example.clf"); + const std::string ctfFile("clf/pre-smpte_only/matrix_example.clf"); OCIO::ConstProcessorRcPtr processor; OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); OCIO_REQUIRE_ASSERT(processor); @@ -4979,7 +5369,7 @@ OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix) // Output matrix array as '3 4 3'. const std::string expectedCTF{ R"( - + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5013,25 +5403,25 @@ OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix) OCIO::CachedFileRcPtr file = tester.read(inputTransform, emptyString, OCIO::INTERP_DEFAULT); OCIO::LocalCachedFileRcPtr cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstMatrixOpDataRcPtr mat = OCIO::DynamicPtrCast(op); OCIO_REQUIRE_ASSERT(mat); const auto & md = mat->getFormatMetadata(); OCIO_REQUIRE_EQUAL(md.getNumAttributes(), 2); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_ID), md.getAttributeName(0)); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_NAME), md.getAttributeName(1)); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_ID, md.getAttributeName(0)); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_NAME, md.getAttributeName(1)); OCIO_CHECK_EQUAL(shortName, md.getAttributeValue(1)); OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 4); const auto & desc0 = md.getChildElement(0); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), desc0.getElementName()); - OCIO_CHECK_EQUAL(std::string(R"(Legacy matrix)"), desc0.getElementValue()); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, desc0.getElementName()); + OCIO_CHECK_EQUAL_STR("Legacy matrix", desc0.getElementValue()); const auto & desc1 = md.getChildElement(2); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), desc1.getElementName()); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, desc1.getElementName()); OCIO_CHECK_EQUAL(description1, desc1.getElementValue()); const auto & desc2 = md.getChildElement(3); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), desc2.getElementName()); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, desc2.getElementName()); OCIO_CHECK_EQUAL(description2, desc2.getElementValue()); } @@ -5063,7 +5453,7 @@ OCIO_ADD_TEST(CTFTransform, save_matrix) matTransform->setDirection(OCIO::TRANSFORM_DIR_FORWARD); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(matTransform); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstMatrixOpDataRcPtr mat = OCIO::DynamicPtrCast(op); @@ -5097,7 +5487,7 @@ OCIO_ADD_TEST(CTFTransform, save_cdl) cdlTransform->getFormatMetadata().addChildElement(OCIO::METADATA_SAT_DESCRIPTION, "Sat description 2"); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(cdlTransform); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstCDLOpDataRcPtr cdl = OCIO::DynamicPtrCast(op); @@ -5105,21 +5495,21 @@ OCIO_ADD_TEST(CTFTransform, save_cdl) OCIO_CHECK_EQUAL(cdl->getID(), "test-cdl-1"); const auto & metadata = cdl->getFormatMetadata(); OCIO_REQUIRE_EQUAL(metadata.getNumChildrenElements(), 8); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, metadata.getChildElement(0).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, metadata.getChildElement(1).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_INPUT_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_INPUT_DESCRIPTION, metadata.getChildElement(2).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_VIEWING_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_VIEWING_DESCRIPTION, metadata.getChildElement(3).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SOP_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SOP_DESCRIPTION, metadata.getChildElement(4).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SOP_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SOP_DESCRIPTION, metadata.getChildElement(5).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SAT_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SAT_DESCRIPTION, metadata.getChildElement(6).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SAT_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SAT_DESCRIPTION, metadata.getChildElement(7).getElementName()); auto params = cdl->getSlopeParams(); OCIO_CHECK_EQUAL(params[0], slope[0]); @@ -5145,7 +5535,7 @@ void TestSaveLog(double base, unsigned line) logT->setBase(base); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(logT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL_FROM(fileOps.size(), 1, line); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLogOpDataRcPtr log = OCIO::DynamicPtrCast(op); @@ -5170,7 +5560,7 @@ OCIO_ADD_TEST(CTFTransform, save_log_affine) logT->setLinSideSlopeValue(vals); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(logT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLogOpDataRcPtr log = OCIO::DynamicPtrCast(op); @@ -5193,7 +5583,7 @@ OCIO_ADD_TEST(CTFTransform, save_log_camera) logT->setLinearSlopeValue(vals_ls); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(logT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLogOpDataRcPtr log = OCIO::DynamicPtrCast(op); @@ -5273,7 +5663,7 @@ OCIO_ADD_TEST(CTFTransform, save_lut1d_halfdomain) } OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(lutT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLut1DOpDataRcPtr lut = OCIO::DynamicPtrCast(op); @@ -5322,7 +5712,7 @@ OCIO_ADD_TEST(CTFTransform, save_lut1d_f16_raw) lutT->setValue(1, values[3], values[4], values[5]); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(lutT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLut1DOpDataRcPtr lut = OCIO::DynamicPtrCast(op); @@ -5364,7 +5754,7 @@ OCIO_ADD_TEST(CTFTransform, save_lut1d_f32) lutT->setValue(7, values[7], values[7], values[7]); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(lutT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLut1DOpDataRcPtr lut = OCIO::DynamicPtrCast(op); @@ -5479,7 +5869,7 @@ OCIO_ADD_TEST(CTFTransform, save_range) rangeT->setMaxOutValue(1.5); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(rangeT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstRangeOpDataRcPtr range = OCIO::DynamicPtrCast(op); @@ -5509,7 +5899,7 @@ OCIO_ADD_TEST(CTFTransform, save_group) groupT->appendTransform(matT); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(groupT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 2); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstRangeOpDataRcPtr range = OCIO::DynamicPtrCast(op); @@ -5522,7 +5912,7 @@ OCIO_ADD_TEST(CTFTransform, save_group) OCIO_ADD_TEST(CTFTransform, load_save_matrix) { - const std::string ctfFile("clf/matrix_example.clf"); + const std::string ctfFile("clf/pre-smpte_only/matrix_example.clf"); OCIO::ConstProcessorRcPtr processor; OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); OCIO_REQUIRE_ASSERT(processor); @@ -5533,7 +5923,7 @@ OCIO_ADD_TEST(CTFTransform, load_save_matrix) // Output matrix array as '3 3 3'. const std::string expected{ R"( - + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5580,7 +5970,7 @@ OCIO_ADD_TEST(CTFTransform, save_matrix_444) OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix_clf) { - const std::string ctfFile("clf/matrix_example.clf"); + const std::string ctfFile("clf/pre-smpte_only/matrix_example.clf"); OCIO::ConstProcessorRcPtr processor; OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); OCIO_REQUIRE_ASSERT(processor); @@ -5595,12 +5985,14 @@ OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix_clf) const double offset[] = { 0.1, 1.2, 2.3, 0.0 }; matTrans->setOffset(offset); - std::ostringstream outputTransform; - OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); + // CLF Academy + { + std::ostringstream outputTransform; + OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); - const std::string expectedCLF{ -R"( - + const std::string expectedCLF_Academy{ + R"( + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5615,20 +6007,23 @@ R"( -)" }; +)"}; - OCIO_CHECK_EQUAL(expectedCLF.size(), outputTransform.str().size()); - OCIO_CHECK_EQUAL(expectedCLF, outputTransform.str()); + OCIO_CHECK_EQUAL(expectedCLF_Academy.size(), outputTransform.str().size()); + OCIO_CHECK_EQUAL(expectedCLF_Academy, outputTransform.str()); + } - const double offsetAlpha[] = { 0.1, 1.2, 2.3, 0.9 }; - matTrans->setOffset(offsetAlpha); + // CTF + { + const double offsetAlpha[] = { 0.1, 1.2, 2.3, 0.9 }; + matTrans->setOffset(offsetAlpha); - std::ostringstream outputTransformCTF; - OCIO_CHECK_NO_THROW(WriteGroupCTF(group, outputTransformCTF)); + std::ostringstream outputTransformCTF; + OCIO_CHECK_NO_THROW(WriteGroupCTF(group, outputTransformCTF)); - const std::string expectedCTF{ -R"( - + const std::string expectedCTF{ + R"( + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5644,10 +6039,13 @@ R"( -)" }; +)"}; + + OCIO_CHECK_EQUAL(expectedCTF.size(), outputTransformCTF.str().size()); + OCIO_CHECK_EQUAL(expectedCTF, outputTransformCTF.str()); + } + - OCIO_CHECK_EQUAL(expectedCTF.size(), outputTransformCTF.str().size()); - OCIO_CHECK_EQUAL(expectedCTF, outputTransformCTF.str()); } OCIO_ADD_TEST(CTFTransform, matrix3x3_clf) @@ -5671,7 +6069,7 @@ OCIO_ADD_TEST(CTFTransform, matrix3x3_clf) // In/out bit-depth equal, matrix not scaled. const std::string expected{ R"( - + 0.333333333333333 3.33333333333333 33.3333333333333 @@ -5919,7 +6317,7 @@ OCIO_ADD_TEST(CTFTransform, cdl_clf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); const std::string expected{ R"( - + ProcessList description ======================= @@ -5965,7 +6363,7 @@ OCIO_ADD_TEST(CTFTransform, cdl_clf) OCIO::CachedFileRcPtr file = tester.read(ctfStream, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto cdlData = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(cdlData); @@ -6084,7 +6482,7 @@ OCIO_ADD_TEST(CTFTransform, range1_clf) const std::string expected{ "\n" - "\n" + "\n" " Input descriptor\n" " Output descriptor\n" " \n" @@ -6119,7 +6517,7 @@ OCIO_ADD_TEST(CTFTransform, range2_clf) const std::string expected{ "\n" - "\n" + "\n" " \n" " 102.3 \n" " 25.5 \n" @@ -6150,7 +6548,7 @@ OCIO_ADD_TEST(CTFTransform, range3_clf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); const std::string expected{ R"( - + 0 0 @@ -6185,7 +6583,7 @@ OCIO_ADD_TEST(CTFTransform, range4_clf) // Range is saved in the forward direction. const std::string expected{ R"( - + 2047.5 4095 @@ -6259,7 +6657,7 @@ OCIO_ADD_TEST(CTFTransform, gamma1_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -6302,7 +6700,7 @@ OCIO_ADD_TEST(CTFTransform, gamma1_mirror_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -6345,7 +6743,7 @@ OCIO_ADD_TEST(CTFTransform, gamma1_pass_thru_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -6430,7 +6828,7 @@ OCIO_ADD_TEST(CTFTransform, gamma3_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -7680,7 +8078,7 @@ OCIO_ADD_TEST(CTFTransform, lut1d_clf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); const std::string expected{ R"( - + 0 @@ -8455,7 +8853,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d) const std::string expectedCLF{ R"( - + 0 @@ -8531,7 +8929,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_shaper) OCIO::CachedFileRcPtr file = tester.read(outputCTF, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto range = OCIO_DYNAMIC_POINTER_CAST(opList[0]); @@ -8573,7 +8971,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_shaper) OCIO::CachedFileRcPtr file = tester.read(outputCTF, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto lut = OCIO_DYNAMIC_POINTER_CAST(opList[0]); @@ -8625,11 +9023,12 @@ OCIO_ADD_TEST(FileFormatCTF, bake_3d) data.addChildElement(OCIO::METADATA_DESCRIPTION, "OpenColorIO Test Line 2"); data.addChildElement("Anything", "Not Saved"); - data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Input descriptor"); - data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Only first is saved"); - data.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "Output descriptor"); + data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Input descriptor 1"); + data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Input descriptor 2"); + data.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "Output descriptor 1"); + data.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "Output descriptor 2"); data.addChildElement(OCIO::METADATA_INFO, ""); - auto & info = data.getChildElement(6); + auto & info = data.getChildElement(7); info.addAttribute("attrib1", "val1"); info.addAttribute("attrib2", "val2"); info.addChildElement("anything", "is saved"); @@ -8644,11 +9043,13 @@ OCIO_ADD_TEST(FileFormatCTF, bake_3d) const std::string expectedCLF{ R"( - + OpenColorIO Test Line 1 OpenColorIO Test Line 2 - Input descriptor - Output descriptor + Input descriptor 1 + Input descriptor 2 + Output descriptor 1 + Output descriptor 2 is saved is also saved @@ -8726,7 +9127,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_3d) OCIO::CachedFileRcPtr file = tester.read(output, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto shaperLut = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(shaperLut); @@ -8776,7 +9177,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_3d) const std::string expectedCLF{ R"( - + -0.125 1.125 diff --git a/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp b/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp index c5ec9c2e9e..f04d3155a8 100644 --- a/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp +++ b/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp @@ -47,58 +47,114 @@ OCIO_ADD_TEST(CTFVersion, read_version) OCIO::CTFVersion versionRead; { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.2.3", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.2.3")); const OCIO::CTFVersion version(1, 2, 3); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.2", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.2")); const OCIO::CTFVersion version(1, 2, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1")); const OCIO::CTFVersion version(1, 0, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.10", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.10")); const OCIO::CTFVersion version(1, 10, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.1.0", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.1.0")); const OCIO::CTFVersion version(1, 1, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.01", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.01")); const OCIO::CTFVersion version(1, 1, 0); OCIO_CHECK_EQUAL(version, versionRead); } - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("", versionRead), + { + // Numeric format is always accepted. + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("2.0.0", OCIO::CTFVersion::VERSION_SMPTE_CLF)); + const OCIO::CTFVersion version(2, 0, 0); + OCIO_CHECK_EQUAL(version, versionRead); + } + + { + // Short SMPTE should be accepted only when the format is allowed. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "ST2136-1:2024"), + OCIO::Exception, + "is not a valid version. Expecting MAJOR[.MINOR[.REVISION]]"); + } + + { + // Long SMPTE should be accepted only when the format is allowed. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "http://www.smpte-ra.org/ns/2136-1/2024"), + OCIO::Exception, + "is not a valid version. Expecting MAJOR[.MINOR[.REVISION]]"); + } + + { + // SMPTE version is regarded as v3.0.0. + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion( + "ST2136-1:2024", OCIO::CTFVersion::VERSION_SMPTE_CLF)); + const OCIO::CTFVersion version(3, 0, 0); + OCIO_CHECK_EQUAL(version, versionRead); + } + + { + // Short SMPTE string is not allowed when only the long format is accepted. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "ST2136-1:2024", OCIO::CTFVersion::VERSION_SMPTE_XMLNS), + OCIO::Exception, + "is not a valid version. Expecting 'http://www.smpte-ra.org/ns/2136-1/2024' or MAJOR[.MINOR[.REVISION]]"); + } + + { + // Long SMPTE should be accepted only when the format is allowed and + // should be regarded as v3.0.0. + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion( + "http://www.smpte-ra.org/ns/2136-1/2024", OCIO::CTFVersion::VERSION_SMPTE_XMLNS)); + const OCIO::CTFVersion version(3, 0, 0); + OCIO_CHECK_EQUAL(version, versionRead); + } + + { + // Long SMPTE string is not allowed when only the short format is accepted. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "http://www.smpte-ra.org/ns/2136-1/2024", OCIO::CTFVersion::VERSION_SMPTE_CLF), + OCIO::Exception, + "is not a valid version. Expecting 'ST2136-1:2024' or MAJOR[.MINOR[.REVISION]]"); + } + + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion(""), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1 2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1 2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1-2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1-2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("a", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("a"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1.", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1."), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion(".2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion(".2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1.0 2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1.0 2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("-1", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("-1"), OCIO::Exception, "is not a valid version"); } @@ -141,13 +197,32 @@ OCIO_ADD_TEST(CTFVersion, version_write) ostream << version; OCIO_CHECK_EQUAL(ostream.str(), "0"); } + { + const OCIO::CTFVersion version( + "ST2136-1:2024", + OCIO::CTFVersion::VERSION_SMPTE_CLF); + std::ostringstream ostream; + ostream << version; + OCIO_CHECK_EQUAL(ostream.str(), "ST2136-1:2024"); + } + { + const OCIO::CTFVersion version( + "http://www.smpte-ra.org/ns/2136-1/2024", + OCIO::CTFVersion::VERSION_SMPTE_XMLNS); + std::ostringstream ostream; + ostream << version; + OCIO_CHECK_EQUAL(ostream.str(), "http://www.smpte-ra.org/ns/2136-1/2024"); + } + } OCIO_ADD_TEST(CTFReaderTransform, accessors) { OCIO::CTFReaderTransform t; + OCIO::FormatMetadataImpl & meta = t.getInfoMetadata(); { const OCIO::CTFReaderTransform & ct = t; + const OCIO::FormatMetadataImpl & cmeta = t.getInfoMetadata(); OCIO::FormatMetadataImpl & info = t.getInfoMetadata(); const OCIO::FormatMetadataImpl & cinfo = t.getInfoMetadata(); @@ -159,53 +234,61 @@ OCIO_ADD_TEST(CTFReaderTransform, accessors) OCIO_CHECK_EQUAL(ct.getID(), ""); OCIO_CHECK_EQUAL(t.getName(), ""); OCIO_CHECK_EQUAL(ct.getName(), ""); - OCIO_CHECK_EQUAL(t.getInverseOfId(), ""); - OCIO_CHECK_EQUAL(ct.getInverseOfId(), ""); - OCIO_CHECK_EQUAL(t.getInputDescriptor(), ""); - OCIO_CHECK_EQUAL(ct.getInputDescriptor(), ""); - OCIO_CHECK_EQUAL(t.getOutputDescriptor(), ""); - OCIO_CHECK_EQUAL(ct.getOutputDescriptor(), ""); + OCIO_CHECK_EQUAL_STR(meta.getAttributeValue("inverseOf"), ""); + OCIO_CHECK_EQUAL_STR(cmeta.getAttributeValue("inverseOf"), ""); - OCIO_CHECK_ASSERT(t.getOps().empty()); - OCIO_CHECK_ASSERT(ct.getOps().empty()); + OCIO_CHECK_ASSERT(t.getOpDataVec().empty()); + OCIO_CHECK_ASSERT(ct.getOpDataVec().empty()); - OCIO_CHECK_ASSERT(t.getDescriptions().empty()); - OCIO_CHECK_ASSERT(ct.getDescriptions().empty()); + OCIO_REQUIRE_EQUAL(meta.getNumChildrenElements(), 0); + OCIO_REQUIRE_EQUAL(cmeta.getNumChildrenElements(), 0); } t.setName("Name"); t.setID("123"); - t.setInverseOfId("654"); - t.setInputDescriptor("input"); - t.setOutputDescriptor("output"); + meta.addAttribute(OCIO::ATTR_INVERSE_OF, "654"); + meta.addChildElement(OCIO::METADATA_ID_ELEMENT, "urn:uuid:123e4567-e89b-12d3-a456-426655440000"); auto matrixOp = std::make_shared(); - t.getOps().push_back(matrixOp); + t.getOpDataVec().push_back(matrixOp); - t.getDescriptions().push_back("One"); - t.getDescriptions().push_back("Two"); + meta.addChildElement(OCIO::METADATA_DESCRIPTION, "One"); + meta.addChildElement(OCIO::METADATA_DESCRIPTION, "Two"); + meta.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "input 1"); + meta.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "input 2"); + meta.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "output 1"); + meta.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "output 2"); + auto & outDesc2 = meta.getChildElement(meta.getNumChildrenElements()-1); + outDesc2.addAttribute(OCIO::ATTR_LANGUAGE, "tr"); { const OCIO::CTFReaderTransform & ct = t; + const OCIO::FormatMetadataImpl & cmeta = t.getInfoMetadata(); OCIO_CHECK_EQUAL(t.getID(), "123"); OCIO_CHECK_EQUAL(ct.getID(), "123"); OCIO_CHECK_EQUAL(t.getName(), "Name"); OCIO_CHECK_EQUAL(ct.getName(), "Name"); - OCIO_CHECK_EQUAL(t.getInverseOfId(), "654"); - OCIO_CHECK_EQUAL(ct.getInverseOfId(), "654"); - OCIO_CHECK_EQUAL(t.getInputDescriptor(), "input"); - OCIO_CHECK_EQUAL(ct.getInputDescriptor(), "input"); - OCIO_CHECK_EQUAL(t.getOutputDescriptor(), "output"); - OCIO_CHECK_EQUAL(ct.getOutputDescriptor(), "output"); - - OCIO_CHECK_EQUAL(t.getOps().size(), 1); - OCIO_CHECK_EQUAL(ct.getOps().size(), 1); - - OCIO_CHECK_EQUAL(t.getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(ct.getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(t.getDescriptions()[0], "One"); - OCIO_CHECK_EQUAL(ct.getDescriptions()[0], "One"); - OCIO_CHECK_EQUAL(t.getDescriptions()[1], "Two"); - OCIO_CHECK_EQUAL(ct.getDescriptions()[1], "Two"); + OCIO_CHECK_EQUAL_STR(meta.getAttributeValue("inverseOf"), "654"); + OCIO_CHECK_EQUAL_STR(cmeta.getAttributeValue("inverseOf"), "654"); + + OCIO_CHECK_EQUAL(t.getOpDataVec().size(), 1); + OCIO_CHECK_EQUAL(ct.getOpDataVec().size(), 1); + + OCIO_REQUIRE_EQUAL(meta.getNumChildrenElements(), 7); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(0).getElementName(), "Id"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(0).getElementValue(), "urn:uuid:123e4567-e89b-12d3-a456-426655440000"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(1).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(1).getElementValue(), "One"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(2).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(2).getElementValue(), "Two"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(3).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(3).getElementValue(), "input 1"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(4).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(4).getElementValue(), "input 2"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(5).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(5).getElementValue(), "output 1"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(6).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(6).getElementValue(), "output 2"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(6).getAttributeValue("language"), "tr"); } } diff --git a/tests/cpu/ops/reference/ReferenceOpData_tests.cpp b/tests/cpu/ops/reference/ReferenceOpData_tests.cpp index 100650d7c2..96f8402bbc 100644 --- a/tests/cpu/ops/reference/ReferenceOpData_tests.cpp +++ b/tests/cpu/ops/reference/ReferenceOpData_tests.cpp @@ -233,7 +233,7 @@ OCIO_ADD_TEST(Reference, load_nested_resolve_internal) op = ops[2]; OCIO_REQUIRE_ASSERT(op); OCIO_REQUIRE_ASSERT(GetFilePath(path, op)); - OCIO_CHECK_NE(path.find("matrix_example.clf"), std::string::npos); + OCIO_CHECK_NE(path.find("matrix_example_utf8.clf"), std::string::npos); op = ops[3]; OCIO_REQUIRE_ASSERT(op); diff --git a/tests/cpu/transforms/FileTransform_tests.cpp b/tests/cpu/transforms/FileTransform_tests.cpp index 9b78b9c50f..101358f29a 100644 --- a/tests/cpu/transforms/FileTransform_tests.cpp +++ b/tests/cpu/transforms/FileTransform_tests.cpp @@ -80,7 +80,7 @@ OCIO_ADD_TEST(FileTransform, load_file_ok) OCIO_CHECK_ASSERT(!proc->isNoOp()); // Academy/ASC common LUT format. - const std::string clfMatTransform("clf/matrix_example.clf"); + const std::string clfMatTransform("clf/pre-smpte_only/matrix_example.clf"); OCIO_CHECK_NO_THROW(proc = OCIO::GetFileTransformProcessor(clfMatTransform)); OCIO_CHECK_ASSERT(!proc->isNoOp()); diff --git a/tests/data/files/clf/aces_to_video_with_look.clf b/tests/data/files/clf/aces_to_video_with_look.clf index 4478c03f70..e2c428403e 100644 --- a/tests/data/files/clf/aces_to_video_with_look.clf +++ b/tests/data/files/clf/aces_to_video_with_look.clf @@ -1,5 +1,5 @@ - + Converts ACES to ACEScct, applies ASC CDL, then applies a 3D-LUT to convert back to ACES and apply the RRT+ODT.Academy.Rec709_100nits_dim ACES2065-1 HD (Rec 709) video diff --git a/tests/data/files/clf/bit_depth_identity.clf b/tests/data/files/clf/bit_depth_identity.clf new file mode 100644 index 0000000000..0ee6d7bb7a --- /dev/null +++ b/tests/data/files/clf/bit_depth_identity.clf @@ -0,0 +1,25 @@ + + + urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7 + Identity transform illustrating Array bit depth scaling + Can be loaded by either SMPTE or CLF v3 parsers + + + 257.0 0.0 0.0 + 0.0 257.0 0.0 + 0.0 0.0 257.0 + + + + + 0.0 10922.5 21845.0 32767.5 43690.0 54612.5 65535.0 + + + + + 1.0 0.0 0.0 + 0.0 1.0 0.0 + 0.0 0.0 1.0 + + + diff --git a/tests/data/files/clf/cdl_all_styles.clf b/tests/data/files/clf/cdl_all_styles.clf index 53e1f428bb..75fb4d9d80 100644 --- a/tests/data/files/clf/cdl_all_styles.clf +++ b/tests/data/files/clf/cdl_all_styles.clf @@ -1,5 +1,5 @@ - + Test all CDL style values diff --git a/tests/data/files/clf/cdl_clamp_fwd.clf b/tests/data/files/clf/cdl_clamp_fwd.clf index 3a298fa13e..633d84346e 100644 --- a/tests/data/files/clf/cdl_clamp_fwd.clf +++ b/tests/data/files/clf/cdl_clamp_fwd.clf @@ -1,5 +1,5 @@ - + Example of ASC CDL operation inputDesc outputDesc diff --git a/tests/data/files/clf/cdl_missing_sat.clf b/tests/data/files/clf/cdl_missing_sat.clf index 40fa7f8851..f44958c6be 100644 --- a/tests/data/files/clf/cdl_missing_sat.clf +++ b/tests/data/files/clf/cdl_missing_sat.clf @@ -1,5 +1,5 @@ - + Missing Sat defaults to 1 ASC CDL operation diff --git a/tests/data/files/clf/cdl_missing_sop.clf b/tests/data/files/clf/cdl_missing_sop.clf index 99ab40eb4c..3a35b2f1ca 100644 --- a/tests/data/files/clf/cdl_missing_sop.clf +++ b/tests/data/files/clf/cdl_missing_sop.clf @@ -1,5 +1,5 @@ - + Missing SOP defaults to identity params inputDesc outputDesc diff --git a/tests/data/files/clf/cdl_missing_style.clf b/tests/data/files/clf/cdl_missing_style.clf index 2c407b929d..a4b76ef97f 100644 --- a/tests/data/files/clf/cdl_missing_style.clf +++ b/tests/data/files/clf/cdl_missing_style.clf @@ -1,5 +1,5 @@ - + Missing style defaults to "Fwd" diff --git a/tests/data/files/clf/difficult_syntax.clf b/tests/data/files/clf/difficult_syntax.clf index 4a48375b9f..9e16a0170b 100644 --- a/tests/data/files/clf/difficult_syntax.clf +++ b/tests/data/files/clf/difficult_syntax.clf @@ -5,7 +5,11 @@ - + + + This is the ProcessList description. + yet 'another' "valid" desc + This is a "difficult" but 'legal' color transform file. @@ -20,7 +24,7 @@ third array dim value is ignored - + 3.24000 -1.53700 -0.49850 -0.96930 1.87600 +0.04156 0.05560 -0.20400 0.105730e+1 @@ -29,12 +33,19 @@ third array dim value is ignored - This is the ProcessList description. - + name' unknown="attr"> the n–dash description + + another valid +description +element + + + + & another <valid> desc + @@ -168,16 +179,8 @@ only tabs used to separate next few triplets 1.00000 0.95000 0.90000 - another valid -description -element - - - - & another <valid> desc - yet 'another' "valid" desc diff --git a/tests/data/files/clf/exponent_all_styles.clf b/tests/data/files/clf/exponent_all_styles.clf index 157df5e411..a7a3392ca2 100644 --- a/tests/data/files/clf/exponent_all_styles.clf +++ b/tests/data/files/clf/exponent_all_styles.clf @@ -1,5 +1,5 @@ - + Test all Exponent style values If there is only one Params, use it for R, G, and B. diff --git a/tests/data/files/clf/illegal/array_bad_dimension.clf b/tests/data/files/clf/illegal/array_bad_dimension.clf index 918b1720c4..03305c37cf 100644 --- a/tests/data/files/clf/illegal/array_bad_dimension.clf +++ b/tests/data/files/clf/illegal/array_bad_dimension.clf @@ -1,5 +1,5 @@ - + Array dim attribute is not legal. diff --git a/tests/data/files/clf/illegal/array_bad_value.clf b/tests/data/files/clf/illegal/array_bad_value.clf index 28f607b9d2..7cfab661de 100644 --- a/tests/data/files/clf/illegal/array_bad_value.clf +++ b/tests/data/files/clf/illegal/array_bad_value.clf @@ -1,5 +1,5 @@ - + Array has a non-numeric character diff --git a/tests/data/files/clf/illegal/array_missing_values.clf b/tests/data/files/clf/illegal/array_missing_values.clf index fafd66361e..20d0e1b110 100644 --- a/tests/data/files/clf/illegal/array_missing_values.clf +++ b/tests/data/files/clf/illegal/array_missing_values.clf @@ -1,5 +1,5 @@ - + Matrix has too few values. diff --git a/tests/data/files/clf/illegal/array_too_many_values.clf b/tests/data/files/clf/illegal/array_too_many_values.clf index 49957befdc..972c2d0ca8 100644 --- a/tests/data/files/clf/illegal/array_too_many_values.clf +++ b/tests/data/files/clf/illegal/array_too_many_values.clf @@ -1,5 +1,5 @@ - + Matrix has too many values. diff --git a/tests/data/files/clf/illegal/cdl_bad_power.clf b/tests/data/files/clf/illegal/cdl_bad_power.clf index e39c8a611f..fc4715c16c 100644 --- a/tests/data/files/clf/illegal/cdl_bad_power.clf +++ b/tests/data/files/clf/illegal/cdl_bad_power.clf @@ -1,5 +1,5 @@ - + CDL power must be > 0 diff --git a/tests/data/files/clf/illegal/cdl_bad_sat.clf b/tests/data/files/clf/illegal/cdl_bad_sat.clf index bca68a6813..06a5ea1453 100644 --- a/tests/data/files/clf/illegal/cdl_bad_sat.clf +++ b/tests/data/files/clf/illegal/cdl_bad_sat.clf @@ -1,5 +1,5 @@ - + Sat may only have 1 value. diff --git a/tests/data/files/clf/illegal/cdl_bad_slope.clf b/tests/data/files/clf/illegal/cdl_bad_slope.clf index b267e9cf45..582299ec32 100644 --- a/tests/data/files/clf/illegal/cdl_bad_slope.clf +++ b/tests/data/files/clf/illegal/cdl_bad_slope.clf @@ -1,5 +1,5 @@ - + Slope must have 3 values. diff --git a/tests/data/files/clf/illegal/cdl_bad_style.clf b/tests/data/files/clf/illegal/cdl_bad_style.clf index 40dc6420b9..6d62bc44ee 100644 --- a/tests/data/files/clf/illegal/cdl_bad_style.clf +++ b/tests/data/files/clf/illegal/cdl_bad_style.clf @@ -1,5 +1,5 @@ - + CDL style is not a legal value diff --git a/tests/data/files/clf/illegal/cdl_missing_offset.clf b/tests/data/files/clf/illegal/cdl_missing_offset.clf index 0ee0dbf2f8..3a4024cd69 100644 --- a/tests/data/files/clf/illegal/cdl_missing_offset.clf +++ b/tests/data/files/clf/illegal/cdl_missing_offset.clf @@ -1,5 +1,5 @@ - + The SOPNode is optional, but if present, must contain Slope, Offset, and Power diff --git a/tests/data/files/clf/illegal/cdl_missing_power.clf b/tests/data/files/clf/illegal/cdl_missing_power.clf index a759f90576..ca3f66cad7 100644 --- a/tests/data/files/clf/illegal/cdl_missing_power.clf +++ b/tests/data/files/clf/illegal/cdl_missing_power.clf @@ -1,5 +1,5 @@ - + The SOPNode is optional, but if present, must contain Slope, Offset, and Power diff --git a/tests/data/files/clf/illegal/cdl_missing_slope.clf b/tests/data/files/clf/illegal/cdl_missing_slope.clf index efd3e9d274..ded6bf15a5 100644 --- a/tests/data/files/clf/illegal/cdl_missing_slope.clf +++ b/tests/data/files/clf/illegal/cdl_missing_slope.clf @@ -1,5 +1,5 @@ - + The SOPNode is optional, but if present, must contain Slope, Offset, and Power diff --git a/tests/data/files/clf/illegal/exponent_bad_param.clf b/tests/data/files/clf/illegal/exponent_bad_param.clf index 5e3094f70c..8d48ba2683 100644 --- a/tests/data/files/clf/illegal/exponent_bad_param.clf +++ b/tests/data/files/clf/illegal/exponent_bad_param.clf @@ -1,5 +1,5 @@ - + The basic styles may not use the offset param diff --git a/tests/data/files/clf/illegal/exponent_bad_value.clf b/tests/data/files/clf/illegal/exponent_bad_value.clf index 2a358d5313..2d4e8ec295 100644 --- a/tests/data/files/clf/illegal/exponent_bad_value.clf +++ b/tests/data/files/clf/illegal/exponent_bad_value.clf @@ -1,5 +1,5 @@ - + The moncurve style requires an exponent >= 1. diff --git a/tests/data/files/clf/illegal/indexMap_test2.clf b/tests/data/files/clf/illegal/indexMap_test2.clf index 498ac6454e..d0b2a10b0f 100644 --- a/tests/data/files/clf/illegal/indexMap_test2.clf +++ b/tests/data/files/clf/illegal/indexMap_test2.clf @@ -1,5 +1,5 @@ - + Index map was only allowed up to CLF v2 diff --git a/tests/data/files/clf/illegal/log_bad_param.clf b/tests/data/files/clf/illegal/log_bad_param.clf index db03820476..880fa5c723 100644 --- a/tests/data/files/clf/illegal/log_bad_param.clf +++ b/tests/data/files/clf/illegal/log_bad_param.clf @@ -1,5 +1,5 @@ - + The linToLog style may not contain the linSideBreak param. diff --git a/tests/data/files/clf/illegal/log_bad_style.clf b/tests/data/files/clf/illegal/log_bad_style.clf index dbc1ac9319..0e1b491b4d 100644 --- a/tests/data/files/clf/illegal/log_bad_style.clf +++ b/tests/data/files/clf/illegal/log_bad_style.clf @@ -1,5 +1,5 @@ - + Illegal log style value. diff --git a/tests/data/files/clf/illegal/log_missing_breakpnt.clf b/tests/data/files/clf/illegal/log_missing_breakpnt.clf index 4282f23df7..1d5e478556 100644 --- a/tests/data/files/clf/illegal/log_missing_breakpnt.clf +++ b/tests/data/files/clf/illegal/log_missing_breakpnt.clf @@ -1,5 +1,5 @@ - + The camera styles must have the linSideBreak param. - + Half-domain must have 65536 values. RGB RGB diff --git a/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf b/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf index fca07d882f..d9e650d90f 100644 --- a/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf +++ b/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf @@ -1,5 +1,5 @@ - + The only legal value for halfDomain is "true". RGB RGB diff --git a/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf b/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf index 94daa1e6f9..3ea1d67594 100644 --- a/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf +++ b/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf @@ -1,5 +1,5 @@ - + The only legal value for rawHhalfs is "true". RGB RGB diff --git a/tests/data/files/clf/illegal/lut3d_unequal_size.clf b/tests/data/files/clf/illegal/lut3d_unequal_size.clf index 1be11cfab9..3c4c11361e 100644 --- a/tests/data/files/clf/illegal/lut3d_unequal_size.clf +++ b/tests/data/files/clf/illegal/lut3d_unequal_size.clf @@ -1,5 +1,5 @@ - + Lut3d must have equal grid dimensions diff --git a/tests/data/files/clf/illegal/matrix_end_missing.clf b/tests/data/files/clf/illegal/matrix_end_missing.clf index b00cddd8cd..1c19332dc0 100644 --- a/tests/data/files/clf/illegal/matrix_end_missing.clf +++ b/tests/data/files/clf/illegal/matrix_end_missing.clf @@ -1,5 +1,5 @@ - + The Matrix element is not complete. diff --git a/tests/data/files/clf/illegal/process_list_missing.clf b/tests/data/files/clf/illegal/process_list_missing.clf index 0dbe66c238..10e25f4e93 100644 --- a/tests/data/files/clf/illegal/process_list_missing.clf +++ b/tests/data/files/clf/illegal/process_list_missing.clf @@ -1,4 +1,4 @@ - + Missing ProcesssList element 3.24000 -1.53700 -0.49850 diff --git a/tests/data/files/clf/illegal/range_bad_noclamp.clf b/tests/data/files/clf/illegal/range_bad_noclamp.clf index 3751a6bfb6..977f996977 100644 --- a/tests/data/files/clf/illegal/range_bad_noclamp.clf +++ b/tests/data/files/clf/illegal/range_bad_noclamp.clf @@ -1,8 +1,8 @@ - + The noClamp style may not be used when there are only two values. - 0.1 1e-1 + 0.1 diff --git a/tests/data/files/clf/illegal/range_bad_values.clf b/tests/data/files/clf/illegal/range_bad_values.clf index 8987272907..6a2416dc87 100644 --- a/tests/data/files/clf/illegal/range_bad_values.clf +++ b/tests/data/files/clf/illegal/range_bad_values.clf @@ -1,5 +1,5 @@ - + Illegal values -- the minInValue must be less than the maxInValue. 240 diff --git a/tests/data/files/clf/illegal/range_empty.clf b/tests/data/files/clf/illegal/range_empty.clf index f4bb850cfa..904436b8a2 100644 --- a/tests/data/files/clf/illegal/range_empty.clf +++ b/tests/data/files/clf/illegal/range_empty.clf @@ -1,5 +1,5 @@ - + Starting in CLF v3, a Range may not be empty diff --git a/tests/data/files/clf/illegal/range_nonmatching_clamp.clf b/tests/data/files/clf/illegal/range_nonmatching_clamp.clf index b8fee78a67..5c2a9b3c8a 100644 --- a/tests/data/files/clf/illegal/range_nonmatching_clamp.clf +++ b/tests/data/files/clf/illegal/range_nonmatching_clamp.clf @@ -1,5 +1,5 @@ - + If there is only a min or only a max, the InValue must equal OutValue. Since the bit-depths are different, they are not actually the same here. diff --git a/tests/data/files/clf/illegal/transform_bad_outdepth.clf b/tests/data/files/clf/illegal/transform_bad_outdepth.clf index 8d65b6db95..27ec7b4337 100644 --- a/tests/data/files/clf/illegal/transform_bad_outdepth.clf +++ b/tests/data/files/clf/illegal/transform_bad_outdepth.clf @@ -1,5 +1,5 @@ - + The outBitDepth is illegal diff --git a/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf b/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf index 1153df6a4e..ca5892b92c 100644 --- a/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf +++ b/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf @@ -1,14 +1,14 @@ - + All bit-depths in a file must match at adjacent ops - + 3.24000 -1.53700 -0.49850 -0.96930 1.87600 0.04156 0.05560 -0.20400 1.05730 - Note in-depth does not == out-depth of previous + Note in-depth does not == out-depth of previous 0.00000 0.00000 1e-2 0.28358 0.28358 1e+2 diff --git a/tests/data/files/clf/illegal/transform_corrupted_tag.clf b/tests/data/files/clf/illegal/transform_corrupted_tag.clf index 1f82247b18..11d606530f 100644 --- a/tests/data/files/clf/illegal/transform_corrupted_tag.clf +++ b/tests/data/files/clf/illegal/transform_corrupted_tag.clf @@ -1,6 +1,7 @@ - + Note closing element is bad + ProcessList is not spelled correctly 3.24000 -1.53700 -0.49850 @@ -8,5 +9,4 @@ 0.05560 -0.20400 1.05730 - ProcessList is not spelled correctly diff --git a/tests/data/files/clf/illegal/transform_element_end_missing.clf b/tests/data/files/clf/illegal/transform_element_end_missing.clf index 136c8453cb..c7464ce1cc 100644 --- a/tests/data/files/clf/illegal/transform_element_end_missing.clf +++ b/tests/data/files/clf/illegal/transform_element_end_missing.clf @@ -1,6 +1,7 @@ - + ProcessList must have an end tag + Note closing element is missing 3.24000 -1.53700 -0.49850 @@ -8,4 +9,3 @@ 0.05560 -0.20400 1.05730 - Note closing element is missing diff --git a/tests/data/files/clf/illegal/transform_empty.clf b/tests/data/files/clf/illegal/transform_empty.clf index b07de5aa5b..2d12809949 100644 --- a/tests/data/files/clf/illegal/transform_empty.clf +++ b/tests/data/files/clf/illegal/transform_empty.clf @@ -1,4 +1,4 @@ - - There must be at least on process node + + There must be at least one process node diff --git a/tests/data/files/clf/illegal/transform_id_empty.clf b/tests/data/files/clf/illegal/transform_id_empty.clf deleted file mode 100644 index bda57d36ef..0000000000 --- a/tests/data/files/clf/illegal/transform_id_empty.clf +++ /dev/null @@ -1,5 +0,0 @@ - - - The id string must not be empty - - diff --git a/tests/data/files/clf/illegal/transform_missing_id.clf b/tests/data/files/clf/illegal/transform_missing_id.clf deleted file mode 100644 index a72ed5577b..0000000000 --- a/tests/data/files/clf/illegal/transform_missing_id.clf +++ /dev/null @@ -1,5 +0,0 @@ - - - The ProcessList id attribute is missing - - diff --git a/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf b/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf index 011ff246d7..94fa26d73c 100644 --- a/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf +++ b/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf @@ -1,5 +1,5 @@ - + The inBitDepth is missing diff --git a/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf b/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf index 26d7cd176d..fdc4dfd7ba 100644 --- a/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf +++ b/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf @@ -1,5 +1,5 @@ - + The outBitDepth is missing diff --git a/tests/data/files/clf/illegal/unknown_elements.clf b/tests/data/files/clf/illegal/unknown_elements.clf index adc9dd3886..000826cfad 100644 --- a/tests/data/files/clf/illegal/unknown_elements.clf +++ b/tests/data/files/clf/illegal/unknown_elements.clf @@ -1,10 +1,10 @@ - + This example contains unknown elements See section 5.4 of the spec: Unrecognized elements that are not children of the Info element should either raise an error or at least provide a warning message - + 3.24000 -1.53700 -0.49850 -0.96930 1.87600 0.04156 0.05560 -0.20400 1.05730 diff --git a/tests/data/files/clf/info_example.clf b/tests/data/files/clf/info_example.clf index c4cf5b602c..f521f15bef 100644 --- a/tests/data/files/clf/info_example.clf +++ b/tests/data/files/clf/info_example.clf @@ -1,9 +1,9 @@ - + Example of using the Info element + A second description input desc output desc - A second description diff --git a/tests/data/files/clf/inverseOf_id_test.clf b/tests/data/files/clf/inverseOf_id_test.clf index 31752d8aaa..dd27a8828b 100644 --- a/tests/data/files/clf/inverseOf_id_test.clf +++ b/tests/data/files/clf/inverseOf_id_test.clf @@ -1,5 +1,5 @@ - + The inverseOf attribute is used to identify inverse pairs RGB RGB diff --git a/tests/data/files/clf/log_all_styles.clf b/tests/data/files/clf/log_all_styles.clf index df9f7eb44d..ca80d2c3bd 100644 --- a/tests/data/files/clf/log_all_styles.clf +++ b/tests/data/files/clf/log_all_styles.clf @@ -1,5 +1,5 @@ - + Test all Logarithmic style values diff --git a/tests/data/files/clf/lut1d_32f_example.clf b/tests/data/files/clf/lut1d_32f_example.clf index c8c97728ce..bffd267de2 100644 --- a/tests/data/files/clf/lut1d_32f_example.clf +++ b/tests/data/files/clf/lut1d_32f_example.clf @@ -1,5 +1,5 @@ - + Basic Lut1D example, formula: 1.25 - 1.5 * x^2.2 1D LUT diff --git a/tests/data/files/clf/lut1d_comp.clf b/tests/data/files/clf/lut1d_comp.clf index 41fc81de11..91d31f516e 100644 --- a/tests/data/files/clf/lut1d_comp.clf +++ b/tests/data/files/clf/lut1d_comp.clf @@ -1,5 +1,5 @@ - + Two Lut1D ops Linear spacing between 64 and 196 diff --git a/tests/data/files/clf/lut1d_example.clf b/tests/data/files/clf/lut1d_example.clf index ebd7677407..a6e54f9c27 100644 --- a/tests/data/files/clf/lut1d_example.clf +++ b/tests/data/files/clf/lut1d_example.clf @@ -1,5 +1,5 @@ - + 1D LUT with legal out of range values Note that the bit-depth does not constrain the legal range of values. diff --git a/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf b/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf index f6a35d0189..288eaa61fd 100644 --- a/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf +++ b/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf @@ -1,10 +1,10 @@ - + + Lut1D testing half-domain layout and raw-halfs value encoding + Function is sign(x)*(abs(x)^0.45) - 0.1 None - Lut1D testing half-domain layout and raw-halfs value encoding - Function is sign(x)*(abs(x)^0.45) - 0.1 44646 diff --git a/tests/data/files/clf/lut1d_long.clf b/tests/data/files/clf/lut1d_long.clf index f0c5f7ee21..3f5bcf254f 100644 --- a/tests/data/files/clf/lut1d_long.clf +++ b/tests/data/files/clf/lut1d_long.clf @@ -1,5 +1,5 @@ - + Very long Lut1D test (x^2.2 * 1.3 - 0.007) Also demonstrates repeating quantized values diff --git a/tests/data/files/clf/lut1d_lut3d_lut1d.clf b/tests/data/files/clf/lut1d_lut3d_lut1d.clf index 43d014dd8f..34bdc0a1de 100644 --- a/tests/data/files/clf/lut1d_lut3d_lut1d.clf +++ b/tests/data/files/clf/lut1d_lut3d_lut1d.clf @@ -1,5 +1,5 @@ - + Lut1D + Lut3D + long Lut1D Tests usage of 1D, 3D, and 2D GPU textures diff --git a/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf b/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf index 3a94ab78fe..bdb8c39fb4 100644 --- a/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf +++ b/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf @@ -1,5 +1,5 @@ - + Basic 3d-LUT example. diff --git a/tests/data/files/clf/lut3d_as_matrix.clf b/tests/data/files/clf/lut3d_as_matrix.clf index f772f72168..967070e225 100644 --- a/tests/data/files/clf/lut3d_as_matrix.clf +++ b/tests/data/files/clf/lut3d_as_matrix.clf @@ -1,5 +1,5 @@ - + This Lut3D is equivalent (on its limited domain) to a matrix multiply from linear ap0 to linear rec 709 ap0 rec 709 diff --git a/tests/data/files/clf/lut3d_bizarre.clf b/tests/data/files/clf/lut3d_bizarre.clf index ef6fc8b045..80de3e54ff 100644 --- a/tests/data/files/clf/lut3d_bizarre.clf +++ b/tests/data/files/clf/lut3d_bizarre.clf @@ -1,5 +1,5 @@ - + Unusual 3d-LUT useful for showing interpolation errors 3d-LUT with extended range values diff --git a/tests/data/files/clf/lut3d_identity_12i_16f.clf b/tests/data/files/clf/lut3d_identity_12i_16f.clf index 463f31dcbd..972fb9775a 100644 --- a/tests/data/files/clf/lut3d_identity_12i_16f.clf +++ b/tests/data/files/clf/lut3d_identity_12i_16f.clf @@ -1,5 +1,5 @@ - + 3D LUT example 3D LUT diff --git a/tests/data/files/clf/lut3d_preview_tier_test.clf b/tests/data/files/clf/lut3d_preview_tier_test.clf index eae5b78a26..2bf09754c4 100644 --- a/tests/data/files/clf/lut3d_preview_tier_test.clf +++ b/tests/data/files/clf/lut3d_preview_tier_test.clf @@ -1,5 +1,5 @@ - + Test LUT for Preview-tier CLF validation test suite ACEScct Rec.1886 / Rec.709 video diff --git a/tests/data/files/clf/matrix_3x4_example.clf b/tests/data/files/clf/matrix_3x4_example.clf index a5f0722a13..1d011f90cc 100644 --- a/tests/data/files/clf/matrix_3x4_example.clf +++ b/tests/data/files/clf/matrix_3x4_example.clf @@ -1,5 +1,5 @@ - + Matrix example Used by unit tests diff --git a/tests/data/files/clf/matrix_example_utf8.clf b/tests/data/files/clf/matrix_example_utf8.clf index 2b5d8348a8..a921d2db23 100644 --- a/tests/data/files/clf/matrix_example_utf8.clf +++ b/tests/data/files/clf/matrix_example_utf8.clf @@ -1,5 +1,5 @@ - + Test utf8 character encoding support. 標準萬國碼 diff --git a/tests/data/files/clf/matrix_no_newlines.clf b/tests/data/files/clf/matrix_no_newlines.clf index 7ed434bee5..f7adde687c 100644 --- a/tests/data/files/clf/matrix_no_newlines.clf +++ b/tests/data/files/clf/matrix_no_newlines.clf @@ -1 +1 @@ -Example with minimal newlinesArray values separated only by tabs3.6 0.1 -0.2 0.3 0.2 3.5 +0.1 -0.05 1E-01 -0.3 0.34e+01 -4e-1 \ No newline at end of file +Example with minimal newlinesArray values separated only by tabs3.6 0.1 -0.2 0.3 0.2 3.5 +0.1 -0.05 1E-01 -0.3 0.34e+01 -4e-1 \ No newline at end of file diff --git a/tests/data/files/clf/matrix_windows.clf b/tests/data/files/clf/matrix_windows.clf index 7e7241610c..5a80b60e6a 100644 --- a/tests/data/files/clf/matrix_windows.clf +++ b/tests/data/files/clf/matrix_windows.clf @@ -1,4 +1,4 @@ - + This file has Windows line-endings. Also, the file does not start with a ?xml header. @@ -8,4 +8,4 @@ 0 0 4095 - \ No newline at end of file + diff --git a/tests/data/files/clf/multiple_ops.clf b/tests/data/files/clf/multiple_ops.clf index 5e0973790d..5ad43d7d01 100644 --- a/tests/data/files/clf/multiple_ops.clf +++ b/tests/data/files/clf/multiple_ops.clf @@ -1,5 +1,5 @@ - + Test with lots of different process nodes scene 1 exterior look diff --git a/tests/data/files/clf/illegal/log_bad_version.clf b/tests/data/files/clf/pre-smpte_only/illegal/log_bad_version.clf similarity index 80% rename from tests/data/files/clf/illegal/log_bad_version.clf rename to tests/data/files/clf/pre-smpte_only/illegal/log_bad_version.clf index 6aea455cd7..d0ad478c1a 100644 --- a/tests/data/files/clf/illegal/log_bad_version.clf +++ b/tests/data/files/clf/pre-smpte_only/illegal/log_bad_version.clf @@ -1,5 +1,5 @@ - + Version is too low to support Log. inputDesc outputDesc diff --git a/tests/data/files/clf/illegal/process_list_bad_version.clf b/tests/data/files/clf/pre-smpte_only/illegal/process_list_bad_version.clf similarity index 82% rename from tests/data/files/clf/illegal/process_list_bad_version.clf rename to tests/data/files/clf/pre-smpte_only/illegal/process_list_bad_version.clf index 11408a1c28..19aca3cd7c 100644 --- a/tests/data/files/clf/illegal/process_list_bad_version.clf +++ b/tests/data/files/clf/pre-smpte_only/illegal/process_list_bad_version.clf @@ -1,6 +1,6 @@ - Not a legal compCLFversion string + Does not contain a legal compCLFversion string. 3.24000 -1.53700 -0.49850 diff --git a/tests/data/files/clf/illegal/process_list_higher_version.clf b/tests/data/files/clf/pre-smpte_only/illegal/process_list_higher_version.clf similarity index 80% rename from tests/data/files/clf/illegal/process_list_higher_version.clf rename to tests/data/files/clf/pre-smpte_only/illegal/process_list_higher_version.clf index 8e1d97bff0..87c398fedb 100644 --- a/tests/data/files/clf/illegal/process_list_higher_version.clf +++ b/tests/data/files/clf/pre-smpte_only/illegal/process_list_higher_version.clf @@ -1,6 +1,6 @@ - Versions higher than current version must be rejected + Versions higher than the supported version must be rejected. 3.24000 -1.53700 -0.49850 diff --git a/tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf b/tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf new file mode 100644 index 0000000000..a3d6e465a3 --- /dev/null +++ b/tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf @@ -0,0 +1,5 @@ + + + The id string must not be empty in v3. + + diff --git a/tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf b/tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf new file mode 100644 index 0000000000..fdf1735321 --- /dev/null +++ b/tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf @@ -0,0 +1,5 @@ + + + The ProcessList id attribute may not be missing in v3. + + diff --git a/tests/data/files/clf/matrix_example.clf b/tests/data/files/clf/pre-smpte_only/matrix_example.clf similarity index 83% rename from tests/data/files/clf/matrix_example.clf rename to tests/data/files/clf/pre-smpte_only/matrix_example.clf index 7d2c833463..04041bdd15 100644 --- a/tests/data/files/clf/matrix_example.clf +++ b/tests/data/files/clf/pre-smpte_only/matrix_example.clf @@ -1,5 +1,5 @@ - + Basic matrix example using CLF v2 dim syntax RGB XYZ diff --git a/tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf b/tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf new file mode 100644 index 0000000000..086bfc86d6 --- /dev/null +++ b/tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf @@ -0,0 +1,11 @@ + + + Uses the v3 namespace. + + + 3.24000 -1.53700 -0.49850 +-0.96930 1.87600 0.04156 + 0.05560 -0.20400 1.05730 + + + diff --git a/tests/data/files/clf/range.clf b/tests/data/files/clf/range.clf index 88c38cdedc..467787dc46 100644 --- a/tests/data/files/clf/range.clf +++ b/tests/data/files/clf/range.clf @@ -1,5 +1,5 @@ - + Basic range example with no style attribute RGB RGB diff --git a/tests/data/files/clf/range_test1_clamp.clf b/tests/data/files/clf/range_test1_clamp.clf index f7e436dee0..ec5f9edbd7 100644 --- a/tests/data/files/clf/range_test1_clamp.clf +++ b/tests/data/files/clf/range_test1_clamp.clf @@ -1,5 +1,5 @@ - + Basic range example 16 diff --git a/tests/data/files/clf/range_test1_noclamp.clf b/tests/data/files/clf/range_test1_noclamp.clf index f5872bd5b3..3e79f25eac 100644 --- a/tests/data/files/clf/range_test1_noclamp.clf +++ b/tests/data/files/clf/range_test1_noclamp.clf @@ -1,5 +1,5 @@ - + Basic range with noClamp style Note that the 8i bit-depth does not constrain the legal range of values diff --git a/tests/data/files/clf/range_test2.clf b/tests/data/files/clf/range_test2.clf index 7ae54b15c9..6a46eb075a 100644 --- a/tests/data/files/clf/range_test2.clf +++ b/tests/data/files/clf/range_test2.clf @@ -1,10 +1,10 @@ - + Range that clamps on the low side - 0.1 1e-1 + 0.1 diff --git a/tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf b/tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf new file mode 100644 index 0000000000..266a53e44b --- /dev/null +++ b/tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf @@ -0,0 +1,35996 @@ + + + + urn:uuid:a8f91bfa-b79f-5d4d-b750-a411c476bb47 + + Demo Advanced LUT with dummy values + Démonstration d'une LUT avancée avec des valeurs factices + Demo Erweiterte LUT mit Dummy-Werten + + ITU-R BT.709 + + Same as Input + Identique à l'entrée + Gleiches wie Eingabe + + + http://www.smpte-ra.org/ns/2136-10/2026#Live_Broadcast_LUT33 + SMPTE_2136-10_Example + OCIO contributors + 1.0 + + ColorPrimaries_ITU709 + TransferCharacteristic_ITU709 + CodingEquations_ITU709 + + + ColorPrimaries_ITU2020 + TransferCharacteristic_SMPTEST2084 + CodingEquations_ITU2100_ICtCp + + sdiClip + Test, Display-light + fake-email@ocio.org + + + + Input Scaling - only used for full-range signals + 0. + 1. + 0.06256109481915934 + 0.91886608015640270 + + + + +0 0 0 +0 0 0.03125 +0 0 0.0625 +0 0 0.09375 +0 0 0.125 +0 0 0.1562 +0 0 0.1875 +0 0 0.2188 +0 0 0.25 +0 0 0.2812 +0 0 0.3125 +0 0 0.3438 +0 0 0.375 +0 0 0.4062 +0 0 0.4375 +0 0 0.4688 +0 0 0.5 +0 0 0.5312 +0 0 0.5625 +0 0 0.5938 +0 0 0.625 +0 0 0.6562 +0 0 0.6875 +0 0 0.7188 +0 0 0.75 +0 0 0.7812 +0 0 0.8125 +0 0 0.8438 +0 0 0.875 +0 0 0.9062 +0 0 0.9375 +0 0 0.9688 +0 0 1 +0 0.03125 0 +0 0.03125 0.03125 +0 0.03125 0.0625 +0 0.03125 0.09375 +0 0.03125 0.125 +0 0.03125 0.1562 +0 0.03125 0.1875 +0 0.03125 0.2188 +0 0.03125 0.25 +0 0.03125 0.2812 +0 0.03125 0.3125 +0 0.03125 0.3438 +0 0.03125 0.375 +0 0.03125 0.4062 +0 0.03125 0.4375 +0 0.03125 0.4688 +0 0.03125 0.5 +0 0.03125 0.5312 +0 0.03125 0.5625 +0 0.03125 0.5938 +0 0.03125 0.625 +0 0.03125 0.6562 +0 0.03125 0.6875 +0 0.03125 0.7188 +0 0.03125 0.75 +0 0.03125 0.7812 +0 0.03125 0.8125 +0 0.03125 0.8438 +0 0.03125 0.875 +0 0.03125 0.9062 +0 0.03125 0.9375 +0 0.03125 0.9688 +0 0.03125 1 +0 0.0625 0 +0 0.0625 0.03125 +0 0.0625 0.0625 +0 0.0625 0.09375 +0 0.0625 0.125 +0 0.0625 0.1562 +0 0.0625 0.1875 +0 0.0625 0.2188 +0 0.0625 0.25 +0 0.0625 0.2812 +0 0.0625 0.3125 +0 0.0625 0.3438 +0 0.0625 0.375 +0 0.0625 0.4062 +0 0.0625 0.4375 +0 0.0625 0.4688 +0 0.0625 0.5 +0 0.0625 0.5312 +0 0.0625 0.5625 +0 0.0625 0.5938 +0 0.0625 0.625 +0 0.0625 0.6562 +0 0.0625 0.6875 +0 0.0625 0.7188 +0 0.0625 0.75 +0 0.0625 0.7812 +0 0.0625 0.8125 +0 0.0625 0.8438 +0 0.0625 0.875 +0 0.0625 0.9062 +0 0.0625 0.9375 +0 0.0625 0.9688 +0 0.0625 1 +0 0.09375 0 +0 0.09375 0.03125 +0 0.09375 0.0625 +0 0.09375 0.09375 +0 0.09375 0.125 +0 0.09375 0.1562 +0 0.09375 0.1875 +0 0.09375 0.2188 +0 0.09375 0.25 +0 0.09375 0.2812 +0 0.09375 0.3125 +0 0.09375 0.3438 +0 0.09375 0.375 +0 0.09375 0.4062 +0 0.09375 0.4375 +0 0.09375 0.4688 +0 0.09375 0.5 +0 0.09375 0.5312 +0 0.09375 0.5625 +0 0.09375 0.5938 +0 0.09375 0.625 +0 0.09375 0.6562 +0 0.09375 0.6875 +0 0.09375 0.7188 +0 0.09375 0.75 +0 0.09375 0.7812 +0 0.09375 0.8125 +0 0.09375 0.8438 +0 0.09375 0.875 +0 0.09375 0.9062 +0 0.09375 0.9375 +0 0.09375 0.9688 +0 0.09375 1 +0 0.125 0 +0 0.125 0.03125 +0 0.125 0.0625 +0 0.125 0.09375 +0 0.125 0.125 +0 0.125 0.1562 +0 0.125 0.1875 +0 0.125 0.2188 +0 0.125 0.25 +0 0.125 0.2812 +0 0.125 0.3125 +0 0.125 0.3438 +0 0.125 0.375 +0 0.125 0.4062 +0 0.125 0.4375 +0 0.125 0.4688 +0 0.125 0.5 +0 0.125 0.5312 +0 0.125 0.5625 +0 0.125 0.5938 +0 0.125 0.625 +0 0.125 0.6562 +0 0.125 0.6875 +0 0.125 0.7188 +0 0.125 0.75 +0 0.125 0.7812 +0 0.125 0.8125 +0 0.125 0.8438 +0 0.125 0.875 +0 0.125 0.9062 +0 0.125 0.9375 +0 0.125 0.9688 +0 0.125 1 +0 0.1562 0 +0 0.1562 0.03125 +0 0.1562 0.0625 +0 0.1562 0.09375 +0 0.1562 0.125 +0 0.1562 0.1562 +0 0.1562 0.1875 +0 0.1562 0.2188 +0 0.1562 0.25 +0 0.1562 0.2812 +0 0.1562 0.3125 +0 0.1562 0.3438 +0 0.1562 0.375 +0 0.1562 0.4062 +0 0.1562 0.4375 +0 0.1562 0.4688 +0 0.1562 0.5 +0 0.1562 0.5312 +0 0.1562 0.5625 +0 0.1562 0.5938 +0 0.1562 0.625 +0 0.1562 0.6562 +0 0.1562 0.6875 +0 0.1562 0.7188 +0 0.1562 0.75 +0 0.1562 0.7812 +0 0.1562 0.8125 +0 0.1562 0.8438 +0 0.1562 0.875 +0 0.1562 0.9062 +0 0.1562 0.9375 +0 0.1562 0.9688 +0 0.1562 1 +0 0.1875 0 +0 0.1875 0.03125 +0 0.1875 0.0625 +0 0.1875 0.09375 +0 0.1875 0.125 +0 0.1875 0.1562 +0 0.1875 0.1875 +0 0.1875 0.2188 +0 0.1875 0.25 +0 0.1875 0.2812 +0 0.1875 0.3125 +0 0.1875 0.3438 +0 0.1875 0.375 +0 0.1875 0.4062 +0 0.1875 0.4375 +0 0.1875 0.4688 +0 0.1875 0.5 +0 0.1875 0.5312 +0 0.1875 0.5625 +0 0.1875 0.5938 +0 0.1875 0.625 +0 0.1875 0.6562 +0 0.1875 0.6875 +0 0.1875 0.7188 +0 0.1875 0.75 +0 0.1875 0.7812 +0 0.1875 0.8125 +0 0.1875 0.8438 +0 0.1875 0.875 +0 0.1875 0.9062 +0 0.1875 0.9375 +0 0.1875 0.9688 +0 0.1875 1 +0 0.2188 0 +0 0.2188 0.03125 +0 0.2188 0.0625 +0 0.2188 0.09375 +0 0.2188 0.125 +0 0.2188 0.1562 +0 0.2188 0.1875 +0 0.2188 0.2188 +0 0.2188 0.25 +0 0.2188 0.2812 +0 0.2188 0.3125 +0 0.2188 0.3438 +0 0.2188 0.375 +0 0.2188 0.4062 +0 0.2188 0.4375 +0 0.2188 0.4688 +0 0.2188 0.5 +0 0.2188 0.5312 +0 0.2188 0.5625 +0 0.2188 0.5938 +0 0.2188 0.625 +0 0.2188 0.6562 +0 0.2188 0.6875 +0 0.2188 0.7188 +0 0.2188 0.75 +0 0.2188 0.7812 +0 0.2188 0.8125 +0 0.2188 0.8438 +0 0.2188 0.875 +0 0.2188 0.9062 +0 0.2188 0.9375 +0 0.2188 0.9688 +0 0.2188 1 +0 0.25 0 +0 0.25 0.03125 +0 0.25 0.0625 +0 0.25 0.09375 +0 0.25 0.125 +0 0.25 0.1562 +0 0.25 0.1875 +0 0.25 0.2188 +0 0.25 0.25 +0 0.25 0.2812 +0 0.25 0.3125 +0 0.25 0.3438 +0 0.25 0.375 +0 0.25 0.4062 +0 0.25 0.4375 +0 0.25 0.4688 +0 0.25 0.5 +0 0.25 0.5312 +0 0.25 0.5625 +0 0.25 0.5938 +0 0.25 0.625 +0 0.25 0.6562 +0 0.25 0.6875 +0 0.25 0.7188 +0 0.25 0.75 +0 0.25 0.7812 +0 0.25 0.8125 +0 0.25 0.8438 +0 0.25 0.875 +0 0.25 0.9062 +0 0.25 0.9375 +0 0.25 0.9688 +0 0.25 1 +0 0.2812 0 +0 0.2812 0.03125 +0 0.2812 0.0625 +0 0.2812 0.09375 +0 0.2812 0.125 +0 0.2812 0.1562 +0 0.2812 0.1875 +0 0.2812 0.2188 +0 0.2812 0.25 +0 0.2812 0.2812 +0 0.2812 0.3125 +0 0.2812 0.3438 +0 0.2812 0.375 +0 0.2812 0.4062 +0 0.2812 0.4375 +0 0.2812 0.4688 +0 0.2812 0.5 +0 0.2812 0.5312 +0 0.2812 0.5625 +0 0.2812 0.5938 +0 0.2812 0.625 +0 0.2812 0.6562 +0 0.2812 0.6875 +0 0.2812 0.7188 +0 0.2812 0.75 +0 0.2812 0.7812 +0 0.2812 0.8125 +0 0.2812 0.8438 +0 0.2812 0.875 +0 0.2812 0.9062 +0 0.2812 0.9375 +0 0.2812 0.9688 +0 0.2812 1 +0 0.3125 0 +0 0.3125 0.03125 +0 0.3125 0.0625 +0 0.3125 0.09375 +0 0.3125 0.125 +0 0.3125 0.1562 +0 0.3125 0.1875 +0 0.3125 0.2188 +0 0.3125 0.25 +0 0.3125 0.2812 +0 0.3125 0.3125 +0 0.3125 0.3438 +0 0.3125 0.375 +0 0.3125 0.4062 +0 0.3125 0.4375 +0 0.3125 0.4688 +0 0.3125 0.5 +0 0.3125 0.5312 +0 0.3125 0.5625 +0 0.3125 0.5938 +0 0.3125 0.625 +0 0.3125 0.6562 +0 0.3125 0.6875 +0 0.3125 0.7188 +0 0.3125 0.75 +0 0.3125 0.7812 +0 0.3125 0.8125 +0 0.3125 0.8438 +0 0.3125 0.875 +0 0.3125 0.9062 +0 0.3125 0.9375 +0 0.3125 0.9688 +0 0.3125 1 +0 0.3438 0 +0 0.3438 0.03125 +0 0.3438 0.0625 +0 0.3438 0.09375 +0 0.3438 0.125 +0 0.3438 0.1562 +0 0.3438 0.1875 +0 0.3438 0.2188 +0 0.3438 0.25 +0 0.3438 0.2812 +0 0.3438 0.3125 +0 0.3438 0.3438 +0 0.3438 0.375 +0 0.3438 0.4062 +0 0.3438 0.4375 +0 0.3438 0.4688 +0 0.3438 0.5 +0 0.3438 0.5312 +0 0.3438 0.5625 +0 0.3438 0.5938 +0 0.3438 0.625 +0 0.3438 0.6562 +0 0.3438 0.6875 +0 0.3438 0.7188 +0 0.3438 0.75 +0 0.3438 0.7812 +0 0.3438 0.8125 +0 0.3438 0.8438 +0 0.3438 0.875 +0 0.3438 0.9062 +0 0.3438 0.9375 +0 0.3438 0.9688 +0 0.3438 1 +0 0.375 0 +0 0.375 0.03125 +0 0.375 0.0625 +0 0.375 0.09375 +0 0.375 0.125 +0 0.375 0.1562 +0 0.375 0.1875 +0 0.375 0.2188 +0 0.375 0.25 +0 0.375 0.2812 +0 0.375 0.3125 +0 0.375 0.3438 +0 0.375 0.375 +0 0.375 0.4062 +0 0.375 0.4375 +0 0.375 0.4688 +0 0.375 0.5 +0 0.375 0.5312 +0 0.375 0.5625 +0 0.375 0.5938 +0 0.375 0.625 +0 0.375 0.6562 +0 0.375 0.6875 +0 0.375 0.7188 +0 0.375 0.75 +0 0.375 0.7812 +0 0.375 0.8125 +0 0.375 0.8438 +0 0.375 0.875 +0 0.375 0.9062 +0 0.375 0.9375 +0 0.375 0.9688 +0 0.375 1 +0 0.4062 0 +0 0.4062 0.03125 +0 0.4062 0.0625 +0 0.4062 0.09375 +0 0.4062 0.125 +0 0.4062 0.1562 +0 0.4062 0.1875 +0 0.4062 0.2188 +0 0.4062 0.25 +0 0.4062 0.2812 +0 0.4062 0.3125 +0 0.4062 0.3438 +0 0.4062 0.375 +0 0.4062 0.4062 +0 0.4062 0.4375 +0 0.4062 0.4688 +0 0.4062 0.5 +0 0.4062 0.5312 +0 0.4062 0.5625 +0 0.4062 0.5938 +0 0.4062 0.625 +0 0.4062 0.6562 +0 0.4062 0.6875 +0 0.4062 0.7188 +0 0.4062 0.75 +0 0.4062 0.7812 +0 0.4062 0.8125 +0 0.4062 0.8438 +0 0.4062 0.875 +0 0.4062 0.9062 +0 0.4062 0.9375 +0 0.4062 0.9688 +0 0.4062 1 +0 0.4375 0 +0 0.4375 0.03125 +0 0.4375 0.0625 +0 0.4375 0.09375 +0 0.4375 0.125 +0 0.4375 0.1562 +0 0.4375 0.1875 +0 0.4375 0.2188 +0 0.4375 0.25 +0 0.4375 0.2812 +0 0.4375 0.3125 +0 0.4375 0.3438 +0 0.4375 0.375 +0 0.4375 0.4062 +0 0.4375 0.4375 +0 0.4375 0.4688 +0 0.4375 0.5 +0 0.4375 0.5312 +0 0.4375 0.5625 +0 0.4375 0.5938 +0 0.4375 0.625 +0 0.4375 0.6562 +0 0.4375 0.6875 +0 0.4375 0.7188 +0 0.4375 0.75 +0 0.4375 0.7812 +0 0.4375 0.8125 +0 0.4375 0.8438 +0 0.4375 0.875 +0 0.4375 0.9062 +0 0.4375 0.9375 +0 0.4375 0.9688 +0 0.4375 1 +0 0.4688 0 +0 0.4688 0.03125 +0 0.4688 0.0625 +0 0.4688 0.09375 +0 0.4688 0.125 +0 0.4688 0.1562 +0 0.4688 0.1875 +0 0.4688 0.2188 +0 0.4688 0.25 +0 0.4688 0.2812 +0 0.4688 0.3125 +0 0.4688 0.3438 +0 0.4688 0.375 +0 0.4688 0.4062 +0 0.4688 0.4375 +0 0.4688 0.4688 +0 0.4688 0.5 +0 0.4688 0.5312 +0 0.4688 0.5625 +0 0.4688 0.5938 +0 0.4688 0.625 +0 0.4688 0.6562 +0 0.4688 0.6875 +0 0.4688 0.7188 +0 0.4688 0.75 +0 0.4688 0.7812 +0 0.4688 0.8125 +0 0.4688 0.8438 +0 0.4688 0.875 +0 0.4688 0.9062 +0 0.4688 0.9375 +0 0.4688 0.9688 +0 0.4688 1 +0 0.5 0 +0 0.5 0.03125 +0 0.5 0.0625 +0 0.5 0.09375 +0 0.5 0.125 +0 0.5 0.1562 +0 0.5 0.1875 +0 0.5 0.2188 +0 0.5 0.25 +0 0.5 0.2812 +0 0.5 0.3125 +0 0.5 0.3438 +0 0.5 0.375 +0 0.5 0.4062 +0 0.5 0.4375 +0 0.5 0.4688 +0 0.5 0.5 +0 0.5 0.5312 +0 0.5 0.5625 +0 0.5 0.5938 +0 0.5 0.625 +0 0.5 0.6562 +0 0.5 0.6875 +0 0.5 0.7188 +0 0.5 0.75 +0 0.5 0.7812 +0 0.5 0.8125 +0 0.5 0.8438 +0 0.5 0.875 +0 0.5 0.9062 +0 0.5 0.9375 +0 0.5 0.9688 +0 0.5 1 +0 0.5312 0 +0 0.5312 0.03125 +0 0.5312 0.0625 +0 0.5312 0.09375 +0 0.5312 0.125 +0 0.5312 0.1562 +0 0.5312 0.1875 +0 0.5312 0.2188 +0 0.5312 0.25 +0 0.5312 0.2812 +0 0.5312 0.3125 +0 0.5312 0.3438 +0 0.5312 0.375 +0 0.5312 0.4062 +0 0.5312 0.4375 +0 0.5312 0.4688 +0 0.5312 0.5 +0 0.5312 0.5312 +0 0.5312 0.5625 +0 0.5312 0.5938 +0 0.5312 0.625 +0 0.5312 0.6562 +0 0.5312 0.6875 +0 0.5312 0.7188 +0 0.5312 0.75 +0 0.5312 0.7812 +0 0.5312 0.8125 +0 0.5312 0.8438 +0 0.5312 0.875 +0 0.5312 0.9062 +0 0.5312 0.9375 +0 0.5312 0.9688 +0 0.5312 1 +0 0.5625 0 +0 0.5625 0.03125 +0 0.5625 0.0625 +0 0.5625 0.09375 +0 0.5625 0.125 +0 0.5625 0.1562 +0 0.5625 0.1875 +0 0.5625 0.2188 +0 0.5625 0.25 +0 0.5625 0.2812 +0 0.5625 0.3125 +0 0.5625 0.3438 +0 0.5625 0.375 +0 0.5625 0.4062 +0 0.5625 0.4375 +0 0.5625 0.4688 +0 0.5625 0.5 +0 0.5625 0.5312 +0 0.5625 0.5625 +0 0.5625 0.5938 +0 0.5625 0.625 +0 0.5625 0.6562 +0 0.5625 0.6875 +0 0.5625 0.7188 +0 0.5625 0.75 +0 0.5625 0.7812 +0 0.5625 0.8125 +0 0.5625 0.8438 +0 0.5625 0.875 +0 0.5625 0.9062 +0 0.5625 0.9375 +0 0.5625 0.9688 +0 0.5625 1 +0 0.5938 0 +0 0.5938 0.03125 +0 0.5938 0.0625 +0 0.5938 0.09375 +0 0.5938 0.125 +0 0.5938 0.1562 +0 0.5938 0.1875 +0 0.5938 0.2188 +0 0.5938 0.25 +0 0.5938 0.2812 +0 0.5938 0.3125 +0 0.5938 0.3438 +0 0.5938 0.375 +0 0.5938 0.4062 +0 0.5938 0.4375 +0 0.5938 0.4688 +0 0.5938 0.5 +0 0.5938 0.5312 +0 0.5938 0.5625 +0 0.5938 0.5938 +0 0.5938 0.625 +0 0.5938 0.6562 +0 0.5938 0.6875 +0 0.5938 0.7188 +0 0.5938 0.75 +0 0.5938 0.7812 +0 0.5938 0.8125 +0 0.5938 0.8438 +0 0.5938 0.875 +0 0.5938 0.9062 +0 0.5938 0.9375 +0 0.5938 0.9688 +0 0.5938 1 +0 0.625 0 +0 0.625 0.03125 +0 0.625 0.0625 +0 0.625 0.09375 +0 0.625 0.125 +0 0.625 0.1562 +0 0.625 0.1875 +0 0.625 0.2188 +0 0.625 0.25 +0 0.625 0.2812 +0 0.625 0.3125 +0 0.625 0.3438 +0 0.625 0.375 +0 0.625 0.4062 +0 0.625 0.4375 +0 0.625 0.4688 +0 0.625 0.5 +0 0.625 0.5312 +0 0.625 0.5625 +0 0.625 0.5938 +0 0.625 0.625 +0 0.625 0.6562 +0 0.625 0.6875 +0 0.625 0.7188 +0 0.625 0.75 +0 0.625 0.7812 +0 0.625 0.8125 +0 0.625 0.8438 +0 0.625 0.875 +0 0.625 0.9062 +0 0.625 0.9375 +0 0.625 0.9688 +0 0.625 1 +0 0.6562 0 +0 0.6562 0.03125 +0 0.6562 0.0625 +0 0.6562 0.09375 +0 0.6562 0.125 +0 0.6562 0.1562 +0 0.6562 0.1875 +0 0.6562 0.2188 +0 0.6562 0.25 +0 0.6562 0.2812 +0 0.6562 0.3125 +0 0.6562 0.3438 +0 0.6562 0.375 +0 0.6562 0.4062 +0 0.6562 0.4375 +0 0.6562 0.4688 +0 0.6562 0.5 +0 0.6562 0.5312 +0 0.6562 0.5625 +0 0.6562 0.5938 +0 0.6562 0.625 +0 0.6562 0.6562 +0 0.6562 0.6875 +0 0.6562 0.7188 +0 0.6562 0.75 +0 0.6562 0.7812 +0 0.6562 0.8125 +0 0.6562 0.8438 +0 0.6562 0.875 +0 0.6562 0.9062 +0 0.6562 0.9375 +0 0.6562 0.9688 +0 0.6562 1 +0 0.6875 0 +0 0.6875 0.03125 +0 0.6875 0.0625 +0 0.6875 0.09375 +0 0.6875 0.125 +0 0.6875 0.1562 +0 0.6875 0.1875 +0 0.6875 0.2188 +0 0.6875 0.25 +0 0.6875 0.2812 +0 0.6875 0.3125 +0 0.6875 0.3438 +0 0.6875 0.375 +0 0.6875 0.4062 +0 0.6875 0.4375 +0 0.6875 0.4688 +0 0.6875 0.5 +0 0.6875 0.5312 +0 0.6875 0.5625 +0 0.6875 0.5938 +0 0.6875 0.625 +0 0.6875 0.6562 +0 0.6875 0.6875 +0 0.6875 0.7188 +0 0.6875 0.75 +0 0.6875 0.7812 +0 0.6875 0.8125 +0 0.6875 0.8438 +0 0.6875 0.875 +0 0.6875 0.9062 +0 0.6875 0.9375 +0 0.6875 0.9688 +0 0.6875 1 +0 0.7188 0 +0 0.7188 0.03125 +0 0.7188 0.0625 +0 0.7188 0.09375 +0 0.7188 0.125 +0 0.7188 0.1562 +0 0.7188 0.1875 +0 0.7188 0.2188 +0 0.7188 0.25 +0 0.7188 0.2812 +0 0.7188 0.3125 +0 0.7188 0.3438 +0 0.7188 0.375 +0 0.7188 0.4062 +0 0.7188 0.4375 +0 0.7188 0.4688 +0 0.7188 0.5 +0 0.7188 0.5312 +0 0.7188 0.5625 +0 0.7188 0.5938 +0 0.7188 0.625 +0 0.7188 0.6562 +0 0.7188 0.6875 +0 0.7188 0.7188 +0 0.7188 0.75 +0 0.7188 0.7812 +0 0.7188 0.8125 +0 0.7188 0.8438 +0 0.7188 0.875 +0 0.7188 0.9062 +0 0.7188 0.9375 +0 0.7188 0.9688 +0 0.7188 1 +0 0.75 0 +0 0.75 0.03125 +0 0.75 0.0625 +0 0.75 0.09375 +0 0.75 0.125 +0 0.75 0.1562 +0 0.75 0.1875 +0 0.75 0.2188 +0 0.75 0.25 +0 0.75 0.2812 +0 0.75 0.3125 +0 0.75 0.3438 +0 0.75 0.375 +0 0.75 0.4062 +0 0.75 0.4375 +0 0.75 0.4688 +0 0.75 0.5 +0 0.75 0.5312 +0 0.75 0.5625 +0 0.75 0.5938 +0 0.75 0.625 +0 0.75 0.6562 +0 0.75 0.6875 +0 0.75 0.7188 +0 0.75 0.75 +0 0.75 0.7812 +0 0.75 0.8125 +0 0.75 0.8438 +0 0.75 0.875 +0 0.75 0.9062 +0 0.75 0.9375 +0 0.75 0.9688 +0 0.75 1 +0 0.7812 0 +0 0.7812 0.03125 +0 0.7812 0.0625 +0 0.7812 0.09375 +0 0.7812 0.125 +0 0.7812 0.1562 +0 0.7812 0.1875 +0 0.7812 0.2188 +0 0.7812 0.25 +0 0.7812 0.2812 +0 0.7812 0.3125 +0 0.7812 0.3438 +0 0.7812 0.375 +0 0.7812 0.4062 +0 0.7812 0.4375 +0 0.7812 0.4688 +0 0.7812 0.5 +0 0.7812 0.5312 +0 0.7812 0.5625 +0 0.7812 0.5938 +0 0.7812 0.625 +0 0.7812 0.6562 +0 0.7812 0.6875 +0 0.7812 0.7188 +0 0.7812 0.75 +0 0.7812 0.7812 +0 0.7812 0.8125 +0 0.7812 0.8438 +0 0.7812 0.875 +0 0.7812 0.9062 +0 0.7812 0.9375 +0 0.7812 0.9688 +0 0.7812 1 +0 0.8125 0 +0 0.8125 0.03125 +0 0.8125 0.0625 +0 0.8125 0.09375 +0 0.8125 0.125 +0 0.8125 0.1562 +0 0.8125 0.1875 +0 0.8125 0.2188 +0 0.8125 0.25 +0 0.8125 0.2812 +0 0.8125 0.3125 +0 0.8125 0.3438 +0 0.8125 0.375 +0 0.8125 0.4062 +0 0.8125 0.4375 +0 0.8125 0.4688 +0 0.8125 0.5 +0 0.8125 0.5312 +0 0.8125 0.5625 +0 0.8125 0.5938 +0 0.8125 0.625 +0 0.8125 0.6562 +0 0.8125 0.6875 +0 0.8125 0.7188 +0 0.8125 0.75 +0 0.8125 0.7812 +0 0.8125 0.8125 +0 0.8125 0.8438 +0 0.8125 0.875 +0 0.8125 0.9062 +0 0.8125 0.9375 +0 0.8125 0.9688 +0 0.8125 1 +0 0.8438 0 +0 0.8438 0.03125 +0 0.8438 0.0625 +0 0.8438 0.09375 +0 0.8438 0.125 +0 0.8438 0.1562 +0 0.8438 0.1875 +0 0.8438 0.2188 +0 0.8438 0.25 +0 0.8438 0.2812 +0 0.8438 0.3125 +0 0.8438 0.3438 +0 0.8438 0.375 +0 0.8438 0.4062 +0 0.8438 0.4375 +0 0.8438 0.4688 +0 0.8438 0.5 +0 0.8438 0.5312 +0 0.8438 0.5625 +0 0.8438 0.5938 +0 0.8438 0.625 +0 0.8438 0.6562 +0 0.8438 0.6875 +0 0.8438 0.7188 +0 0.8438 0.75 +0 0.8438 0.7812 +0 0.8438 0.8125 +0 0.8438 0.8438 +0 0.8438 0.875 +0 0.8438 0.9062 +0 0.8438 0.9375 +0 0.8438 0.9688 +0 0.8438 1 +0 0.875 0 +0 0.875 0.03125 +0 0.875 0.0625 +0 0.875 0.09375 +0 0.875 0.125 +0 0.875 0.1562 +0 0.875 0.1875 +0 0.875 0.2188 +0 0.875 0.25 +0 0.875 0.2812 +0 0.875 0.3125 +0 0.875 0.3438 +0 0.875 0.375 +0 0.875 0.4062 +0 0.875 0.4375 +0 0.875 0.4688 +0 0.875 0.5 +0 0.875 0.5312 +0 0.875 0.5625 +0 0.875 0.5938 +0 0.875 0.625 +0 0.875 0.6562 +0 0.875 0.6875 +0 0.875 0.7188 +0 0.875 0.75 +0 0.875 0.7812 +0 0.875 0.8125 +0 0.875 0.8438 +0 0.875 0.875 +0 0.875 0.9062 +0 0.875 0.9375 +0 0.875 0.9688 +0 0.875 1 +0 0.9062 0 +0 0.9062 0.03125 +0 0.9062 0.0625 +0 0.9062 0.09375 +0 0.9062 0.125 +0 0.9062 0.1562 +0 0.9062 0.1875 +0 0.9062 0.2188 +0 0.9062 0.25 +0 0.9062 0.2812 +0 0.9062 0.3125 +0 0.9062 0.3438 +0 0.9062 0.375 +0 0.9062 0.4062 +0 0.9062 0.4375 +0 0.9062 0.4688 +0 0.9062 0.5 +0 0.9062 0.5312 +0 0.9062 0.5625 +0 0.9062 0.5938 +0 0.9062 0.625 +0 0.9062 0.6562 +0 0.9062 0.6875 +0 0.9062 0.7188 +0 0.9062 0.75 +0 0.9062 0.7812 +0 0.9062 0.8125 +0 0.9062 0.8438 +0 0.9062 0.875 +0 0.9062 0.9062 +0 0.9062 0.9375 +0 0.9062 0.9688 +0 0.9062 1 +0 0.9375 0 +0 0.9375 0.03125 +0 0.9375 0.0625 +0 0.9375 0.09375 +0 0.9375 0.125 +0 0.9375 0.1562 +0 0.9375 0.1875 +0 0.9375 0.2188 +0 0.9375 0.25 +0 0.9375 0.2812 +0 0.9375 0.3125 +0 0.9375 0.3438 +0 0.9375 0.375 +0 0.9375 0.4062 +0 0.9375 0.4375 +0 0.9375 0.4688 +0 0.9375 0.5 +0 0.9375 0.5312 +0 0.9375 0.5625 +0 0.9375 0.5938 +0 0.9375 0.625 +0 0.9375 0.6562 +0 0.9375 0.6875 +0 0.9375 0.7188 +0 0.9375 0.75 +0 0.9375 0.7812 +0 0.9375 0.8125 +0 0.9375 0.8438 +0 0.9375 0.875 +0 0.9375 0.9062 +0 0.9375 0.9375 +0 0.9375 0.9688 +0 0.9375 1 +0 0.9688 0 +0 0.9688 0.03125 +0 0.9688 0.0625 +0 0.9688 0.09375 +0 0.9688 0.125 +0 0.9688 0.1562 +0 0.9688 0.1875 +0 0.9688 0.2188 +0 0.9688 0.25 +0 0.9688 0.2812 +0 0.9688 0.3125 +0 0.9688 0.3438 +0 0.9688 0.375 +0 0.9688 0.4062 +0 0.9688 0.4375 +0 0.9688 0.4688 +0 0.9688 0.5 +0 0.9688 0.5312 +0 0.9688 0.5625 +0 0.9688 0.5938 +0 0.9688 0.625 +0 0.9688 0.6562 +0 0.9688 0.6875 +0 0.9688 0.7188 +0 0.9688 0.75 +0 0.9688 0.7812 +0 0.9688 0.8125 +0 0.9688 0.8438 +0 0.9688 0.875 +0 0.9688 0.9062 +0 0.9688 0.9375 +0 0.9688 0.9688 +0 0.9688 1 +0 1 0 +0 1 0.03125 +0 1 0.0625 +0 1 0.09375 +0 1 0.125 +0 1 0.1562 +0 1 0.1875 +0 1 0.2188 +0 1 0.25 +0 1 0.2812 +0 1 0.3125 +0 1 0.3438 +0 1 0.375 +0 1 0.4062 +0 1 0.4375 +0 1 0.4688 +0 1 0.5 +0 1 0.5312 +0 1 0.5625 +0 1 0.5938 +0 1 0.625 +0 1 0.6562 +0 1 0.6875 +0 1 0.7188 +0 1 0.75 +0 1 0.7812 +0 1 0.8125 +0 1 0.8438 +0 1 0.875 +0 1 0.9062 +0 1 0.9375 +0 1 0.9688 +0 1 1 +0.03125 0 0 +0.03125 0 0.03125 +0.03125 0 0.0625 +0.03125 0 0.09375 +0.03125 0 0.125 +0.03125 0 0.1562 +0.03125 0 0.1875 +0.03125 0 0.2188 +0.03125 0 0.25 +0.03125 0 0.2812 +0.03125 0 0.3125 +0.03125 0 0.3438 +0.03125 0 0.375 +0.03125 0 0.4062 +0.03125 0 0.4375 +0.03125 0 0.4688 +0.03125 0 0.5 +0.03125 0 0.5312 +0.03125 0 0.5625 +0.03125 0 0.5938 +0.03125 0 0.625 +0.03125 0 0.6562 +0.03125 0 0.6875 +0.03125 0 0.7188 +0.03125 0 0.75 +0.03125 0 0.7812 +0.03125 0 0.8125 +0.03125 0 0.8438 +0.03125 0 0.875 +0.03125 0 0.9062 +0.03125 0 0.9375 +0.03125 0 0.9688 +0.03125 0 1 +0.03125 0.03125 0 +0.03125 0.03125 0.03125 +0.03125 0.03125 0.0625 +0.03125 0.03125 0.09375 +0.03125 0.03125 0.125 +0.03125 0.03125 0.1562 +0.03125 0.03125 0.1875 +0.03125 0.03125 0.2188 +0.03125 0.03125 0.25 +0.03125 0.03125 0.2812 +0.03125 0.03125 0.3125 +0.03125 0.03125 0.3438 +0.03125 0.03125 0.375 +0.03125 0.03125 0.4062 +0.03125 0.03125 0.4375 +0.03125 0.03125 0.4688 +0.03125 0.03125 0.5 +0.03125 0.03125 0.5312 +0.03125 0.03125 0.5625 +0.03125 0.03125 0.5938 +0.03125 0.03125 0.625 +0.03125 0.03125 0.6562 +0.03125 0.03125 0.6875 +0.03125 0.03125 0.7188 +0.03125 0.03125 0.75 +0.03125 0.03125 0.7812 +0.03125 0.03125 0.8125 +0.03125 0.03125 0.8438 +0.03125 0.03125 0.875 +0.03125 0.03125 0.9062 +0.03125 0.03125 0.9375 +0.03125 0.03125 0.9688 +0.03125 0.03125 1 +0.03125 0.0625 0 +0.03125 0.0625 0.03125 +0.03125 0.0625 0.0625 +0.03125 0.0625 0.09375 +0.03125 0.0625 0.125 +0.03125 0.0625 0.1562 +0.03125 0.0625 0.1875 +0.03125 0.0625 0.2188 +0.03125 0.0625 0.25 +0.03125 0.0625 0.2812 +0.03125 0.0625 0.3125 +0.03125 0.0625 0.3438 +0.03125 0.0625 0.375 +0.03125 0.0625 0.4062 +0.03125 0.0625 0.4375 +0.03125 0.0625 0.4688 +0.03125 0.0625 0.5 +0.03125 0.0625 0.5312 +0.03125 0.0625 0.5625 +0.03125 0.0625 0.5938 +0.03125 0.0625 0.625 +0.03125 0.0625 0.6562 +0.03125 0.0625 0.6875 +0.03125 0.0625 0.7188 +0.03125 0.0625 0.75 +0.03125 0.0625 0.7812 +0.03125 0.0625 0.8125 +0.03125 0.0625 0.8438 +0.03125 0.0625 0.875 +0.03125 0.0625 0.9062 +0.03125 0.0625 0.9375 +0.03125 0.0625 0.9688 +0.03125 0.0625 1 +0.03125 0.09375 0 +0.03125 0.09375 0.03125 +0.03125 0.09375 0.0625 +0.03125 0.09375 0.09375 +0.03125 0.09375 0.125 +0.03125 0.09375 0.1562 +0.03125 0.09375 0.1875 +0.03125 0.09375 0.2188 +0.03125 0.09375 0.25 +0.03125 0.09375 0.2812 +0.03125 0.09375 0.3125 +0.03125 0.09375 0.3438 +0.03125 0.09375 0.375 +0.03125 0.09375 0.4062 +0.03125 0.09375 0.4375 +0.03125 0.09375 0.4688 +0.03125 0.09375 0.5 +0.03125 0.09375 0.5312 +0.03125 0.09375 0.5625 +0.03125 0.09375 0.5938 +0.03125 0.09375 0.625 +0.03125 0.09375 0.6562 +0.03125 0.09375 0.6875 +0.03125 0.09375 0.7188 +0.03125 0.09375 0.75 +0.03125 0.09375 0.7812 +0.03125 0.09375 0.8125 +0.03125 0.09375 0.8438 +0.03125 0.09375 0.875 +0.03125 0.09375 0.9062 +0.03125 0.09375 0.9375 +0.03125 0.09375 0.9688 +0.03125 0.09375 1 +0.03125 0.125 0 +0.03125 0.125 0.03125 +0.03125 0.125 0.0625 +0.03125 0.125 0.09375 +0.03125 0.125 0.125 +0.03125 0.125 0.1562 +0.03125 0.125 0.1875 +0.03125 0.125 0.2188 +0.03125 0.125 0.25 +0.03125 0.125 0.2812 +0.03125 0.125 0.3125 +0.03125 0.125 0.3438 +0.03125 0.125 0.375 +0.03125 0.125 0.4062 +0.03125 0.125 0.4375 +0.03125 0.125 0.4688 +0.03125 0.125 0.5 +0.03125 0.125 0.5312 +0.03125 0.125 0.5625 +0.03125 0.125 0.5938 +0.03125 0.125 0.625 +0.03125 0.125 0.6562 +0.03125 0.125 0.6875 +0.03125 0.125 0.7188 +0.03125 0.125 0.75 +0.03125 0.125 0.7812 +0.03125 0.125 0.8125 +0.03125 0.125 0.8438 +0.03125 0.125 0.875 +0.03125 0.125 0.9062 +0.03125 0.125 0.9375 +0.03125 0.125 0.9688 +0.03125 0.125 1 +0.03125 0.1562 0 +0.03125 0.1562 0.03125 +0.03125 0.1562 0.0625 +0.03125 0.1562 0.09375 +0.03125 0.1562 0.125 +0.03125 0.1562 0.1562 +0.03125 0.1562 0.1875 +0.03125 0.1562 0.2188 +0.03125 0.1562 0.25 +0.03125 0.1562 0.2812 +0.03125 0.1562 0.3125 +0.03125 0.1562 0.3438 +0.03125 0.1562 0.375 +0.03125 0.1562 0.4062 +0.03125 0.1562 0.4375 +0.03125 0.1562 0.4688 +0.03125 0.1562 0.5 +0.03125 0.1562 0.5312 +0.03125 0.1562 0.5625 +0.03125 0.1562 0.5938 +0.03125 0.1562 0.625 +0.03125 0.1562 0.6562 +0.03125 0.1562 0.6875 +0.03125 0.1562 0.7188 +0.03125 0.1562 0.75 +0.03125 0.1562 0.7812 +0.03125 0.1562 0.8125 +0.03125 0.1562 0.8438 +0.03125 0.1562 0.875 +0.03125 0.1562 0.9062 +0.03125 0.1562 0.9375 +0.03125 0.1562 0.9688 +0.03125 0.1562 1 +0.03125 0.1875 0 +0.03125 0.1875 0.03125 +0.03125 0.1875 0.0625 +0.03125 0.1875 0.09375 +0.03125 0.1875 0.125 +0.03125 0.1875 0.1562 +0.03125 0.1875 0.1875 +0.03125 0.1875 0.2188 +0.03125 0.1875 0.25 +0.03125 0.1875 0.2812 +0.03125 0.1875 0.3125 +0.03125 0.1875 0.3438 +0.03125 0.1875 0.375 +0.03125 0.1875 0.4062 +0.03125 0.1875 0.4375 +0.03125 0.1875 0.4688 +0.03125 0.1875 0.5 +0.03125 0.1875 0.5312 +0.03125 0.1875 0.5625 +0.03125 0.1875 0.5938 +0.03125 0.1875 0.625 +0.03125 0.1875 0.6562 +0.03125 0.1875 0.6875 +0.03125 0.1875 0.7188 +0.03125 0.1875 0.75 +0.03125 0.1875 0.7812 +0.03125 0.1875 0.8125 +0.03125 0.1875 0.8438 +0.03125 0.1875 0.875 +0.03125 0.1875 0.9062 +0.03125 0.1875 0.9375 +0.03125 0.1875 0.9688 +0.03125 0.1875 1 +0.03125 0.2188 0 +0.03125 0.2188 0.03125 +0.03125 0.2188 0.0625 +0.03125 0.2188 0.09375 +0.03125 0.2188 0.125 +0.03125 0.2188 0.1562 +0.03125 0.2188 0.1875 +0.03125 0.2188 0.2188 +0.03125 0.2188 0.25 +0.03125 0.2188 0.2812 +0.03125 0.2188 0.3125 +0.03125 0.2188 0.3438 +0.03125 0.2188 0.375 +0.03125 0.2188 0.4062 +0.03125 0.2188 0.4375 +0.03125 0.2188 0.4688 +0.03125 0.2188 0.5 +0.03125 0.2188 0.5312 +0.03125 0.2188 0.5625 +0.03125 0.2188 0.5938 +0.03125 0.2188 0.625 +0.03125 0.2188 0.6562 +0.03125 0.2188 0.6875 +0.03125 0.2188 0.7188 +0.03125 0.2188 0.75 +0.03125 0.2188 0.7812 +0.03125 0.2188 0.8125 +0.03125 0.2188 0.8438 +0.03125 0.2188 0.875 +0.03125 0.2188 0.9062 +0.03125 0.2188 0.9375 +0.03125 0.2188 0.9688 +0.03125 0.2188 1 +0.03125 0.25 0 +0.03125 0.25 0.03125 +0.03125 0.25 0.0625 +0.03125 0.25 0.09375 +0.03125 0.25 0.125 +0.03125 0.25 0.1562 +0.03125 0.25 0.1875 +0.03125 0.25 0.2188 +0.03125 0.25 0.25 +0.03125 0.25 0.2812 +0.03125 0.25 0.3125 +0.03125 0.25 0.3438 +0.03125 0.25 0.375 +0.03125 0.25 0.4062 +0.03125 0.25 0.4375 +0.03125 0.25 0.4688 +0.03125 0.25 0.5 +0.03125 0.25 0.5312 +0.03125 0.25 0.5625 +0.03125 0.25 0.5938 +0.03125 0.25 0.625 +0.03125 0.25 0.6562 +0.03125 0.25 0.6875 +0.03125 0.25 0.7188 +0.03125 0.25 0.75 +0.03125 0.25 0.7812 +0.03125 0.25 0.8125 +0.03125 0.25 0.8438 +0.03125 0.25 0.875 +0.03125 0.25 0.9062 +0.03125 0.25 0.9375 +0.03125 0.25 0.9688 +0.03125 0.25 1 +0.03125 0.2812 0 +0.03125 0.2812 0.03125 +0.03125 0.2812 0.0625 +0.03125 0.2812 0.09375 +0.03125 0.2812 0.125 +0.03125 0.2812 0.1562 +0.03125 0.2812 0.1875 +0.03125 0.2812 0.2188 +0.03125 0.2812 0.25 +0.03125 0.2812 0.2812 +0.03125 0.2812 0.3125 +0.03125 0.2812 0.3438 +0.03125 0.2812 0.375 +0.03125 0.2812 0.4062 +0.03125 0.2812 0.4375 +0.03125 0.2812 0.4688 +0.03125 0.2812 0.5 +0.03125 0.2812 0.5312 +0.03125 0.2812 0.5625 +0.03125 0.2812 0.5938 +0.03125 0.2812 0.625 +0.03125 0.2812 0.6562 +0.03125 0.2812 0.6875 +0.03125 0.2812 0.7188 +0.03125 0.2812 0.75 +0.03125 0.2812 0.7812 +0.03125 0.2812 0.8125 +0.03125 0.2812 0.8438 +0.03125 0.2812 0.875 +0.03125 0.2812 0.9062 +0.03125 0.2812 0.9375 +0.03125 0.2812 0.9688 +0.03125 0.2812 1 +0.03125 0.3125 0 +0.03125 0.3125 0.03125 +0.03125 0.3125 0.0625 +0.03125 0.3125 0.09375 +0.03125 0.3125 0.125 +0.03125 0.3125 0.1562 +0.03125 0.3125 0.1875 +0.03125 0.3125 0.2188 +0.03125 0.3125 0.25 +0.03125 0.3125 0.2812 +0.03125 0.3125 0.3125 +0.03125 0.3125 0.3438 +0.03125 0.3125 0.375 +0.03125 0.3125 0.4062 +0.03125 0.3125 0.4375 +0.03125 0.3125 0.4688 +0.03125 0.3125 0.5 +0.03125 0.3125 0.5312 +0.03125 0.3125 0.5625 +0.03125 0.3125 0.5938 +0.03125 0.3125 0.625 +0.03125 0.3125 0.6562 +0.03125 0.3125 0.6875 +0.03125 0.3125 0.7188 +0.03125 0.3125 0.75 +0.03125 0.3125 0.7812 +0.03125 0.3125 0.8125 +0.03125 0.3125 0.8438 +0.03125 0.3125 0.875 +0.03125 0.3125 0.9062 +0.03125 0.3125 0.9375 +0.03125 0.3125 0.9688 +0.03125 0.3125 1 +0.03125 0.3438 0 +0.03125 0.3438 0.03125 +0.03125 0.3438 0.0625 +0.03125 0.3438 0.09375 +0.03125 0.3438 0.125 +0.03125 0.3438 0.1562 +0.03125 0.3438 0.1875 +0.03125 0.3438 0.2188 +0.03125 0.3438 0.25 +0.03125 0.3438 0.2812 +0.03125 0.3438 0.3125 +0.03125 0.3438 0.3438 +0.03125 0.3438 0.375 +0.03125 0.3438 0.4062 +0.03125 0.3438 0.4375 +0.03125 0.3438 0.4688 +0.03125 0.3438 0.5 +0.03125 0.3438 0.5312 +0.03125 0.3438 0.5625 +0.03125 0.3438 0.5938 +0.03125 0.3438 0.625 +0.03125 0.3438 0.6562 +0.03125 0.3438 0.6875 +0.03125 0.3438 0.7188 +0.03125 0.3438 0.75 +0.03125 0.3438 0.7812 +0.03125 0.3438 0.8125 +0.03125 0.3438 0.8438 +0.03125 0.3438 0.875 +0.03125 0.3438 0.9062 +0.03125 0.3438 0.9375 +0.03125 0.3438 0.9688 +0.03125 0.3438 1 +0.03125 0.375 0 +0.03125 0.375 0.03125 +0.03125 0.375 0.0625 +0.03125 0.375 0.09375 +0.03125 0.375 0.125 +0.03125 0.375 0.1562 +0.03125 0.375 0.1875 +0.03125 0.375 0.2188 +0.03125 0.375 0.25 +0.03125 0.375 0.2812 +0.03125 0.375 0.3125 +0.03125 0.375 0.3438 +0.03125 0.375 0.375 +0.03125 0.375 0.4062 +0.03125 0.375 0.4375 +0.03125 0.375 0.4688 +0.03125 0.375 0.5 +0.03125 0.375 0.5312 +0.03125 0.375 0.5625 +0.03125 0.375 0.5938 +0.03125 0.375 0.625 +0.03125 0.375 0.6562 +0.03125 0.375 0.6875 +0.03125 0.375 0.7188 +0.03125 0.375 0.75 +0.03125 0.375 0.7812 +0.03125 0.375 0.8125 +0.03125 0.375 0.8438 +0.03125 0.375 0.875 +0.03125 0.375 0.9062 +0.03125 0.375 0.9375 +0.03125 0.375 0.9688 +0.03125 0.375 1 +0.03125 0.4062 0 +0.03125 0.4062 0.03125 +0.03125 0.4062 0.0625 +0.03125 0.4062 0.09375 +0.03125 0.4062 0.125 +0.03125 0.4062 0.1562 +0.03125 0.4062 0.1875 +0.03125 0.4062 0.2188 +0.03125 0.4062 0.25 +0.03125 0.4062 0.2812 +0.03125 0.4062 0.3125 +0.03125 0.4062 0.3438 +0.03125 0.4062 0.375 +0.03125 0.4062 0.4062 +0.03125 0.4062 0.4375 +0.03125 0.4062 0.4688 +0.03125 0.4062 0.5 +0.03125 0.4062 0.5312 +0.03125 0.4062 0.5625 +0.03125 0.4062 0.5938 +0.03125 0.4062 0.625 +0.03125 0.4062 0.6562 +0.03125 0.4062 0.6875 +0.03125 0.4062 0.7188 +0.03125 0.4062 0.75 +0.03125 0.4062 0.7812 +0.03125 0.4062 0.8125 +0.03125 0.4062 0.8438 +0.03125 0.4062 0.875 +0.03125 0.4062 0.9062 +0.03125 0.4062 0.9375 +0.03125 0.4062 0.9688 +0.03125 0.4062 1 +0.03125 0.4375 0 +0.03125 0.4375 0.03125 +0.03125 0.4375 0.0625 +0.03125 0.4375 0.09375 +0.03125 0.4375 0.125 +0.03125 0.4375 0.1562 +0.03125 0.4375 0.1875 +0.03125 0.4375 0.2188 +0.03125 0.4375 0.25 +0.03125 0.4375 0.2812 +0.03125 0.4375 0.3125 +0.03125 0.4375 0.3438 +0.03125 0.4375 0.375 +0.03125 0.4375 0.4062 +0.03125 0.4375 0.4375 +0.03125 0.4375 0.4688 +0.03125 0.4375 0.5 +0.03125 0.4375 0.5312 +0.03125 0.4375 0.5625 +0.03125 0.4375 0.5938 +0.03125 0.4375 0.625 +0.03125 0.4375 0.6562 +0.03125 0.4375 0.6875 +0.03125 0.4375 0.7188 +0.03125 0.4375 0.75 +0.03125 0.4375 0.7812 +0.03125 0.4375 0.8125 +0.03125 0.4375 0.8438 +0.03125 0.4375 0.875 +0.03125 0.4375 0.9062 +0.03125 0.4375 0.9375 +0.03125 0.4375 0.9688 +0.03125 0.4375 1 +0.03125 0.4688 0 +0.03125 0.4688 0.03125 +0.03125 0.4688 0.0625 +0.03125 0.4688 0.09375 +0.03125 0.4688 0.125 +0.03125 0.4688 0.1562 +0.03125 0.4688 0.1875 +0.03125 0.4688 0.2188 +0.03125 0.4688 0.25 +0.03125 0.4688 0.2812 +0.03125 0.4688 0.3125 +0.03125 0.4688 0.3438 +0.03125 0.4688 0.375 +0.03125 0.4688 0.4062 +0.03125 0.4688 0.4375 +0.03125 0.4688 0.4688 +0.03125 0.4688 0.5 +0.03125 0.4688 0.5312 +0.03125 0.4688 0.5625 +0.03125 0.4688 0.5938 +0.03125 0.4688 0.625 +0.03125 0.4688 0.6562 +0.03125 0.4688 0.6875 +0.03125 0.4688 0.7188 +0.03125 0.4688 0.75 +0.03125 0.4688 0.7812 +0.03125 0.4688 0.8125 +0.03125 0.4688 0.8438 +0.03125 0.4688 0.875 +0.03125 0.4688 0.9062 +0.03125 0.4688 0.9375 +0.03125 0.4688 0.9688 +0.03125 0.4688 1 +0.03125 0.5 0 +0.03125 0.5 0.03125 +0.03125 0.5 0.0625 +0.03125 0.5 0.09375 +0.03125 0.5 0.125 +0.03125 0.5 0.1562 +0.03125 0.5 0.1875 +0.03125 0.5 0.2188 +0.03125 0.5 0.25 +0.03125 0.5 0.2812 +0.03125 0.5 0.3125 +0.03125 0.5 0.3438 +0.03125 0.5 0.375 +0.03125 0.5 0.4062 +0.03125 0.5 0.4375 +0.03125 0.5 0.4688 +0.03125 0.5 0.5 +0.03125 0.5 0.5312 +0.03125 0.5 0.5625 +0.03125 0.5 0.5938 +0.03125 0.5 0.625 +0.03125 0.5 0.6562 +0.03125 0.5 0.6875 +0.03125 0.5 0.7188 +0.03125 0.5 0.75 +0.03125 0.5 0.7812 +0.03125 0.5 0.8125 +0.03125 0.5 0.8438 +0.03125 0.5 0.875 +0.03125 0.5 0.9062 +0.03125 0.5 0.9375 +0.03125 0.5 0.9688 +0.03125 0.5 1 +0.03125 0.5312 0 +0.03125 0.5312 0.03125 +0.03125 0.5312 0.0625 +0.03125 0.5312 0.09375 +0.03125 0.5312 0.125 +0.03125 0.5312 0.1562 +0.03125 0.5312 0.1875 +0.03125 0.5312 0.2188 +0.03125 0.5312 0.25 +0.03125 0.5312 0.2812 +0.03125 0.5312 0.3125 +0.03125 0.5312 0.3438 +0.03125 0.5312 0.375 +0.03125 0.5312 0.4062 +0.03125 0.5312 0.4375 +0.03125 0.5312 0.4688 +0.03125 0.5312 0.5 +0.03125 0.5312 0.5312 +0.03125 0.5312 0.5625 +0.03125 0.5312 0.5938 +0.03125 0.5312 0.625 +0.03125 0.5312 0.6562 +0.03125 0.5312 0.6875 +0.03125 0.5312 0.7188 +0.03125 0.5312 0.75 +0.03125 0.5312 0.7812 +0.03125 0.5312 0.8125 +0.03125 0.5312 0.8438 +0.03125 0.5312 0.875 +0.03125 0.5312 0.9062 +0.03125 0.5312 0.9375 +0.03125 0.5312 0.9688 +0.03125 0.5312 1 +0.03125 0.5625 0 +0.03125 0.5625 0.03125 +0.03125 0.5625 0.0625 +0.03125 0.5625 0.09375 +0.03125 0.5625 0.125 +0.03125 0.5625 0.1562 +0.03125 0.5625 0.1875 +0.03125 0.5625 0.2188 +0.03125 0.5625 0.25 +0.03125 0.5625 0.2812 +0.03125 0.5625 0.3125 +0.03125 0.5625 0.3438 +0.03125 0.5625 0.375 +0.03125 0.5625 0.4062 +0.03125 0.5625 0.4375 +0.03125 0.5625 0.4688 +0.03125 0.5625 0.5 +0.03125 0.5625 0.5312 +0.03125 0.5625 0.5625 +0.03125 0.5625 0.5938 +0.03125 0.5625 0.625 +0.03125 0.5625 0.6562 +0.03125 0.5625 0.6875 +0.03125 0.5625 0.7188 +0.03125 0.5625 0.75 +0.03125 0.5625 0.7812 +0.03125 0.5625 0.8125 +0.03125 0.5625 0.8438 +0.03125 0.5625 0.875 +0.03125 0.5625 0.9062 +0.03125 0.5625 0.9375 +0.03125 0.5625 0.9688 +0.03125 0.5625 1 +0.03125 0.5938 0 +0.03125 0.5938 0.03125 +0.03125 0.5938 0.0625 +0.03125 0.5938 0.09375 +0.03125 0.5938 0.125 +0.03125 0.5938 0.1562 +0.03125 0.5938 0.1875 +0.03125 0.5938 0.2188 +0.03125 0.5938 0.25 +0.03125 0.5938 0.2812 +0.03125 0.5938 0.3125 +0.03125 0.5938 0.3438 +0.03125 0.5938 0.375 +0.03125 0.5938 0.4062 +0.03125 0.5938 0.4375 +0.03125 0.5938 0.4688 +0.03125 0.5938 0.5 +0.03125 0.5938 0.5312 +0.03125 0.5938 0.5625 +0.03125 0.5938 0.5938 +0.03125 0.5938 0.625 +0.03125 0.5938 0.6562 +0.03125 0.5938 0.6875 +0.03125 0.5938 0.7188 +0.03125 0.5938 0.75 +0.03125 0.5938 0.7812 +0.03125 0.5938 0.8125 +0.03125 0.5938 0.8438 +0.03125 0.5938 0.875 +0.03125 0.5938 0.9062 +0.03125 0.5938 0.9375 +0.03125 0.5938 0.9688 +0.03125 0.5938 1 +0.03125 0.625 0 +0.03125 0.625 0.03125 +0.03125 0.625 0.0625 +0.03125 0.625 0.09375 +0.03125 0.625 0.125 +0.03125 0.625 0.1562 +0.03125 0.625 0.1875 +0.03125 0.625 0.2188 +0.03125 0.625 0.25 +0.03125 0.625 0.2812 +0.03125 0.625 0.3125 +0.03125 0.625 0.3438 +0.03125 0.625 0.375 +0.03125 0.625 0.4062 +0.03125 0.625 0.4375 +0.03125 0.625 0.4688 +0.03125 0.625 0.5 +0.03125 0.625 0.5312 +0.03125 0.625 0.5625 +0.03125 0.625 0.5938 +0.03125 0.625 0.625 +0.03125 0.625 0.6562 +0.03125 0.625 0.6875 +0.03125 0.625 0.7188 +0.03125 0.625 0.75 +0.03125 0.625 0.7812 +0.03125 0.625 0.8125 +0.03125 0.625 0.8438 +0.03125 0.625 0.875 +0.03125 0.625 0.9062 +0.03125 0.625 0.9375 +0.03125 0.625 0.9688 +0.03125 0.625 1 +0.03125 0.6562 0 +0.03125 0.6562 0.03125 +0.03125 0.6562 0.0625 +0.03125 0.6562 0.09375 +0.03125 0.6562 0.125 +0.03125 0.6562 0.1562 +0.03125 0.6562 0.1875 +0.03125 0.6562 0.2188 +0.03125 0.6562 0.25 +0.03125 0.6562 0.2812 +0.03125 0.6562 0.3125 +0.03125 0.6562 0.3438 +0.03125 0.6562 0.375 +0.03125 0.6562 0.4062 +0.03125 0.6562 0.4375 +0.03125 0.6562 0.4688 +0.03125 0.6562 0.5 +0.03125 0.6562 0.5312 +0.03125 0.6562 0.5625 +0.03125 0.6562 0.5938 +0.03125 0.6562 0.625 +0.03125 0.6562 0.6562 +0.03125 0.6562 0.6875 +0.03125 0.6562 0.7188 +0.03125 0.6562 0.75 +0.03125 0.6562 0.7812 +0.03125 0.6562 0.8125 +0.03125 0.6562 0.8438 +0.03125 0.6562 0.875 +0.03125 0.6562 0.9062 +0.03125 0.6562 0.9375 +0.03125 0.6562 0.9688 +0.03125 0.6562 1 +0.03125 0.6875 0 +0.03125 0.6875 0.03125 +0.03125 0.6875 0.0625 +0.03125 0.6875 0.09375 +0.03125 0.6875 0.125 +0.03125 0.6875 0.1562 +0.03125 0.6875 0.1875 +0.03125 0.6875 0.2188 +0.03125 0.6875 0.25 +0.03125 0.6875 0.2812 +0.03125 0.6875 0.3125 +0.03125 0.6875 0.3438 +0.03125 0.6875 0.375 +0.03125 0.6875 0.4062 +0.03125 0.6875 0.4375 +0.03125 0.6875 0.4688 +0.03125 0.6875 0.5 +0.03125 0.6875 0.5312 +0.03125 0.6875 0.5625 +0.03125 0.6875 0.5938 +0.03125 0.6875 0.625 +0.03125 0.6875 0.6562 +0.03125 0.6875 0.6875 +0.03125 0.6875 0.7188 +0.03125 0.6875 0.75 +0.03125 0.6875 0.7812 +0.03125 0.6875 0.8125 +0.03125 0.6875 0.8438 +0.03125 0.6875 0.875 +0.03125 0.6875 0.9062 +0.03125 0.6875 0.9375 +0.03125 0.6875 0.9688 +0.03125 0.6875 1 +0.03125 0.7188 0 +0.03125 0.7188 0.03125 +0.03125 0.7188 0.0625 +0.03125 0.7188 0.09375 +0.03125 0.7188 0.125 +0.03125 0.7188 0.1562 +0.03125 0.7188 0.1875 +0.03125 0.7188 0.2188 +0.03125 0.7188 0.25 +0.03125 0.7188 0.2812 +0.03125 0.7188 0.3125 +0.03125 0.7188 0.3438 +0.03125 0.7188 0.375 +0.03125 0.7188 0.4062 +0.03125 0.7188 0.4375 +0.03125 0.7188 0.4688 +0.03125 0.7188 0.5 +0.03125 0.7188 0.5312 +0.03125 0.7188 0.5625 +0.03125 0.7188 0.5938 +0.03125 0.7188 0.625 +0.03125 0.7188 0.6562 +0.03125 0.7188 0.6875 +0.03125 0.7188 0.7188 +0.03125 0.7188 0.75 +0.03125 0.7188 0.7812 +0.03125 0.7188 0.8125 +0.03125 0.7188 0.8438 +0.03125 0.7188 0.875 +0.03125 0.7188 0.9062 +0.03125 0.7188 0.9375 +0.03125 0.7188 0.9688 +0.03125 0.7188 1 +0.03125 0.75 0 +0.03125 0.75 0.03125 +0.03125 0.75 0.0625 +0.03125 0.75 0.09375 +0.03125 0.75 0.125 +0.03125 0.75 0.1562 +0.03125 0.75 0.1875 +0.03125 0.75 0.2188 +0.03125 0.75 0.25 +0.03125 0.75 0.2812 +0.03125 0.75 0.3125 +0.03125 0.75 0.3438 +0.03125 0.75 0.375 +0.03125 0.75 0.4062 +0.03125 0.75 0.4375 +0.03125 0.75 0.4688 +0.03125 0.75 0.5 +0.03125 0.75 0.5312 +0.03125 0.75 0.5625 +0.03125 0.75 0.5938 +0.03125 0.75 0.625 +0.03125 0.75 0.6562 +0.03125 0.75 0.6875 +0.03125 0.75 0.7188 +0.03125 0.75 0.75 +0.03125 0.75 0.7812 +0.03125 0.75 0.8125 +0.03125 0.75 0.8438 +0.03125 0.75 0.875 +0.03125 0.75 0.9062 +0.03125 0.75 0.9375 +0.03125 0.75 0.9688 +0.03125 0.75 1 +0.03125 0.7812 0 +0.03125 0.7812 0.03125 +0.03125 0.7812 0.0625 +0.03125 0.7812 0.09375 +0.03125 0.7812 0.125 +0.03125 0.7812 0.1562 +0.03125 0.7812 0.1875 +0.03125 0.7812 0.2188 +0.03125 0.7812 0.25 +0.03125 0.7812 0.2812 +0.03125 0.7812 0.3125 +0.03125 0.7812 0.3438 +0.03125 0.7812 0.375 +0.03125 0.7812 0.4062 +0.03125 0.7812 0.4375 +0.03125 0.7812 0.4688 +0.03125 0.7812 0.5 +0.03125 0.7812 0.5312 +0.03125 0.7812 0.5625 +0.03125 0.7812 0.5938 +0.03125 0.7812 0.625 +0.03125 0.7812 0.6562 +0.03125 0.7812 0.6875 +0.03125 0.7812 0.7188 +0.03125 0.7812 0.75 +0.03125 0.7812 0.7812 +0.03125 0.7812 0.8125 +0.03125 0.7812 0.8438 +0.03125 0.7812 0.875 +0.03125 0.7812 0.9062 +0.03125 0.7812 0.9375 +0.03125 0.7812 0.9688 +0.03125 0.7812 1 +0.03125 0.8125 0 +0.03125 0.8125 0.03125 +0.03125 0.8125 0.0625 +0.03125 0.8125 0.09375 +0.03125 0.8125 0.125 +0.03125 0.8125 0.1562 +0.03125 0.8125 0.1875 +0.03125 0.8125 0.2188 +0.03125 0.8125 0.25 +0.03125 0.8125 0.2812 +0.03125 0.8125 0.3125 +0.03125 0.8125 0.3438 +0.03125 0.8125 0.375 +0.03125 0.8125 0.4062 +0.03125 0.8125 0.4375 +0.03125 0.8125 0.4688 +0.03125 0.8125 0.5 +0.03125 0.8125 0.5312 +0.03125 0.8125 0.5625 +0.03125 0.8125 0.5938 +0.03125 0.8125 0.625 +0.03125 0.8125 0.6562 +0.03125 0.8125 0.6875 +0.03125 0.8125 0.7188 +0.03125 0.8125 0.75 +0.03125 0.8125 0.7812 +0.03125 0.8125 0.8125 +0.03125 0.8125 0.8438 +0.03125 0.8125 0.875 +0.03125 0.8125 0.9062 +0.03125 0.8125 0.9375 +0.03125 0.8125 0.9688 +0.03125 0.8125 1 +0.03125 0.8438 0 +0.03125 0.8438 0.03125 +0.03125 0.8438 0.0625 +0.03125 0.8438 0.09375 +0.03125 0.8438 0.125 +0.03125 0.8438 0.1562 +0.03125 0.8438 0.1875 +0.03125 0.8438 0.2188 +0.03125 0.8438 0.25 +0.03125 0.8438 0.2812 +0.03125 0.8438 0.3125 +0.03125 0.8438 0.3438 +0.03125 0.8438 0.375 +0.03125 0.8438 0.4062 +0.03125 0.8438 0.4375 +0.03125 0.8438 0.4688 +0.03125 0.8438 0.5 +0.03125 0.8438 0.5312 +0.03125 0.8438 0.5625 +0.03125 0.8438 0.5938 +0.03125 0.8438 0.625 +0.03125 0.8438 0.6562 +0.03125 0.8438 0.6875 +0.03125 0.8438 0.7188 +0.03125 0.8438 0.75 +0.03125 0.8438 0.7812 +0.03125 0.8438 0.8125 +0.03125 0.8438 0.8438 +0.03125 0.8438 0.875 +0.03125 0.8438 0.9062 +0.03125 0.8438 0.9375 +0.03125 0.8438 0.9688 +0.03125 0.8438 1 +0.03125 0.875 0 +0.03125 0.875 0.03125 +0.03125 0.875 0.0625 +0.03125 0.875 0.09375 +0.03125 0.875 0.125 +0.03125 0.875 0.1562 +0.03125 0.875 0.1875 +0.03125 0.875 0.2188 +0.03125 0.875 0.25 +0.03125 0.875 0.2812 +0.03125 0.875 0.3125 +0.03125 0.875 0.3438 +0.03125 0.875 0.375 +0.03125 0.875 0.4062 +0.03125 0.875 0.4375 +0.03125 0.875 0.4688 +0.03125 0.875 0.5 +0.03125 0.875 0.5312 +0.03125 0.875 0.5625 +0.03125 0.875 0.5938 +0.03125 0.875 0.625 +0.03125 0.875 0.6562 +0.03125 0.875 0.6875 +0.03125 0.875 0.7188 +0.03125 0.875 0.75 +0.03125 0.875 0.7812 +0.03125 0.875 0.8125 +0.03125 0.875 0.8438 +0.03125 0.875 0.875 +0.03125 0.875 0.9062 +0.03125 0.875 0.9375 +0.03125 0.875 0.9688 +0.03125 0.875 1 +0.03125 0.9062 0 +0.03125 0.9062 0.03125 +0.03125 0.9062 0.0625 +0.03125 0.9062 0.09375 +0.03125 0.9062 0.125 +0.03125 0.9062 0.1562 +0.03125 0.9062 0.1875 +0.03125 0.9062 0.2188 +0.03125 0.9062 0.25 +0.03125 0.9062 0.2812 +0.03125 0.9062 0.3125 +0.03125 0.9062 0.3438 +0.03125 0.9062 0.375 +0.03125 0.9062 0.4062 +0.03125 0.9062 0.4375 +0.03125 0.9062 0.4688 +0.03125 0.9062 0.5 +0.03125 0.9062 0.5312 +0.03125 0.9062 0.5625 +0.03125 0.9062 0.5938 +0.03125 0.9062 0.625 +0.03125 0.9062 0.6562 +0.03125 0.9062 0.6875 +0.03125 0.9062 0.7188 +0.03125 0.9062 0.75 +0.03125 0.9062 0.7812 +0.03125 0.9062 0.8125 +0.03125 0.9062 0.8438 +0.03125 0.9062 0.875 +0.03125 0.9062 0.9062 +0.03125 0.9062 0.9375 +0.03125 0.9062 0.9688 +0.03125 0.9062 1 +0.03125 0.9375 0 +0.03125 0.9375 0.03125 +0.03125 0.9375 0.0625 +0.03125 0.9375 0.09375 +0.03125 0.9375 0.125 +0.03125 0.9375 0.1562 +0.03125 0.9375 0.1875 +0.03125 0.9375 0.2188 +0.03125 0.9375 0.25 +0.03125 0.9375 0.2812 +0.03125 0.9375 0.3125 +0.03125 0.9375 0.3438 +0.03125 0.9375 0.375 +0.03125 0.9375 0.4062 +0.03125 0.9375 0.4375 +0.03125 0.9375 0.4688 +0.03125 0.9375 0.5 +0.03125 0.9375 0.5312 +0.03125 0.9375 0.5625 +0.03125 0.9375 0.5938 +0.03125 0.9375 0.625 +0.03125 0.9375 0.6562 +0.03125 0.9375 0.6875 +0.03125 0.9375 0.7188 +0.03125 0.9375 0.75 +0.03125 0.9375 0.7812 +0.03125 0.9375 0.8125 +0.03125 0.9375 0.8438 +0.03125 0.9375 0.875 +0.03125 0.9375 0.9062 +0.03125 0.9375 0.9375 +0.03125 0.9375 0.9688 +0.03125 0.9375 1 +0.03125 0.9688 0 +0.03125 0.9688 0.03125 +0.03125 0.9688 0.0625 +0.03125 0.9688 0.09375 +0.03125 0.9688 0.125 +0.03125 0.9688 0.1562 +0.03125 0.9688 0.1875 +0.03125 0.9688 0.2188 +0.03125 0.9688 0.25 +0.03125 0.9688 0.2812 +0.03125 0.9688 0.3125 +0.03125 0.9688 0.3438 +0.03125 0.9688 0.375 +0.03125 0.9688 0.4062 +0.03125 0.9688 0.4375 +0.03125 0.9688 0.4688 +0.03125 0.9688 0.5 +0.03125 0.9688 0.5312 +0.03125 0.9688 0.5625 +0.03125 0.9688 0.5938 +0.03125 0.9688 0.625 +0.03125 0.9688 0.6562 +0.03125 0.9688 0.6875 +0.03125 0.9688 0.7188 +0.03125 0.9688 0.75 +0.03125 0.9688 0.7812 +0.03125 0.9688 0.8125 +0.03125 0.9688 0.8438 +0.03125 0.9688 0.875 +0.03125 0.9688 0.9062 +0.03125 0.9688 0.9375 +0.03125 0.9688 0.9688 +0.03125 0.9688 1 +0.03125 1 0 +0.03125 1 0.03125 +0.03125 1 0.0625 +0.03125 1 0.09375 +0.03125 1 0.125 +0.03125 1 0.1562 +0.03125 1 0.1875 +0.03125 1 0.2188 +0.03125 1 0.25 +0.03125 1 0.2812 +0.03125 1 0.3125 +0.03125 1 0.3438 +0.03125 1 0.375 +0.03125 1 0.4062 +0.03125 1 0.4375 +0.03125 1 0.4688 +0.03125 1 0.5 +0.03125 1 0.5312 +0.03125 1 0.5625 +0.03125 1 0.5938 +0.03125 1 0.625 +0.03125 1 0.6562 +0.03125 1 0.6875 +0.03125 1 0.7188 +0.03125 1 0.75 +0.03125 1 0.7812 +0.03125 1 0.8125 +0.03125 1 0.8438 +0.03125 1 0.875 +0.03125 1 0.9062 +0.03125 1 0.9375 +0.03125 1 0.9688 +0.03125 1 1 +0.0625 0 0 +0.0625 0 0.03125 +0.0625 0 0.0625 +0.0625 0 0.09375 +0.0625 0 0.125 +0.0625 0 0.1562 +0.0625 0 0.1875 +0.0625 0 0.2188 +0.0625 0 0.25 +0.0625 0 0.2812 +0.0625 0 0.3125 +0.0625 0 0.3438 +0.0625 0 0.375 +0.0625 0 0.4062 +0.0625 0 0.4375 +0.0625 0 0.4688 +0.0625 0 0.5 +0.0625 0 0.5312 +0.0625 0 0.5625 +0.0625 0 0.5938 +0.0625 0 0.625 +0.0625 0 0.6562 +0.0625 0 0.6875 +0.0625 0 0.7188 +0.0625 0 0.75 +0.0625 0 0.7812 +0.0625 0 0.8125 +0.0625 0 0.8438 +0.0625 0 0.875 +0.0625 0 0.9062 +0.0625 0 0.9375 +0.0625 0 0.9688 +0.0625 0 1 +0.0625 0.03125 0 +0.0625 0.03125 0.03125 +0.0625 0.03125 0.0625 +0.0625 0.03125 0.09375 +0.0625 0.03125 0.125 +0.0625 0.03125 0.1562 +0.0625 0.03125 0.1875 +0.0625 0.03125 0.2188 +0.0625 0.03125 0.25 +0.0625 0.03125 0.2812 +0.0625 0.03125 0.3125 +0.0625 0.03125 0.3438 +0.0625 0.03125 0.375 +0.0625 0.03125 0.4062 +0.0625 0.03125 0.4375 +0.0625 0.03125 0.4688 +0.0625 0.03125 0.5 +0.0625 0.03125 0.5312 +0.0625 0.03125 0.5625 +0.0625 0.03125 0.5938 +0.0625 0.03125 0.625 +0.0625 0.03125 0.6562 +0.0625 0.03125 0.6875 +0.0625 0.03125 0.7188 +0.0625 0.03125 0.75 +0.0625 0.03125 0.7812 +0.0625 0.03125 0.8125 +0.0625 0.03125 0.8438 +0.0625 0.03125 0.875 +0.0625 0.03125 0.9062 +0.0625 0.03125 0.9375 +0.0625 0.03125 0.9688 +0.0625 0.03125 1 +0.0625 0.0625 0 +0.0625 0.0625 0.03125 +0.0625 0.0625 0.0625 +0.0625 0.0625 0.09375 +0.0625 0.0625 0.125 +0.0625 0.0625 0.1562 +0.0625 0.0625 0.1875 +0.0625 0.0625 0.2188 +0.0625 0.0625 0.25 +0.0625 0.0625 0.2812 +0.0625 0.0625 0.3125 +0.0625 0.0625 0.3438 +0.0625 0.0625 0.375 +0.0625 0.0625 0.4062 +0.0625 0.0625 0.4375 +0.0625 0.0625 0.4688 +0.0625 0.0625 0.5 +0.0625 0.0625 0.5312 +0.0625 0.0625 0.5625 +0.0625 0.0625 0.5938 +0.0625 0.0625 0.625 +0.0625 0.0625 0.6562 +0.0625 0.0625 0.6875 +0.0625 0.0625 0.7188 +0.0625 0.0625 0.75 +0.0625 0.0625 0.7812 +0.0625 0.0625 0.8125 +0.0625 0.0625 0.8438 +0.0625 0.0625 0.875 +0.0625 0.0625 0.9062 +0.0625 0.0625 0.9375 +0.0625 0.0625 0.9688 +0.0625 0.0625 1 +0.0625 0.09375 0 +0.0625 0.09375 0.03125 +0.0625 0.09375 0.0625 +0.0625 0.09375 0.09375 +0.0625 0.09375 0.125 +0.0625 0.09375 0.1562 +0.0625 0.09375 0.1875 +0.0625 0.09375 0.2188 +0.0625 0.09375 0.25 +0.0625 0.09375 0.2812 +0.0625 0.09375 0.3125 +0.0625 0.09375 0.3438 +0.0625 0.09375 0.375 +0.0625 0.09375 0.4062 +0.0625 0.09375 0.4375 +0.0625 0.09375 0.4688 +0.0625 0.09375 0.5 +0.0625 0.09375 0.5312 +0.0625 0.09375 0.5625 +0.0625 0.09375 0.5938 +0.0625 0.09375 0.625 +0.0625 0.09375 0.6562 +0.0625 0.09375 0.6875 +0.0625 0.09375 0.7188 +0.0625 0.09375 0.75 +0.0625 0.09375 0.7812 +0.0625 0.09375 0.8125 +0.0625 0.09375 0.8438 +0.0625 0.09375 0.875 +0.0625 0.09375 0.9062 +0.0625 0.09375 0.9375 +0.0625 0.09375 0.9688 +0.0625 0.09375 1 +0.0625 0.125 0 +0.0625 0.125 0.03125 +0.0625 0.125 0.0625 +0.0625 0.125 0.09375 +0.0625 0.125 0.125 +0.0625 0.125 0.1562 +0.0625 0.125 0.1875 +0.0625 0.125 0.2188 +0.0625 0.125 0.25 +0.0625 0.125 0.2812 +0.0625 0.125 0.3125 +0.0625 0.125 0.3438 +0.0625 0.125 0.375 +0.0625 0.125 0.4062 +0.0625 0.125 0.4375 +0.0625 0.125 0.4688 +0.0625 0.125 0.5 +0.0625 0.125 0.5312 +0.0625 0.125 0.5625 +0.0625 0.125 0.5938 +0.0625 0.125 0.625 +0.0625 0.125 0.6562 +0.0625 0.125 0.6875 +0.0625 0.125 0.7188 +0.0625 0.125 0.75 +0.0625 0.125 0.7812 +0.0625 0.125 0.8125 +0.0625 0.125 0.8438 +0.0625 0.125 0.875 +0.0625 0.125 0.9062 +0.0625 0.125 0.9375 +0.0625 0.125 0.9688 +0.0625 0.125 1 +0.0625 0.1562 0 +0.0625 0.1562 0.03125 +0.0625 0.1562 0.0625 +0.0625 0.1562 0.09375 +0.0625 0.1562 0.125 +0.0625 0.1562 0.1562 +0.0625 0.1562 0.1875 +0.0625 0.1562 0.2188 +0.0625 0.1562 0.25 +0.0625 0.1562 0.2812 +0.0625 0.1562 0.3125 +0.0625 0.1562 0.3438 +0.0625 0.1562 0.375 +0.0625 0.1562 0.4062 +0.0625 0.1562 0.4375 +0.0625 0.1562 0.4688 +0.0625 0.1562 0.5 +0.0625 0.1562 0.5312 +0.0625 0.1562 0.5625 +0.0625 0.1562 0.5938 +0.0625 0.1562 0.625 +0.0625 0.1562 0.6562 +0.0625 0.1562 0.6875 +0.0625 0.1562 0.7188 +0.0625 0.1562 0.75 +0.0625 0.1562 0.7812 +0.0625 0.1562 0.8125 +0.0625 0.1562 0.8438 +0.0625 0.1562 0.875 +0.0625 0.1562 0.9062 +0.0625 0.1562 0.9375 +0.0625 0.1562 0.9688 +0.0625 0.1562 1 +0.0625 0.1875 0 +0.0625 0.1875 0.03125 +0.0625 0.1875 0.0625 +0.0625 0.1875 0.09375 +0.0625 0.1875 0.125 +0.0625 0.1875 0.1562 +0.0625 0.1875 0.1875 +0.0625 0.1875 0.2188 +0.0625 0.1875 0.25 +0.0625 0.1875 0.2812 +0.0625 0.1875 0.3125 +0.0625 0.1875 0.3438 +0.0625 0.1875 0.375 +0.0625 0.1875 0.4062 +0.0625 0.1875 0.4375 +0.0625 0.1875 0.4688 +0.0625 0.1875 0.5 +0.0625 0.1875 0.5312 +0.0625 0.1875 0.5625 +0.0625 0.1875 0.5938 +0.0625 0.1875 0.625 +0.0625 0.1875 0.6562 +0.0625 0.1875 0.6875 +0.0625 0.1875 0.7188 +0.0625 0.1875 0.75 +0.0625 0.1875 0.7812 +0.0625 0.1875 0.8125 +0.0625 0.1875 0.8438 +0.0625 0.1875 0.875 +0.0625 0.1875 0.9062 +0.0625 0.1875 0.9375 +0.0625 0.1875 0.9688 +0.0625 0.1875 1 +0.0625 0.2188 0 +0.0625 0.2188 0.03125 +0.0625 0.2188 0.0625 +0.0625 0.2188 0.09375 +0.0625 0.2188 0.125 +0.0625 0.2188 0.1562 +0.0625 0.2188 0.1875 +0.0625 0.2188 0.2188 +0.0625 0.2188 0.25 +0.0625 0.2188 0.2812 +0.0625 0.2188 0.3125 +0.0625 0.2188 0.3438 +0.0625 0.2188 0.375 +0.0625 0.2188 0.4062 +0.0625 0.2188 0.4375 +0.0625 0.2188 0.4688 +0.0625 0.2188 0.5 +0.0625 0.2188 0.5312 +0.0625 0.2188 0.5625 +0.0625 0.2188 0.5938 +0.0625 0.2188 0.625 +0.0625 0.2188 0.6562 +0.0625 0.2188 0.6875 +0.0625 0.2188 0.7188 +0.0625 0.2188 0.75 +0.0625 0.2188 0.7812 +0.0625 0.2188 0.8125 +0.0625 0.2188 0.8438 +0.0625 0.2188 0.875 +0.0625 0.2188 0.9062 +0.0625 0.2188 0.9375 +0.0625 0.2188 0.9688 +0.0625 0.2188 1 +0.0625 0.25 0 +0.0625 0.25 0.03125 +0.0625 0.25 0.0625 +0.0625 0.25 0.09375 +0.0625 0.25 0.125 +0.0625 0.25 0.1562 +0.0625 0.25 0.1875 +0.0625 0.25 0.2188 +0.0625 0.25 0.25 +0.0625 0.25 0.2812 +0.0625 0.25 0.3125 +0.0625 0.25 0.3438 +0.0625 0.25 0.375 +0.0625 0.25 0.4062 +0.0625 0.25 0.4375 +0.0625 0.25 0.4688 +0.0625 0.25 0.5 +0.0625 0.25 0.5312 +0.0625 0.25 0.5625 +0.0625 0.25 0.5938 +0.0625 0.25 0.625 +0.0625 0.25 0.6562 +0.0625 0.25 0.6875 +0.0625 0.25 0.7188 +0.0625 0.25 0.75 +0.0625 0.25 0.7812 +0.0625 0.25 0.8125 +0.0625 0.25 0.8438 +0.0625 0.25 0.875 +0.0625 0.25 0.9062 +0.0625 0.25 0.9375 +0.0625 0.25 0.9688 +0.0625 0.25 1 +0.0625 0.2812 0 +0.0625 0.2812 0.03125 +0.0625 0.2812 0.0625 +0.0625 0.2812 0.09375 +0.0625 0.2812 0.125 +0.0625 0.2812 0.1562 +0.0625 0.2812 0.1875 +0.0625 0.2812 0.2188 +0.0625 0.2812 0.25 +0.0625 0.2812 0.2812 +0.0625 0.2812 0.3125 +0.0625 0.2812 0.3438 +0.0625 0.2812 0.375 +0.0625 0.2812 0.4062 +0.0625 0.2812 0.4375 +0.0625 0.2812 0.4688 +0.0625 0.2812 0.5 +0.0625 0.2812 0.5312 +0.0625 0.2812 0.5625 +0.0625 0.2812 0.5938 +0.0625 0.2812 0.625 +0.0625 0.2812 0.6562 +0.0625 0.2812 0.6875 +0.0625 0.2812 0.7188 +0.0625 0.2812 0.75 +0.0625 0.2812 0.7812 +0.0625 0.2812 0.8125 +0.0625 0.2812 0.8438 +0.0625 0.2812 0.875 +0.0625 0.2812 0.9062 +0.0625 0.2812 0.9375 +0.0625 0.2812 0.9688 +0.0625 0.2812 1 +0.0625 0.3125 0 +0.0625 0.3125 0.03125 +0.0625 0.3125 0.0625 +0.0625 0.3125 0.09375 +0.0625 0.3125 0.125 +0.0625 0.3125 0.1562 +0.0625 0.3125 0.1875 +0.0625 0.3125 0.2188 +0.0625 0.3125 0.25 +0.0625 0.3125 0.2812 +0.0625 0.3125 0.3125 +0.0625 0.3125 0.3438 +0.0625 0.3125 0.375 +0.0625 0.3125 0.4062 +0.0625 0.3125 0.4375 +0.0625 0.3125 0.4688 +0.0625 0.3125 0.5 +0.0625 0.3125 0.5312 +0.0625 0.3125 0.5625 +0.0625 0.3125 0.5938 +0.0625 0.3125 0.625 +0.0625 0.3125 0.6562 +0.0625 0.3125 0.6875 +0.0625 0.3125 0.7188 +0.0625 0.3125 0.75 +0.0625 0.3125 0.7812 +0.0625 0.3125 0.8125 +0.0625 0.3125 0.8438 +0.0625 0.3125 0.875 +0.0625 0.3125 0.9062 +0.0625 0.3125 0.9375 +0.0625 0.3125 0.9688 +0.0625 0.3125 1 +0.0625 0.3438 0 +0.0625 0.3438 0.03125 +0.0625 0.3438 0.0625 +0.0625 0.3438 0.09375 +0.0625 0.3438 0.125 +0.0625 0.3438 0.1562 +0.0625 0.3438 0.1875 +0.0625 0.3438 0.2188 +0.0625 0.3438 0.25 +0.0625 0.3438 0.2812 +0.0625 0.3438 0.3125 +0.0625 0.3438 0.3438 +0.0625 0.3438 0.375 +0.0625 0.3438 0.4062 +0.0625 0.3438 0.4375 +0.0625 0.3438 0.4688 +0.0625 0.3438 0.5 +0.0625 0.3438 0.5312 +0.0625 0.3438 0.5625 +0.0625 0.3438 0.5938 +0.0625 0.3438 0.625 +0.0625 0.3438 0.6562 +0.0625 0.3438 0.6875 +0.0625 0.3438 0.7188 +0.0625 0.3438 0.75 +0.0625 0.3438 0.7812 +0.0625 0.3438 0.8125 +0.0625 0.3438 0.8438 +0.0625 0.3438 0.875 +0.0625 0.3438 0.9062 +0.0625 0.3438 0.9375 +0.0625 0.3438 0.9688 +0.0625 0.3438 1 +0.0625 0.375 0 +0.0625 0.375 0.03125 +0.0625 0.375 0.0625 +0.0625 0.375 0.09375 +0.0625 0.375 0.125 +0.0625 0.375 0.1562 +0.0625 0.375 0.1875 +0.0625 0.375 0.2188 +0.0625 0.375 0.25 +0.0625 0.375 0.2812 +0.0625 0.375 0.3125 +0.0625 0.375 0.3438 +0.0625 0.375 0.375 +0.0625 0.375 0.4062 +0.0625 0.375 0.4375 +0.0625 0.375 0.4688 +0.0625 0.375 0.5 +0.0625 0.375 0.5312 +0.0625 0.375 0.5625 +0.0625 0.375 0.5938 +0.0625 0.375 0.625 +0.0625 0.375 0.6562 +0.0625 0.375 0.6875 +0.0625 0.375 0.7188 +0.0625 0.375 0.75 +0.0625 0.375 0.7812 +0.0625 0.375 0.8125 +0.0625 0.375 0.8438 +0.0625 0.375 0.875 +0.0625 0.375 0.9062 +0.0625 0.375 0.9375 +0.0625 0.375 0.9688 +0.0625 0.375 1 +0.0625 0.4062 0 +0.0625 0.4062 0.03125 +0.0625 0.4062 0.0625 +0.0625 0.4062 0.09375 +0.0625 0.4062 0.125 +0.0625 0.4062 0.1562 +0.0625 0.4062 0.1875 +0.0625 0.4062 0.2188 +0.0625 0.4062 0.25 +0.0625 0.4062 0.2812 +0.0625 0.4062 0.3125 +0.0625 0.4062 0.3438 +0.0625 0.4062 0.375 +0.0625 0.4062 0.4062 +0.0625 0.4062 0.4375 +0.0625 0.4062 0.4688 +0.0625 0.4062 0.5 +0.0625 0.4062 0.5312 +0.0625 0.4062 0.5625 +0.0625 0.4062 0.5938 +0.0625 0.4062 0.625 +0.0625 0.4062 0.6562 +0.0625 0.4062 0.6875 +0.0625 0.4062 0.7188 +0.0625 0.4062 0.75 +0.0625 0.4062 0.7812 +0.0625 0.4062 0.8125 +0.0625 0.4062 0.8438 +0.0625 0.4062 0.875 +0.0625 0.4062 0.9062 +0.0625 0.4062 0.9375 +0.0625 0.4062 0.9688 +0.0625 0.4062 1 +0.0625 0.4375 0 +0.0625 0.4375 0.03125 +0.0625 0.4375 0.0625 +0.0625 0.4375 0.09375 +0.0625 0.4375 0.125 +0.0625 0.4375 0.1562 +0.0625 0.4375 0.1875 +0.0625 0.4375 0.2188 +0.0625 0.4375 0.25 +0.0625 0.4375 0.2812 +0.0625 0.4375 0.3125 +0.0625 0.4375 0.3438 +0.0625 0.4375 0.375 +0.0625 0.4375 0.4062 +0.0625 0.4375 0.4375 +0.0625 0.4375 0.4688 +0.0625 0.4375 0.5 +0.0625 0.4375 0.5312 +0.0625 0.4375 0.5625 +0.0625 0.4375 0.5938 +0.0625 0.4375 0.625 +0.0625 0.4375 0.6562 +0.0625 0.4375 0.6875 +0.0625 0.4375 0.7188 +0.0625 0.4375 0.75 +0.0625 0.4375 0.7812 +0.0625 0.4375 0.8125 +0.0625 0.4375 0.8438 +0.0625 0.4375 0.875 +0.0625 0.4375 0.9062 +0.0625 0.4375 0.9375 +0.0625 0.4375 0.9688 +0.0625 0.4375 1 +0.0625 0.4688 0 +0.0625 0.4688 0.03125 +0.0625 0.4688 0.0625 +0.0625 0.4688 0.09375 +0.0625 0.4688 0.125 +0.0625 0.4688 0.1562 +0.0625 0.4688 0.1875 +0.0625 0.4688 0.2188 +0.0625 0.4688 0.25 +0.0625 0.4688 0.2812 +0.0625 0.4688 0.3125 +0.0625 0.4688 0.3438 +0.0625 0.4688 0.375 +0.0625 0.4688 0.4062 +0.0625 0.4688 0.4375 +0.0625 0.4688 0.4688 +0.0625 0.4688 0.5 +0.0625 0.4688 0.5312 +0.0625 0.4688 0.5625 +0.0625 0.4688 0.5938 +0.0625 0.4688 0.625 +0.0625 0.4688 0.6562 +0.0625 0.4688 0.6875 +0.0625 0.4688 0.7188 +0.0625 0.4688 0.75 +0.0625 0.4688 0.7812 +0.0625 0.4688 0.8125 +0.0625 0.4688 0.8438 +0.0625 0.4688 0.875 +0.0625 0.4688 0.9062 +0.0625 0.4688 0.9375 +0.0625 0.4688 0.9688 +0.0625 0.4688 1 +0.0625 0.5 0 +0.0625 0.5 0.03125 +0.0625 0.5 0.0625 +0.0625 0.5 0.09375 +0.0625 0.5 0.125 +0.0625 0.5 0.1562 +0.0625 0.5 0.1875 +0.0625 0.5 0.2188 +0.0625 0.5 0.25 +0.0625 0.5 0.2812 +0.0625 0.5 0.3125 +0.0625 0.5 0.3438 +0.0625 0.5 0.375 +0.0625 0.5 0.4062 +0.0625 0.5 0.4375 +0.0625 0.5 0.4688 +0.0625 0.5 0.5 +0.0625 0.5 0.5312 +0.0625 0.5 0.5625 +0.0625 0.5 0.5938 +0.0625 0.5 0.625 +0.0625 0.5 0.6562 +0.0625 0.5 0.6875 +0.0625 0.5 0.7188 +0.0625 0.5 0.75 +0.0625 0.5 0.7812 +0.0625 0.5 0.8125 +0.0625 0.5 0.8438 +0.0625 0.5 0.875 +0.0625 0.5 0.9062 +0.0625 0.5 0.9375 +0.0625 0.5 0.9688 +0.0625 0.5 1 +0.0625 0.5312 0 +0.0625 0.5312 0.03125 +0.0625 0.5312 0.0625 +0.0625 0.5312 0.09375 +0.0625 0.5312 0.125 +0.0625 0.5312 0.1562 +0.0625 0.5312 0.1875 +0.0625 0.5312 0.2188 +0.0625 0.5312 0.25 +0.0625 0.5312 0.2812 +0.0625 0.5312 0.3125 +0.0625 0.5312 0.3438 +0.0625 0.5312 0.375 +0.0625 0.5312 0.4062 +0.0625 0.5312 0.4375 +0.0625 0.5312 0.4688 +0.0625 0.5312 0.5 +0.0625 0.5312 0.5312 +0.0625 0.5312 0.5625 +0.0625 0.5312 0.5938 +0.0625 0.5312 0.625 +0.0625 0.5312 0.6562 +0.0625 0.5312 0.6875 +0.0625 0.5312 0.7188 +0.0625 0.5312 0.75 +0.0625 0.5312 0.7812 +0.0625 0.5312 0.8125 +0.0625 0.5312 0.8438 +0.0625 0.5312 0.875 +0.0625 0.5312 0.9062 +0.0625 0.5312 0.9375 +0.0625 0.5312 0.9688 +0.0625 0.5312 1 +0.0625 0.5625 0 +0.0625 0.5625 0.03125 +0.0625 0.5625 0.0625 +0.0625 0.5625 0.09375 +0.0625 0.5625 0.125 +0.0625 0.5625 0.1562 +0.0625 0.5625 0.1875 +0.0625 0.5625 0.2188 +0.0625 0.5625 0.25 +0.0625 0.5625 0.2812 +0.0625 0.5625 0.3125 +0.0625 0.5625 0.3438 +0.0625 0.5625 0.375 +0.0625 0.5625 0.4062 +0.0625 0.5625 0.4375 +0.0625 0.5625 0.4688 +0.0625 0.5625 0.5 +0.0625 0.5625 0.5312 +0.0625 0.5625 0.5625 +0.0625 0.5625 0.5938 +0.0625 0.5625 0.625 +0.0625 0.5625 0.6562 +0.0625 0.5625 0.6875 +0.0625 0.5625 0.7188 +0.0625 0.5625 0.75 +0.0625 0.5625 0.7812 +0.0625 0.5625 0.8125 +0.0625 0.5625 0.8438 +0.0625 0.5625 0.875 +0.0625 0.5625 0.9062 +0.0625 0.5625 0.9375 +0.0625 0.5625 0.9688 +0.0625 0.5625 1 +0.0625 0.5938 0 +0.0625 0.5938 0.03125 +0.0625 0.5938 0.0625 +0.0625 0.5938 0.09375 +0.0625 0.5938 0.125 +0.0625 0.5938 0.1562 +0.0625 0.5938 0.1875 +0.0625 0.5938 0.2188 +0.0625 0.5938 0.25 +0.0625 0.5938 0.2812 +0.0625 0.5938 0.3125 +0.0625 0.5938 0.3438 +0.0625 0.5938 0.375 +0.0625 0.5938 0.4062 +0.0625 0.5938 0.4375 +0.0625 0.5938 0.4688 +0.0625 0.5938 0.5 +0.0625 0.5938 0.5312 +0.0625 0.5938 0.5625 +0.0625 0.5938 0.5938 +0.0625 0.5938 0.625 +0.0625 0.5938 0.6562 +0.0625 0.5938 0.6875 +0.0625 0.5938 0.7188 +0.0625 0.5938 0.75 +0.0625 0.5938 0.7812 +0.0625 0.5938 0.8125 +0.0625 0.5938 0.8438 +0.0625 0.5938 0.875 +0.0625 0.5938 0.9062 +0.0625 0.5938 0.9375 +0.0625 0.5938 0.9688 +0.0625 0.5938 1 +0.0625 0.625 0 +0.0625 0.625 0.03125 +0.0625 0.625 0.0625 +0.0625 0.625 0.09375 +0.0625 0.625 0.125 +0.0625 0.625 0.1562 +0.0625 0.625 0.1875 +0.0625 0.625 0.2188 +0.0625 0.625 0.25 +0.0625 0.625 0.2812 +0.0625 0.625 0.3125 +0.0625 0.625 0.3438 +0.0625 0.625 0.375 +0.0625 0.625 0.4062 +0.0625 0.625 0.4375 +0.0625 0.625 0.4688 +0.0625 0.625 0.5 +0.0625 0.625 0.5312 +0.0625 0.625 0.5625 +0.0625 0.625 0.5938 +0.0625 0.625 0.625 +0.0625 0.625 0.6562 +0.0625 0.625 0.6875 +0.0625 0.625 0.7188 +0.0625 0.625 0.75 +0.0625 0.625 0.7812 +0.0625 0.625 0.8125 +0.0625 0.625 0.8438 +0.0625 0.625 0.875 +0.0625 0.625 0.9062 +0.0625 0.625 0.9375 +0.0625 0.625 0.9688 +0.0625 0.625 1 +0.0625 0.6562 0 +0.0625 0.6562 0.03125 +0.0625 0.6562 0.0625 +0.0625 0.6562 0.09375 +0.0625 0.6562 0.125 +0.0625 0.6562 0.1562 +0.0625 0.6562 0.1875 +0.0625 0.6562 0.2188 +0.0625 0.6562 0.25 +0.0625 0.6562 0.2812 +0.0625 0.6562 0.3125 +0.0625 0.6562 0.3438 +0.0625 0.6562 0.375 +0.0625 0.6562 0.4062 +0.0625 0.6562 0.4375 +0.0625 0.6562 0.4688 +0.0625 0.6562 0.5 +0.0625 0.6562 0.5312 +0.0625 0.6562 0.5625 +0.0625 0.6562 0.5938 +0.0625 0.6562 0.625 +0.0625 0.6562 0.6562 +0.0625 0.6562 0.6875 +0.0625 0.6562 0.7188 +0.0625 0.6562 0.75 +0.0625 0.6562 0.7812 +0.0625 0.6562 0.8125 +0.0625 0.6562 0.8438 +0.0625 0.6562 0.875 +0.0625 0.6562 0.9062 +0.0625 0.6562 0.9375 +0.0625 0.6562 0.9688 +0.0625 0.6562 1 +0.0625 0.6875 0 +0.0625 0.6875 0.03125 +0.0625 0.6875 0.0625 +0.0625 0.6875 0.09375 +0.0625 0.6875 0.125 +0.0625 0.6875 0.1562 +0.0625 0.6875 0.1875 +0.0625 0.6875 0.2188 +0.0625 0.6875 0.25 +0.0625 0.6875 0.2812 +0.0625 0.6875 0.3125 +0.0625 0.6875 0.3438 +0.0625 0.6875 0.375 +0.0625 0.6875 0.4062 +0.0625 0.6875 0.4375 +0.0625 0.6875 0.4688 +0.0625 0.6875 0.5 +0.0625 0.6875 0.5312 +0.0625 0.6875 0.5625 +0.0625 0.6875 0.5938 +0.0625 0.6875 0.625 +0.0625 0.6875 0.6562 +0.0625 0.6875 0.6875 +0.0625 0.6875 0.7188 +0.0625 0.6875 0.75 +0.0625 0.6875 0.7812 +0.0625 0.6875 0.8125 +0.0625 0.6875 0.8438 +0.0625 0.6875 0.875 +0.0625 0.6875 0.9062 +0.0625 0.6875 0.9375 +0.0625 0.6875 0.9688 +0.0625 0.6875 1 +0.0625 0.7188 0 +0.0625 0.7188 0.03125 +0.0625 0.7188 0.0625 +0.0625 0.7188 0.09375 +0.0625 0.7188 0.125 +0.0625 0.7188 0.1562 +0.0625 0.7188 0.1875 +0.0625 0.7188 0.2188 +0.0625 0.7188 0.25 +0.0625 0.7188 0.2812 +0.0625 0.7188 0.3125 +0.0625 0.7188 0.3438 +0.0625 0.7188 0.375 +0.0625 0.7188 0.4062 +0.0625 0.7188 0.4375 +0.0625 0.7188 0.4688 +0.0625 0.7188 0.5 +0.0625 0.7188 0.5312 +0.0625 0.7188 0.5625 +0.0625 0.7188 0.5938 +0.0625 0.7188 0.625 +0.0625 0.7188 0.6562 +0.0625 0.7188 0.6875 +0.0625 0.7188 0.7188 +0.0625 0.7188 0.75 +0.0625 0.7188 0.7812 +0.0625 0.7188 0.8125 +0.0625 0.7188 0.8438 +0.0625 0.7188 0.875 +0.0625 0.7188 0.9062 +0.0625 0.7188 0.9375 +0.0625 0.7188 0.9688 +0.0625 0.7188 1 +0.0625 0.75 0 +0.0625 0.75 0.03125 +0.0625 0.75 0.0625 +0.0625 0.75 0.09375 +0.0625 0.75 0.125 +0.0625 0.75 0.1562 +0.0625 0.75 0.1875 +0.0625 0.75 0.2188 +0.0625 0.75 0.25 +0.0625 0.75 0.2812 +0.0625 0.75 0.3125 +0.0625 0.75 0.3438 +0.0625 0.75 0.375 +0.0625 0.75 0.4062 +0.0625 0.75 0.4375 +0.0625 0.75 0.4688 +0.0625 0.75 0.5 +0.0625 0.75 0.5312 +0.0625 0.75 0.5625 +0.0625 0.75 0.5938 +0.0625 0.75 0.625 +0.0625 0.75 0.6562 +0.0625 0.75 0.6875 +0.0625 0.75 0.7188 +0.0625 0.75 0.75 +0.0625 0.75 0.7812 +0.0625 0.75 0.8125 +0.0625 0.75 0.8438 +0.0625 0.75 0.875 +0.0625 0.75 0.9062 +0.0625 0.75 0.9375 +0.0625 0.75 0.9688 +0.0625 0.75 1 +0.0625 0.7812 0 +0.0625 0.7812 0.03125 +0.0625 0.7812 0.0625 +0.0625 0.7812 0.09375 +0.0625 0.7812 0.125 +0.0625 0.7812 0.1562 +0.0625 0.7812 0.1875 +0.0625 0.7812 0.2188 +0.0625 0.7812 0.25 +0.0625 0.7812 0.2812 +0.0625 0.7812 0.3125 +0.0625 0.7812 0.3438 +0.0625 0.7812 0.375 +0.0625 0.7812 0.4062 +0.0625 0.7812 0.4375 +0.0625 0.7812 0.4688 +0.0625 0.7812 0.5 +0.0625 0.7812 0.5312 +0.0625 0.7812 0.5625 +0.0625 0.7812 0.5938 +0.0625 0.7812 0.625 +0.0625 0.7812 0.6562 +0.0625 0.7812 0.6875 +0.0625 0.7812 0.7188 +0.0625 0.7812 0.75 +0.0625 0.7812 0.7812 +0.0625 0.7812 0.8125 +0.0625 0.7812 0.8438 +0.0625 0.7812 0.875 +0.0625 0.7812 0.9062 +0.0625 0.7812 0.9375 +0.0625 0.7812 0.9688 +0.0625 0.7812 1 +0.0625 0.8125 0 +0.0625 0.8125 0.03125 +0.0625 0.8125 0.0625 +0.0625 0.8125 0.09375 +0.0625 0.8125 0.125 +0.0625 0.8125 0.1562 +0.0625 0.8125 0.1875 +0.0625 0.8125 0.2188 +0.0625 0.8125 0.25 +0.0625 0.8125 0.2812 +0.0625 0.8125 0.3125 +0.0625 0.8125 0.3438 +0.0625 0.8125 0.375 +0.0625 0.8125 0.4062 +0.0625 0.8125 0.4375 +0.0625 0.8125 0.4688 +0.0625 0.8125 0.5 +0.0625 0.8125 0.5312 +0.0625 0.8125 0.5625 +0.0625 0.8125 0.5938 +0.0625 0.8125 0.625 +0.0625 0.8125 0.6562 +0.0625 0.8125 0.6875 +0.0625 0.8125 0.7188 +0.0625 0.8125 0.75 +0.0625 0.8125 0.7812 +0.0625 0.8125 0.8125 +0.0625 0.8125 0.8438 +0.0625 0.8125 0.875 +0.0625 0.8125 0.9062 +0.0625 0.8125 0.9375 +0.0625 0.8125 0.9688 +0.0625 0.8125 1 +0.0625 0.8438 0 +0.0625 0.8438 0.03125 +0.0625 0.8438 0.0625 +0.0625 0.8438 0.09375 +0.0625 0.8438 0.125 +0.0625 0.8438 0.1562 +0.0625 0.8438 0.1875 +0.0625 0.8438 0.2188 +0.0625 0.8438 0.25 +0.0625 0.8438 0.2812 +0.0625 0.8438 0.3125 +0.0625 0.8438 0.3438 +0.0625 0.8438 0.375 +0.0625 0.8438 0.4062 +0.0625 0.8438 0.4375 +0.0625 0.8438 0.4688 +0.0625 0.8438 0.5 +0.0625 0.8438 0.5312 +0.0625 0.8438 0.5625 +0.0625 0.8438 0.5938 +0.0625 0.8438 0.625 +0.0625 0.8438 0.6562 +0.0625 0.8438 0.6875 +0.0625 0.8438 0.7188 +0.0625 0.8438 0.75 +0.0625 0.8438 0.7812 +0.0625 0.8438 0.8125 +0.0625 0.8438 0.8438 +0.0625 0.8438 0.875 +0.0625 0.8438 0.9062 +0.0625 0.8438 0.9375 +0.0625 0.8438 0.9688 +0.0625 0.8438 1 +0.0625 0.875 0 +0.0625 0.875 0.03125 +0.0625 0.875 0.0625 +0.0625 0.875 0.09375 +0.0625 0.875 0.125 +0.0625 0.875 0.1562 +0.0625 0.875 0.1875 +0.0625 0.875 0.2188 +0.0625 0.875 0.25 +0.0625 0.875 0.2812 +0.0625 0.875 0.3125 +0.0625 0.875 0.3438 +0.0625 0.875 0.375 +0.0625 0.875 0.4062 +0.0625 0.875 0.4375 +0.0625 0.875 0.4688 +0.0625 0.875 0.5 +0.0625 0.875 0.5312 +0.0625 0.875 0.5625 +0.0625 0.875 0.5938 +0.0625 0.875 0.625 +0.0625 0.875 0.6562 +0.0625 0.875 0.6875 +0.0625 0.875 0.7188 +0.0625 0.875 0.75 +0.0625 0.875 0.7812 +0.0625 0.875 0.8125 +0.0625 0.875 0.8438 +0.0625 0.875 0.875 +0.0625 0.875 0.9062 +0.0625 0.875 0.9375 +0.0625 0.875 0.9688 +0.0625 0.875 1 +0.0625 0.9062 0 +0.0625 0.9062 0.03125 +0.0625 0.9062 0.0625 +0.0625 0.9062 0.09375 +0.0625 0.9062 0.125 +0.0625 0.9062 0.1562 +0.0625 0.9062 0.1875 +0.0625 0.9062 0.2188 +0.0625 0.9062 0.25 +0.0625 0.9062 0.2812 +0.0625 0.9062 0.3125 +0.0625 0.9062 0.3438 +0.0625 0.9062 0.375 +0.0625 0.9062 0.4062 +0.0625 0.9062 0.4375 +0.0625 0.9062 0.4688 +0.0625 0.9062 0.5 +0.0625 0.9062 0.5312 +0.0625 0.9062 0.5625 +0.0625 0.9062 0.5938 +0.0625 0.9062 0.625 +0.0625 0.9062 0.6562 +0.0625 0.9062 0.6875 +0.0625 0.9062 0.7188 +0.0625 0.9062 0.75 +0.0625 0.9062 0.7812 +0.0625 0.9062 0.8125 +0.0625 0.9062 0.8438 +0.0625 0.9062 0.875 +0.0625 0.9062 0.9062 +0.0625 0.9062 0.9375 +0.0625 0.9062 0.9688 +0.0625 0.9062 1 +0.0625 0.9375 0 +0.0625 0.9375 0.03125 +0.0625 0.9375 0.0625 +0.0625 0.9375 0.09375 +0.0625 0.9375 0.125 +0.0625 0.9375 0.1562 +0.0625 0.9375 0.1875 +0.0625 0.9375 0.2188 +0.0625 0.9375 0.25 +0.0625 0.9375 0.2812 +0.0625 0.9375 0.3125 +0.0625 0.9375 0.3438 +0.0625 0.9375 0.375 +0.0625 0.9375 0.4062 +0.0625 0.9375 0.4375 +0.0625 0.9375 0.4688 +0.0625 0.9375 0.5 +0.0625 0.9375 0.5312 +0.0625 0.9375 0.5625 +0.0625 0.9375 0.5938 +0.0625 0.9375 0.625 +0.0625 0.9375 0.6562 +0.0625 0.9375 0.6875 +0.0625 0.9375 0.7188 +0.0625 0.9375 0.75 +0.0625 0.9375 0.7812 +0.0625 0.9375 0.8125 +0.0625 0.9375 0.8438 +0.0625 0.9375 0.875 +0.0625 0.9375 0.9062 +0.0625 0.9375 0.9375 +0.0625 0.9375 0.9688 +0.0625 0.9375 1 +0.0625 0.9688 0 +0.0625 0.9688 0.03125 +0.0625 0.9688 0.0625 +0.0625 0.9688 0.09375 +0.0625 0.9688 0.125 +0.0625 0.9688 0.1562 +0.0625 0.9688 0.1875 +0.0625 0.9688 0.2188 +0.0625 0.9688 0.25 +0.0625 0.9688 0.2812 +0.0625 0.9688 0.3125 +0.0625 0.9688 0.3438 +0.0625 0.9688 0.375 +0.0625 0.9688 0.4062 +0.0625 0.9688 0.4375 +0.0625 0.9688 0.4688 +0.0625 0.9688 0.5 +0.0625 0.9688 0.5312 +0.0625 0.9688 0.5625 +0.0625 0.9688 0.5938 +0.0625 0.9688 0.625 +0.0625 0.9688 0.6562 +0.0625 0.9688 0.6875 +0.0625 0.9688 0.7188 +0.0625 0.9688 0.75 +0.0625 0.9688 0.7812 +0.0625 0.9688 0.8125 +0.0625 0.9688 0.8438 +0.0625 0.9688 0.875 +0.0625 0.9688 0.9062 +0.0625 0.9688 0.9375 +0.0625 0.9688 0.9688 +0.0625 0.9688 1 +0.0625 1 0 +0.0625 1 0.03125 +0.0625 1 0.0625 +0.0625 1 0.09375 +0.0625 1 0.125 +0.0625 1 0.1562 +0.0625 1 0.1875 +0.0625 1 0.2188 +0.0625 1 0.25 +0.0625 1 0.2812 +0.0625 1 0.3125 +0.0625 1 0.3438 +0.0625 1 0.375 +0.0625 1 0.4062 +0.0625 1 0.4375 +0.0625 1 0.4688 +0.0625 1 0.5 +0.0625 1 0.5312 +0.0625 1 0.5625 +0.0625 1 0.5938 +0.0625 1 0.625 +0.0625 1 0.6562 +0.0625 1 0.6875 +0.0625 1 0.7188 +0.0625 1 0.75 +0.0625 1 0.7812 +0.0625 1 0.8125 +0.0625 1 0.8438 +0.0625 1 0.875 +0.0625 1 0.9062 +0.0625 1 0.9375 +0.0625 1 0.9688 +0.0625 1 1 +0.09375 0 0 +0.09375 0 0.03125 +0.09375 0 0.0625 +0.09375 0 0.09375 +0.09375 0 0.125 +0.09375 0 0.1562 +0.09375 0 0.1875 +0.09375 0 0.2188 +0.09375 0 0.25 +0.09375 0 0.2812 +0.09375 0 0.3125 +0.09375 0 0.3438 +0.09375 0 0.375 +0.09375 0 0.4062 +0.09375 0 0.4375 +0.09375 0 0.4688 +0.09375 0 0.5 +0.09375 0 0.5312 +0.09375 0 0.5625 +0.09375 0 0.5938 +0.09375 0 0.625 +0.09375 0 0.6562 +0.09375 0 0.6875 +0.09375 0 0.7188 +0.09375 0 0.75 +0.09375 0 0.7812 +0.09375 0 0.8125 +0.09375 0 0.8438 +0.09375 0 0.875 +0.09375 0 0.9062 +0.09375 0 0.9375 +0.09375 0 0.9688 +0.09375 0 1 +0.09375 0.03125 0 +0.09375 0.03125 0.03125 +0.09375 0.03125 0.0625 +0.09375 0.03125 0.09375 +0.09375 0.03125 0.125 +0.09375 0.03125 0.1562 +0.09375 0.03125 0.1875 +0.09375 0.03125 0.2188 +0.09375 0.03125 0.25 +0.09375 0.03125 0.2812 +0.09375 0.03125 0.3125 +0.09375 0.03125 0.3438 +0.09375 0.03125 0.375 +0.09375 0.03125 0.4062 +0.09375 0.03125 0.4375 +0.09375 0.03125 0.4688 +0.09375 0.03125 0.5 +0.09375 0.03125 0.5312 +0.09375 0.03125 0.5625 +0.09375 0.03125 0.5938 +0.09375 0.03125 0.625 +0.09375 0.03125 0.6562 +0.09375 0.03125 0.6875 +0.09375 0.03125 0.7188 +0.09375 0.03125 0.75 +0.09375 0.03125 0.7812 +0.09375 0.03125 0.8125 +0.09375 0.03125 0.8438 +0.09375 0.03125 0.875 +0.09375 0.03125 0.9062 +0.09375 0.03125 0.9375 +0.09375 0.03125 0.9688 +0.09375 0.03125 1 +0.09375 0.0625 0 +0.09375 0.0625 0.03125 +0.09375 0.0625 0.0625 +0.09375 0.0625 0.09375 +0.09375 0.0625 0.125 +0.09375 0.0625 0.1562 +0.09375 0.0625 0.1875 +0.09375 0.0625 0.2188 +0.09375 0.0625 0.25 +0.09375 0.0625 0.2812 +0.09375 0.0625 0.3125 +0.09375 0.0625 0.3438 +0.09375 0.0625 0.375 +0.09375 0.0625 0.4062 +0.09375 0.0625 0.4375 +0.09375 0.0625 0.4688 +0.09375 0.0625 0.5 +0.09375 0.0625 0.5312 +0.09375 0.0625 0.5625 +0.09375 0.0625 0.5938 +0.09375 0.0625 0.625 +0.09375 0.0625 0.6562 +0.09375 0.0625 0.6875 +0.09375 0.0625 0.7188 +0.09375 0.0625 0.75 +0.09375 0.0625 0.7812 +0.09375 0.0625 0.8125 +0.09375 0.0625 0.8438 +0.09375 0.0625 0.875 +0.09375 0.0625 0.9062 +0.09375 0.0625 0.9375 +0.09375 0.0625 0.9688 +0.09375 0.0625 1 +0.09375 0.09375 0 +0.09375 0.09375 0.03125 +0.09375 0.09375 0.0625 +0.09375 0.09375 0.09375 +0.09375 0.09375 0.125 +0.09375 0.09375 0.1562 +0.09375 0.09375 0.1875 +0.09375 0.09375 0.2188 +0.09375 0.09375 0.25 +0.09375 0.09375 0.2812 +0.09375 0.09375 0.3125 +0.09375 0.09375 0.3438 +0.09375 0.09375 0.375 +0.09375 0.09375 0.4062 +0.09375 0.09375 0.4375 +0.09375 0.09375 0.4688 +0.09375 0.09375 0.5 +0.09375 0.09375 0.5312 +0.09375 0.09375 0.5625 +0.09375 0.09375 0.5938 +0.09375 0.09375 0.625 +0.09375 0.09375 0.6562 +0.09375 0.09375 0.6875 +0.09375 0.09375 0.7188 +0.09375 0.09375 0.75 +0.09375 0.09375 0.7812 +0.09375 0.09375 0.8125 +0.09375 0.09375 0.8438 +0.09375 0.09375 0.875 +0.09375 0.09375 0.9062 +0.09375 0.09375 0.9375 +0.09375 0.09375 0.9688 +0.09375 0.09375 1 +0.09375 0.125 0 +0.09375 0.125 0.03125 +0.09375 0.125 0.0625 +0.09375 0.125 0.09375 +0.09375 0.125 0.125 +0.09375 0.125 0.1562 +0.09375 0.125 0.1875 +0.09375 0.125 0.2188 +0.09375 0.125 0.25 +0.09375 0.125 0.2812 +0.09375 0.125 0.3125 +0.09375 0.125 0.3438 +0.09375 0.125 0.375 +0.09375 0.125 0.4062 +0.09375 0.125 0.4375 +0.09375 0.125 0.4688 +0.09375 0.125 0.5 +0.09375 0.125 0.5312 +0.09375 0.125 0.5625 +0.09375 0.125 0.5938 +0.09375 0.125 0.625 +0.09375 0.125 0.6562 +0.09375 0.125 0.6875 +0.09375 0.125 0.7188 +0.09375 0.125 0.75 +0.09375 0.125 0.7812 +0.09375 0.125 0.8125 +0.09375 0.125 0.8438 +0.09375 0.125 0.875 +0.09375 0.125 0.9062 +0.09375 0.125 0.9375 +0.09375 0.125 0.9688 +0.09375 0.125 1 +0.09375 0.1562 0 +0.09375 0.1562 0.03125 +0.09375 0.1562 0.0625 +0.09375 0.1562 0.09375 +0.09375 0.1562 0.125 +0.09375 0.1562 0.1562 +0.09375 0.1562 0.1875 +0.09375 0.1562 0.2188 +0.09375 0.1562 0.25 +0.09375 0.1562 0.2812 +0.09375 0.1562 0.3125 +0.09375 0.1562 0.3438 +0.09375 0.1562 0.375 +0.09375 0.1562 0.4062 +0.09375 0.1562 0.4375 +0.09375 0.1562 0.4688 +0.09375 0.1562 0.5 +0.09375 0.1562 0.5312 +0.09375 0.1562 0.5625 +0.09375 0.1562 0.5938 +0.09375 0.1562 0.625 +0.09375 0.1562 0.6562 +0.09375 0.1562 0.6875 +0.09375 0.1562 0.7188 +0.09375 0.1562 0.75 +0.09375 0.1562 0.7812 +0.09375 0.1562 0.8125 +0.09375 0.1562 0.8438 +0.09375 0.1562 0.875 +0.09375 0.1562 0.9062 +0.09375 0.1562 0.9375 +0.09375 0.1562 0.9688 +0.09375 0.1562 1 +0.09375 0.1875 0 +0.09375 0.1875 0.03125 +0.09375 0.1875 0.0625 +0.09375 0.1875 0.09375 +0.09375 0.1875 0.125 +0.09375 0.1875 0.1562 +0.09375 0.1875 0.1875 +0.09375 0.1875 0.2188 +0.09375 0.1875 0.25 +0.09375 0.1875 0.2812 +0.09375 0.1875 0.3125 +0.09375 0.1875 0.3438 +0.09375 0.1875 0.375 +0.09375 0.1875 0.4062 +0.09375 0.1875 0.4375 +0.09375 0.1875 0.4688 +0.09375 0.1875 0.5 +0.09375 0.1875 0.5312 +0.09375 0.1875 0.5625 +0.09375 0.1875 0.5938 +0.09375 0.1875 0.625 +0.09375 0.1875 0.6562 +0.09375 0.1875 0.6875 +0.09375 0.1875 0.7188 +0.09375 0.1875 0.75 +0.09375 0.1875 0.7812 +0.09375 0.1875 0.8125 +0.09375 0.1875 0.8438 +0.09375 0.1875 0.875 +0.09375 0.1875 0.9062 +0.09375 0.1875 0.9375 +0.09375 0.1875 0.9688 +0.09375 0.1875 1 +0.09375 0.2188 0 +0.09375 0.2188 0.03125 +0.09375 0.2188 0.0625 +0.09375 0.2188 0.09375 +0.09375 0.2188 0.125 +0.09375 0.2188 0.1562 +0.09375 0.2188 0.1875 +0.09375 0.2188 0.2188 +0.09375 0.2188 0.25 +0.09375 0.2188 0.2812 +0.09375 0.2188 0.3125 +0.09375 0.2188 0.3438 +0.09375 0.2188 0.375 +0.09375 0.2188 0.4062 +0.09375 0.2188 0.4375 +0.09375 0.2188 0.4688 +0.09375 0.2188 0.5 +0.09375 0.2188 0.5312 +0.09375 0.2188 0.5625 +0.09375 0.2188 0.5938 +0.09375 0.2188 0.625 +0.09375 0.2188 0.6562 +0.09375 0.2188 0.6875 +0.09375 0.2188 0.7188 +0.09375 0.2188 0.75 +0.09375 0.2188 0.7812 +0.09375 0.2188 0.8125 +0.09375 0.2188 0.8438 +0.09375 0.2188 0.875 +0.09375 0.2188 0.9062 +0.09375 0.2188 0.9375 +0.09375 0.2188 0.9688 +0.09375 0.2188 1 +0.09375 0.25 0 +0.09375 0.25 0.03125 +0.09375 0.25 0.0625 +0.09375 0.25 0.09375 +0.09375 0.25 0.125 +0.09375 0.25 0.1562 +0.09375 0.25 0.1875 +0.09375 0.25 0.2188 +0.09375 0.25 0.25 +0.09375 0.25 0.2812 +0.09375 0.25 0.3125 +0.09375 0.25 0.3438 +0.09375 0.25 0.375 +0.09375 0.25 0.4062 +0.09375 0.25 0.4375 +0.09375 0.25 0.4688 +0.09375 0.25 0.5 +0.09375 0.25 0.5312 +0.09375 0.25 0.5625 +0.09375 0.25 0.5938 +0.09375 0.25 0.625 +0.09375 0.25 0.6562 +0.09375 0.25 0.6875 +0.09375 0.25 0.7188 +0.09375 0.25 0.75 +0.09375 0.25 0.7812 +0.09375 0.25 0.8125 +0.09375 0.25 0.8438 +0.09375 0.25 0.875 +0.09375 0.25 0.9062 +0.09375 0.25 0.9375 +0.09375 0.25 0.9688 +0.09375 0.25 1 +0.09375 0.2812 0 +0.09375 0.2812 0.03125 +0.09375 0.2812 0.0625 +0.09375 0.2812 0.09375 +0.09375 0.2812 0.125 +0.09375 0.2812 0.1562 +0.09375 0.2812 0.1875 +0.09375 0.2812 0.2188 +0.09375 0.2812 0.25 +0.09375 0.2812 0.2812 +0.09375 0.2812 0.3125 +0.09375 0.2812 0.3438 +0.09375 0.2812 0.375 +0.09375 0.2812 0.4062 +0.09375 0.2812 0.4375 +0.09375 0.2812 0.4688 +0.09375 0.2812 0.5 +0.09375 0.2812 0.5312 +0.09375 0.2812 0.5625 +0.09375 0.2812 0.5938 +0.09375 0.2812 0.625 +0.09375 0.2812 0.6562 +0.09375 0.2812 0.6875 +0.09375 0.2812 0.7188 +0.09375 0.2812 0.75 +0.09375 0.2812 0.7812 +0.09375 0.2812 0.8125 +0.09375 0.2812 0.8438 +0.09375 0.2812 0.875 +0.09375 0.2812 0.9062 +0.09375 0.2812 0.9375 +0.09375 0.2812 0.9688 +0.09375 0.2812 1 +0.09375 0.3125 0 +0.09375 0.3125 0.03125 +0.09375 0.3125 0.0625 +0.09375 0.3125 0.09375 +0.09375 0.3125 0.125 +0.09375 0.3125 0.1562 +0.09375 0.3125 0.1875 +0.09375 0.3125 0.2188 +0.09375 0.3125 0.25 +0.09375 0.3125 0.2812 +0.09375 0.3125 0.3125 +0.09375 0.3125 0.3438 +0.09375 0.3125 0.375 +0.09375 0.3125 0.4062 +0.09375 0.3125 0.4375 +0.09375 0.3125 0.4688 +0.09375 0.3125 0.5 +0.09375 0.3125 0.5312 +0.09375 0.3125 0.5625 +0.09375 0.3125 0.5938 +0.09375 0.3125 0.625 +0.09375 0.3125 0.6562 +0.09375 0.3125 0.6875 +0.09375 0.3125 0.7188 +0.09375 0.3125 0.75 +0.09375 0.3125 0.7812 +0.09375 0.3125 0.8125 +0.09375 0.3125 0.8438 +0.09375 0.3125 0.875 +0.09375 0.3125 0.9062 +0.09375 0.3125 0.9375 +0.09375 0.3125 0.9688 +0.09375 0.3125 1 +0.09375 0.3438 0 +0.09375 0.3438 0.03125 +0.09375 0.3438 0.0625 +0.09375 0.3438 0.09375 +0.09375 0.3438 0.125 +0.09375 0.3438 0.1562 +0.09375 0.3438 0.1875 +0.09375 0.3438 0.2188 +0.09375 0.3438 0.25 +0.09375 0.3438 0.2812 +0.09375 0.3438 0.3125 +0.09375 0.3438 0.3438 +0.09375 0.3438 0.375 +0.09375 0.3438 0.4062 +0.09375 0.3438 0.4375 +0.09375 0.3438 0.4688 +0.09375 0.3438 0.5 +0.09375 0.3438 0.5312 +0.09375 0.3438 0.5625 +0.09375 0.3438 0.5938 +0.09375 0.3438 0.625 +0.09375 0.3438 0.6562 +0.09375 0.3438 0.6875 +0.09375 0.3438 0.7188 +0.09375 0.3438 0.75 +0.09375 0.3438 0.7812 +0.09375 0.3438 0.8125 +0.09375 0.3438 0.8438 +0.09375 0.3438 0.875 +0.09375 0.3438 0.9062 +0.09375 0.3438 0.9375 +0.09375 0.3438 0.9688 +0.09375 0.3438 1 +0.09375 0.375 0 +0.09375 0.375 0.03125 +0.09375 0.375 0.0625 +0.09375 0.375 0.09375 +0.09375 0.375 0.125 +0.09375 0.375 0.1562 +0.09375 0.375 0.1875 +0.09375 0.375 0.2188 +0.09375 0.375 0.25 +0.09375 0.375 0.2812 +0.09375 0.375 0.3125 +0.09375 0.375 0.3438 +0.09375 0.375 0.375 +0.09375 0.375 0.4062 +0.09375 0.375 0.4375 +0.09375 0.375 0.4688 +0.09375 0.375 0.5 +0.09375 0.375 0.5312 +0.09375 0.375 0.5625 +0.09375 0.375 0.5938 +0.09375 0.375 0.625 +0.09375 0.375 0.6562 +0.09375 0.375 0.6875 +0.09375 0.375 0.7188 +0.09375 0.375 0.75 +0.09375 0.375 0.7812 +0.09375 0.375 0.8125 +0.09375 0.375 0.8438 +0.09375 0.375 0.875 +0.09375 0.375 0.9062 +0.09375 0.375 0.9375 +0.09375 0.375 0.9688 +0.09375 0.375 1 +0.09375 0.4062 0 +0.09375 0.4062 0.03125 +0.09375 0.4062 0.0625 +0.09375 0.4062 0.09375 +0.09375 0.4062 0.125 +0.09375 0.4062 0.1562 +0.09375 0.4062 0.1875 +0.09375 0.4062 0.2188 +0.09375 0.4062 0.25 +0.09375 0.4062 0.2812 +0.09375 0.4062 0.3125 +0.09375 0.4062 0.3438 +0.09375 0.4062 0.375 +0.09375 0.4062 0.4062 +0.09375 0.4062 0.4375 +0.09375 0.4062 0.4688 +0.09375 0.4062 0.5 +0.09375 0.4062 0.5312 +0.09375 0.4062 0.5625 +0.09375 0.4062 0.5938 +0.09375 0.4062 0.625 +0.09375 0.4062 0.6562 +0.09375 0.4062 0.6875 +0.09375 0.4062 0.7188 +0.09375 0.4062 0.75 +0.09375 0.4062 0.7812 +0.09375 0.4062 0.8125 +0.09375 0.4062 0.8438 +0.09375 0.4062 0.875 +0.09375 0.4062 0.9062 +0.09375 0.4062 0.9375 +0.09375 0.4062 0.9688 +0.09375 0.4062 1 +0.09375 0.4375 0 +0.09375 0.4375 0.03125 +0.09375 0.4375 0.0625 +0.09375 0.4375 0.09375 +0.09375 0.4375 0.125 +0.09375 0.4375 0.1562 +0.09375 0.4375 0.1875 +0.09375 0.4375 0.2188 +0.09375 0.4375 0.25 +0.09375 0.4375 0.2812 +0.09375 0.4375 0.3125 +0.09375 0.4375 0.3438 +0.09375 0.4375 0.375 +0.09375 0.4375 0.4062 +0.09375 0.4375 0.4375 +0.09375 0.4375 0.4688 +0.09375 0.4375 0.5 +0.09375 0.4375 0.5312 +0.09375 0.4375 0.5625 +0.09375 0.4375 0.5938 +0.09375 0.4375 0.625 +0.09375 0.4375 0.6562 +0.09375 0.4375 0.6875 +0.09375 0.4375 0.7188 +0.09375 0.4375 0.75 +0.09375 0.4375 0.7812 +0.09375 0.4375 0.8125 +0.09375 0.4375 0.8438 +0.09375 0.4375 0.875 +0.09375 0.4375 0.9062 +0.09375 0.4375 0.9375 +0.09375 0.4375 0.9688 +0.09375 0.4375 1 +0.09375 0.4688 0 +0.09375 0.4688 0.03125 +0.09375 0.4688 0.0625 +0.09375 0.4688 0.09375 +0.09375 0.4688 0.125 +0.09375 0.4688 0.1562 +0.09375 0.4688 0.1875 +0.09375 0.4688 0.2188 +0.09375 0.4688 0.25 +0.09375 0.4688 0.2812 +0.09375 0.4688 0.3125 +0.09375 0.4688 0.3438 +0.09375 0.4688 0.375 +0.09375 0.4688 0.4062 +0.09375 0.4688 0.4375 +0.09375 0.4688 0.4688 +0.09375 0.4688 0.5 +0.09375 0.4688 0.5312 +0.09375 0.4688 0.5625 +0.09375 0.4688 0.5938 +0.09375 0.4688 0.625 +0.09375 0.4688 0.6562 +0.09375 0.4688 0.6875 +0.09375 0.4688 0.7188 +0.09375 0.4688 0.75 +0.09375 0.4688 0.7812 +0.09375 0.4688 0.8125 +0.09375 0.4688 0.8438 +0.09375 0.4688 0.875 +0.09375 0.4688 0.9062 +0.09375 0.4688 0.9375 +0.09375 0.4688 0.9688 +0.09375 0.4688 1 +0.09375 0.5 0 +0.09375 0.5 0.03125 +0.09375 0.5 0.0625 +0.09375 0.5 0.09375 +0.09375 0.5 0.125 +0.09375 0.5 0.1562 +0.09375 0.5 0.1875 +0.09375 0.5 0.2188 +0.09375 0.5 0.25 +0.09375 0.5 0.2812 +0.09375 0.5 0.3125 +0.09375 0.5 0.3438 +0.09375 0.5 0.375 +0.09375 0.5 0.4062 +0.09375 0.5 0.4375 +0.09375 0.5 0.4688 +0.09375 0.5 0.5 +0.09375 0.5 0.5312 +0.09375 0.5 0.5625 +0.09375 0.5 0.5938 +0.09375 0.5 0.625 +0.09375 0.5 0.6562 +0.09375 0.5 0.6875 +0.09375 0.5 0.7188 +0.09375 0.5 0.75 +0.09375 0.5 0.7812 +0.09375 0.5 0.8125 +0.09375 0.5 0.8438 +0.09375 0.5 0.875 +0.09375 0.5 0.9062 +0.09375 0.5 0.9375 +0.09375 0.5 0.9688 +0.09375 0.5 1 +0.09375 0.5312 0 +0.09375 0.5312 0.03125 +0.09375 0.5312 0.0625 +0.09375 0.5312 0.09375 +0.09375 0.5312 0.125 +0.09375 0.5312 0.1562 +0.09375 0.5312 0.1875 +0.09375 0.5312 0.2188 +0.09375 0.5312 0.25 +0.09375 0.5312 0.2812 +0.09375 0.5312 0.3125 +0.09375 0.5312 0.3438 +0.09375 0.5312 0.375 +0.09375 0.5312 0.4062 +0.09375 0.5312 0.4375 +0.09375 0.5312 0.4688 +0.09375 0.5312 0.5 +0.09375 0.5312 0.5312 +0.09375 0.5312 0.5625 +0.09375 0.5312 0.5938 +0.09375 0.5312 0.625 +0.09375 0.5312 0.6562 +0.09375 0.5312 0.6875 +0.09375 0.5312 0.7188 +0.09375 0.5312 0.75 +0.09375 0.5312 0.7812 +0.09375 0.5312 0.8125 +0.09375 0.5312 0.8438 +0.09375 0.5312 0.875 +0.09375 0.5312 0.9062 +0.09375 0.5312 0.9375 +0.09375 0.5312 0.9688 +0.09375 0.5312 1 +0.09375 0.5625 0 +0.09375 0.5625 0.03125 +0.09375 0.5625 0.0625 +0.09375 0.5625 0.09375 +0.09375 0.5625 0.125 +0.09375 0.5625 0.1562 +0.09375 0.5625 0.1875 +0.09375 0.5625 0.2188 +0.09375 0.5625 0.25 +0.09375 0.5625 0.2812 +0.09375 0.5625 0.3125 +0.09375 0.5625 0.3438 +0.09375 0.5625 0.375 +0.09375 0.5625 0.4062 +0.09375 0.5625 0.4375 +0.09375 0.5625 0.4688 +0.09375 0.5625 0.5 +0.09375 0.5625 0.5312 +0.09375 0.5625 0.5625 +0.09375 0.5625 0.5938 +0.09375 0.5625 0.625 +0.09375 0.5625 0.6562 +0.09375 0.5625 0.6875 +0.09375 0.5625 0.7188 +0.09375 0.5625 0.75 +0.09375 0.5625 0.7812 +0.09375 0.5625 0.8125 +0.09375 0.5625 0.8438 +0.09375 0.5625 0.875 +0.09375 0.5625 0.9062 +0.09375 0.5625 0.9375 +0.09375 0.5625 0.9688 +0.09375 0.5625 1 +0.09375 0.5938 0 +0.09375 0.5938 0.03125 +0.09375 0.5938 0.0625 +0.09375 0.5938 0.09375 +0.09375 0.5938 0.125 +0.09375 0.5938 0.1562 +0.09375 0.5938 0.1875 +0.09375 0.5938 0.2188 +0.09375 0.5938 0.25 +0.09375 0.5938 0.2812 +0.09375 0.5938 0.3125 +0.09375 0.5938 0.3438 +0.09375 0.5938 0.375 +0.09375 0.5938 0.4062 +0.09375 0.5938 0.4375 +0.09375 0.5938 0.4688 +0.09375 0.5938 0.5 +0.09375 0.5938 0.5312 +0.09375 0.5938 0.5625 +0.09375 0.5938 0.5938 +0.09375 0.5938 0.625 +0.09375 0.5938 0.6562 +0.09375 0.5938 0.6875 +0.09375 0.5938 0.7188 +0.09375 0.5938 0.75 +0.09375 0.5938 0.7812 +0.09375 0.5938 0.8125 +0.09375 0.5938 0.8438 +0.09375 0.5938 0.875 +0.09375 0.5938 0.9062 +0.09375 0.5938 0.9375 +0.09375 0.5938 0.9688 +0.09375 0.5938 1 +0.09375 0.625 0 +0.09375 0.625 0.03125 +0.09375 0.625 0.0625 +0.09375 0.625 0.09375 +0.09375 0.625 0.125 +0.09375 0.625 0.1562 +0.09375 0.625 0.1875 +0.09375 0.625 0.2188 +0.09375 0.625 0.25 +0.09375 0.625 0.2812 +0.09375 0.625 0.3125 +0.09375 0.625 0.3438 +0.09375 0.625 0.375 +0.09375 0.625 0.4062 +0.09375 0.625 0.4375 +0.09375 0.625 0.4688 +0.09375 0.625 0.5 +0.09375 0.625 0.5312 +0.09375 0.625 0.5625 +0.09375 0.625 0.5938 +0.09375 0.625 0.625 +0.09375 0.625 0.6562 +0.09375 0.625 0.6875 +0.09375 0.625 0.7188 +0.09375 0.625 0.75 +0.09375 0.625 0.7812 +0.09375 0.625 0.8125 +0.09375 0.625 0.8438 +0.09375 0.625 0.875 +0.09375 0.625 0.9062 +0.09375 0.625 0.9375 +0.09375 0.625 0.9688 +0.09375 0.625 1 +0.09375 0.6562 0 +0.09375 0.6562 0.03125 +0.09375 0.6562 0.0625 +0.09375 0.6562 0.09375 +0.09375 0.6562 0.125 +0.09375 0.6562 0.1562 +0.09375 0.6562 0.1875 +0.09375 0.6562 0.2188 +0.09375 0.6562 0.25 +0.09375 0.6562 0.2812 +0.09375 0.6562 0.3125 +0.09375 0.6562 0.3438 +0.09375 0.6562 0.375 +0.09375 0.6562 0.4062 +0.09375 0.6562 0.4375 +0.09375 0.6562 0.4688 +0.09375 0.6562 0.5 +0.09375 0.6562 0.5312 +0.09375 0.6562 0.5625 +0.09375 0.6562 0.5938 +0.09375 0.6562 0.625 +0.09375 0.6562 0.6562 +0.09375 0.6562 0.6875 +0.09375 0.6562 0.7188 +0.09375 0.6562 0.75 +0.09375 0.6562 0.7812 +0.09375 0.6562 0.8125 +0.09375 0.6562 0.8438 +0.09375 0.6562 0.875 +0.09375 0.6562 0.9062 +0.09375 0.6562 0.9375 +0.09375 0.6562 0.9688 +0.09375 0.6562 1 +0.09375 0.6875 0 +0.09375 0.6875 0.03125 +0.09375 0.6875 0.0625 +0.09375 0.6875 0.09375 +0.09375 0.6875 0.125 +0.09375 0.6875 0.1562 +0.09375 0.6875 0.1875 +0.09375 0.6875 0.2188 +0.09375 0.6875 0.25 +0.09375 0.6875 0.2812 +0.09375 0.6875 0.3125 +0.09375 0.6875 0.3438 +0.09375 0.6875 0.375 +0.09375 0.6875 0.4062 +0.09375 0.6875 0.4375 +0.09375 0.6875 0.4688 +0.09375 0.6875 0.5 +0.09375 0.6875 0.5312 +0.09375 0.6875 0.5625 +0.09375 0.6875 0.5938 +0.09375 0.6875 0.625 +0.09375 0.6875 0.6562 +0.09375 0.6875 0.6875 +0.09375 0.6875 0.7188 +0.09375 0.6875 0.75 +0.09375 0.6875 0.7812 +0.09375 0.6875 0.8125 +0.09375 0.6875 0.8438 +0.09375 0.6875 0.875 +0.09375 0.6875 0.9062 +0.09375 0.6875 0.9375 +0.09375 0.6875 0.9688 +0.09375 0.6875 1 +0.09375 0.7188 0 +0.09375 0.7188 0.03125 +0.09375 0.7188 0.0625 +0.09375 0.7188 0.09375 +0.09375 0.7188 0.125 +0.09375 0.7188 0.1562 +0.09375 0.7188 0.1875 +0.09375 0.7188 0.2188 +0.09375 0.7188 0.25 +0.09375 0.7188 0.2812 +0.09375 0.7188 0.3125 +0.09375 0.7188 0.3438 +0.09375 0.7188 0.375 +0.09375 0.7188 0.4062 +0.09375 0.7188 0.4375 +0.09375 0.7188 0.4688 +0.09375 0.7188 0.5 +0.09375 0.7188 0.5312 +0.09375 0.7188 0.5625 +0.09375 0.7188 0.5938 +0.09375 0.7188 0.625 +0.09375 0.7188 0.6562 +0.09375 0.7188 0.6875 +0.09375 0.7188 0.7188 +0.09375 0.7188 0.75 +0.09375 0.7188 0.7812 +0.09375 0.7188 0.8125 +0.09375 0.7188 0.8438 +0.09375 0.7188 0.875 +0.09375 0.7188 0.9062 +0.09375 0.7188 0.9375 +0.09375 0.7188 0.9688 +0.09375 0.7188 1 +0.09375 0.75 0 +0.09375 0.75 0.03125 +0.09375 0.75 0.0625 +0.09375 0.75 0.09375 +0.09375 0.75 0.125 +0.09375 0.75 0.1562 +0.09375 0.75 0.1875 +0.09375 0.75 0.2188 +0.09375 0.75 0.25 +0.09375 0.75 0.2812 +0.09375 0.75 0.3125 +0.09375 0.75 0.3438 +0.09375 0.75 0.375 +0.09375 0.75 0.4062 +0.09375 0.75 0.4375 +0.09375 0.75 0.4688 +0.09375 0.75 0.5 +0.09375 0.75 0.5312 +0.09375 0.75 0.5625 +0.09375 0.75 0.5938 +0.09375 0.75 0.625 +0.09375 0.75 0.6562 +0.09375 0.75 0.6875 +0.09375 0.75 0.7188 +0.09375 0.75 0.75 +0.09375 0.75 0.7812 +0.09375 0.75 0.8125 +0.09375 0.75 0.8438 +0.09375 0.75 0.875 +0.09375 0.75 0.9062 +0.09375 0.75 0.9375 +0.09375 0.75 0.9688 +0.09375 0.75 1 +0.09375 0.7812 0 +0.09375 0.7812 0.03125 +0.09375 0.7812 0.0625 +0.09375 0.7812 0.09375 +0.09375 0.7812 0.125 +0.09375 0.7812 0.1562 +0.09375 0.7812 0.1875 +0.09375 0.7812 0.2188 +0.09375 0.7812 0.25 +0.09375 0.7812 0.2812 +0.09375 0.7812 0.3125 +0.09375 0.7812 0.3438 +0.09375 0.7812 0.375 +0.09375 0.7812 0.4062 +0.09375 0.7812 0.4375 +0.09375 0.7812 0.4688 +0.09375 0.7812 0.5 +0.09375 0.7812 0.5312 +0.09375 0.7812 0.5625 +0.09375 0.7812 0.5938 +0.09375 0.7812 0.625 +0.09375 0.7812 0.6562 +0.09375 0.7812 0.6875 +0.09375 0.7812 0.7188 +0.09375 0.7812 0.75 +0.09375 0.7812 0.7812 +0.09375 0.7812 0.8125 +0.09375 0.7812 0.8438 +0.09375 0.7812 0.875 +0.09375 0.7812 0.9062 +0.09375 0.7812 0.9375 +0.09375 0.7812 0.9688 +0.09375 0.7812 1 +0.09375 0.8125 0 +0.09375 0.8125 0.03125 +0.09375 0.8125 0.0625 +0.09375 0.8125 0.09375 +0.09375 0.8125 0.125 +0.09375 0.8125 0.1562 +0.09375 0.8125 0.1875 +0.09375 0.8125 0.2188 +0.09375 0.8125 0.25 +0.09375 0.8125 0.2812 +0.09375 0.8125 0.3125 +0.09375 0.8125 0.3438 +0.09375 0.8125 0.375 +0.09375 0.8125 0.4062 +0.09375 0.8125 0.4375 +0.09375 0.8125 0.4688 +0.09375 0.8125 0.5 +0.09375 0.8125 0.5312 +0.09375 0.8125 0.5625 +0.09375 0.8125 0.5938 +0.09375 0.8125 0.625 +0.09375 0.8125 0.6562 +0.09375 0.8125 0.6875 +0.09375 0.8125 0.7188 +0.09375 0.8125 0.75 +0.09375 0.8125 0.7812 +0.09375 0.8125 0.8125 +0.09375 0.8125 0.8438 +0.09375 0.8125 0.875 +0.09375 0.8125 0.9062 +0.09375 0.8125 0.9375 +0.09375 0.8125 0.9688 +0.09375 0.8125 1 +0.09375 0.8438 0 +0.09375 0.8438 0.03125 +0.09375 0.8438 0.0625 +0.09375 0.8438 0.09375 +0.09375 0.8438 0.125 +0.09375 0.8438 0.1562 +0.09375 0.8438 0.1875 +0.09375 0.8438 0.2188 +0.09375 0.8438 0.25 +0.09375 0.8438 0.2812 +0.09375 0.8438 0.3125 +0.09375 0.8438 0.3438 +0.09375 0.8438 0.375 +0.09375 0.8438 0.4062 +0.09375 0.8438 0.4375 +0.09375 0.8438 0.4688 +0.09375 0.8438 0.5 +0.09375 0.8438 0.5312 +0.09375 0.8438 0.5625 +0.09375 0.8438 0.5938 +0.09375 0.8438 0.625 +0.09375 0.8438 0.6562 +0.09375 0.8438 0.6875 +0.09375 0.8438 0.7188 +0.09375 0.8438 0.75 +0.09375 0.8438 0.7812 +0.09375 0.8438 0.8125 +0.09375 0.8438 0.8438 +0.09375 0.8438 0.875 +0.09375 0.8438 0.9062 +0.09375 0.8438 0.9375 +0.09375 0.8438 0.9688 +0.09375 0.8438 1 +0.09375 0.875 0 +0.09375 0.875 0.03125 +0.09375 0.875 0.0625 +0.09375 0.875 0.09375 +0.09375 0.875 0.125 +0.09375 0.875 0.1562 +0.09375 0.875 0.1875 +0.09375 0.875 0.2188 +0.09375 0.875 0.25 +0.09375 0.875 0.2812 +0.09375 0.875 0.3125 +0.09375 0.875 0.3438 +0.09375 0.875 0.375 +0.09375 0.875 0.4062 +0.09375 0.875 0.4375 +0.09375 0.875 0.4688 +0.09375 0.875 0.5 +0.09375 0.875 0.5312 +0.09375 0.875 0.5625 +0.09375 0.875 0.5938 +0.09375 0.875 0.625 +0.09375 0.875 0.6562 +0.09375 0.875 0.6875 +0.09375 0.875 0.7188 +0.09375 0.875 0.75 +0.09375 0.875 0.7812 +0.09375 0.875 0.8125 +0.09375 0.875 0.8438 +0.09375 0.875 0.875 +0.09375 0.875 0.9062 +0.09375 0.875 0.9375 +0.09375 0.875 0.9688 +0.09375 0.875 1 +0.09375 0.9062 0 +0.09375 0.9062 0.03125 +0.09375 0.9062 0.0625 +0.09375 0.9062 0.09375 +0.09375 0.9062 0.125 +0.09375 0.9062 0.1562 +0.09375 0.9062 0.1875 +0.09375 0.9062 0.2188 +0.09375 0.9062 0.25 +0.09375 0.9062 0.2812 +0.09375 0.9062 0.3125 +0.09375 0.9062 0.3438 +0.09375 0.9062 0.375 +0.09375 0.9062 0.4062 +0.09375 0.9062 0.4375 +0.09375 0.9062 0.4688 +0.09375 0.9062 0.5 +0.09375 0.9062 0.5312 +0.09375 0.9062 0.5625 +0.09375 0.9062 0.5938 +0.09375 0.9062 0.625 +0.09375 0.9062 0.6562 +0.09375 0.9062 0.6875 +0.09375 0.9062 0.7188 +0.09375 0.9062 0.75 +0.09375 0.9062 0.7812 +0.09375 0.9062 0.8125 +0.09375 0.9062 0.8438 +0.09375 0.9062 0.875 +0.09375 0.9062 0.9062 +0.09375 0.9062 0.9375 +0.09375 0.9062 0.9688 +0.09375 0.9062 1 +0.09375 0.9375 0 +0.09375 0.9375 0.03125 +0.09375 0.9375 0.0625 +0.09375 0.9375 0.09375 +0.09375 0.9375 0.125 +0.09375 0.9375 0.1562 +0.09375 0.9375 0.1875 +0.09375 0.9375 0.2188 +0.09375 0.9375 0.25 +0.09375 0.9375 0.2812 +0.09375 0.9375 0.3125 +0.09375 0.9375 0.3438 +0.09375 0.9375 0.375 +0.09375 0.9375 0.4062 +0.09375 0.9375 0.4375 +0.09375 0.9375 0.4688 +0.09375 0.9375 0.5 +0.09375 0.9375 0.5312 +0.09375 0.9375 0.5625 +0.09375 0.9375 0.5938 +0.09375 0.9375 0.625 +0.09375 0.9375 0.6562 +0.09375 0.9375 0.6875 +0.09375 0.9375 0.7188 +0.09375 0.9375 0.75 +0.09375 0.9375 0.7812 +0.09375 0.9375 0.8125 +0.09375 0.9375 0.8438 +0.09375 0.9375 0.875 +0.09375 0.9375 0.9062 +0.09375 0.9375 0.9375 +0.09375 0.9375 0.9688 +0.09375 0.9375 1 +0.09375 0.9688 0 +0.09375 0.9688 0.03125 +0.09375 0.9688 0.0625 +0.09375 0.9688 0.09375 +0.09375 0.9688 0.125 +0.09375 0.9688 0.1562 +0.09375 0.9688 0.1875 +0.09375 0.9688 0.2188 +0.09375 0.9688 0.25 +0.09375 0.9688 0.2812 +0.09375 0.9688 0.3125 +0.09375 0.9688 0.3438 +0.09375 0.9688 0.375 +0.09375 0.9688 0.4062 +0.09375 0.9688 0.4375 +0.09375 0.9688 0.4688 +0.09375 0.9688 0.5 +0.09375 0.9688 0.5312 +0.09375 0.9688 0.5625 +0.09375 0.9688 0.5938 +0.09375 0.9688 0.625 +0.09375 0.9688 0.6562 +0.09375 0.9688 0.6875 +0.09375 0.9688 0.7188 +0.09375 0.9688 0.75 +0.09375 0.9688 0.7812 +0.09375 0.9688 0.8125 +0.09375 0.9688 0.8438 +0.09375 0.9688 0.875 +0.09375 0.9688 0.9062 +0.09375 0.9688 0.9375 +0.09375 0.9688 0.9688 +0.09375 0.9688 1 +0.09375 1 0 +0.09375 1 0.03125 +0.09375 1 0.0625 +0.09375 1 0.09375 +0.09375 1 0.125 +0.09375 1 0.1562 +0.09375 1 0.1875 +0.09375 1 0.2188 +0.09375 1 0.25 +0.09375 1 0.2812 +0.09375 1 0.3125 +0.09375 1 0.3438 +0.09375 1 0.375 +0.09375 1 0.4062 +0.09375 1 0.4375 +0.09375 1 0.4688 +0.09375 1 0.5 +0.09375 1 0.5312 +0.09375 1 0.5625 +0.09375 1 0.5938 +0.09375 1 0.625 +0.09375 1 0.6562 +0.09375 1 0.6875 +0.09375 1 0.7188 +0.09375 1 0.75 +0.09375 1 0.7812 +0.09375 1 0.8125 +0.09375 1 0.8438 +0.09375 1 0.875 +0.09375 1 0.9062 +0.09375 1 0.9375 +0.09375 1 0.9688 +0.09375 1 1 +0.125 0 0 +0.125 0 0.03125 +0.125 0 0.0625 +0.125 0 0.09375 +0.125 0 0.125 +0.125 0 0.1562 +0.125 0 0.1875 +0.125 0 0.2188 +0.125 0 0.25 +0.125 0 0.2812 +0.125 0 0.3125 +0.125 0 0.3438 +0.125 0 0.375 +0.125 0 0.4062 +0.125 0 0.4375 +0.125 0 0.4688 +0.125 0 0.5 +0.125 0 0.5312 +0.125 0 0.5625 +0.125 0 0.5938 +0.125 0 0.625 +0.125 0 0.6562 +0.125 0 0.6875 +0.125 0 0.7188 +0.125 0 0.75 +0.125 0 0.7812 +0.125 0 0.8125 +0.125 0 0.8438 +0.125 0 0.875 +0.125 0 0.9062 +0.125 0 0.9375 +0.125 0 0.9688 +0.125 0 1 +0.125 0.03125 0 +0.125 0.03125 0.03125 +0.125 0.03125 0.0625 +0.125 0.03125 0.09375 +0.125 0.03125 0.125 +0.125 0.03125 0.1562 +0.125 0.03125 0.1875 +0.125 0.03125 0.2188 +0.125 0.03125 0.25 +0.125 0.03125 0.2812 +0.125 0.03125 0.3125 +0.125 0.03125 0.3438 +0.125 0.03125 0.375 +0.125 0.03125 0.4062 +0.125 0.03125 0.4375 +0.125 0.03125 0.4688 +0.125 0.03125 0.5 +0.125 0.03125 0.5312 +0.125 0.03125 0.5625 +0.125 0.03125 0.5938 +0.125 0.03125 0.625 +0.125 0.03125 0.6562 +0.125 0.03125 0.6875 +0.125 0.03125 0.7188 +0.125 0.03125 0.75 +0.125 0.03125 0.7812 +0.125 0.03125 0.8125 +0.125 0.03125 0.8438 +0.125 0.03125 0.875 +0.125 0.03125 0.9062 +0.125 0.03125 0.9375 +0.125 0.03125 0.9688 +0.125 0.03125 1 +0.125 0.0625 0 +0.125 0.0625 0.03125 +0.125 0.0625 0.0625 +0.125 0.0625 0.09375 +0.125 0.0625 0.125 +0.125 0.0625 0.1562 +0.125 0.0625 0.1875 +0.125 0.0625 0.2188 +0.125 0.0625 0.25 +0.125 0.0625 0.2812 +0.125 0.0625 0.3125 +0.125 0.0625 0.3438 +0.125 0.0625 0.375 +0.125 0.0625 0.4062 +0.125 0.0625 0.4375 +0.125 0.0625 0.4688 +0.125 0.0625 0.5 +0.125 0.0625 0.5312 +0.125 0.0625 0.5625 +0.125 0.0625 0.5938 +0.125 0.0625 0.625 +0.125 0.0625 0.6562 +0.125 0.0625 0.6875 +0.125 0.0625 0.7188 +0.125 0.0625 0.75 +0.125 0.0625 0.7812 +0.125 0.0625 0.8125 +0.125 0.0625 0.8438 +0.125 0.0625 0.875 +0.125 0.0625 0.9062 +0.125 0.0625 0.9375 +0.125 0.0625 0.9688 +0.125 0.0625 1 +0.125 0.09375 0 +0.125 0.09375 0.03125 +0.125 0.09375 0.0625 +0.125 0.09375 0.09375 +0.125 0.09375 0.125 +0.125 0.09375 0.1562 +0.125 0.09375 0.1875 +0.125 0.09375 0.2188 +0.125 0.09375 0.25 +0.125 0.09375 0.2812 +0.125 0.09375 0.3125 +0.125 0.09375 0.3438 +0.125 0.09375 0.375 +0.125 0.09375 0.4062 +0.125 0.09375 0.4375 +0.125 0.09375 0.4688 +0.125 0.09375 0.5 +0.125 0.09375 0.5312 +0.125 0.09375 0.5625 +0.125 0.09375 0.5938 +0.125 0.09375 0.625 +0.125 0.09375 0.6562 +0.125 0.09375 0.6875 +0.125 0.09375 0.7188 +0.125 0.09375 0.75 +0.125 0.09375 0.7812 +0.125 0.09375 0.8125 +0.125 0.09375 0.8438 +0.125 0.09375 0.875 +0.125 0.09375 0.9062 +0.125 0.09375 0.9375 +0.125 0.09375 0.9688 +0.125 0.09375 1 +0.125 0.125 0 +0.125 0.125 0.03125 +0.125 0.125 0.0625 +0.125 0.125 0.09375 +0.125 0.125 0.125 +0.125 0.125 0.1562 +0.125 0.125 0.1875 +0.125 0.125 0.2188 +0.125 0.125 0.25 +0.125 0.125 0.2812 +0.125 0.125 0.3125 +0.125 0.125 0.3438 +0.125 0.125 0.375 +0.125 0.125 0.4062 +0.125 0.125 0.4375 +0.125 0.125 0.4688 +0.125 0.125 0.5 +0.125 0.125 0.5312 +0.125 0.125 0.5625 +0.125 0.125 0.5938 +0.125 0.125 0.625 +0.125 0.125 0.6562 +0.125 0.125 0.6875 +0.125 0.125 0.7188 +0.125 0.125 0.75 +0.125 0.125 0.7812 +0.125 0.125 0.8125 +0.125 0.125 0.8438 +0.125 0.125 0.875 +0.125 0.125 0.9062 +0.125 0.125 0.9375 +0.125 0.125 0.9688 +0.125 0.125 1 +0.125 0.1562 0 +0.125 0.1562 0.03125 +0.125 0.1562 0.0625 +0.125 0.1562 0.09375 +0.125 0.1562 0.125 +0.125 0.1562 0.1562 +0.125 0.1562 0.1875 +0.125 0.1562 0.2188 +0.125 0.1562 0.25 +0.125 0.1562 0.2812 +0.125 0.1562 0.3125 +0.125 0.1562 0.3438 +0.125 0.1562 0.375 +0.125 0.1562 0.4062 +0.125 0.1562 0.4375 +0.125 0.1562 0.4688 +0.125 0.1562 0.5 +0.125 0.1562 0.5312 +0.125 0.1562 0.5625 +0.125 0.1562 0.5938 +0.125 0.1562 0.625 +0.125 0.1562 0.6562 +0.125 0.1562 0.6875 +0.125 0.1562 0.7188 +0.125 0.1562 0.75 +0.125 0.1562 0.7812 +0.125 0.1562 0.8125 +0.125 0.1562 0.8438 +0.125 0.1562 0.875 +0.125 0.1562 0.9062 +0.125 0.1562 0.9375 +0.125 0.1562 0.9688 +0.125 0.1562 1 +0.125 0.1875 0 +0.125 0.1875 0.03125 +0.125 0.1875 0.0625 +0.125 0.1875 0.09375 +0.125 0.1875 0.125 +0.125 0.1875 0.1562 +0.125 0.1875 0.1875 +0.125 0.1875 0.2188 +0.125 0.1875 0.25 +0.125 0.1875 0.2812 +0.125 0.1875 0.3125 +0.125 0.1875 0.3438 +0.125 0.1875 0.375 +0.125 0.1875 0.4062 +0.125 0.1875 0.4375 +0.125 0.1875 0.4688 +0.125 0.1875 0.5 +0.125 0.1875 0.5312 +0.125 0.1875 0.5625 +0.125 0.1875 0.5938 +0.125 0.1875 0.625 +0.125 0.1875 0.6562 +0.125 0.1875 0.6875 +0.125 0.1875 0.7188 +0.125 0.1875 0.75 +0.125 0.1875 0.7812 +0.125 0.1875 0.8125 +0.125 0.1875 0.8438 +0.125 0.1875 0.875 +0.125 0.1875 0.9062 +0.125 0.1875 0.9375 +0.125 0.1875 0.9688 +0.125 0.1875 1 +0.125 0.2188 0 +0.125 0.2188 0.03125 +0.125 0.2188 0.0625 +0.125 0.2188 0.09375 +0.125 0.2188 0.125 +0.125 0.2188 0.1562 +0.125 0.2188 0.1875 +0.125 0.2188 0.2188 +0.125 0.2188 0.25 +0.125 0.2188 0.2812 +0.125 0.2188 0.3125 +0.125 0.2188 0.3438 +0.125 0.2188 0.375 +0.125 0.2188 0.4062 +0.125 0.2188 0.4375 +0.125 0.2188 0.4688 +0.125 0.2188 0.5 +0.125 0.2188 0.5312 +0.125 0.2188 0.5625 +0.125 0.2188 0.5938 +0.125 0.2188 0.625 +0.125 0.2188 0.6562 +0.125 0.2188 0.6875 +0.125 0.2188 0.7188 +0.125 0.2188 0.75 +0.125 0.2188 0.7812 +0.125 0.2188 0.8125 +0.125 0.2188 0.8438 +0.125 0.2188 0.875 +0.125 0.2188 0.9062 +0.125 0.2188 0.9375 +0.125 0.2188 0.9688 +0.125 0.2188 1 +0.125 0.25 0 +0.125 0.25 0.03125 +0.125 0.25 0.0625 +0.125 0.25 0.09375 +0.125 0.25 0.125 +0.125 0.25 0.1562 +0.125 0.25 0.1875 +0.125 0.25 0.2188 +0.125 0.25 0.25 +0.125 0.25 0.2812 +0.125 0.25 0.3125 +0.125 0.25 0.3438 +0.125 0.25 0.375 +0.125 0.25 0.4062 +0.125 0.25 0.4375 +0.125 0.25 0.4688 +0.125 0.25 0.5 +0.125 0.25 0.5312 +0.125 0.25 0.5625 +0.125 0.25 0.5938 +0.125 0.25 0.625 +0.125 0.25 0.6562 +0.125 0.25 0.6875 +0.125 0.25 0.7188 +0.125 0.25 0.75 +0.125 0.25 0.7812 +0.125 0.25 0.8125 +0.125 0.25 0.8438 +0.125 0.25 0.875 +0.125 0.25 0.9062 +0.125 0.25 0.9375 +0.125 0.25 0.9688 +0.125 0.25 1 +0.125 0.2812 0 +0.125 0.2812 0.03125 +0.125 0.2812 0.0625 +0.125 0.2812 0.09375 +0.125 0.2812 0.125 +0.125 0.2812 0.1562 +0.125 0.2812 0.1875 +0.125 0.2812 0.2188 +0.125 0.2812 0.25 +0.125 0.2812 0.2812 +0.125 0.2812 0.3125 +0.125 0.2812 0.3438 +0.125 0.2812 0.375 +0.125 0.2812 0.4062 +0.125 0.2812 0.4375 +0.125 0.2812 0.4688 +0.125 0.2812 0.5 +0.125 0.2812 0.5312 +0.125 0.2812 0.5625 +0.125 0.2812 0.5938 +0.125 0.2812 0.625 +0.125 0.2812 0.6562 +0.125 0.2812 0.6875 +0.125 0.2812 0.7188 +0.125 0.2812 0.75 +0.125 0.2812 0.7812 +0.125 0.2812 0.8125 +0.125 0.2812 0.8438 +0.125 0.2812 0.875 +0.125 0.2812 0.9062 +0.125 0.2812 0.9375 +0.125 0.2812 0.9688 +0.125 0.2812 1 +0.125 0.3125 0 +0.125 0.3125 0.03125 +0.125 0.3125 0.0625 +0.125 0.3125 0.09375 +0.125 0.3125 0.125 +0.125 0.3125 0.1562 +0.125 0.3125 0.1875 +0.125 0.3125 0.2188 +0.125 0.3125 0.25 +0.125 0.3125 0.2812 +0.125 0.3125 0.3125 +0.125 0.3125 0.3438 +0.125 0.3125 0.375 +0.125 0.3125 0.4062 +0.125 0.3125 0.4375 +0.125 0.3125 0.4688 +0.125 0.3125 0.5 +0.125 0.3125 0.5312 +0.125 0.3125 0.5625 +0.125 0.3125 0.5938 +0.125 0.3125 0.625 +0.125 0.3125 0.6562 +0.125 0.3125 0.6875 +0.125 0.3125 0.7188 +0.125 0.3125 0.75 +0.125 0.3125 0.7812 +0.125 0.3125 0.8125 +0.125 0.3125 0.8438 +0.125 0.3125 0.875 +0.125 0.3125 0.9062 +0.125 0.3125 0.9375 +0.125 0.3125 0.9688 +0.125 0.3125 1 +0.125 0.3438 0 +0.125 0.3438 0.03125 +0.125 0.3438 0.0625 +0.125 0.3438 0.09375 +0.125 0.3438 0.125 +0.125 0.3438 0.1562 +0.125 0.3438 0.1875 +0.125 0.3438 0.2188 +0.125 0.3438 0.25 +0.125 0.3438 0.2812 +0.125 0.3438 0.3125 +0.125 0.3438 0.3438 +0.125 0.3438 0.375 +0.125 0.3438 0.4062 +0.125 0.3438 0.4375 +0.125 0.3438 0.4688 +0.125 0.3438 0.5 +0.125 0.3438 0.5312 +0.125 0.3438 0.5625 +0.125 0.3438 0.5938 +0.125 0.3438 0.625 +0.125 0.3438 0.6562 +0.125 0.3438 0.6875 +0.125 0.3438 0.7188 +0.125 0.3438 0.75 +0.125 0.3438 0.7812 +0.125 0.3438 0.8125 +0.125 0.3438 0.8438 +0.125 0.3438 0.875 +0.125 0.3438 0.9062 +0.125 0.3438 0.9375 +0.125 0.3438 0.9688 +0.125 0.3438 1 +0.125 0.375 0 +0.125 0.375 0.03125 +0.125 0.375 0.0625 +0.125 0.375 0.09375 +0.125 0.375 0.125 +0.125 0.375 0.1562 +0.125 0.375 0.1875 +0.125 0.375 0.2188 +0.125 0.375 0.25 +0.125 0.375 0.2812 +0.125 0.375 0.3125 +0.125 0.375 0.3438 +0.125 0.375 0.375 +0.125 0.375 0.4062 +0.125 0.375 0.4375 +0.125 0.375 0.4688 +0.125 0.375 0.5 +0.125 0.375 0.5312 +0.125 0.375 0.5625 +0.125 0.375 0.5938 +0.125 0.375 0.625 +0.125 0.375 0.6562 +0.125 0.375 0.6875 +0.125 0.375 0.7188 +0.125 0.375 0.75 +0.125 0.375 0.7812 +0.125 0.375 0.8125 +0.125 0.375 0.8438 +0.125 0.375 0.875 +0.125 0.375 0.9062 +0.125 0.375 0.9375 +0.125 0.375 0.9688 +0.125 0.375 1 +0.125 0.4062 0 +0.125 0.4062 0.03125 +0.125 0.4062 0.0625 +0.125 0.4062 0.09375 +0.125 0.4062 0.125 +0.125 0.4062 0.1562 +0.125 0.4062 0.1875 +0.125 0.4062 0.2188 +0.125 0.4062 0.25 +0.125 0.4062 0.2812 +0.125 0.4062 0.3125 +0.125 0.4062 0.3438 +0.125 0.4062 0.375 +0.125 0.4062 0.4062 +0.125 0.4062 0.4375 +0.125 0.4062 0.4688 +0.125 0.4062 0.5 +0.125 0.4062 0.5312 +0.125 0.4062 0.5625 +0.125 0.4062 0.5938 +0.125 0.4062 0.625 +0.125 0.4062 0.6562 +0.125 0.4062 0.6875 +0.125 0.4062 0.7188 +0.125 0.4062 0.75 +0.125 0.4062 0.7812 +0.125 0.4062 0.8125 +0.125 0.4062 0.8438 +0.125 0.4062 0.875 +0.125 0.4062 0.9062 +0.125 0.4062 0.9375 +0.125 0.4062 0.9688 +0.125 0.4062 1 +0.125 0.4375 0 +0.125 0.4375 0.03125 +0.125 0.4375 0.0625 +0.125 0.4375 0.09375 +0.125 0.4375 0.125 +0.125 0.4375 0.1562 +0.125 0.4375 0.1875 +0.125 0.4375 0.2188 +0.125 0.4375 0.25 +0.125 0.4375 0.2812 +0.125 0.4375 0.3125 +0.125 0.4375 0.3438 +0.125 0.4375 0.375 +0.125 0.4375 0.4062 +0.125 0.4375 0.4375 +0.125 0.4375 0.4688 +0.125 0.4375 0.5 +0.125 0.4375 0.5312 +0.125 0.4375 0.5625 +0.125 0.4375 0.5938 +0.125 0.4375 0.625 +0.125 0.4375 0.6562 +0.125 0.4375 0.6875 +0.125 0.4375 0.7188 +0.125 0.4375 0.75 +0.125 0.4375 0.7812 +0.125 0.4375 0.8125 +0.125 0.4375 0.8438 +0.125 0.4375 0.875 +0.125 0.4375 0.9062 +0.125 0.4375 0.9375 +0.125 0.4375 0.9688 +0.125 0.4375 1 +0.125 0.4688 0 +0.125 0.4688 0.03125 +0.125 0.4688 0.0625 +0.125 0.4688 0.09375 +0.125 0.4688 0.125 +0.125 0.4688 0.1562 +0.125 0.4688 0.1875 +0.125 0.4688 0.2188 +0.125 0.4688 0.25 +0.125 0.4688 0.2812 +0.125 0.4688 0.3125 +0.125 0.4688 0.3438 +0.125 0.4688 0.375 +0.125 0.4688 0.4062 +0.125 0.4688 0.4375 +0.125 0.4688 0.4688 +0.125 0.4688 0.5 +0.125 0.4688 0.5312 +0.125 0.4688 0.5625 +0.125 0.4688 0.5938 +0.125 0.4688 0.625 +0.125 0.4688 0.6562 +0.125 0.4688 0.6875 +0.125 0.4688 0.7188 +0.125 0.4688 0.75 +0.125 0.4688 0.7812 +0.125 0.4688 0.8125 +0.125 0.4688 0.8438 +0.125 0.4688 0.875 +0.125 0.4688 0.9062 +0.125 0.4688 0.9375 +0.125 0.4688 0.9688 +0.125 0.4688 1 +0.125 0.5 0 +0.125 0.5 0.03125 +0.125 0.5 0.0625 +0.125 0.5 0.09375 +0.125 0.5 0.125 +0.125 0.5 0.1562 +0.125 0.5 0.1875 +0.125 0.5 0.2188 +0.125 0.5 0.25 +0.125 0.5 0.2812 +0.125 0.5 0.3125 +0.125 0.5 0.3438 +0.125 0.5 0.375 +0.125 0.5 0.4062 +0.125 0.5 0.4375 +0.125 0.5 0.4688 +0.125 0.5 0.5 +0.125 0.5 0.5312 +0.125 0.5 0.5625 +0.125 0.5 0.5938 +0.125 0.5 0.625 +0.125 0.5 0.6562 +0.125 0.5 0.6875 +0.125 0.5 0.7188 +0.125 0.5 0.75 +0.125 0.5 0.7812 +0.125 0.5 0.8125 +0.125 0.5 0.8438 +0.125 0.5 0.875 +0.125 0.5 0.9062 +0.125 0.5 0.9375 +0.125 0.5 0.9688 +0.125 0.5 1 +0.125 0.5312 0 +0.125 0.5312 0.03125 +0.125 0.5312 0.0625 +0.125 0.5312 0.09375 +0.125 0.5312 0.125 +0.125 0.5312 0.1562 +0.125 0.5312 0.1875 +0.125 0.5312 0.2188 +0.125 0.5312 0.25 +0.125 0.5312 0.2812 +0.125 0.5312 0.3125 +0.125 0.5312 0.3438 +0.125 0.5312 0.375 +0.125 0.5312 0.4062 +0.125 0.5312 0.4375 +0.125 0.5312 0.4688 +0.125 0.5312 0.5 +0.125 0.5312 0.5312 +0.125 0.5312 0.5625 +0.125 0.5312 0.5938 +0.125 0.5312 0.625 +0.125 0.5312 0.6562 +0.125 0.5312 0.6875 +0.125 0.5312 0.7188 +0.125 0.5312 0.75 +0.125 0.5312 0.7812 +0.125 0.5312 0.8125 +0.125 0.5312 0.8438 +0.125 0.5312 0.875 +0.125 0.5312 0.9062 +0.125 0.5312 0.9375 +0.125 0.5312 0.9688 +0.125 0.5312 1 +0.125 0.5625 0 +0.125 0.5625 0.03125 +0.125 0.5625 0.0625 +0.125 0.5625 0.09375 +0.125 0.5625 0.125 +0.125 0.5625 0.1562 +0.125 0.5625 0.1875 +0.125 0.5625 0.2188 +0.125 0.5625 0.25 +0.125 0.5625 0.2812 +0.125 0.5625 0.3125 +0.125 0.5625 0.3438 +0.125 0.5625 0.375 +0.125 0.5625 0.4062 +0.125 0.5625 0.4375 +0.125 0.5625 0.4688 +0.125 0.5625 0.5 +0.125 0.5625 0.5312 +0.125 0.5625 0.5625 +0.125 0.5625 0.5938 +0.125 0.5625 0.625 +0.125 0.5625 0.6562 +0.125 0.5625 0.6875 +0.125 0.5625 0.7188 +0.125 0.5625 0.75 +0.125 0.5625 0.7812 +0.125 0.5625 0.8125 +0.125 0.5625 0.8438 +0.125 0.5625 0.875 +0.125 0.5625 0.9062 +0.125 0.5625 0.9375 +0.125 0.5625 0.9688 +0.125 0.5625 1 +0.125 0.5938 0 +0.125 0.5938 0.03125 +0.125 0.5938 0.0625 +0.125 0.5938 0.09375 +0.125 0.5938 0.125 +0.125 0.5938 0.1562 +0.125 0.5938 0.1875 +0.125 0.5938 0.2188 +0.125 0.5938 0.25 +0.125 0.5938 0.2812 +0.125 0.5938 0.3125 +0.125 0.5938 0.3438 +0.125 0.5938 0.375 +0.125 0.5938 0.4062 +0.125 0.5938 0.4375 +0.125 0.5938 0.4688 +0.125 0.5938 0.5 +0.125 0.5938 0.5312 +0.125 0.5938 0.5625 +0.125 0.5938 0.5938 +0.125 0.5938 0.625 +0.125 0.5938 0.6562 +0.125 0.5938 0.6875 +0.125 0.5938 0.7188 +0.125 0.5938 0.75 +0.125 0.5938 0.7812 +0.125 0.5938 0.8125 +0.125 0.5938 0.8438 +0.125 0.5938 0.875 +0.125 0.5938 0.9062 +0.125 0.5938 0.9375 +0.125 0.5938 0.9688 +0.125 0.5938 1 +0.125 0.625 0 +0.125 0.625 0.03125 +0.125 0.625 0.0625 +0.125 0.625 0.09375 +0.125 0.625 0.125 +0.125 0.625 0.1562 +0.125 0.625 0.1875 +0.125 0.625 0.2188 +0.125 0.625 0.25 +0.125 0.625 0.2812 +0.125 0.625 0.3125 +0.125 0.625 0.3438 +0.125 0.625 0.375 +0.125 0.625 0.4062 +0.125 0.625 0.4375 +0.125 0.625 0.4688 +0.125 0.625 0.5 +0.125 0.625 0.5312 +0.125 0.625 0.5625 +0.125 0.625 0.5938 +0.125 0.625 0.625 +0.125 0.625 0.6562 +0.125 0.625 0.6875 +0.125 0.625 0.7188 +0.125 0.625 0.75 +0.125 0.625 0.7812 +0.125 0.625 0.8125 +0.125 0.625 0.8438 +0.125 0.625 0.875 +0.125 0.625 0.9062 +0.125 0.625 0.9375 +0.125 0.625 0.9688 +0.125 0.625 1 +0.125 0.6562 0 +0.125 0.6562 0.03125 +0.125 0.6562 0.0625 +0.125 0.6562 0.09375 +0.125 0.6562 0.125 +0.125 0.6562 0.1562 +0.125 0.6562 0.1875 +0.125 0.6562 0.2188 +0.125 0.6562 0.25 +0.125 0.6562 0.2812 +0.125 0.6562 0.3125 +0.125 0.6562 0.3438 +0.125 0.6562 0.375 +0.125 0.6562 0.4062 +0.125 0.6562 0.4375 +0.125 0.6562 0.4688 +0.125 0.6562 0.5 +0.125 0.6562 0.5312 +0.125 0.6562 0.5625 +0.125 0.6562 0.5938 +0.125 0.6562 0.625 +0.125 0.6562 0.6562 +0.125 0.6562 0.6875 +0.125 0.6562 0.7188 +0.125 0.6562 0.75 +0.125 0.6562 0.7812 +0.125 0.6562 0.8125 +0.125 0.6562 0.8438 +0.125 0.6562 0.875 +0.125 0.6562 0.9062 +0.125 0.6562 0.9375 +0.125 0.6562 0.9688 +0.125 0.6562 1 +0.125 0.6875 0 +0.125 0.6875 0.03125 +0.125 0.6875 0.0625 +0.125 0.6875 0.09375 +0.125 0.6875 0.125 +0.125 0.6875 0.1562 +0.125 0.6875 0.1875 +0.125 0.6875 0.2188 +0.125 0.6875 0.25 +0.125 0.6875 0.2812 +0.125 0.6875 0.3125 +0.125 0.6875 0.3438 +0.125 0.6875 0.375 +0.125 0.6875 0.4062 +0.125 0.6875 0.4375 +0.125 0.6875 0.4688 +0.125 0.6875 0.5 +0.125 0.6875 0.5312 +0.125 0.6875 0.5625 +0.125 0.6875 0.5938 +0.125 0.6875 0.625 +0.125 0.6875 0.6562 +0.125 0.6875 0.6875 +0.125 0.6875 0.7188 +0.125 0.6875 0.75 +0.125 0.6875 0.7812 +0.125 0.6875 0.8125 +0.125 0.6875 0.8438 +0.125 0.6875 0.875 +0.125 0.6875 0.9062 +0.125 0.6875 0.9375 +0.125 0.6875 0.9688 +0.125 0.6875 1 +0.125 0.7188 0 +0.125 0.7188 0.03125 +0.125 0.7188 0.0625 +0.125 0.7188 0.09375 +0.125 0.7188 0.125 +0.125 0.7188 0.1562 +0.125 0.7188 0.1875 +0.125 0.7188 0.2188 +0.125 0.7188 0.25 +0.125 0.7188 0.2812 +0.125 0.7188 0.3125 +0.125 0.7188 0.3438 +0.125 0.7188 0.375 +0.125 0.7188 0.4062 +0.125 0.7188 0.4375 +0.125 0.7188 0.4688 +0.125 0.7188 0.5 +0.125 0.7188 0.5312 +0.125 0.7188 0.5625 +0.125 0.7188 0.5938 +0.125 0.7188 0.625 +0.125 0.7188 0.6562 +0.125 0.7188 0.6875 +0.125 0.7188 0.7188 +0.125 0.7188 0.75 +0.125 0.7188 0.7812 +0.125 0.7188 0.8125 +0.125 0.7188 0.8438 +0.125 0.7188 0.875 +0.125 0.7188 0.9062 +0.125 0.7188 0.9375 +0.125 0.7188 0.9688 +0.125 0.7188 1 +0.125 0.75 0 +0.125 0.75 0.03125 +0.125 0.75 0.0625 +0.125 0.75 0.09375 +0.125 0.75 0.125 +0.125 0.75 0.1562 +0.125 0.75 0.1875 +0.125 0.75 0.2188 +0.125 0.75 0.25 +0.125 0.75 0.2812 +0.125 0.75 0.3125 +0.125 0.75 0.3438 +0.125 0.75 0.375 +0.125 0.75 0.4062 +0.125 0.75 0.4375 +0.125 0.75 0.4688 +0.125 0.75 0.5 +0.125 0.75 0.5312 +0.125 0.75 0.5625 +0.125 0.75 0.5938 +0.125 0.75 0.625 +0.125 0.75 0.6562 +0.125 0.75 0.6875 +0.125 0.75 0.7188 +0.125 0.75 0.75 +0.125 0.75 0.7812 +0.125 0.75 0.8125 +0.125 0.75 0.8438 +0.125 0.75 0.875 +0.125 0.75 0.9062 +0.125 0.75 0.9375 +0.125 0.75 0.9688 +0.125 0.75 1 +0.125 0.7812 0 +0.125 0.7812 0.03125 +0.125 0.7812 0.0625 +0.125 0.7812 0.09375 +0.125 0.7812 0.125 +0.125 0.7812 0.1562 +0.125 0.7812 0.1875 +0.125 0.7812 0.2188 +0.125 0.7812 0.25 +0.125 0.7812 0.2812 +0.125 0.7812 0.3125 +0.125 0.7812 0.3438 +0.125 0.7812 0.375 +0.125 0.7812 0.4062 +0.125 0.7812 0.4375 +0.125 0.7812 0.4688 +0.125 0.7812 0.5 +0.125 0.7812 0.5312 +0.125 0.7812 0.5625 +0.125 0.7812 0.5938 +0.125 0.7812 0.625 +0.125 0.7812 0.6562 +0.125 0.7812 0.6875 +0.125 0.7812 0.7188 +0.125 0.7812 0.75 +0.125 0.7812 0.7812 +0.125 0.7812 0.8125 +0.125 0.7812 0.8438 +0.125 0.7812 0.875 +0.125 0.7812 0.9062 +0.125 0.7812 0.9375 +0.125 0.7812 0.9688 +0.125 0.7812 1 +0.125 0.8125 0 +0.125 0.8125 0.03125 +0.125 0.8125 0.0625 +0.125 0.8125 0.09375 +0.125 0.8125 0.125 +0.125 0.8125 0.1562 +0.125 0.8125 0.1875 +0.125 0.8125 0.2188 +0.125 0.8125 0.25 +0.125 0.8125 0.2812 +0.125 0.8125 0.3125 +0.125 0.8125 0.3438 +0.125 0.8125 0.375 +0.125 0.8125 0.4062 +0.125 0.8125 0.4375 +0.125 0.8125 0.4688 +0.125 0.8125 0.5 +0.125 0.8125 0.5312 +0.125 0.8125 0.5625 +0.125 0.8125 0.5938 +0.125 0.8125 0.625 +0.125 0.8125 0.6562 +0.125 0.8125 0.6875 +0.125 0.8125 0.7188 +0.125 0.8125 0.75 +0.125 0.8125 0.7812 +0.125 0.8125 0.8125 +0.125 0.8125 0.8438 +0.125 0.8125 0.875 +0.125 0.8125 0.9062 +0.125 0.8125 0.9375 +0.125 0.8125 0.9688 +0.125 0.8125 1 +0.125 0.8438 0 +0.125 0.8438 0.03125 +0.125 0.8438 0.0625 +0.125 0.8438 0.09375 +0.125 0.8438 0.125 +0.125 0.8438 0.1562 +0.125 0.8438 0.1875 +0.125 0.8438 0.2188 +0.125 0.8438 0.25 +0.125 0.8438 0.2812 +0.125 0.8438 0.3125 +0.125 0.8438 0.3438 +0.125 0.8438 0.375 +0.125 0.8438 0.4062 +0.125 0.8438 0.4375 +0.125 0.8438 0.4688 +0.125 0.8438 0.5 +0.125 0.8438 0.5312 +0.125 0.8438 0.5625 +0.125 0.8438 0.5938 +0.125 0.8438 0.625 +0.125 0.8438 0.6562 +0.125 0.8438 0.6875 +0.125 0.8438 0.7188 +0.125 0.8438 0.75 +0.125 0.8438 0.7812 +0.125 0.8438 0.8125 +0.125 0.8438 0.8438 +0.125 0.8438 0.875 +0.125 0.8438 0.9062 +0.125 0.8438 0.9375 +0.125 0.8438 0.9688 +0.125 0.8438 1 +0.125 0.875 0 +0.125 0.875 0.03125 +0.125 0.875 0.0625 +0.125 0.875 0.09375 +0.125 0.875 0.125 +0.125 0.875 0.1562 +0.125 0.875 0.1875 +0.125 0.875 0.2188 +0.125 0.875 0.25 +0.125 0.875 0.2812 +0.125 0.875 0.3125 +0.125 0.875 0.3438 +0.125 0.875 0.375 +0.125 0.875 0.4062 +0.125 0.875 0.4375 +0.125 0.875 0.4688 +0.125 0.875 0.5 +0.125 0.875 0.5312 +0.125 0.875 0.5625 +0.125 0.875 0.5938 +0.125 0.875 0.625 +0.125 0.875 0.6562 +0.125 0.875 0.6875 +0.125 0.875 0.7188 +0.125 0.875 0.75 +0.125 0.875 0.7812 +0.125 0.875 0.8125 +0.125 0.875 0.8438 +0.125 0.875 0.875 +0.125 0.875 0.9062 +0.125 0.875 0.9375 +0.125 0.875 0.9688 +0.125 0.875 1 +0.125 0.9062 0 +0.125 0.9062 0.03125 +0.125 0.9062 0.0625 +0.125 0.9062 0.09375 +0.125 0.9062 0.125 +0.125 0.9062 0.1562 +0.125 0.9062 0.1875 +0.125 0.9062 0.2188 +0.125 0.9062 0.25 +0.125 0.9062 0.2812 +0.125 0.9062 0.3125 +0.125 0.9062 0.3438 +0.125 0.9062 0.375 +0.125 0.9062 0.4062 +0.125 0.9062 0.4375 +0.125 0.9062 0.4688 +0.125 0.9062 0.5 +0.125 0.9062 0.5312 +0.125 0.9062 0.5625 +0.125 0.9062 0.5938 +0.125 0.9062 0.625 +0.125 0.9062 0.6562 +0.125 0.9062 0.6875 +0.125 0.9062 0.7188 +0.125 0.9062 0.75 +0.125 0.9062 0.7812 +0.125 0.9062 0.8125 +0.125 0.9062 0.8438 +0.125 0.9062 0.875 +0.125 0.9062 0.9062 +0.125 0.9062 0.9375 +0.125 0.9062 0.9688 +0.125 0.9062 1 +0.125 0.9375 0 +0.125 0.9375 0.03125 +0.125 0.9375 0.0625 +0.125 0.9375 0.09375 +0.125 0.9375 0.125 +0.125 0.9375 0.1562 +0.125 0.9375 0.1875 +0.125 0.9375 0.2188 +0.125 0.9375 0.25 +0.125 0.9375 0.2812 +0.125 0.9375 0.3125 +0.125 0.9375 0.3438 +0.125 0.9375 0.375 +0.125 0.9375 0.4062 +0.125 0.9375 0.4375 +0.125 0.9375 0.4688 +0.125 0.9375 0.5 +0.125 0.9375 0.5312 +0.125 0.9375 0.5625 +0.125 0.9375 0.5938 +0.125 0.9375 0.625 +0.125 0.9375 0.6562 +0.125 0.9375 0.6875 +0.125 0.9375 0.7188 +0.125 0.9375 0.75 +0.125 0.9375 0.7812 +0.125 0.9375 0.8125 +0.125 0.9375 0.8438 +0.125 0.9375 0.875 +0.125 0.9375 0.9062 +0.125 0.9375 0.9375 +0.125 0.9375 0.9688 +0.125 0.9375 1 +0.125 0.9688 0 +0.125 0.9688 0.03125 +0.125 0.9688 0.0625 +0.125 0.9688 0.09375 +0.125 0.9688 0.125 +0.125 0.9688 0.1562 +0.125 0.9688 0.1875 +0.125 0.9688 0.2188 +0.125 0.9688 0.25 +0.125 0.9688 0.2812 +0.125 0.9688 0.3125 +0.125 0.9688 0.3438 +0.125 0.9688 0.375 +0.125 0.9688 0.4062 +0.125 0.9688 0.4375 +0.125 0.9688 0.4688 +0.125 0.9688 0.5 +0.125 0.9688 0.5312 +0.125 0.9688 0.5625 +0.125 0.9688 0.5938 +0.125 0.9688 0.625 +0.125 0.9688 0.6562 +0.125 0.9688 0.6875 +0.125 0.9688 0.7188 +0.125 0.9688 0.75 +0.125 0.9688 0.7812 +0.125 0.9688 0.8125 +0.125 0.9688 0.8438 +0.125 0.9688 0.875 +0.125 0.9688 0.9062 +0.125 0.9688 0.9375 +0.125 0.9688 0.9688 +0.125 0.9688 1 +0.125 1 0 +0.125 1 0.03125 +0.125 1 0.0625 +0.125 1 0.09375 +0.125 1 0.125 +0.125 1 0.1562 +0.125 1 0.1875 +0.125 1 0.2188 +0.125 1 0.25 +0.125 1 0.2812 +0.125 1 0.3125 +0.125 1 0.3438 +0.125 1 0.375 +0.125 1 0.4062 +0.125 1 0.4375 +0.125 1 0.4688 +0.125 1 0.5 +0.125 1 0.5312 +0.125 1 0.5625 +0.125 1 0.5938 +0.125 1 0.625 +0.125 1 0.6562 +0.125 1 0.6875 +0.125 1 0.7188 +0.125 1 0.75 +0.125 1 0.7812 +0.125 1 0.8125 +0.125 1 0.8438 +0.125 1 0.875 +0.125 1 0.9062 +0.125 1 0.9375 +0.125 1 0.9688 +0.125 1 1 +0.1562 0 0 +0.1562 0 0.03125 +0.1562 0 0.0625 +0.1562 0 0.09375 +0.1562 0 0.125 +0.1562 0 0.1562 +0.1562 0 0.1875 +0.1562 0 0.2188 +0.1562 0 0.25 +0.1562 0 0.2812 +0.1562 0 0.3125 +0.1562 0 0.3438 +0.1562 0 0.375 +0.1562 0 0.4062 +0.1562 0 0.4375 +0.1562 0 0.4688 +0.1562 0 0.5 +0.1562 0 0.5312 +0.1562 0 0.5625 +0.1562 0 0.5938 +0.1562 0 0.625 +0.1562 0 0.6562 +0.1562 0 0.6875 +0.1562 0 0.7188 +0.1562 0 0.75 +0.1562 0 0.7812 +0.1562 0 0.8125 +0.1562 0 0.8438 +0.1562 0 0.875 +0.1562 0 0.9062 +0.1562 0 0.9375 +0.1562 0 0.9688 +0.1562 0 1 +0.1562 0.03125 0 +0.1562 0.03125 0.03125 +0.1562 0.03125 0.0625 +0.1562 0.03125 0.09375 +0.1562 0.03125 0.125 +0.1562 0.03125 0.1562 +0.1562 0.03125 0.1875 +0.1562 0.03125 0.2188 +0.1562 0.03125 0.25 +0.1562 0.03125 0.2812 +0.1562 0.03125 0.3125 +0.1562 0.03125 0.3438 +0.1562 0.03125 0.375 +0.1562 0.03125 0.4062 +0.1562 0.03125 0.4375 +0.1562 0.03125 0.4688 +0.1562 0.03125 0.5 +0.1562 0.03125 0.5312 +0.1562 0.03125 0.5625 +0.1562 0.03125 0.5938 +0.1562 0.03125 0.625 +0.1562 0.03125 0.6562 +0.1562 0.03125 0.6875 +0.1562 0.03125 0.7188 +0.1562 0.03125 0.75 +0.1562 0.03125 0.7812 +0.1562 0.03125 0.8125 +0.1562 0.03125 0.8438 +0.1562 0.03125 0.875 +0.1562 0.03125 0.9062 +0.1562 0.03125 0.9375 +0.1562 0.03125 0.9688 +0.1562 0.03125 1 +0.1562 0.0625 0 +0.1562 0.0625 0.03125 +0.1562 0.0625 0.0625 +0.1562 0.0625 0.09375 +0.1562 0.0625 0.125 +0.1562 0.0625 0.1562 +0.1562 0.0625 0.1875 +0.1562 0.0625 0.2188 +0.1562 0.0625 0.25 +0.1562 0.0625 0.2812 +0.1562 0.0625 0.3125 +0.1562 0.0625 0.3438 +0.1562 0.0625 0.375 +0.1562 0.0625 0.4062 +0.1562 0.0625 0.4375 +0.1562 0.0625 0.4688 +0.1562 0.0625 0.5 +0.1562 0.0625 0.5312 +0.1562 0.0625 0.5625 +0.1562 0.0625 0.5938 +0.1562 0.0625 0.625 +0.1562 0.0625 0.6562 +0.1562 0.0625 0.6875 +0.1562 0.0625 0.7188 +0.1562 0.0625 0.75 +0.1562 0.0625 0.7812 +0.1562 0.0625 0.8125 +0.1562 0.0625 0.8438 +0.1562 0.0625 0.875 +0.1562 0.0625 0.9062 +0.1562 0.0625 0.9375 +0.1562 0.0625 0.9688 +0.1562 0.0625 1 +0.1562 0.09375 0 +0.1562 0.09375 0.03125 +0.1562 0.09375 0.0625 +0.1562 0.09375 0.09375 +0.1562 0.09375 0.125 +0.1562 0.09375 0.1562 +0.1562 0.09375 0.1875 +0.1562 0.09375 0.2188 +0.1562 0.09375 0.25 +0.1562 0.09375 0.2812 +0.1562 0.09375 0.3125 +0.1562 0.09375 0.3438 +0.1562 0.09375 0.375 +0.1562 0.09375 0.4062 +0.1562 0.09375 0.4375 +0.1562 0.09375 0.4688 +0.1562 0.09375 0.5 +0.1562 0.09375 0.5312 +0.1562 0.09375 0.5625 +0.1562 0.09375 0.5938 +0.1562 0.09375 0.625 +0.1562 0.09375 0.6562 +0.1562 0.09375 0.6875 +0.1562 0.09375 0.7188 +0.1562 0.09375 0.75 +0.1562 0.09375 0.7812 +0.1562 0.09375 0.8125 +0.1562 0.09375 0.8438 +0.1562 0.09375 0.875 +0.1562 0.09375 0.9062 +0.1562 0.09375 0.9375 +0.1562 0.09375 0.9688 +0.1562 0.09375 1 +0.1562 0.125 0 +0.1562 0.125 0.03125 +0.1562 0.125 0.0625 +0.1562 0.125 0.09375 +0.1562 0.125 0.125 +0.1562 0.125 0.1562 +0.1562 0.125 0.1875 +0.1562 0.125 0.2188 +0.1562 0.125 0.25 +0.1562 0.125 0.2812 +0.1562 0.125 0.3125 +0.1562 0.125 0.3438 +0.1562 0.125 0.375 +0.1562 0.125 0.4062 +0.1562 0.125 0.4375 +0.1562 0.125 0.4688 +0.1562 0.125 0.5 +0.1562 0.125 0.5312 +0.1562 0.125 0.5625 +0.1562 0.125 0.5938 +0.1562 0.125 0.625 +0.1562 0.125 0.6562 +0.1562 0.125 0.6875 +0.1562 0.125 0.7188 +0.1562 0.125 0.75 +0.1562 0.125 0.7812 +0.1562 0.125 0.8125 +0.1562 0.125 0.8438 +0.1562 0.125 0.875 +0.1562 0.125 0.9062 +0.1562 0.125 0.9375 +0.1562 0.125 0.9688 +0.1562 0.125 1 +0.1562 0.1562 0 +0.1562 0.1562 0.03125 +0.1562 0.1562 0.0625 +0.1562 0.1562 0.09375 +0.1562 0.1562 0.125 +0.1562 0.1562 0.1562 +0.1562 0.1562 0.1875 +0.1562 0.1562 0.2188 +0.1562 0.1562 0.25 +0.1562 0.1562 0.2812 +0.1562 0.1562 0.3125 +0.1562 0.1562 0.3438 +0.1562 0.1562 0.375 +0.1562 0.1562 0.4062 +0.1562 0.1562 0.4375 +0.1562 0.1562 0.4688 +0.1562 0.1562 0.5 +0.1562 0.1562 0.5312 +0.1562 0.1562 0.5625 +0.1562 0.1562 0.5938 +0.1562 0.1562 0.625 +0.1562 0.1562 0.6562 +0.1562 0.1562 0.6875 +0.1562 0.1562 0.7188 +0.1562 0.1562 0.75 +0.1562 0.1562 0.7812 +0.1562 0.1562 0.8125 +0.1562 0.1562 0.8438 +0.1562 0.1562 0.875 +0.1562 0.1562 0.9062 +0.1562 0.1562 0.9375 +0.1562 0.1562 0.9688 +0.1562 0.1562 1 +0.1562 0.1875 0 +0.1562 0.1875 0.03125 +0.1562 0.1875 0.0625 +0.1562 0.1875 0.09375 +0.1562 0.1875 0.125 +0.1562 0.1875 0.1562 +0.1562 0.1875 0.1875 +0.1562 0.1875 0.2188 +0.1562 0.1875 0.25 +0.1562 0.1875 0.2812 +0.1562 0.1875 0.3125 +0.1562 0.1875 0.3438 +0.1562 0.1875 0.375 +0.1562 0.1875 0.4062 +0.1562 0.1875 0.4375 +0.1562 0.1875 0.4688 +0.1562 0.1875 0.5 +0.1562 0.1875 0.5312 +0.1562 0.1875 0.5625 +0.1562 0.1875 0.5938 +0.1562 0.1875 0.625 +0.1562 0.1875 0.6562 +0.1562 0.1875 0.6875 +0.1562 0.1875 0.7188 +0.1562 0.1875 0.75 +0.1562 0.1875 0.7812 +0.1562 0.1875 0.8125 +0.1562 0.1875 0.8438 +0.1562 0.1875 0.875 +0.1562 0.1875 0.9062 +0.1562 0.1875 0.9375 +0.1562 0.1875 0.9688 +0.1562 0.1875 1 +0.1562 0.2188 0 +0.1562 0.2188 0.03125 +0.1562 0.2188 0.0625 +0.1562 0.2188 0.09375 +0.1562 0.2188 0.125 +0.1562 0.2188 0.1562 +0.1562 0.2188 0.1875 +0.1562 0.2188 0.2188 +0.1562 0.2188 0.25 +0.1562 0.2188 0.2812 +0.1562 0.2188 0.3125 +0.1562 0.2188 0.3438 +0.1562 0.2188 0.375 +0.1562 0.2188 0.4062 +0.1562 0.2188 0.4375 +0.1562 0.2188 0.4688 +0.1562 0.2188 0.5 +0.1562 0.2188 0.5312 +0.1562 0.2188 0.5625 +0.1562 0.2188 0.5938 +0.1562 0.2188 0.625 +0.1562 0.2188 0.6562 +0.1562 0.2188 0.6875 +0.1562 0.2188 0.7188 +0.1562 0.2188 0.75 +0.1562 0.2188 0.7812 +0.1562 0.2188 0.8125 +0.1562 0.2188 0.8438 +0.1562 0.2188 0.875 +0.1562 0.2188 0.9062 +0.1562 0.2188 0.9375 +0.1562 0.2188 0.9688 +0.1562 0.2188 1 +0.1562 0.25 0 +0.1562 0.25 0.03125 +0.1562 0.25 0.0625 +0.1562 0.25 0.09375 +0.1562 0.25 0.125 +0.1562 0.25 0.1562 +0.1562 0.25 0.1875 +0.1562 0.25 0.2188 +0.1562 0.25 0.25 +0.1562 0.25 0.2812 +0.1562 0.25 0.3125 +0.1562 0.25 0.3438 +0.1562 0.25 0.375 +0.1562 0.25 0.4062 +0.1562 0.25 0.4375 +0.1562 0.25 0.4688 +0.1562 0.25 0.5 +0.1562 0.25 0.5312 +0.1562 0.25 0.5625 +0.1562 0.25 0.5938 +0.1562 0.25 0.625 +0.1562 0.25 0.6562 +0.1562 0.25 0.6875 +0.1562 0.25 0.7188 +0.1562 0.25 0.75 +0.1562 0.25 0.7812 +0.1562 0.25 0.8125 +0.1562 0.25 0.8438 +0.1562 0.25 0.875 +0.1562 0.25 0.9062 +0.1562 0.25 0.9375 +0.1562 0.25 0.9688 +0.1562 0.25 1 +0.1562 0.2812 0 +0.1562 0.2812 0.03125 +0.1562 0.2812 0.0625 +0.1562 0.2812 0.09375 +0.1562 0.2812 0.125 +0.1562 0.2812 0.1562 +0.1562 0.2812 0.1875 +0.1562 0.2812 0.2188 +0.1562 0.2812 0.25 +0.1562 0.2812 0.2812 +0.1562 0.2812 0.3125 +0.1562 0.2812 0.3438 +0.1562 0.2812 0.375 +0.1562 0.2812 0.4062 +0.1562 0.2812 0.4375 +0.1562 0.2812 0.4688 +0.1562 0.2812 0.5 +0.1562 0.2812 0.5312 +0.1562 0.2812 0.5625 +0.1562 0.2812 0.5938 +0.1562 0.2812 0.625 +0.1562 0.2812 0.6562 +0.1562 0.2812 0.6875 +0.1562 0.2812 0.7188 +0.1562 0.2812 0.75 +0.1562 0.2812 0.7812 +0.1562 0.2812 0.8125 +0.1562 0.2812 0.8438 +0.1562 0.2812 0.875 +0.1562 0.2812 0.9062 +0.1562 0.2812 0.9375 +0.1562 0.2812 0.9688 +0.1562 0.2812 1 +0.1562 0.3125 0 +0.1562 0.3125 0.03125 +0.1562 0.3125 0.0625 +0.1562 0.3125 0.09375 +0.1562 0.3125 0.125 +0.1562 0.3125 0.1562 +0.1562 0.3125 0.1875 +0.1562 0.3125 0.2188 +0.1562 0.3125 0.25 +0.1562 0.3125 0.2812 +0.1562 0.3125 0.3125 +0.1562 0.3125 0.3438 +0.1562 0.3125 0.375 +0.1562 0.3125 0.4062 +0.1562 0.3125 0.4375 +0.1562 0.3125 0.4688 +0.1562 0.3125 0.5 +0.1562 0.3125 0.5312 +0.1562 0.3125 0.5625 +0.1562 0.3125 0.5938 +0.1562 0.3125 0.625 +0.1562 0.3125 0.6562 +0.1562 0.3125 0.6875 +0.1562 0.3125 0.7188 +0.1562 0.3125 0.75 +0.1562 0.3125 0.7812 +0.1562 0.3125 0.8125 +0.1562 0.3125 0.8438 +0.1562 0.3125 0.875 +0.1562 0.3125 0.9062 +0.1562 0.3125 0.9375 +0.1562 0.3125 0.9688 +0.1562 0.3125 1 +0.1562 0.3438 0 +0.1562 0.3438 0.03125 +0.1562 0.3438 0.0625 +0.1562 0.3438 0.09375 +0.1562 0.3438 0.125 +0.1562 0.3438 0.1562 +0.1562 0.3438 0.1875 +0.1562 0.3438 0.2188 +0.1562 0.3438 0.25 +0.1562 0.3438 0.2812 +0.1562 0.3438 0.3125 +0.1562 0.3438 0.3438 +0.1562 0.3438 0.375 +0.1562 0.3438 0.4062 +0.1562 0.3438 0.4375 +0.1562 0.3438 0.4688 +0.1562 0.3438 0.5 +0.1562 0.3438 0.5312 +0.1562 0.3438 0.5625 +0.1562 0.3438 0.5938 +0.1562 0.3438 0.625 +0.1562 0.3438 0.6562 +0.1562 0.3438 0.6875 +0.1562 0.3438 0.7188 +0.1562 0.3438 0.75 +0.1562 0.3438 0.7812 +0.1562 0.3438 0.8125 +0.1562 0.3438 0.8438 +0.1562 0.3438 0.875 +0.1562 0.3438 0.9062 +0.1562 0.3438 0.9375 +0.1562 0.3438 0.9688 +0.1562 0.3438 1 +0.1562 0.375 0 +0.1562 0.375 0.03125 +0.1562 0.375 0.0625 +0.1562 0.375 0.09375 +0.1562 0.375 0.125 +0.1562 0.375 0.1562 +0.1562 0.375 0.1875 +0.1562 0.375 0.2188 +0.1562 0.375 0.25 +0.1562 0.375 0.2812 +0.1562 0.375 0.3125 +0.1562 0.375 0.3438 +0.1562 0.375 0.375 +0.1562 0.375 0.4062 +0.1562 0.375 0.4375 +0.1562 0.375 0.4688 +0.1562 0.375 0.5 +0.1562 0.375 0.5312 +0.1562 0.375 0.5625 +0.1562 0.375 0.5938 +0.1562 0.375 0.625 +0.1562 0.375 0.6562 +0.1562 0.375 0.6875 +0.1562 0.375 0.7188 +0.1562 0.375 0.75 +0.1562 0.375 0.7812 +0.1562 0.375 0.8125 +0.1562 0.375 0.8438 +0.1562 0.375 0.875 +0.1562 0.375 0.9062 +0.1562 0.375 0.9375 +0.1562 0.375 0.9688 +0.1562 0.375 1 +0.1562 0.4062 0 +0.1562 0.4062 0.03125 +0.1562 0.4062 0.0625 +0.1562 0.4062 0.09375 +0.1562 0.4062 0.125 +0.1562 0.4062 0.1562 +0.1562 0.4062 0.1875 +0.1562 0.4062 0.2188 +0.1562 0.4062 0.25 +0.1562 0.4062 0.2812 +0.1562 0.4062 0.3125 +0.1562 0.4062 0.3438 +0.1562 0.4062 0.375 +0.1562 0.4062 0.4062 +0.1562 0.4062 0.4375 +0.1562 0.4062 0.4688 +0.1562 0.4062 0.5 +0.1562 0.4062 0.5312 +0.1562 0.4062 0.5625 +0.1562 0.4062 0.5938 +0.1562 0.4062 0.625 +0.1562 0.4062 0.6562 +0.1562 0.4062 0.6875 +0.1562 0.4062 0.7188 +0.1562 0.4062 0.75 +0.1562 0.4062 0.7812 +0.1562 0.4062 0.8125 +0.1562 0.4062 0.8438 +0.1562 0.4062 0.875 +0.1562 0.4062 0.9062 +0.1562 0.4062 0.9375 +0.1562 0.4062 0.9688 +0.1562 0.4062 1 +0.1562 0.4375 0 +0.1562 0.4375 0.03125 +0.1562 0.4375 0.0625 +0.1562 0.4375 0.09375 +0.1562 0.4375 0.125 +0.1562 0.4375 0.1562 +0.1562 0.4375 0.1875 +0.1562 0.4375 0.2188 +0.1562 0.4375 0.25 +0.1562 0.4375 0.2812 +0.1562 0.4375 0.3125 +0.1562 0.4375 0.3438 +0.1562 0.4375 0.375 +0.1562 0.4375 0.4062 +0.1562 0.4375 0.4375 +0.1562 0.4375 0.4688 +0.1562 0.4375 0.5 +0.1562 0.4375 0.5312 +0.1562 0.4375 0.5625 +0.1562 0.4375 0.5938 +0.1562 0.4375 0.625 +0.1562 0.4375 0.6562 +0.1562 0.4375 0.6875 +0.1562 0.4375 0.7188 +0.1562 0.4375 0.75 +0.1562 0.4375 0.7812 +0.1562 0.4375 0.8125 +0.1562 0.4375 0.8438 +0.1562 0.4375 0.875 +0.1562 0.4375 0.9062 +0.1562 0.4375 0.9375 +0.1562 0.4375 0.9688 +0.1562 0.4375 1 +0.1562 0.4688 0 +0.1562 0.4688 0.03125 +0.1562 0.4688 0.0625 +0.1562 0.4688 0.09375 +0.1562 0.4688 0.125 +0.1562 0.4688 0.1562 +0.1562 0.4688 0.1875 +0.1562 0.4688 0.2188 +0.1562 0.4688 0.25 +0.1562 0.4688 0.2812 +0.1562 0.4688 0.3125 +0.1562 0.4688 0.3438 +0.1562 0.4688 0.375 +0.1562 0.4688 0.4062 +0.1562 0.4688 0.4375 +0.1562 0.4688 0.4688 +0.1562 0.4688 0.5 +0.1562 0.4688 0.5312 +0.1562 0.4688 0.5625 +0.1562 0.4688 0.5938 +0.1562 0.4688 0.625 +0.1562 0.4688 0.6562 +0.1562 0.4688 0.6875 +0.1562 0.4688 0.7188 +0.1562 0.4688 0.75 +0.1562 0.4688 0.7812 +0.1562 0.4688 0.8125 +0.1562 0.4688 0.8438 +0.1562 0.4688 0.875 +0.1562 0.4688 0.9062 +0.1562 0.4688 0.9375 +0.1562 0.4688 0.9688 +0.1562 0.4688 1 +0.1562 0.5 0 +0.1562 0.5 0.03125 +0.1562 0.5 0.0625 +0.1562 0.5 0.09375 +0.1562 0.5 0.125 +0.1562 0.5 0.1562 +0.1562 0.5 0.1875 +0.1562 0.5 0.2188 +0.1562 0.5 0.25 +0.1562 0.5 0.2812 +0.1562 0.5 0.3125 +0.1562 0.5 0.3438 +0.1562 0.5 0.375 +0.1562 0.5 0.4062 +0.1562 0.5 0.4375 +0.1562 0.5 0.4688 +0.1562 0.5 0.5 +0.1562 0.5 0.5312 +0.1562 0.5 0.5625 +0.1562 0.5 0.5938 +0.1562 0.5 0.625 +0.1562 0.5 0.6562 +0.1562 0.5 0.6875 +0.1562 0.5 0.7188 +0.1562 0.5 0.75 +0.1562 0.5 0.7812 +0.1562 0.5 0.8125 +0.1562 0.5 0.8438 +0.1562 0.5 0.875 +0.1562 0.5 0.9062 +0.1562 0.5 0.9375 +0.1562 0.5 0.9688 +0.1562 0.5 1 +0.1562 0.5312 0 +0.1562 0.5312 0.03125 +0.1562 0.5312 0.0625 +0.1562 0.5312 0.09375 +0.1562 0.5312 0.125 +0.1562 0.5312 0.1562 +0.1562 0.5312 0.1875 +0.1562 0.5312 0.2188 +0.1562 0.5312 0.25 +0.1562 0.5312 0.2812 +0.1562 0.5312 0.3125 +0.1562 0.5312 0.3438 +0.1562 0.5312 0.375 +0.1562 0.5312 0.4062 +0.1562 0.5312 0.4375 +0.1562 0.5312 0.4688 +0.1562 0.5312 0.5 +0.1562 0.5312 0.5312 +0.1562 0.5312 0.5625 +0.1562 0.5312 0.5938 +0.1562 0.5312 0.625 +0.1562 0.5312 0.6562 +0.1562 0.5312 0.6875 +0.1562 0.5312 0.7188 +0.1562 0.5312 0.75 +0.1562 0.5312 0.7812 +0.1562 0.5312 0.8125 +0.1562 0.5312 0.8438 +0.1562 0.5312 0.875 +0.1562 0.5312 0.9062 +0.1562 0.5312 0.9375 +0.1562 0.5312 0.9688 +0.1562 0.5312 1 +0.1562 0.5625 0 +0.1562 0.5625 0.03125 +0.1562 0.5625 0.0625 +0.1562 0.5625 0.09375 +0.1562 0.5625 0.125 +0.1562 0.5625 0.1562 +0.1562 0.5625 0.1875 +0.1562 0.5625 0.2188 +0.1562 0.5625 0.25 +0.1562 0.5625 0.2812 +0.1562 0.5625 0.3125 +0.1562 0.5625 0.3438 +0.1562 0.5625 0.375 +0.1562 0.5625 0.4062 +0.1562 0.5625 0.4375 +0.1562 0.5625 0.4688 +0.1562 0.5625 0.5 +0.1562 0.5625 0.5312 +0.1562 0.5625 0.5625 +0.1562 0.5625 0.5938 +0.1562 0.5625 0.625 +0.1562 0.5625 0.6562 +0.1562 0.5625 0.6875 +0.1562 0.5625 0.7188 +0.1562 0.5625 0.75 +0.1562 0.5625 0.7812 +0.1562 0.5625 0.8125 +0.1562 0.5625 0.8438 +0.1562 0.5625 0.875 +0.1562 0.5625 0.9062 +0.1562 0.5625 0.9375 +0.1562 0.5625 0.9688 +0.1562 0.5625 1 +0.1562 0.5938 0 +0.1562 0.5938 0.03125 +0.1562 0.5938 0.0625 +0.1562 0.5938 0.09375 +0.1562 0.5938 0.125 +0.1562 0.5938 0.1562 +0.1562 0.5938 0.1875 +0.1562 0.5938 0.2188 +0.1562 0.5938 0.25 +0.1562 0.5938 0.2812 +0.1562 0.5938 0.3125 +0.1562 0.5938 0.3438 +0.1562 0.5938 0.375 +0.1562 0.5938 0.4062 +0.1562 0.5938 0.4375 +0.1562 0.5938 0.4688 +0.1562 0.5938 0.5 +0.1562 0.5938 0.5312 +0.1562 0.5938 0.5625 +0.1562 0.5938 0.5938 +0.1562 0.5938 0.625 +0.1562 0.5938 0.6562 +0.1562 0.5938 0.6875 +0.1562 0.5938 0.7188 +0.1562 0.5938 0.75 +0.1562 0.5938 0.7812 +0.1562 0.5938 0.8125 +0.1562 0.5938 0.8438 +0.1562 0.5938 0.875 +0.1562 0.5938 0.9062 +0.1562 0.5938 0.9375 +0.1562 0.5938 0.9688 +0.1562 0.5938 1 +0.1562 0.625 0 +0.1562 0.625 0.03125 +0.1562 0.625 0.0625 +0.1562 0.625 0.09375 +0.1562 0.625 0.125 +0.1562 0.625 0.1562 +0.1562 0.625 0.1875 +0.1562 0.625 0.2188 +0.1562 0.625 0.25 +0.1562 0.625 0.2812 +0.1562 0.625 0.3125 +0.1562 0.625 0.3438 +0.1562 0.625 0.375 +0.1562 0.625 0.4062 +0.1562 0.625 0.4375 +0.1562 0.625 0.4688 +0.1562 0.625 0.5 +0.1562 0.625 0.5312 +0.1562 0.625 0.5625 +0.1562 0.625 0.5938 +0.1562 0.625 0.625 +0.1562 0.625 0.6562 +0.1562 0.625 0.6875 +0.1562 0.625 0.7188 +0.1562 0.625 0.75 +0.1562 0.625 0.7812 +0.1562 0.625 0.8125 +0.1562 0.625 0.8438 +0.1562 0.625 0.875 +0.1562 0.625 0.9062 +0.1562 0.625 0.9375 +0.1562 0.625 0.9688 +0.1562 0.625 1 +0.1562 0.6562 0 +0.1562 0.6562 0.03125 +0.1562 0.6562 0.0625 +0.1562 0.6562 0.09375 +0.1562 0.6562 0.125 +0.1562 0.6562 0.1562 +0.1562 0.6562 0.1875 +0.1562 0.6562 0.2188 +0.1562 0.6562 0.25 +0.1562 0.6562 0.2812 +0.1562 0.6562 0.3125 +0.1562 0.6562 0.3438 +0.1562 0.6562 0.375 +0.1562 0.6562 0.4062 +0.1562 0.6562 0.4375 +0.1562 0.6562 0.4688 +0.1562 0.6562 0.5 +0.1562 0.6562 0.5312 +0.1562 0.6562 0.5625 +0.1562 0.6562 0.5938 +0.1562 0.6562 0.625 +0.1562 0.6562 0.6562 +0.1562 0.6562 0.6875 +0.1562 0.6562 0.7188 +0.1562 0.6562 0.75 +0.1562 0.6562 0.7812 +0.1562 0.6562 0.8125 +0.1562 0.6562 0.8438 +0.1562 0.6562 0.875 +0.1562 0.6562 0.9062 +0.1562 0.6562 0.9375 +0.1562 0.6562 0.9688 +0.1562 0.6562 1 +0.1562 0.6875 0 +0.1562 0.6875 0.03125 +0.1562 0.6875 0.0625 +0.1562 0.6875 0.09375 +0.1562 0.6875 0.125 +0.1562 0.6875 0.1562 +0.1562 0.6875 0.1875 +0.1562 0.6875 0.2188 +0.1562 0.6875 0.25 +0.1562 0.6875 0.2812 +0.1562 0.6875 0.3125 +0.1562 0.6875 0.3438 +0.1562 0.6875 0.375 +0.1562 0.6875 0.4062 +0.1562 0.6875 0.4375 +0.1562 0.6875 0.4688 +0.1562 0.6875 0.5 +0.1562 0.6875 0.5312 +0.1562 0.6875 0.5625 +0.1562 0.6875 0.5938 +0.1562 0.6875 0.625 +0.1562 0.6875 0.6562 +0.1562 0.6875 0.6875 +0.1562 0.6875 0.7188 +0.1562 0.6875 0.75 +0.1562 0.6875 0.7812 +0.1562 0.6875 0.8125 +0.1562 0.6875 0.8438 +0.1562 0.6875 0.875 +0.1562 0.6875 0.9062 +0.1562 0.6875 0.9375 +0.1562 0.6875 0.9688 +0.1562 0.6875 1 +0.1562 0.7188 0 +0.1562 0.7188 0.03125 +0.1562 0.7188 0.0625 +0.1562 0.7188 0.09375 +0.1562 0.7188 0.125 +0.1562 0.7188 0.1562 +0.1562 0.7188 0.1875 +0.1562 0.7188 0.2188 +0.1562 0.7188 0.25 +0.1562 0.7188 0.2812 +0.1562 0.7188 0.3125 +0.1562 0.7188 0.3438 +0.1562 0.7188 0.375 +0.1562 0.7188 0.4062 +0.1562 0.7188 0.4375 +0.1562 0.7188 0.4688 +0.1562 0.7188 0.5 +0.1562 0.7188 0.5312 +0.1562 0.7188 0.5625 +0.1562 0.7188 0.5938 +0.1562 0.7188 0.625 +0.1562 0.7188 0.6562 +0.1562 0.7188 0.6875 +0.1562 0.7188 0.7188 +0.1562 0.7188 0.75 +0.1562 0.7188 0.7812 +0.1562 0.7188 0.8125 +0.1562 0.7188 0.8438 +0.1562 0.7188 0.875 +0.1562 0.7188 0.9062 +0.1562 0.7188 0.9375 +0.1562 0.7188 0.9688 +0.1562 0.7188 1 +0.1562 0.75 0 +0.1562 0.75 0.03125 +0.1562 0.75 0.0625 +0.1562 0.75 0.09375 +0.1562 0.75 0.125 +0.1562 0.75 0.1562 +0.1562 0.75 0.1875 +0.1562 0.75 0.2188 +0.1562 0.75 0.25 +0.1562 0.75 0.2812 +0.1562 0.75 0.3125 +0.1562 0.75 0.3438 +0.1562 0.75 0.375 +0.1562 0.75 0.4062 +0.1562 0.75 0.4375 +0.1562 0.75 0.4688 +0.1562 0.75 0.5 +0.1562 0.75 0.5312 +0.1562 0.75 0.5625 +0.1562 0.75 0.5938 +0.1562 0.75 0.625 +0.1562 0.75 0.6562 +0.1562 0.75 0.6875 +0.1562 0.75 0.7188 +0.1562 0.75 0.75 +0.1562 0.75 0.7812 +0.1562 0.75 0.8125 +0.1562 0.75 0.8438 +0.1562 0.75 0.875 +0.1562 0.75 0.9062 +0.1562 0.75 0.9375 +0.1562 0.75 0.9688 +0.1562 0.75 1 +0.1562 0.7812 0 +0.1562 0.7812 0.03125 +0.1562 0.7812 0.0625 +0.1562 0.7812 0.09375 +0.1562 0.7812 0.125 +0.1562 0.7812 0.1562 +0.1562 0.7812 0.1875 +0.1562 0.7812 0.2188 +0.1562 0.7812 0.25 +0.1562 0.7812 0.2812 +0.1562 0.7812 0.3125 +0.1562 0.7812 0.3438 +0.1562 0.7812 0.375 +0.1562 0.7812 0.4062 +0.1562 0.7812 0.4375 +0.1562 0.7812 0.4688 +0.1562 0.7812 0.5 +0.1562 0.7812 0.5312 +0.1562 0.7812 0.5625 +0.1562 0.7812 0.5938 +0.1562 0.7812 0.625 +0.1562 0.7812 0.6562 +0.1562 0.7812 0.6875 +0.1562 0.7812 0.7188 +0.1562 0.7812 0.75 +0.1562 0.7812 0.7812 +0.1562 0.7812 0.8125 +0.1562 0.7812 0.8438 +0.1562 0.7812 0.875 +0.1562 0.7812 0.9062 +0.1562 0.7812 0.9375 +0.1562 0.7812 0.9688 +0.1562 0.7812 1 +0.1562 0.8125 0 +0.1562 0.8125 0.03125 +0.1562 0.8125 0.0625 +0.1562 0.8125 0.09375 +0.1562 0.8125 0.125 +0.1562 0.8125 0.1562 +0.1562 0.8125 0.1875 +0.1562 0.8125 0.2188 +0.1562 0.8125 0.25 +0.1562 0.8125 0.2812 +0.1562 0.8125 0.3125 +0.1562 0.8125 0.3438 +0.1562 0.8125 0.375 +0.1562 0.8125 0.4062 +0.1562 0.8125 0.4375 +0.1562 0.8125 0.4688 +0.1562 0.8125 0.5 +0.1562 0.8125 0.5312 +0.1562 0.8125 0.5625 +0.1562 0.8125 0.5938 +0.1562 0.8125 0.625 +0.1562 0.8125 0.6562 +0.1562 0.8125 0.6875 +0.1562 0.8125 0.7188 +0.1562 0.8125 0.75 +0.1562 0.8125 0.7812 +0.1562 0.8125 0.8125 +0.1562 0.8125 0.8438 +0.1562 0.8125 0.875 +0.1562 0.8125 0.9062 +0.1562 0.8125 0.9375 +0.1562 0.8125 0.9688 +0.1562 0.8125 1 +0.1562 0.8438 0 +0.1562 0.8438 0.03125 +0.1562 0.8438 0.0625 +0.1562 0.8438 0.09375 +0.1562 0.8438 0.125 +0.1562 0.8438 0.1562 +0.1562 0.8438 0.1875 +0.1562 0.8438 0.2188 +0.1562 0.8438 0.25 +0.1562 0.8438 0.2812 +0.1562 0.8438 0.3125 +0.1562 0.8438 0.3438 +0.1562 0.8438 0.375 +0.1562 0.8438 0.4062 +0.1562 0.8438 0.4375 +0.1562 0.8438 0.4688 +0.1562 0.8438 0.5 +0.1562 0.8438 0.5312 +0.1562 0.8438 0.5625 +0.1562 0.8438 0.5938 +0.1562 0.8438 0.625 +0.1562 0.8438 0.6562 +0.1562 0.8438 0.6875 +0.1562 0.8438 0.7188 +0.1562 0.8438 0.75 +0.1562 0.8438 0.7812 +0.1562 0.8438 0.8125 +0.1562 0.8438 0.8438 +0.1562 0.8438 0.875 +0.1562 0.8438 0.9062 +0.1562 0.8438 0.9375 +0.1562 0.8438 0.9688 +0.1562 0.8438 1 +0.1562 0.875 0 +0.1562 0.875 0.03125 +0.1562 0.875 0.0625 +0.1562 0.875 0.09375 +0.1562 0.875 0.125 +0.1562 0.875 0.1562 +0.1562 0.875 0.1875 +0.1562 0.875 0.2188 +0.1562 0.875 0.25 +0.1562 0.875 0.2812 +0.1562 0.875 0.3125 +0.1562 0.875 0.3438 +0.1562 0.875 0.375 +0.1562 0.875 0.4062 +0.1562 0.875 0.4375 +0.1562 0.875 0.4688 +0.1562 0.875 0.5 +0.1562 0.875 0.5312 +0.1562 0.875 0.5625 +0.1562 0.875 0.5938 +0.1562 0.875 0.625 +0.1562 0.875 0.6562 +0.1562 0.875 0.6875 +0.1562 0.875 0.7188 +0.1562 0.875 0.75 +0.1562 0.875 0.7812 +0.1562 0.875 0.8125 +0.1562 0.875 0.8438 +0.1562 0.875 0.875 +0.1562 0.875 0.9062 +0.1562 0.875 0.9375 +0.1562 0.875 0.9688 +0.1562 0.875 1 +0.1562 0.9062 0 +0.1562 0.9062 0.03125 +0.1562 0.9062 0.0625 +0.1562 0.9062 0.09375 +0.1562 0.9062 0.125 +0.1562 0.9062 0.1562 +0.1562 0.9062 0.1875 +0.1562 0.9062 0.2188 +0.1562 0.9062 0.25 +0.1562 0.9062 0.2812 +0.1562 0.9062 0.3125 +0.1562 0.9062 0.3438 +0.1562 0.9062 0.375 +0.1562 0.9062 0.4062 +0.1562 0.9062 0.4375 +0.1562 0.9062 0.4688 +0.1562 0.9062 0.5 +0.1562 0.9062 0.5312 +0.1562 0.9062 0.5625 +0.1562 0.9062 0.5938 +0.1562 0.9062 0.625 +0.1562 0.9062 0.6562 +0.1562 0.9062 0.6875 +0.1562 0.9062 0.7188 +0.1562 0.9062 0.75 +0.1562 0.9062 0.7812 +0.1562 0.9062 0.8125 +0.1562 0.9062 0.8438 +0.1562 0.9062 0.875 +0.1562 0.9062 0.9062 +0.1562 0.9062 0.9375 +0.1562 0.9062 0.9688 +0.1562 0.9062 1 +0.1562 0.9375 0 +0.1562 0.9375 0.03125 +0.1562 0.9375 0.0625 +0.1562 0.9375 0.09375 +0.1562 0.9375 0.125 +0.1562 0.9375 0.1562 +0.1562 0.9375 0.1875 +0.1562 0.9375 0.2188 +0.1562 0.9375 0.25 +0.1562 0.9375 0.2812 +0.1562 0.9375 0.3125 +0.1562 0.9375 0.3438 +0.1562 0.9375 0.375 +0.1562 0.9375 0.4062 +0.1562 0.9375 0.4375 +0.1562 0.9375 0.4688 +0.1562 0.9375 0.5 +0.1562 0.9375 0.5312 +0.1562 0.9375 0.5625 +0.1562 0.9375 0.5938 +0.1562 0.9375 0.625 +0.1562 0.9375 0.6562 +0.1562 0.9375 0.6875 +0.1562 0.9375 0.7188 +0.1562 0.9375 0.75 +0.1562 0.9375 0.7812 +0.1562 0.9375 0.8125 +0.1562 0.9375 0.8438 +0.1562 0.9375 0.875 +0.1562 0.9375 0.9062 +0.1562 0.9375 0.9375 +0.1562 0.9375 0.9688 +0.1562 0.9375 1 +0.1562 0.9688 0 +0.1562 0.9688 0.03125 +0.1562 0.9688 0.0625 +0.1562 0.9688 0.09375 +0.1562 0.9688 0.125 +0.1562 0.9688 0.1562 +0.1562 0.9688 0.1875 +0.1562 0.9688 0.2188 +0.1562 0.9688 0.25 +0.1562 0.9688 0.2812 +0.1562 0.9688 0.3125 +0.1562 0.9688 0.3438 +0.1562 0.9688 0.375 +0.1562 0.9688 0.4062 +0.1562 0.9688 0.4375 +0.1562 0.9688 0.4688 +0.1562 0.9688 0.5 +0.1562 0.9688 0.5312 +0.1562 0.9688 0.5625 +0.1562 0.9688 0.5938 +0.1562 0.9688 0.625 +0.1562 0.9688 0.6562 +0.1562 0.9688 0.6875 +0.1562 0.9688 0.7188 +0.1562 0.9688 0.75 +0.1562 0.9688 0.7812 +0.1562 0.9688 0.8125 +0.1562 0.9688 0.8438 +0.1562 0.9688 0.875 +0.1562 0.9688 0.9062 +0.1562 0.9688 0.9375 +0.1562 0.9688 0.9688 +0.1562 0.9688 1 +0.1562 1 0 +0.1562 1 0.03125 +0.1562 1 0.0625 +0.1562 1 0.09375 +0.1562 1 0.125 +0.1562 1 0.1562 +0.1562 1 0.1875 +0.1562 1 0.2188 +0.1562 1 0.25 +0.1562 1 0.2812 +0.1562 1 0.3125 +0.1562 1 0.3438 +0.1562 1 0.375 +0.1562 1 0.4062 +0.1562 1 0.4375 +0.1562 1 0.4688 +0.1562 1 0.5 +0.1562 1 0.5312 +0.1562 1 0.5625 +0.1562 1 0.5938 +0.1562 1 0.625 +0.1562 1 0.6562 +0.1562 1 0.6875 +0.1562 1 0.7188 +0.1562 1 0.75 +0.1562 1 0.7812 +0.1562 1 0.8125 +0.1562 1 0.8438 +0.1562 1 0.875 +0.1562 1 0.9062 +0.1562 1 0.9375 +0.1562 1 0.9688 +0.1562 1 1 +0.1875 0 0 +0.1875 0 0.03125 +0.1875 0 0.0625 +0.1875 0 0.09375 +0.1875 0 0.125 +0.1875 0 0.1562 +0.1875 0 0.1875 +0.1875 0 0.2188 +0.1875 0 0.25 +0.1875 0 0.2812 +0.1875 0 0.3125 +0.1875 0 0.3438 +0.1875 0 0.375 +0.1875 0 0.4062 +0.1875 0 0.4375 +0.1875 0 0.4688 +0.1875 0 0.5 +0.1875 0 0.5312 +0.1875 0 0.5625 +0.1875 0 0.5938 +0.1875 0 0.625 +0.1875 0 0.6562 +0.1875 0 0.6875 +0.1875 0 0.7188 +0.1875 0 0.75 +0.1875 0 0.7812 +0.1875 0 0.8125 +0.1875 0 0.8438 +0.1875 0 0.875 +0.1875 0 0.9062 +0.1875 0 0.9375 +0.1875 0 0.9688 +0.1875 0 1 +0.1875 0.03125 0 +0.1875 0.03125 0.03125 +0.1875 0.03125 0.0625 +0.1875 0.03125 0.09375 +0.1875 0.03125 0.125 +0.1875 0.03125 0.1562 +0.1875 0.03125 0.1875 +0.1875 0.03125 0.2188 +0.1875 0.03125 0.25 +0.1875 0.03125 0.2812 +0.1875 0.03125 0.3125 +0.1875 0.03125 0.3438 +0.1875 0.03125 0.375 +0.1875 0.03125 0.4062 +0.1875 0.03125 0.4375 +0.1875 0.03125 0.4688 +0.1875 0.03125 0.5 +0.1875 0.03125 0.5312 +0.1875 0.03125 0.5625 +0.1875 0.03125 0.5938 +0.1875 0.03125 0.625 +0.1875 0.03125 0.6562 +0.1875 0.03125 0.6875 +0.1875 0.03125 0.7188 +0.1875 0.03125 0.75 +0.1875 0.03125 0.7812 +0.1875 0.03125 0.8125 +0.1875 0.03125 0.8438 +0.1875 0.03125 0.875 +0.1875 0.03125 0.9062 +0.1875 0.03125 0.9375 +0.1875 0.03125 0.9688 +0.1875 0.03125 1 +0.1875 0.0625 0 +0.1875 0.0625 0.03125 +0.1875 0.0625 0.0625 +0.1875 0.0625 0.09375 +0.1875 0.0625 0.125 +0.1875 0.0625 0.1562 +0.1875 0.0625 0.1875 +0.1875 0.0625 0.2188 +0.1875 0.0625 0.25 +0.1875 0.0625 0.2812 +0.1875 0.0625 0.3125 +0.1875 0.0625 0.3438 +0.1875 0.0625 0.375 +0.1875 0.0625 0.4062 +0.1875 0.0625 0.4375 +0.1875 0.0625 0.4688 +0.1875 0.0625 0.5 +0.1875 0.0625 0.5312 +0.1875 0.0625 0.5625 +0.1875 0.0625 0.5938 +0.1875 0.0625 0.625 +0.1875 0.0625 0.6562 +0.1875 0.0625 0.6875 +0.1875 0.0625 0.7188 +0.1875 0.0625 0.75 +0.1875 0.0625 0.7812 +0.1875 0.0625 0.8125 +0.1875 0.0625 0.8438 +0.1875 0.0625 0.875 +0.1875 0.0625 0.9062 +0.1875 0.0625 0.9375 +0.1875 0.0625 0.9688 +0.1875 0.0625 1 +0.1875 0.09375 0 +0.1875 0.09375 0.03125 +0.1875 0.09375 0.0625 +0.1875 0.09375 0.09375 +0.1875 0.09375 0.125 +0.1875 0.09375 0.1562 +0.1875 0.09375 0.1875 +0.1875 0.09375 0.2188 +0.1875 0.09375 0.25 +0.1875 0.09375 0.2812 +0.1875 0.09375 0.3125 +0.1875 0.09375 0.3438 +0.1875 0.09375 0.375 +0.1875 0.09375 0.4062 +0.1875 0.09375 0.4375 +0.1875 0.09375 0.4688 +0.1875 0.09375 0.5 +0.1875 0.09375 0.5312 +0.1875 0.09375 0.5625 +0.1875 0.09375 0.5938 +0.1875 0.09375 0.625 +0.1875 0.09375 0.6562 +0.1875 0.09375 0.6875 +0.1875 0.09375 0.7188 +0.1875 0.09375 0.75 +0.1875 0.09375 0.7812 +0.1875 0.09375 0.8125 +0.1875 0.09375 0.8438 +0.1875 0.09375 0.875 +0.1875 0.09375 0.9062 +0.1875 0.09375 0.9375 +0.1875 0.09375 0.9688 +0.1875 0.09375 1 +0.1875 0.125 0 +0.1875 0.125 0.03125 +0.1875 0.125 0.0625 +0.1875 0.125 0.09375 +0.1875 0.125 0.125 +0.1875 0.125 0.1562 +0.1875 0.125 0.1875 +0.1875 0.125 0.2188 +0.1875 0.125 0.25 +0.1875 0.125 0.2812 +0.1875 0.125 0.3125 +0.1875 0.125 0.3438 +0.1875 0.125 0.375 +0.1875 0.125 0.4062 +0.1875 0.125 0.4375 +0.1875 0.125 0.4688 +0.1875 0.125 0.5 +0.1875 0.125 0.5312 +0.1875 0.125 0.5625 +0.1875 0.125 0.5938 +0.1875 0.125 0.625 +0.1875 0.125 0.6562 +0.1875 0.125 0.6875 +0.1875 0.125 0.7188 +0.1875 0.125 0.75 +0.1875 0.125 0.7812 +0.1875 0.125 0.8125 +0.1875 0.125 0.8438 +0.1875 0.125 0.875 +0.1875 0.125 0.9062 +0.1875 0.125 0.9375 +0.1875 0.125 0.9688 +0.1875 0.125 1 +0.1875 0.1562 0 +0.1875 0.1562 0.03125 +0.1875 0.1562 0.0625 +0.1875 0.1562 0.09375 +0.1875 0.1562 0.125 +0.1875 0.1562 0.1562 +0.1875 0.1562 0.1875 +0.1875 0.1562 0.2188 +0.1875 0.1562 0.25 +0.1875 0.1562 0.2812 +0.1875 0.1562 0.3125 +0.1875 0.1562 0.3438 +0.1875 0.1562 0.375 +0.1875 0.1562 0.4062 +0.1875 0.1562 0.4375 +0.1875 0.1562 0.4688 +0.1875 0.1562 0.5 +0.1875 0.1562 0.5312 +0.1875 0.1562 0.5625 +0.1875 0.1562 0.5938 +0.1875 0.1562 0.625 +0.1875 0.1562 0.6562 +0.1875 0.1562 0.6875 +0.1875 0.1562 0.7188 +0.1875 0.1562 0.75 +0.1875 0.1562 0.7812 +0.1875 0.1562 0.8125 +0.1875 0.1562 0.8438 +0.1875 0.1562 0.875 +0.1875 0.1562 0.9062 +0.1875 0.1562 0.9375 +0.1875 0.1562 0.9688 +0.1875 0.1562 1 +0.1875 0.1875 0 +0.1875 0.1875 0.03125 +0.1875 0.1875 0.0625 +0.1875 0.1875 0.09375 +0.1875 0.1875 0.125 +0.1875 0.1875 0.1562 +0.1875 0.1875 0.1875 +0.1875 0.1875 0.2188 +0.1875 0.1875 0.25 +0.1875 0.1875 0.2812 +0.1875 0.1875 0.3125 +0.1875 0.1875 0.3438 +0.1875 0.1875 0.375 +0.1875 0.1875 0.4062 +0.1875 0.1875 0.4375 +0.1875 0.1875 0.4688 +0.1875 0.1875 0.5 +0.1875 0.1875 0.5312 +0.1875 0.1875 0.5625 +0.1875 0.1875 0.5938 +0.1875 0.1875 0.625 +0.1875 0.1875 0.6562 +0.1875 0.1875 0.6875 +0.1875 0.1875 0.7188 +0.1875 0.1875 0.75 +0.1875 0.1875 0.7812 +0.1875 0.1875 0.8125 +0.1875 0.1875 0.8438 +0.1875 0.1875 0.875 +0.1875 0.1875 0.9062 +0.1875 0.1875 0.9375 +0.1875 0.1875 0.9688 +0.1875 0.1875 1 +0.1875 0.2188 0 +0.1875 0.2188 0.03125 +0.1875 0.2188 0.0625 +0.1875 0.2188 0.09375 +0.1875 0.2188 0.125 +0.1875 0.2188 0.1562 +0.1875 0.2188 0.1875 +0.1875 0.2188 0.2188 +0.1875 0.2188 0.25 +0.1875 0.2188 0.2812 +0.1875 0.2188 0.3125 +0.1875 0.2188 0.3438 +0.1875 0.2188 0.375 +0.1875 0.2188 0.4062 +0.1875 0.2188 0.4375 +0.1875 0.2188 0.4688 +0.1875 0.2188 0.5 +0.1875 0.2188 0.5312 +0.1875 0.2188 0.5625 +0.1875 0.2188 0.5938 +0.1875 0.2188 0.625 +0.1875 0.2188 0.6562 +0.1875 0.2188 0.6875 +0.1875 0.2188 0.7188 +0.1875 0.2188 0.75 +0.1875 0.2188 0.7812 +0.1875 0.2188 0.8125 +0.1875 0.2188 0.8438 +0.1875 0.2188 0.875 +0.1875 0.2188 0.9062 +0.1875 0.2188 0.9375 +0.1875 0.2188 0.9688 +0.1875 0.2188 1 +0.1875 0.25 0 +0.1875 0.25 0.03125 +0.1875 0.25 0.0625 +0.1875 0.25 0.09375 +0.1875 0.25 0.125 +0.1875 0.25 0.1562 +0.1875 0.25 0.1875 +0.1875 0.25 0.2188 +0.1875 0.25 0.25 +0.1875 0.25 0.2812 +0.1875 0.25 0.3125 +0.1875 0.25 0.3438 +0.1875 0.25 0.375 +0.1875 0.25 0.4062 +0.1875 0.25 0.4375 +0.1875 0.25 0.4688 +0.1875 0.25 0.5 +0.1875 0.25 0.5312 +0.1875 0.25 0.5625 +0.1875 0.25 0.5938 +0.1875 0.25 0.625 +0.1875 0.25 0.6562 +0.1875 0.25 0.6875 +0.1875 0.25 0.7188 +0.1875 0.25 0.75 +0.1875 0.25 0.7812 +0.1875 0.25 0.8125 +0.1875 0.25 0.8438 +0.1875 0.25 0.875 +0.1875 0.25 0.9062 +0.1875 0.25 0.9375 +0.1875 0.25 0.9688 +0.1875 0.25 1 +0.1875 0.2812 0 +0.1875 0.2812 0.03125 +0.1875 0.2812 0.0625 +0.1875 0.2812 0.09375 +0.1875 0.2812 0.125 +0.1875 0.2812 0.1562 +0.1875 0.2812 0.1875 +0.1875 0.2812 0.2188 +0.1875 0.2812 0.25 +0.1875 0.2812 0.2812 +0.1875 0.2812 0.3125 +0.1875 0.2812 0.3438 +0.1875 0.2812 0.375 +0.1875 0.2812 0.4062 +0.1875 0.2812 0.4375 +0.1875 0.2812 0.4688 +0.1875 0.2812 0.5 +0.1875 0.2812 0.5312 +0.1875 0.2812 0.5625 +0.1875 0.2812 0.5938 +0.1875 0.2812 0.625 +0.1875 0.2812 0.6562 +0.1875 0.2812 0.6875 +0.1875 0.2812 0.7188 +0.1875 0.2812 0.75 +0.1875 0.2812 0.7812 +0.1875 0.2812 0.8125 +0.1875 0.2812 0.8438 +0.1875 0.2812 0.875 +0.1875 0.2812 0.9062 +0.1875 0.2812 0.9375 +0.1875 0.2812 0.9688 +0.1875 0.2812 1 +0.1875 0.3125 0 +0.1875 0.3125 0.03125 +0.1875 0.3125 0.0625 +0.1875 0.3125 0.09375 +0.1875 0.3125 0.125 +0.1875 0.3125 0.1562 +0.1875 0.3125 0.1875 +0.1875 0.3125 0.2188 +0.1875 0.3125 0.25 +0.1875 0.3125 0.2812 +0.1875 0.3125 0.3125 +0.1875 0.3125 0.3438 +0.1875 0.3125 0.375 +0.1875 0.3125 0.4062 +0.1875 0.3125 0.4375 +0.1875 0.3125 0.4688 +0.1875 0.3125 0.5 +0.1875 0.3125 0.5312 +0.1875 0.3125 0.5625 +0.1875 0.3125 0.5938 +0.1875 0.3125 0.625 +0.1875 0.3125 0.6562 +0.1875 0.3125 0.6875 +0.1875 0.3125 0.7188 +0.1875 0.3125 0.75 +0.1875 0.3125 0.7812 +0.1875 0.3125 0.8125 +0.1875 0.3125 0.8438 +0.1875 0.3125 0.875 +0.1875 0.3125 0.9062 +0.1875 0.3125 0.9375 +0.1875 0.3125 0.9688 +0.1875 0.3125 1 +0.1875 0.3438 0 +0.1875 0.3438 0.03125 +0.1875 0.3438 0.0625 +0.1875 0.3438 0.09375 +0.1875 0.3438 0.125 +0.1875 0.3438 0.1562 +0.1875 0.3438 0.1875 +0.1875 0.3438 0.2188 +0.1875 0.3438 0.25 +0.1875 0.3438 0.2812 +0.1875 0.3438 0.3125 +0.1875 0.3438 0.3438 +0.1875 0.3438 0.375 +0.1875 0.3438 0.4062 +0.1875 0.3438 0.4375 +0.1875 0.3438 0.4688 +0.1875 0.3438 0.5 +0.1875 0.3438 0.5312 +0.1875 0.3438 0.5625 +0.1875 0.3438 0.5938 +0.1875 0.3438 0.625 +0.1875 0.3438 0.6562 +0.1875 0.3438 0.6875 +0.1875 0.3438 0.7188 +0.1875 0.3438 0.75 +0.1875 0.3438 0.7812 +0.1875 0.3438 0.8125 +0.1875 0.3438 0.8438 +0.1875 0.3438 0.875 +0.1875 0.3438 0.9062 +0.1875 0.3438 0.9375 +0.1875 0.3438 0.9688 +0.1875 0.3438 1 +0.1875 0.375 0 +0.1875 0.375 0.03125 +0.1875 0.375 0.0625 +0.1875 0.375 0.09375 +0.1875 0.375 0.125 +0.1875 0.375 0.1562 +0.1875 0.375 0.1875 +0.1875 0.375 0.2188 +0.1875 0.375 0.25 +0.1875 0.375 0.2812 +0.1875 0.375 0.3125 +0.1875 0.375 0.3438 +0.1875 0.375 0.375 +0.1875 0.375 0.4062 +0.1875 0.375 0.4375 +0.1875 0.375 0.4688 +0.1875 0.375 0.5 +0.1875 0.375 0.5312 +0.1875 0.375 0.5625 +0.1875 0.375 0.5938 +0.1875 0.375 0.625 +0.1875 0.375 0.6562 +0.1875 0.375 0.6875 +0.1875 0.375 0.7188 +0.1875 0.375 0.75 +0.1875 0.375 0.7812 +0.1875 0.375 0.8125 +0.1875 0.375 0.8438 +0.1875 0.375 0.875 +0.1875 0.375 0.9062 +0.1875 0.375 0.9375 +0.1875 0.375 0.9688 +0.1875 0.375 1 +0.1875 0.4062 0 +0.1875 0.4062 0.03125 +0.1875 0.4062 0.0625 +0.1875 0.4062 0.09375 +0.1875 0.4062 0.125 +0.1875 0.4062 0.1562 +0.1875 0.4062 0.1875 +0.1875 0.4062 0.2188 +0.1875 0.4062 0.25 +0.1875 0.4062 0.2812 +0.1875 0.4062 0.3125 +0.1875 0.4062 0.3438 +0.1875 0.4062 0.375 +0.1875 0.4062 0.4062 +0.1875 0.4062 0.4375 +0.1875 0.4062 0.4688 +0.1875 0.4062 0.5 +0.1875 0.4062 0.5312 +0.1875 0.4062 0.5625 +0.1875 0.4062 0.5938 +0.1875 0.4062 0.625 +0.1875 0.4062 0.6562 +0.1875 0.4062 0.6875 +0.1875 0.4062 0.7188 +0.1875 0.4062 0.75 +0.1875 0.4062 0.7812 +0.1875 0.4062 0.8125 +0.1875 0.4062 0.8438 +0.1875 0.4062 0.875 +0.1875 0.4062 0.9062 +0.1875 0.4062 0.9375 +0.1875 0.4062 0.9688 +0.1875 0.4062 1 +0.1875 0.4375 0 +0.1875 0.4375 0.03125 +0.1875 0.4375 0.0625 +0.1875 0.4375 0.09375 +0.1875 0.4375 0.125 +0.1875 0.4375 0.1562 +0.1875 0.4375 0.1875 +0.1875 0.4375 0.2188 +0.1875 0.4375 0.25 +0.1875 0.4375 0.2812 +0.1875 0.4375 0.3125 +0.1875 0.4375 0.3438 +0.1875 0.4375 0.375 +0.1875 0.4375 0.4062 +0.1875 0.4375 0.4375 +0.1875 0.4375 0.4688 +0.1875 0.4375 0.5 +0.1875 0.4375 0.5312 +0.1875 0.4375 0.5625 +0.1875 0.4375 0.5938 +0.1875 0.4375 0.625 +0.1875 0.4375 0.6562 +0.1875 0.4375 0.6875 +0.1875 0.4375 0.7188 +0.1875 0.4375 0.75 +0.1875 0.4375 0.7812 +0.1875 0.4375 0.8125 +0.1875 0.4375 0.8438 +0.1875 0.4375 0.875 +0.1875 0.4375 0.9062 +0.1875 0.4375 0.9375 +0.1875 0.4375 0.9688 +0.1875 0.4375 1 +0.1875 0.4688 0 +0.1875 0.4688 0.03125 +0.1875 0.4688 0.0625 +0.1875 0.4688 0.09375 +0.1875 0.4688 0.125 +0.1875 0.4688 0.1562 +0.1875 0.4688 0.1875 +0.1875 0.4688 0.2188 +0.1875 0.4688 0.25 +0.1875 0.4688 0.2812 +0.1875 0.4688 0.3125 +0.1875 0.4688 0.3438 +0.1875 0.4688 0.375 +0.1875 0.4688 0.4062 +0.1875 0.4688 0.4375 +0.1875 0.4688 0.4688 +0.1875 0.4688 0.5 +0.1875 0.4688 0.5312 +0.1875 0.4688 0.5625 +0.1875 0.4688 0.5938 +0.1875 0.4688 0.625 +0.1875 0.4688 0.6562 +0.1875 0.4688 0.6875 +0.1875 0.4688 0.7188 +0.1875 0.4688 0.75 +0.1875 0.4688 0.7812 +0.1875 0.4688 0.8125 +0.1875 0.4688 0.8438 +0.1875 0.4688 0.875 +0.1875 0.4688 0.9062 +0.1875 0.4688 0.9375 +0.1875 0.4688 0.9688 +0.1875 0.4688 1 +0.1875 0.5 0 +0.1875 0.5 0.03125 +0.1875 0.5 0.0625 +0.1875 0.5 0.09375 +0.1875 0.5 0.125 +0.1875 0.5 0.1562 +0.1875 0.5 0.1875 +0.1875 0.5 0.2188 +0.1875 0.5 0.25 +0.1875 0.5 0.2812 +0.1875 0.5 0.3125 +0.1875 0.5 0.3438 +0.1875 0.5 0.375 +0.1875 0.5 0.4062 +0.1875 0.5 0.4375 +0.1875 0.5 0.4688 +0.1875 0.5 0.5 +0.1875 0.5 0.5312 +0.1875 0.5 0.5625 +0.1875 0.5 0.5938 +0.1875 0.5 0.625 +0.1875 0.5 0.6562 +0.1875 0.5 0.6875 +0.1875 0.5 0.7188 +0.1875 0.5 0.75 +0.1875 0.5 0.7812 +0.1875 0.5 0.8125 +0.1875 0.5 0.8438 +0.1875 0.5 0.875 +0.1875 0.5 0.9062 +0.1875 0.5 0.9375 +0.1875 0.5 0.9688 +0.1875 0.5 1 +0.1875 0.5312 0 +0.1875 0.5312 0.03125 +0.1875 0.5312 0.0625 +0.1875 0.5312 0.09375 +0.1875 0.5312 0.125 +0.1875 0.5312 0.1562 +0.1875 0.5312 0.1875 +0.1875 0.5312 0.2188 +0.1875 0.5312 0.25 +0.1875 0.5312 0.2812 +0.1875 0.5312 0.3125 +0.1875 0.5312 0.3438 +0.1875 0.5312 0.375 +0.1875 0.5312 0.4062 +0.1875 0.5312 0.4375 +0.1875 0.5312 0.4688 +0.1875 0.5312 0.5 +0.1875 0.5312 0.5312 +0.1875 0.5312 0.5625 +0.1875 0.5312 0.5938 +0.1875 0.5312 0.625 +0.1875 0.5312 0.6562 +0.1875 0.5312 0.6875 +0.1875 0.5312 0.7188 +0.1875 0.5312 0.75 +0.1875 0.5312 0.7812 +0.1875 0.5312 0.8125 +0.1875 0.5312 0.8438 +0.1875 0.5312 0.875 +0.1875 0.5312 0.9062 +0.1875 0.5312 0.9375 +0.1875 0.5312 0.9688 +0.1875 0.5312 1 +0.1875 0.5625 0 +0.1875 0.5625 0.03125 +0.1875 0.5625 0.0625 +0.1875 0.5625 0.09375 +0.1875 0.5625 0.125 +0.1875 0.5625 0.1562 +0.1875 0.5625 0.1875 +0.1875 0.5625 0.2188 +0.1875 0.5625 0.25 +0.1875 0.5625 0.2812 +0.1875 0.5625 0.3125 +0.1875 0.5625 0.3438 +0.1875 0.5625 0.375 +0.1875 0.5625 0.4062 +0.1875 0.5625 0.4375 +0.1875 0.5625 0.4688 +0.1875 0.5625 0.5 +0.1875 0.5625 0.5312 +0.1875 0.5625 0.5625 +0.1875 0.5625 0.5938 +0.1875 0.5625 0.625 +0.1875 0.5625 0.6562 +0.1875 0.5625 0.6875 +0.1875 0.5625 0.7188 +0.1875 0.5625 0.75 +0.1875 0.5625 0.7812 +0.1875 0.5625 0.8125 +0.1875 0.5625 0.8438 +0.1875 0.5625 0.875 +0.1875 0.5625 0.9062 +0.1875 0.5625 0.9375 +0.1875 0.5625 0.9688 +0.1875 0.5625 1 +0.1875 0.5938 0 +0.1875 0.5938 0.03125 +0.1875 0.5938 0.0625 +0.1875 0.5938 0.09375 +0.1875 0.5938 0.125 +0.1875 0.5938 0.1562 +0.1875 0.5938 0.1875 +0.1875 0.5938 0.2188 +0.1875 0.5938 0.25 +0.1875 0.5938 0.2812 +0.1875 0.5938 0.3125 +0.1875 0.5938 0.3438 +0.1875 0.5938 0.375 +0.1875 0.5938 0.4062 +0.1875 0.5938 0.4375 +0.1875 0.5938 0.4688 +0.1875 0.5938 0.5 +0.1875 0.5938 0.5312 +0.1875 0.5938 0.5625 +0.1875 0.5938 0.5938 +0.1875 0.5938 0.625 +0.1875 0.5938 0.6562 +0.1875 0.5938 0.6875 +0.1875 0.5938 0.7188 +0.1875 0.5938 0.75 +0.1875 0.5938 0.7812 +0.1875 0.5938 0.8125 +0.1875 0.5938 0.8438 +0.1875 0.5938 0.875 +0.1875 0.5938 0.9062 +0.1875 0.5938 0.9375 +0.1875 0.5938 0.9688 +0.1875 0.5938 1 +0.1875 0.625 0 +0.1875 0.625 0.03125 +0.1875 0.625 0.0625 +0.1875 0.625 0.09375 +0.1875 0.625 0.125 +0.1875 0.625 0.1562 +0.1875 0.625 0.1875 +0.1875 0.625 0.2188 +0.1875 0.625 0.25 +0.1875 0.625 0.2812 +0.1875 0.625 0.3125 +0.1875 0.625 0.3438 +0.1875 0.625 0.375 +0.1875 0.625 0.4062 +0.1875 0.625 0.4375 +0.1875 0.625 0.4688 +0.1875 0.625 0.5 +0.1875 0.625 0.5312 +0.1875 0.625 0.5625 +0.1875 0.625 0.5938 +0.1875 0.625 0.625 +0.1875 0.625 0.6562 +0.1875 0.625 0.6875 +0.1875 0.625 0.7188 +0.1875 0.625 0.75 +0.1875 0.625 0.7812 +0.1875 0.625 0.8125 +0.1875 0.625 0.8438 +0.1875 0.625 0.875 +0.1875 0.625 0.9062 +0.1875 0.625 0.9375 +0.1875 0.625 0.9688 +0.1875 0.625 1 +0.1875 0.6562 0 +0.1875 0.6562 0.03125 +0.1875 0.6562 0.0625 +0.1875 0.6562 0.09375 +0.1875 0.6562 0.125 +0.1875 0.6562 0.1562 +0.1875 0.6562 0.1875 +0.1875 0.6562 0.2188 +0.1875 0.6562 0.25 +0.1875 0.6562 0.2812 +0.1875 0.6562 0.3125 +0.1875 0.6562 0.3438 +0.1875 0.6562 0.375 +0.1875 0.6562 0.4062 +0.1875 0.6562 0.4375 +0.1875 0.6562 0.4688 +0.1875 0.6562 0.5 +0.1875 0.6562 0.5312 +0.1875 0.6562 0.5625 +0.1875 0.6562 0.5938 +0.1875 0.6562 0.625 +0.1875 0.6562 0.6562 +0.1875 0.6562 0.6875 +0.1875 0.6562 0.7188 +0.1875 0.6562 0.75 +0.1875 0.6562 0.7812 +0.1875 0.6562 0.8125 +0.1875 0.6562 0.8438 +0.1875 0.6562 0.875 +0.1875 0.6562 0.9062 +0.1875 0.6562 0.9375 +0.1875 0.6562 0.9688 +0.1875 0.6562 1 +0.1875 0.6875 0 +0.1875 0.6875 0.03125 +0.1875 0.6875 0.0625 +0.1875 0.6875 0.09375 +0.1875 0.6875 0.125 +0.1875 0.6875 0.1562 +0.1875 0.6875 0.1875 +0.1875 0.6875 0.2188 +0.1875 0.6875 0.25 +0.1875 0.6875 0.2812 +0.1875 0.6875 0.3125 +0.1875 0.6875 0.3438 +0.1875 0.6875 0.375 +0.1875 0.6875 0.4062 +0.1875 0.6875 0.4375 +0.1875 0.6875 0.4688 +0.1875 0.6875 0.5 +0.1875 0.6875 0.5312 +0.1875 0.6875 0.5625 +0.1875 0.6875 0.5938 +0.1875 0.6875 0.625 +0.1875 0.6875 0.6562 +0.1875 0.6875 0.6875 +0.1875 0.6875 0.7188 +0.1875 0.6875 0.75 +0.1875 0.6875 0.7812 +0.1875 0.6875 0.8125 +0.1875 0.6875 0.8438 +0.1875 0.6875 0.875 +0.1875 0.6875 0.9062 +0.1875 0.6875 0.9375 +0.1875 0.6875 0.9688 +0.1875 0.6875 1 +0.1875 0.7188 0 +0.1875 0.7188 0.03125 +0.1875 0.7188 0.0625 +0.1875 0.7188 0.09375 +0.1875 0.7188 0.125 +0.1875 0.7188 0.1562 +0.1875 0.7188 0.1875 +0.1875 0.7188 0.2188 +0.1875 0.7188 0.25 +0.1875 0.7188 0.2812 +0.1875 0.7188 0.3125 +0.1875 0.7188 0.3438 +0.1875 0.7188 0.375 +0.1875 0.7188 0.4062 +0.1875 0.7188 0.4375 +0.1875 0.7188 0.4688 +0.1875 0.7188 0.5 +0.1875 0.7188 0.5312 +0.1875 0.7188 0.5625 +0.1875 0.7188 0.5938 +0.1875 0.7188 0.625 +0.1875 0.7188 0.6562 +0.1875 0.7188 0.6875 +0.1875 0.7188 0.7188 +0.1875 0.7188 0.75 +0.1875 0.7188 0.7812 +0.1875 0.7188 0.8125 +0.1875 0.7188 0.8438 +0.1875 0.7188 0.875 +0.1875 0.7188 0.9062 +0.1875 0.7188 0.9375 +0.1875 0.7188 0.9688 +0.1875 0.7188 1 +0.1875 0.75 0 +0.1875 0.75 0.03125 +0.1875 0.75 0.0625 +0.1875 0.75 0.09375 +0.1875 0.75 0.125 +0.1875 0.75 0.1562 +0.1875 0.75 0.1875 +0.1875 0.75 0.2188 +0.1875 0.75 0.25 +0.1875 0.75 0.2812 +0.1875 0.75 0.3125 +0.1875 0.75 0.3438 +0.1875 0.75 0.375 +0.1875 0.75 0.4062 +0.1875 0.75 0.4375 +0.1875 0.75 0.4688 +0.1875 0.75 0.5 +0.1875 0.75 0.5312 +0.1875 0.75 0.5625 +0.1875 0.75 0.5938 +0.1875 0.75 0.625 +0.1875 0.75 0.6562 +0.1875 0.75 0.6875 +0.1875 0.75 0.7188 +0.1875 0.75 0.75 +0.1875 0.75 0.7812 +0.1875 0.75 0.8125 +0.1875 0.75 0.8438 +0.1875 0.75 0.875 +0.1875 0.75 0.9062 +0.1875 0.75 0.9375 +0.1875 0.75 0.9688 +0.1875 0.75 1 +0.1875 0.7812 0 +0.1875 0.7812 0.03125 +0.1875 0.7812 0.0625 +0.1875 0.7812 0.09375 +0.1875 0.7812 0.125 +0.1875 0.7812 0.1562 +0.1875 0.7812 0.1875 +0.1875 0.7812 0.2188 +0.1875 0.7812 0.25 +0.1875 0.7812 0.2812 +0.1875 0.7812 0.3125 +0.1875 0.7812 0.3438 +0.1875 0.7812 0.375 +0.1875 0.7812 0.4062 +0.1875 0.7812 0.4375 +0.1875 0.7812 0.4688 +0.1875 0.7812 0.5 +0.1875 0.7812 0.5312 +0.1875 0.7812 0.5625 +0.1875 0.7812 0.5938 +0.1875 0.7812 0.625 +0.1875 0.7812 0.6562 +0.1875 0.7812 0.6875 +0.1875 0.7812 0.7188 +0.1875 0.7812 0.75 +0.1875 0.7812 0.7812 +0.1875 0.7812 0.8125 +0.1875 0.7812 0.8438 +0.1875 0.7812 0.875 +0.1875 0.7812 0.9062 +0.1875 0.7812 0.9375 +0.1875 0.7812 0.9688 +0.1875 0.7812 1 +0.1875 0.8125 0 +0.1875 0.8125 0.03125 +0.1875 0.8125 0.0625 +0.1875 0.8125 0.09375 +0.1875 0.8125 0.125 +0.1875 0.8125 0.1562 +0.1875 0.8125 0.1875 +0.1875 0.8125 0.2188 +0.1875 0.8125 0.25 +0.1875 0.8125 0.2812 +0.1875 0.8125 0.3125 +0.1875 0.8125 0.3438 +0.1875 0.8125 0.375 +0.1875 0.8125 0.4062 +0.1875 0.8125 0.4375 +0.1875 0.8125 0.4688 +0.1875 0.8125 0.5 +0.1875 0.8125 0.5312 +0.1875 0.8125 0.5625 +0.1875 0.8125 0.5938 +0.1875 0.8125 0.625 +0.1875 0.8125 0.6562 +0.1875 0.8125 0.6875 +0.1875 0.8125 0.7188 +0.1875 0.8125 0.75 +0.1875 0.8125 0.7812 +0.1875 0.8125 0.8125 +0.1875 0.8125 0.8438 +0.1875 0.8125 0.875 +0.1875 0.8125 0.9062 +0.1875 0.8125 0.9375 +0.1875 0.8125 0.9688 +0.1875 0.8125 1 +0.1875 0.8438 0 +0.1875 0.8438 0.03125 +0.1875 0.8438 0.0625 +0.1875 0.8438 0.09375 +0.1875 0.8438 0.125 +0.1875 0.8438 0.1562 +0.1875 0.8438 0.1875 +0.1875 0.8438 0.2188 +0.1875 0.8438 0.25 +0.1875 0.8438 0.2812 +0.1875 0.8438 0.3125 +0.1875 0.8438 0.3438 +0.1875 0.8438 0.375 +0.1875 0.8438 0.4062 +0.1875 0.8438 0.4375 +0.1875 0.8438 0.4688 +0.1875 0.8438 0.5 +0.1875 0.8438 0.5312 +0.1875 0.8438 0.5625 +0.1875 0.8438 0.5938 +0.1875 0.8438 0.625 +0.1875 0.8438 0.6562 +0.1875 0.8438 0.6875 +0.1875 0.8438 0.7188 +0.1875 0.8438 0.75 +0.1875 0.8438 0.7812 +0.1875 0.8438 0.8125 +0.1875 0.8438 0.8438 +0.1875 0.8438 0.875 +0.1875 0.8438 0.9062 +0.1875 0.8438 0.9375 +0.1875 0.8438 0.9688 +0.1875 0.8438 1 +0.1875 0.875 0 +0.1875 0.875 0.03125 +0.1875 0.875 0.0625 +0.1875 0.875 0.09375 +0.1875 0.875 0.125 +0.1875 0.875 0.1562 +0.1875 0.875 0.1875 +0.1875 0.875 0.2188 +0.1875 0.875 0.25 +0.1875 0.875 0.2812 +0.1875 0.875 0.3125 +0.1875 0.875 0.3438 +0.1875 0.875 0.375 +0.1875 0.875 0.4062 +0.1875 0.875 0.4375 +0.1875 0.875 0.4688 +0.1875 0.875 0.5 +0.1875 0.875 0.5312 +0.1875 0.875 0.5625 +0.1875 0.875 0.5938 +0.1875 0.875 0.625 +0.1875 0.875 0.6562 +0.1875 0.875 0.6875 +0.1875 0.875 0.7188 +0.1875 0.875 0.75 +0.1875 0.875 0.7812 +0.1875 0.875 0.8125 +0.1875 0.875 0.8438 +0.1875 0.875 0.875 +0.1875 0.875 0.9062 +0.1875 0.875 0.9375 +0.1875 0.875 0.9688 +0.1875 0.875 1 +0.1875 0.9062 0 +0.1875 0.9062 0.03125 +0.1875 0.9062 0.0625 +0.1875 0.9062 0.09375 +0.1875 0.9062 0.125 +0.1875 0.9062 0.1562 +0.1875 0.9062 0.1875 +0.1875 0.9062 0.2188 +0.1875 0.9062 0.25 +0.1875 0.9062 0.2812 +0.1875 0.9062 0.3125 +0.1875 0.9062 0.3438 +0.1875 0.9062 0.375 +0.1875 0.9062 0.4062 +0.1875 0.9062 0.4375 +0.1875 0.9062 0.4688 +0.1875 0.9062 0.5 +0.1875 0.9062 0.5312 +0.1875 0.9062 0.5625 +0.1875 0.9062 0.5938 +0.1875 0.9062 0.625 +0.1875 0.9062 0.6562 +0.1875 0.9062 0.6875 +0.1875 0.9062 0.7188 +0.1875 0.9062 0.75 +0.1875 0.9062 0.7812 +0.1875 0.9062 0.8125 +0.1875 0.9062 0.8438 +0.1875 0.9062 0.875 +0.1875 0.9062 0.9062 +0.1875 0.9062 0.9375 +0.1875 0.9062 0.9688 +0.1875 0.9062 1 +0.1875 0.9375 0 +0.1875 0.9375 0.03125 +0.1875 0.9375 0.0625 +0.1875 0.9375 0.09375 +0.1875 0.9375 0.125 +0.1875 0.9375 0.1562 +0.1875 0.9375 0.1875 +0.1875 0.9375 0.2188 +0.1875 0.9375 0.25 +0.1875 0.9375 0.2812 +0.1875 0.9375 0.3125 +0.1875 0.9375 0.3438 +0.1875 0.9375 0.375 +0.1875 0.9375 0.4062 +0.1875 0.9375 0.4375 +0.1875 0.9375 0.4688 +0.1875 0.9375 0.5 +0.1875 0.9375 0.5312 +0.1875 0.9375 0.5625 +0.1875 0.9375 0.5938 +0.1875 0.9375 0.625 +0.1875 0.9375 0.6562 +0.1875 0.9375 0.6875 +0.1875 0.9375 0.7188 +0.1875 0.9375 0.75 +0.1875 0.9375 0.7812 +0.1875 0.9375 0.8125 +0.1875 0.9375 0.8438 +0.1875 0.9375 0.875 +0.1875 0.9375 0.9062 +0.1875 0.9375 0.9375 +0.1875 0.9375 0.9688 +0.1875 0.9375 1 +0.1875 0.9688 0 +0.1875 0.9688 0.03125 +0.1875 0.9688 0.0625 +0.1875 0.9688 0.09375 +0.1875 0.9688 0.125 +0.1875 0.9688 0.1562 +0.1875 0.9688 0.1875 +0.1875 0.9688 0.2188 +0.1875 0.9688 0.25 +0.1875 0.9688 0.2812 +0.1875 0.9688 0.3125 +0.1875 0.9688 0.3438 +0.1875 0.9688 0.375 +0.1875 0.9688 0.4062 +0.1875 0.9688 0.4375 +0.1875 0.9688 0.4688 +0.1875 0.9688 0.5 +0.1875 0.9688 0.5312 +0.1875 0.9688 0.5625 +0.1875 0.9688 0.5938 +0.1875 0.9688 0.625 +0.1875 0.9688 0.6562 +0.1875 0.9688 0.6875 +0.1875 0.9688 0.7188 +0.1875 0.9688 0.75 +0.1875 0.9688 0.7812 +0.1875 0.9688 0.8125 +0.1875 0.9688 0.8438 +0.1875 0.9688 0.875 +0.1875 0.9688 0.9062 +0.1875 0.9688 0.9375 +0.1875 0.9688 0.9688 +0.1875 0.9688 1 +0.1875 1 0 +0.1875 1 0.03125 +0.1875 1 0.0625 +0.1875 1 0.09375 +0.1875 1 0.125 +0.1875 1 0.1562 +0.1875 1 0.1875 +0.1875 1 0.2188 +0.1875 1 0.25 +0.1875 1 0.2812 +0.1875 1 0.3125 +0.1875 1 0.3438 +0.1875 1 0.375 +0.1875 1 0.4062 +0.1875 1 0.4375 +0.1875 1 0.4688 +0.1875 1 0.5 +0.1875 1 0.5312 +0.1875 1 0.5625 +0.1875 1 0.5938 +0.1875 1 0.625 +0.1875 1 0.6562 +0.1875 1 0.6875 +0.1875 1 0.7188 +0.1875 1 0.75 +0.1875 1 0.7812 +0.1875 1 0.8125 +0.1875 1 0.8438 +0.1875 1 0.875 +0.1875 1 0.9062 +0.1875 1 0.9375 +0.1875 1 0.9688 +0.1875 1 1 +0.2188 0 0 +0.2188 0 0.03125 +0.2188 0 0.0625 +0.2188 0 0.09375 +0.2188 0 0.125 +0.2188 0 0.1562 +0.2188 0 0.1875 +0.2188 0 0.2188 +0.2188 0 0.25 +0.2188 0 0.2812 +0.2188 0 0.3125 +0.2188 0 0.3438 +0.2188 0 0.375 +0.2188 0 0.4062 +0.2188 0 0.4375 +0.2188 0 0.4688 +0.2188 0 0.5 +0.2188 0 0.5312 +0.2188 0 0.5625 +0.2188 0 0.5938 +0.2188 0 0.625 +0.2188 0 0.6562 +0.2188 0 0.6875 +0.2188 0 0.7188 +0.2188 0 0.75 +0.2188 0 0.7812 +0.2188 0 0.8125 +0.2188 0 0.8438 +0.2188 0 0.875 +0.2188 0 0.9062 +0.2188 0 0.9375 +0.2188 0 0.9688 +0.2188 0 1 +0.2188 0.03125 0 +0.2188 0.03125 0.03125 +0.2188 0.03125 0.0625 +0.2188 0.03125 0.09375 +0.2188 0.03125 0.125 +0.2188 0.03125 0.1562 +0.2188 0.03125 0.1875 +0.2188 0.03125 0.2188 +0.2188 0.03125 0.25 +0.2188 0.03125 0.2812 +0.2188 0.03125 0.3125 +0.2188 0.03125 0.3438 +0.2188 0.03125 0.375 +0.2188 0.03125 0.4062 +0.2188 0.03125 0.4375 +0.2188 0.03125 0.4688 +0.2188 0.03125 0.5 +0.2188 0.03125 0.5312 +0.2188 0.03125 0.5625 +0.2188 0.03125 0.5938 +0.2188 0.03125 0.625 +0.2188 0.03125 0.6562 +0.2188 0.03125 0.6875 +0.2188 0.03125 0.7188 +0.2188 0.03125 0.75 +0.2188 0.03125 0.7812 +0.2188 0.03125 0.8125 +0.2188 0.03125 0.8438 +0.2188 0.03125 0.875 +0.2188 0.03125 0.9062 +0.2188 0.03125 0.9375 +0.2188 0.03125 0.9688 +0.2188 0.03125 1 +0.2188 0.0625 0 +0.2188 0.0625 0.03125 +0.2188 0.0625 0.0625 +0.2188 0.0625 0.09375 +0.2188 0.0625 0.125 +0.2188 0.0625 0.1562 +0.2188 0.0625 0.1875 +0.2188 0.0625 0.2188 +0.2188 0.0625 0.25 +0.2188 0.0625 0.2812 +0.2188 0.0625 0.3125 +0.2188 0.0625 0.3438 +0.2188 0.0625 0.375 +0.2188 0.0625 0.4062 +0.2188 0.0625 0.4375 +0.2188 0.0625 0.4688 +0.2188 0.0625 0.5 +0.2188 0.0625 0.5312 +0.2188 0.0625 0.5625 +0.2188 0.0625 0.5938 +0.2188 0.0625 0.625 +0.2188 0.0625 0.6562 +0.2188 0.0625 0.6875 +0.2188 0.0625 0.7188 +0.2188 0.0625 0.75 +0.2188 0.0625 0.7812 +0.2188 0.0625 0.8125 +0.2188 0.0625 0.8438 +0.2188 0.0625 0.875 +0.2188 0.0625 0.9062 +0.2188 0.0625 0.9375 +0.2188 0.0625 0.9688 +0.2188 0.0625 1 +0.2188 0.09375 0 +0.2188 0.09375 0.03125 +0.2188 0.09375 0.0625 +0.2188 0.09375 0.09375 +0.2188 0.09375 0.125 +0.2188 0.09375 0.1562 +0.2188 0.09375 0.1875 +0.2188 0.09375 0.2188 +0.2188 0.09375 0.25 +0.2188 0.09375 0.2812 +0.2188 0.09375 0.3125 +0.2188 0.09375 0.3438 +0.2188 0.09375 0.375 +0.2188 0.09375 0.4062 +0.2188 0.09375 0.4375 +0.2188 0.09375 0.4688 +0.2188 0.09375 0.5 +0.2188 0.09375 0.5312 +0.2188 0.09375 0.5625 +0.2188 0.09375 0.5938 +0.2188 0.09375 0.625 +0.2188 0.09375 0.6562 +0.2188 0.09375 0.6875 +0.2188 0.09375 0.7188 +0.2188 0.09375 0.75 +0.2188 0.09375 0.7812 +0.2188 0.09375 0.8125 +0.2188 0.09375 0.8438 +0.2188 0.09375 0.875 +0.2188 0.09375 0.9062 +0.2188 0.09375 0.9375 +0.2188 0.09375 0.9688 +0.2188 0.09375 1 +0.2188 0.125 0 +0.2188 0.125 0.03125 +0.2188 0.125 0.0625 +0.2188 0.125 0.09375 +0.2188 0.125 0.125 +0.2188 0.125 0.1562 +0.2188 0.125 0.1875 +0.2188 0.125 0.2188 +0.2188 0.125 0.25 +0.2188 0.125 0.2812 +0.2188 0.125 0.3125 +0.2188 0.125 0.3438 +0.2188 0.125 0.375 +0.2188 0.125 0.4062 +0.2188 0.125 0.4375 +0.2188 0.125 0.4688 +0.2188 0.125 0.5 +0.2188 0.125 0.5312 +0.2188 0.125 0.5625 +0.2188 0.125 0.5938 +0.2188 0.125 0.625 +0.2188 0.125 0.6562 +0.2188 0.125 0.6875 +0.2188 0.125 0.7188 +0.2188 0.125 0.75 +0.2188 0.125 0.7812 +0.2188 0.125 0.8125 +0.2188 0.125 0.8438 +0.2188 0.125 0.875 +0.2188 0.125 0.9062 +0.2188 0.125 0.9375 +0.2188 0.125 0.9688 +0.2188 0.125 1 +0.2188 0.1562 0 +0.2188 0.1562 0.03125 +0.2188 0.1562 0.0625 +0.2188 0.1562 0.09375 +0.2188 0.1562 0.125 +0.2188 0.1562 0.1562 +0.2188 0.1562 0.1875 +0.2188 0.1562 0.2188 +0.2188 0.1562 0.25 +0.2188 0.1562 0.2812 +0.2188 0.1562 0.3125 +0.2188 0.1562 0.3438 +0.2188 0.1562 0.375 +0.2188 0.1562 0.4062 +0.2188 0.1562 0.4375 +0.2188 0.1562 0.4688 +0.2188 0.1562 0.5 +0.2188 0.1562 0.5312 +0.2188 0.1562 0.5625 +0.2188 0.1562 0.5938 +0.2188 0.1562 0.625 +0.2188 0.1562 0.6562 +0.2188 0.1562 0.6875 +0.2188 0.1562 0.7188 +0.2188 0.1562 0.75 +0.2188 0.1562 0.7812 +0.2188 0.1562 0.8125 +0.2188 0.1562 0.8438 +0.2188 0.1562 0.875 +0.2188 0.1562 0.9062 +0.2188 0.1562 0.9375 +0.2188 0.1562 0.9688 +0.2188 0.1562 1 +0.2188 0.1875 0 +0.2188 0.1875 0.03125 +0.2188 0.1875 0.0625 +0.2188 0.1875 0.09375 +0.2188 0.1875 0.125 +0.2188 0.1875 0.1562 +0.2188 0.1875 0.1875 +0.2188 0.1875 0.2188 +0.2188 0.1875 0.25 +0.2188 0.1875 0.2812 +0.2188 0.1875 0.3125 +0.2188 0.1875 0.3438 +0.2188 0.1875 0.375 +0.2188 0.1875 0.4062 +0.2188 0.1875 0.4375 +0.2188 0.1875 0.4688 +0.2188 0.1875 0.5 +0.2188 0.1875 0.5312 +0.2188 0.1875 0.5625 +0.2188 0.1875 0.5938 +0.2188 0.1875 0.625 +0.2188 0.1875 0.6562 +0.2188 0.1875 0.6875 +0.2188 0.1875 0.7188 +0.2188 0.1875 0.75 +0.2188 0.1875 0.7812 +0.2188 0.1875 0.8125 +0.2188 0.1875 0.8438 +0.2188 0.1875 0.875 +0.2188 0.1875 0.9062 +0.2188 0.1875 0.9375 +0.2188 0.1875 0.9688 +0.2188 0.1875 1 +0.2188 0.2188 0 +0.2188 0.2188 0.03125 +0.2188 0.2188 0.0625 +0.2188 0.2188 0.09375 +0.2188 0.2188 0.125 +0.2188 0.2188 0.1562 +0.2188 0.2188 0.1875 +0.2188 0.2188 0.2188 +0.2188 0.2188 0.25 +0.2188 0.2188 0.2812 +0.2188 0.2188 0.3125 +0.2188 0.2188 0.3438 +0.2188 0.2188 0.375 +0.2188 0.2188 0.4062 +0.2188 0.2188 0.4375 +0.2188 0.2188 0.4688 +0.2188 0.2188 0.5 +0.2188 0.2188 0.5312 +0.2188 0.2188 0.5625 +0.2188 0.2188 0.5938 +0.2188 0.2188 0.625 +0.2188 0.2188 0.6562 +0.2188 0.2188 0.6875 +0.2188 0.2188 0.7188 +0.2188 0.2188 0.75 +0.2188 0.2188 0.7812 +0.2188 0.2188 0.8125 +0.2188 0.2188 0.8438 +0.2188 0.2188 0.875 +0.2188 0.2188 0.9062 +0.2188 0.2188 0.9375 +0.2188 0.2188 0.9688 +0.2188 0.2188 1 +0.2188 0.25 0 +0.2188 0.25 0.03125 +0.2188 0.25 0.0625 +0.2188 0.25 0.09375 +0.2188 0.25 0.125 +0.2188 0.25 0.1562 +0.2188 0.25 0.1875 +0.2188 0.25 0.2188 +0.2188 0.25 0.25 +0.2188 0.25 0.2812 +0.2188 0.25 0.3125 +0.2188 0.25 0.3438 +0.2188 0.25 0.375 +0.2188 0.25 0.4062 +0.2188 0.25 0.4375 +0.2188 0.25 0.4688 +0.2188 0.25 0.5 +0.2188 0.25 0.5312 +0.2188 0.25 0.5625 +0.2188 0.25 0.5938 +0.2188 0.25 0.625 +0.2188 0.25 0.6562 +0.2188 0.25 0.6875 +0.2188 0.25 0.7188 +0.2188 0.25 0.75 +0.2188 0.25 0.7812 +0.2188 0.25 0.8125 +0.2188 0.25 0.8438 +0.2188 0.25 0.875 +0.2188 0.25 0.9062 +0.2188 0.25 0.9375 +0.2188 0.25 0.9688 +0.2188 0.25 1 +0.2188 0.2812 0 +0.2188 0.2812 0.03125 +0.2188 0.2812 0.0625 +0.2188 0.2812 0.09375 +0.2188 0.2812 0.125 +0.2188 0.2812 0.1562 +0.2188 0.2812 0.1875 +0.2188 0.2812 0.2188 +0.2188 0.2812 0.25 +0.2188 0.2812 0.2812 +0.2188 0.2812 0.3125 +0.2188 0.2812 0.3438 +0.2188 0.2812 0.375 +0.2188 0.2812 0.4062 +0.2188 0.2812 0.4375 +0.2188 0.2812 0.4688 +0.2188 0.2812 0.5 +0.2188 0.2812 0.5312 +0.2188 0.2812 0.5625 +0.2188 0.2812 0.5938 +0.2188 0.2812 0.625 +0.2188 0.2812 0.6562 +0.2188 0.2812 0.6875 +0.2188 0.2812 0.7188 +0.2188 0.2812 0.75 +0.2188 0.2812 0.7812 +0.2188 0.2812 0.8125 +0.2188 0.2812 0.8438 +0.2188 0.2812 0.875 +0.2188 0.2812 0.9062 +0.2188 0.2812 0.9375 +0.2188 0.2812 0.9688 +0.2188 0.2812 1 +0.2188 0.3125 0 +0.2188 0.3125 0.03125 +0.2188 0.3125 0.0625 +0.2188 0.3125 0.09375 +0.2188 0.3125 0.125 +0.2188 0.3125 0.1562 +0.2188 0.3125 0.1875 +0.2188 0.3125 0.2188 +0.2188 0.3125 0.25 +0.2188 0.3125 0.2812 +0.2188 0.3125 0.3125 +0.2188 0.3125 0.3438 +0.2188 0.3125 0.375 +0.2188 0.3125 0.4062 +0.2188 0.3125 0.4375 +0.2188 0.3125 0.4688 +0.2188 0.3125 0.5 +0.2188 0.3125 0.5312 +0.2188 0.3125 0.5625 +0.2188 0.3125 0.5938 +0.2188 0.3125 0.625 +0.2188 0.3125 0.6562 +0.2188 0.3125 0.6875 +0.2188 0.3125 0.7188 +0.2188 0.3125 0.75 +0.2188 0.3125 0.7812 +0.2188 0.3125 0.8125 +0.2188 0.3125 0.8438 +0.2188 0.3125 0.875 +0.2188 0.3125 0.9062 +0.2188 0.3125 0.9375 +0.2188 0.3125 0.9688 +0.2188 0.3125 1 +0.2188 0.3438 0 +0.2188 0.3438 0.03125 +0.2188 0.3438 0.0625 +0.2188 0.3438 0.09375 +0.2188 0.3438 0.125 +0.2188 0.3438 0.1562 +0.2188 0.3438 0.1875 +0.2188 0.3438 0.2188 +0.2188 0.3438 0.25 +0.2188 0.3438 0.2812 +0.2188 0.3438 0.3125 +0.2188 0.3438 0.3438 +0.2188 0.3438 0.375 +0.2188 0.3438 0.4062 +0.2188 0.3438 0.4375 +0.2188 0.3438 0.4688 +0.2188 0.3438 0.5 +0.2188 0.3438 0.5312 +0.2188 0.3438 0.5625 +0.2188 0.3438 0.5938 +0.2188 0.3438 0.625 +0.2188 0.3438 0.6562 +0.2188 0.3438 0.6875 +0.2188 0.3438 0.7188 +0.2188 0.3438 0.75 +0.2188 0.3438 0.7812 +0.2188 0.3438 0.8125 +0.2188 0.3438 0.8438 +0.2188 0.3438 0.875 +0.2188 0.3438 0.9062 +0.2188 0.3438 0.9375 +0.2188 0.3438 0.9688 +0.2188 0.3438 1 +0.2188 0.375 0 +0.2188 0.375 0.03125 +0.2188 0.375 0.0625 +0.2188 0.375 0.09375 +0.2188 0.375 0.125 +0.2188 0.375 0.1562 +0.2188 0.375 0.1875 +0.2188 0.375 0.2188 +0.2188 0.375 0.25 +0.2188 0.375 0.2812 +0.2188 0.375 0.3125 +0.2188 0.375 0.3438 +0.2188 0.375 0.375 +0.2188 0.375 0.4062 +0.2188 0.375 0.4375 +0.2188 0.375 0.4688 +0.2188 0.375 0.5 +0.2188 0.375 0.5312 +0.2188 0.375 0.5625 +0.2188 0.375 0.5938 +0.2188 0.375 0.625 +0.2188 0.375 0.6562 +0.2188 0.375 0.6875 +0.2188 0.375 0.7188 +0.2188 0.375 0.75 +0.2188 0.375 0.7812 +0.2188 0.375 0.8125 +0.2188 0.375 0.8438 +0.2188 0.375 0.875 +0.2188 0.375 0.9062 +0.2188 0.375 0.9375 +0.2188 0.375 0.9688 +0.2188 0.375 1 +0.2188 0.4062 0 +0.2188 0.4062 0.03125 +0.2188 0.4062 0.0625 +0.2188 0.4062 0.09375 +0.2188 0.4062 0.125 +0.2188 0.4062 0.1562 +0.2188 0.4062 0.1875 +0.2188 0.4062 0.2188 +0.2188 0.4062 0.25 +0.2188 0.4062 0.2812 +0.2188 0.4062 0.3125 +0.2188 0.4062 0.3438 +0.2188 0.4062 0.375 +0.2188 0.4062 0.4062 +0.2188 0.4062 0.4375 +0.2188 0.4062 0.4688 +0.2188 0.4062 0.5 +0.2188 0.4062 0.5312 +0.2188 0.4062 0.5625 +0.2188 0.4062 0.5938 +0.2188 0.4062 0.625 +0.2188 0.4062 0.6562 +0.2188 0.4062 0.6875 +0.2188 0.4062 0.7188 +0.2188 0.4062 0.75 +0.2188 0.4062 0.7812 +0.2188 0.4062 0.8125 +0.2188 0.4062 0.8438 +0.2188 0.4062 0.875 +0.2188 0.4062 0.9062 +0.2188 0.4062 0.9375 +0.2188 0.4062 0.9688 +0.2188 0.4062 1 +0.2188 0.4375 0 +0.2188 0.4375 0.03125 +0.2188 0.4375 0.0625 +0.2188 0.4375 0.09375 +0.2188 0.4375 0.125 +0.2188 0.4375 0.1562 +0.2188 0.4375 0.1875 +0.2188 0.4375 0.2188 +0.2188 0.4375 0.25 +0.2188 0.4375 0.2812 +0.2188 0.4375 0.3125 +0.2188 0.4375 0.3438 +0.2188 0.4375 0.375 +0.2188 0.4375 0.4062 +0.2188 0.4375 0.4375 +0.2188 0.4375 0.4688 +0.2188 0.4375 0.5 +0.2188 0.4375 0.5312 +0.2188 0.4375 0.5625 +0.2188 0.4375 0.5938 +0.2188 0.4375 0.625 +0.2188 0.4375 0.6562 +0.2188 0.4375 0.6875 +0.2188 0.4375 0.7188 +0.2188 0.4375 0.75 +0.2188 0.4375 0.7812 +0.2188 0.4375 0.8125 +0.2188 0.4375 0.8438 +0.2188 0.4375 0.875 +0.2188 0.4375 0.9062 +0.2188 0.4375 0.9375 +0.2188 0.4375 0.9688 +0.2188 0.4375 1 +0.2188 0.4688 0 +0.2188 0.4688 0.03125 +0.2188 0.4688 0.0625 +0.2188 0.4688 0.09375 +0.2188 0.4688 0.125 +0.2188 0.4688 0.1562 +0.2188 0.4688 0.1875 +0.2188 0.4688 0.2188 +0.2188 0.4688 0.25 +0.2188 0.4688 0.2812 +0.2188 0.4688 0.3125 +0.2188 0.4688 0.3438 +0.2188 0.4688 0.375 +0.2188 0.4688 0.4062 +0.2188 0.4688 0.4375 +0.2188 0.4688 0.4688 +0.2188 0.4688 0.5 +0.2188 0.4688 0.5312 +0.2188 0.4688 0.5625 +0.2188 0.4688 0.5938 +0.2188 0.4688 0.625 +0.2188 0.4688 0.6562 +0.2188 0.4688 0.6875 +0.2188 0.4688 0.7188 +0.2188 0.4688 0.75 +0.2188 0.4688 0.7812 +0.2188 0.4688 0.8125 +0.2188 0.4688 0.8438 +0.2188 0.4688 0.875 +0.2188 0.4688 0.9062 +0.2188 0.4688 0.9375 +0.2188 0.4688 0.9688 +0.2188 0.4688 1 +0.2188 0.5 0 +0.2188 0.5 0.03125 +0.2188 0.5 0.0625 +0.2188 0.5 0.09375 +0.2188 0.5 0.125 +0.2188 0.5 0.1562 +0.2188 0.5 0.1875 +0.2188 0.5 0.2188 +0.2188 0.5 0.25 +0.2188 0.5 0.2812 +0.2188 0.5 0.3125 +0.2188 0.5 0.3438 +0.2188 0.5 0.375 +0.2188 0.5 0.4062 +0.2188 0.5 0.4375 +0.2188 0.5 0.4688 +0.2188 0.5 0.5 +0.2188 0.5 0.5312 +0.2188 0.5 0.5625 +0.2188 0.5 0.5938 +0.2188 0.5 0.625 +0.2188 0.5 0.6562 +0.2188 0.5 0.6875 +0.2188 0.5 0.7188 +0.2188 0.5 0.75 +0.2188 0.5 0.7812 +0.2188 0.5 0.8125 +0.2188 0.5 0.8438 +0.2188 0.5 0.875 +0.2188 0.5 0.9062 +0.2188 0.5 0.9375 +0.2188 0.5 0.9688 +0.2188 0.5 1 +0.2188 0.5312 0 +0.2188 0.5312 0.03125 +0.2188 0.5312 0.0625 +0.2188 0.5312 0.09375 +0.2188 0.5312 0.125 +0.2188 0.5312 0.1562 +0.2188 0.5312 0.1875 +0.2188 0.5312 0.2188 +0.2188 0.5312 0.25 +0.2188 0.5312 0.2812 +0.2188 0.5312 0.3125 +0.2188 0.5312 0.3438 +0.2188 0.5312 0.375 +0.2188 0.5312 0.4062 +0.2188 0.5312 0.4375 +0.2188 0.5312 0.4688 +0.2188 0.5312 0.5 +0.2188 0.5312 0.5312 +0.2188 0.5312 0.5625 +0.2188 0.5312 0.5938 +0.2188 0.5312 0.625 +0.2188 0.5312 0.6562 +0.2188 0.5312 0.6875 +0.2188 0.5312 0.7188 +0.2188 0.5312 0.75 +0.2188 0.5312 0.7812 +0.2188 0.5312 0.8125 +0.2188 0.5312 0.8438 +0.2188 0.5312 0.875 +0.2188 0.5312 0.9062 +0.2188 0.5312 0.9375 +0.2188 0.5312 0.9688 +0.2188 0.5312 1 +0.2188 0.5625 0 +0.2188 0.5625 0.03125 +0.2188 0.5625 0.0625 +0.2188 0.5625 0.09375 +0.2188 0.5625 0.125 +0.2188 0.5625 0.1562 +0.2188 0.5625 0.1875 +0.2188 0.5625 0.2188 +0.2188 0.5625 0.25 +0.2188 0.5625 0.2812 +0.2188 0.5625 0.3125 +0.2188 0.5625 0.3438 +0.2188 0.5625 0.375 +0.2188 0.5625 0.4062 +0.2188 0.5625 0.4375 +0.2188 0.5625 0.4688 +0.2188 0.5625 0.5 +0.2188 0.5625 0.5312 +0.2188 0.5625 0.5625 +0.2188 0.5625 0.5938 +0.2188 0.5625 0.625 +0.2188 0.5625 0.6562 +0.2188 0.5625 0.6875 +0.2188 0.5625 0.7188 +0.2188 0.5625 0.75 +0.2188 0.5625 0.7812 +0.2188 0.5625 0.8125 +0.2188 0.5625 0.8438 +0.2188 0.5625 0.875 +0.2188 0.5625 0.9062 +0.2188 0.5625 0.9375 +0.2188 0.5625 0.9688 +0.2188 0.5625 1 +0.2188 0.5938 0 +0.2188 0.5938 0.03125 +0.2188 0.5938 0.0625 +0.2188 0.5938 0.09375 +0.2188 0.5938 0.125 +0.2188 0.5938 0.1562 +0.2188 0.5938 0.1875 +0.2188 0.5938 0.2188 +0.2188 0.5938 0.25 +0.2188 0.5938 0.2812 +0.2188 0.5938 0.3125 +0.2188 0.5938 0.3438 +0.2188 0.5938 0.375 +0.2188 0.5938 0.4062 +0.2188 0.5938 0.4375 +0.2188 0.5938 0.4688 +0.2188 0.5938 0.5 +0.2188 0.5938 0.5312 +0.2188 0.5938 0.5625 +0.2188 0.5938 0.5938 +0.2188 0.5938 0.625 +0.2188 0.5938 0.6562 +0.2188 0.5938 0.6875 +0.2188 0.5938 0.7188 +0.2188 0.5938 0.75 +0.2188 0.5938 0.7812 +0.2188 0.5938 0.8125 +0.2188 0.5938 0.8438 +0.2188 0.5938 0.875 +0.2188 0.5938 0.9062 +0.2188 0.5938 0.9375 +0.2188 0.5938 0.9688 +0.2188 0.5938 1 +0.2188 0.625 0 +0.2188 0.625 0.03125 +0.2188 0.625 0.0625 +0.2188 0.625 0.09375 +0.2188 0.625 0.125 +0.2188 0.625 0.1562 +0.2188 0.625 0.1875 +0.2188 0.625 0.2188 +0.2188 0.625 0.25 +0.2188 0.625 0.2812 +0.2188 0.625 0.3125 +0.2188 0.625 0.3438 +0.2188 0.625 0.375 +0.2188 0.625 0.4062 +0.2188 0.625 0.4375 +0.2188 0.625 0.4688 +0.2188 0.625 0.5 +0.2188 0.625 0.5312 +0.2188 0.625 0.5625 +0.2188 0.625 0.5938 +0.2188 0.625 0.625 +0.2188 0.625 0.6562 +0.2188 0.625 0.6875 +0.2188 0.625 0.7188 +0.2188 0.625 0.75 +0.2188 0.625 0.7812 +0.2188 0.625 0.8125 +0.2188 0.625 0.8438 +0.2188 0.625 0.875 +0.2188 0.625 0.9062 +0.2188 0.625 0.9375 +0.2188 0.625 0.9688 +0.2188 0.625 1 +0.2188 0.6562 0 +0.2188 0.6562 0.03125 +0.2188 0.6562 0.0625 +0.2188 0.6562 0.09375 +0.2188 0.6562 0.125 +0.2188 0.6562 0.1562 +0.2188 0.6562 0.1875 +0.2188 0.6562 0.2188 +0.2188 0.6562 0.25 +0.2188 0.6562 0.2812 +0.2188 0.6562 0.3125 +0.2188 0.6562 0.3438 +0.2188 0.6562 0.375 +0.2188 0.6562 0.4062 +0.2188 0.6562 0.4375 +0.2188 0.6562 0.4688 +0.2188 0.6562 0.5 +0.2188 0.6562 0.5312 +0.2188 0.6562 0.5625 +0.2188 0.6562 0.5938 +0.2188 0.6562 0.625 +0.2188 0.6562 0.6562 +0.2188 0.6562 0.6875 +0.2188 0.6562 0.7188 +0.2188 0.6562 0.75 +0.2188 0.6562 0.7812 +0.2188 0.6562 0.8125 +0.2188 0.6562 0.8438 +0.2188 0.6562 0.875 +0.2188 0.6562 0.9062 +0.2188 0.6562 0.9375 +0.2188 0.6562 0.9688 +0.2188 0.6562 1 +0.2188 0.6875 0 +0.2188 0.6875 0.03125 +0.2188 0.6875 0.0625 +0.2188 0.6875 0.09375 +0.2188 0.6875 0.125 +0.2188 0.6875 0.1562 +0.2188 0.6875 0.1875 +0.2188 0.6875 0.2188 +0.2188 0.6875 0.25 +0.2188 0.6875 0.2812 +0.2188 0.6875 0.3125 +0.2188 0.6875 0.3438 +0.2188 0.6875 0.375 +0.2188 0.6875 0.4062 +0.2188 0.6875 0.4375 +0.2188 0.6875 0.4688 +0.2188 0.6875 0.5 +0.2188 0.6875 0.5312 +0.2188 0.6875 0.5625 +0.2188 0.6875 0.5938 +0.2188 0.6875 0.625 +0.2188 0.6875 0.6562 +0.2188 0.6875 0.6875 +0.2188 0.6875 0.7188 +0.2188 0.6875 0.75 +0.2188 0.6875 0.7812 +0.2188 0.6875 0.8125 +0.2188 0.6875 0.8438 +0.2188 0.6875 0.875 +0.2188 0.6875 0.9062 +0.2188 0.6875 0.9375 +0.2188 0.6875 0.9688 +0.2188 0.6875 1 +0.2188 0.7188 0 +0.2188 0.7188 0.03125 +0.2188 0.7188 0.0625 +0.2188 0.7188 0.09375 +0.2188 0.7188 0.125 +0.2188 0.7188 0.1562 +0.2188 0.7188 0.1875 +0.2188 0.7188 0.2188 +0.2188 0.7188 0.25 +0.2188 0.7188 0.2812 +0.2188 0.7188 0.3125 +0.2188 0.7188 0.3438 +0.2188 0.7188 0.375 +0.2188 0.7188 0.4062 +0.2188 0.7188 0.4375 +0.2188 0.7188 0.4688 +0.2188 0.7188 0.5 +0.2188 0.7188 0.5312 +0.2188 0.7188 0.5625 +0.2188 0.7188 0.5938 +0.2188 0.7188 0.625 +0.2188 0.7188 0.6562 +0.2188 0.7188 0.6875 +0.2188 0.7188 0.7188 +0.2188 0.7188 0.75 +0.2188 0.7188 0.7812 +0.2188 0.7188 0.8125 +0.2188 0.7188 0.8438 +0.2188 0.7188 0.875 +0.2188 0.7188 0.9062 +0.2188 0.7188 0.9375 +0.2188 0.7188 0.9688 +0.2188 0.7188 1 +0.2188 0.75 0 +0.2188 0.75 0.03125 +0.2188 0.75 0.0625 +0.2188 0.75 0.09375 +0.2188 0.75 0.125 +0.2188 0.75 0.1562 +0.2188 0.75 0.1875 +0.2188 0.75 0.2188 +0.2188 0.75 0.25 +0.2188 0.75 0.2812 +0.2188 0.75 0.3125 +0.2188 0.75 0.3438 +0.2188 0.75 0.375 +0.2188 0.75 0.4062 +0.2188 0.75 0.4375 +0.2188 0.75 0.4688 +0.2188 0.75 0.5 +0.2188 0.75 0.5312 +0.2188 0.75 0.5625 +0.2188 0.75 0.5938 +0.2188 0.75 0.625 +0.2188 0.75 0.6562 +0.2188 0.75 0.6875 +0.2188 0.75 0.7188 +0.2188 0.75 0.75 +0.2188 0.75 0.7812 +0.2188 0.75 0.8125 +0.2188 0.75 0.8438 +0.2188 0.75 0.875 +0.2188 0.75 0.9062 +0.2188 0.75 0.9375 +0.2188 0.75 0.9688 +0.2188 0.75 1 +0.2188 0.7812 0 +0.2188 0.7812 0.03125 +0.2188 0.7812 0.0625 +0.2188 0.7812 0.09375 +0.2188 0.7812 0.125 +0.2188 0.7812 0.1562 +0.2188 0.7812 0.1875 +0.2188 0.7812 0.2188 +0.2188 0.7812 0.25 +0.2188 0.7812 0.2812 +0.2188 0.7812 0.3125 +0.2188 0.7812 0.3438 +0.2188 0.7812 0.375 +0.2188 0.7812 0.4062 +0.2188 0.7812 0.4375 +0.2188 0.7812 0.4688 +0.2188 0.7812 0.5 +0.2188 0.7812 0.5312 +0.2188 0.7812 0.5625 +0.2188 0.7812 0.5938 +0.2188 0.7812 0.625 +0.2188 0.7812 0.6562 +0.2188 0.7812 0.6875 +0.2188 0.7812 0.7188 +0.2188 0.7812 0.75 +0.2188 0.7812 0.7812 +0.2188 0.7812 0.8125 +0.2188 0.7812 0.8438 +0.2188 0.7812 0.875 +0.2188 0.7812 0.9062 +0.2188 0.7812 0.9375 +0.2188 0.7812 0.9688 +0.2188 0.7812 1 +0.2188 0.8125 0 +0.2188 0.8125 0.03125 +0.2188 0.8125 0.0625 +0.2188 0.8125 0.09375 +0.2188 0.8125 0.125 +0.2188 0.8125 0.1562 +0.2188 0.8125 0.1875 +0.2188 0.8125 0.2188 +0.2188 0.8125 0.25 +0.2188 0.8125 0.2812 +0.2188 0.8125 0.3125 +0.2188 0.8125 0.3438 +0.2188 0.8125 0.375 +0.2188 0.8125 0.4062 +0.2188 0.8125 0.4375 +0.2188 0.8125 0.4688 +0.2188 0.8125 0.5 +0.2188 0.8125 0.5312 +0.2188 0.8125 0.5625 +0.2188 0.8125 0.5938 +0.2188 0.8125 0.625 +0.2188 0.8125 0.6562 +0.2188 0.8125 0.6875 +0.2188 0.8125 0.7188 +0.2188 0.8125 0.75 +0.2188 0.8125 0.7812 +0.2188 0.8125 0.8125 +0.2188 0.8125 0.8438 +0.2188 0.8125 0.875 +0.2188 0.8125 0.9062 +0.2188 0.8125 0.9375 +0.2188 0.8125 0.9688 +0.2188 0.8125 1 +0.2188 0.8438 0 +0.2188 0.8438 0.03125 +0.2188 0.8438 0.0625 +0.2188 0.8438 0.09375 +0.2188 0.8438 0.125 +0.2188 0.8438 0.1562 +0.2188 0.8438 0.1875 +0.2188 0.8438 0.2188 +0.2188 0.8438 0.25 +0.2188 0.8438 0.2812 +0.2188 0.8438 0.3125 +0.2188 0.8438 0.3438 +0.2188 0.8438 0.375 +0.2188 0.8438 0.4062 +0.2188 0.8438 0.4375 +0.2188 0.8438 0.4688 +0.2188 0.8438 0.5 +0.2188 0.8438 0.5312 +0.2188 0.8438 0.5625 +0.2188 0.8438 0.5938 +0.2188 0.8438 0.625 +0.2188 0.8438 0.6562 +0.2188 0.8438 0.6875 +0.2188 0.8438 0.7188 +0.2188 0.8438 0.75 +0.2188 0.8438 0.7812 +0.2188 0.8438 0.8125 +0.2188 0.8438 0.8438 +0.2188 0.8438 0.875 +0.2188 0.8438 0.9062 +0.2188 0.8438 0.9375 +0.2188 0.8438 0.9688 +0.2188 0.8438 1 +0.2188 0.875 0 +0.2188 0.875 0.03125 +0.2188 0.875 0.0625 +0.2188 0.875 0.09375 +0.2188 0.875 0.125 +0.2188 0.875 0.1562 +0.2188 0.875 0.1875 +0.2188 0.875 0.2188 +0.2188 0.875 0.25 +0.2188 0.875 0.2812 +0.2188 0.875 0.3125 +0.2188 0.875 0.3438 +0.2188 0.875 0.375 +0.2188 0.875 0.4062 +0.2188 0.875 0.4375 +0.2188 0.875 0.4688 +0.2188 0.875 0.5 +0.2188 0.875 0.5312 +0.2188 0.875 0.5625 +0.2188 0.875 0.5938 +0.2188 0.875 0.625 +0.2188 0.875 0.6562 +0.2188 0.875 0.6875 +0.2188 0.875 0.7188 +0.2188 0.875 0.75 +0.2188 0.875 0.7812 +0.2188 0.875 0.8125 +0.2188 0.875 0.8438 +0.2188 0.875 0.875 +0.2188 0.875 0.9062 +0.2188 0.875 0.9375 +0.2188 0.875 0.9688 +0.2188 0.875 1 +0.2188 0.9062 0 +0.2188 0.9062 0.03125 +0.2188 0.9062 0.0625 +0.2188 0.9062 0.09375 +0.2188 0.9062 0.125 +0.2188 0.9062 0.1562 +0.2188 0.9062 0.1875 +0.2188 0.9062 0.2188 +0.2188 0.9062 0.25 +0.2188 0.9062 0.2812 +0.2188 0.9062 0.3125 +0.2188 0.9062 0.3438 +0.2188 0.9062 0.375 +0.2188 0.9062 0.4062 +0.2188 0.9062 0.4375 +0.2188 0.9062 0.4688 +0.2188 0.9062 0.5 +0.2188 0.9062 0.5312 +0.2188 0.9062 0.5625 +0.2188 0.9062 0.5938 +0.2188 0.9062 0.625 +0.2188 0.9062 0.6562 +0.2188 0.9062 0.6875 +0.2188 0.9062 0.7188 +0.2188 0.9062 0.75 +0.2188 0.9062 0.7812 +0.2188 0.9062 0.8125 +0.2188 0.9062 0.8438 +0.2188 0.9062 0.875 +0.2188 0.9062 0.9062 +0.2188 0.9062 0.9375 +0.2188 0.9062 0.9688 +0.2188 0.9062 1 +0.2188 0.9375 0 +0.2188 0.9375 0.03125 +0.2188 0.9375 0.0625 +0.2188 0.9375 0.09375 +0.2188 0.9375 0.125 +0.2188 0.9375 0.1562 +0.2188 0.9375 0.1875 +0.2188 0.9375 0.2188 +0.2188 0.9375 0.25 +0.2188 0.9375 0.2812 +0.2188 0.9375 0.3125 +0.2188 0.9375 0.3438 +0.2188 0.9375 0.375 +0.2188 0.9375 0.4062 +0.2188 0.9375 0.4375 +0.2188 0.9375 0.4688 +0.2188 0.9375 0.5 +0.2188 0.9375 0.5312 +0.2188 0.9375 0.5625 +0.2188 0.9375 0.5938 +0.2188 0.9375 0.625 +0.2188 0.9375 0.6562 +0.2188 0.9375 0.6875 +0.2188 0.9375 0.7188 +0.2188 0.9375 0.75 +0.2188 0.9375 0.7812 +0.2188 0.9375 0.8125 +0.2188 0.9375 0.8438 +0.2188 0.9375 0.875 +0.2188 0.9375 0.9062 +0.2188 0.9375 0.9375 +0.2188 0.9375 0.9688 +0.2188 0.9375 1 +0.2188 0.9688 0 +0.2188 0.9688 0.03125 +0.2188 0.9688 0.0625 +0.2188 0.9688 0.09375 +0.2188 0.9688 0.125 +0.2188 0.9688 0.1562 +0.2188 0.9688 0.1875 +0.2188 0.9688 0.2188 +0.2188 0.9688 0.25 +0.2188 0.9688 0.2812 +0.2188 0.9688 0.3125 +0.2188 0.9688 0.3438 +0.2188 0.9688 0.375 +0.2188 0.9688 0.4062 +0.2188 0.9688 0.4375 +0.2188 0.9688 0.4688 +0.2188 0.9688 0.5 +0.2188 0.9688 0.5312 +0.2188 0.9688 0.5625 +0.2188 0.9688 0.5938 +0.2188 0.9688 0.625 +0.2188 0.9688 0.6562 +0.2188 0.9688 0.6875 +0.2188 0.9688 0.7188 +0.2188 0.9688 0.75 +0.2188 0.9688 0.7812 +0.2188 0.9688 0.8125 +0.2188 0.9688 0.8438 +0.2188 0.9688 0.875 +0.2188 0.9688 0.9062 +0.2188 0.9688 0.9375 +0.2188 0.9688 0.9688 +0.2188 0.9688 1 +0.2188 1 0 +0.2188 1 0.03125 +0.2188 1 0.0625 +0.2188 1 0.09375 +0.2188 1 0.125 +0.2188 1 0.1562 +0.2188 1 0.1875 +0.2188 1 0.2188 +0.2188 1 0.25 +0.2188 1 0.2812 +0.2188 1 0.3125 +0.2188 1 0.3438 +0.2188 1 0.375 +0.2188 1 0.4062 +0.2188 1 0.4375 +0.2188 1 0.4688 +0.2188 1 0.5 +0.2188 1 0.5312 +0.2188 1 0.5625 +0.2188 1 0.5938 +0.2188 1 0.625 +0.2188 1 0.6562 +0.2188 1 0.6875 +0.2188 1 0.7188 +0.2188 1 0.75 +0.2188 1 0.7812 +0.2188 1 0.8125 +0.2188 1 0.8438 +0.2188 1 0.875 +0.2188 1 0.9062 +0.2188 1 0.9375 +0.2188 1 0.9688 +0.2188 1 1 +0.25 0 0 +0.25 0 0.03125 +0.25 0 0.0625 +0.25 0 0.09375 +0.25 0 0.125 +0.25 0 0.1562 +0.25 0 0.1875 +0.25 0 0.2188 +0.25 0 0.25 +0.25 0 0.2812 +0.25 0 0.3125 +0.25 0 0.3438 +0.25 0 0.375 +0.25 0 0.4062 +0.25 0 0.4375 +0.25 0 0.4688 +0.25 0 0.5 +0.25 0 0.5312 +0.25 0 0.5625 +0.25 0 0.5938 +0.25 0 0.625 +0.25 0 0.6562 +0.25 0 0.6875 +0.25 0 0.7188 +0.25 0 0.75 +0.25 0 0.7812 +0.25 0 0.8125 +0.25 0 0.8438 +0.25 0 0.875 +0.25 0 0.9062 +0.25 0 0.9375 +0.25 0 0.9688 +0.25 0 1 +0.25 0.03125 0 +0.25 0.03125 0.03125 +0.25 0.03125 0.0625 +0.25 0.03125 0.09375 +0.25 0.03125 0.125 +0.25 0.03125 0.1562 +0.25 0.03125 0.1875 +0.25 0.03125 0.2188 +0.25 0.03125 0.25 +0.25 0.03125 0.2812 +0.25 0.03125 0.3125 +0.25 0.03125 0.3438 +0.25 0.03125 0.375 +0.25 0.03125 0.4062 +0.25 0.03125 0.4375 +0.25 0.03125 0.4688 +0.25 0.03125 0.5 +0.25 0.03125 0.5312 +0.25 0.03125 0.5625 +0.25 0.03125 0.5938 +0.25 0.03125 0.625 +0.25 0.03125 0.6562 +0.25 0.03125 0.6875 +0.25 0.03125 0.7188 +0.25 0.03125 0.75 +0.25 0.03125 0.7812 +0.25 0.03125 0.8125 +0.25 0.03125 0.8438 +0.25 0.03125 0.875 +0.25 0.03125 0.9062 +0.25 0.03125 0.9375 +0.25 0.03125 0.9688 +0.25 0.03125 1 +0.25 0.0625 0 +0.25 0.0625 0.03125 +0.25 0.0625 0.0625 +0.25 0.0625 0.09375 +0.25 0.0625 0.125 +0.25 0.0625 0.1562 +0.25 0.0625 0.1875 +0.25 0.0625 0.2188 +0.25 0.0625 0.25 +0.25 0.0625 0.2812 +0.25 0.0625 0.3125 +0.25 0.0625 0.3438 +0.25 0.0625 0.375 +0.25 0.0625 0.4062 +0.25 0.0625 0.4375 +0.25 0.0625 0.4688 +0.25 0.0625 0.5 +0.25 0.0625 0.5312 +0.25 0.0625 0.5625 +0.25 0.0625 0.5938 +0.25 0.0625 0.625 +0.25 0.0625 0.6562 +0.25 0.0625 0.6875 +0.25 0.0625 0.7188 +0.25 0.0625 0.75 +0.25 0.0625 0.7812 +0.25 0.0625 0.8125 +0.25 0.0625 0.8438 +0.25 0.0625 0.875 +0.25 0.0625 0.9062 +0.25 0.0625 0.9375 +0.25 0.0625 0.9688 +0.25 0.0625 1 +0.25 0.09375 0 +0.25 0.09375 0.03125 +0.25 0.09375 0.0625 +0.25 0.09375 0.09375 +0.25 0.09375 0.125 +0.25 0.09375 0.1562 +0.25 0.09375 0.1875 +0.25 0.09375 0.2188 +0.25 0.09375 0.25 +0.25 0.09375 0.2812 +0.25 0.09375 0.3125 +0.25 0.09375 0.3438 +0.25 0.09375 0.375 +0.25 0.09375 0.4062 +0.25 0.09375 0.4375 +0.25 0.09375 0.4688 +0.25 0.09375 0.5 +0.25 0.09375 0.5312 +0.25 0.09375 0.5625 +0.25 0.09375 0.5938 +0.25 0.09375 0.625 +0.25 0.09375 0.6562 +0.25 0.09375 0.6875 +0.25 0.09375 0.7188 +0.25 0.09375 0.75 +0.25 0.09375 0.7812 +0.25 0.09375 0.8125 +0.25 0.09375 0.8438 +0.25 0.09375 0.875 +0.25 0.09375 0.9062 +0.25 0.09375 0.9375 +0.25 0.09375 0.9688 +0.25 0.09375 1 +0.25 0.125 0 +0.25 0.125 0.03125 +0.25 0.125 0.0625 +0.25 0.125 0.09375 +0.25 0.125 0.125 +0.25 0.125 0.1562 +0.25 0.125 0.1875 +0.25 0.125 0.2188 +0.25 0.125 0.25 +0.25 0.125 0.2812 +0.25 0.125 0.3125 +0.25 0.125 0.3438 +0.25 0.125 0.375 +0.25 0.125 0.4062 +0.25 0.125 0.4375 +0.25 0.125 0.4688 +0.25 0.125 0.5 +0.25 0.125 0.5312 +0.25 0.125 0.5625 +0.25 0.125 0.5938 +0.25 0.125 0.625 +0.25 0.125 0.6562 +0.25 0.125 0.6875 +0.25 0.125 0.7188 +0.25 0.125 0.75 +0.25 0.125 0.7812 +0.25 0.125 0.8125 +0.25 0.125 0.8438 +0.25 0.125 0.875 +0.25 0.125 0.9062 +0.25 0.125 0.9375 +0.25 0.125 0.9688 +0.25 0.125 1 +0.25 0.1562 0 +0.25 0.1562 0.03125 +0.25 0.1562 0.0625 +0.25 0.1562 0.09375 +0.25 0.1562 0.125 +0.25 0.1562 0.1562 +0.25 0.1562 0.1875 +0.25 0.1562 0.2188 +0.25 0.1562 0.25 +0.25 0.1562 0.2812 +0.25 0.1562 0.3125 +0.25 0.1562 0.3438 +0.25 0.1562 0.375 +0.25 0.1562 0.4062 +0.25 0.1562 0.4375 +0.25 0.1562 0.4688 +0.25 0.1562 0.5 +0.25 0.1562 0.5312 +0.25 0.1562 0.5625 +0.25 0.1562 0.5938 +0.25 0.1562 0.625 +0.25 0.1562 0.6562 +0.25 0.1562 0.6875 +0.25 0.1562 0.7188 +0.25 0.1562 0.75 +0.25 0.1562 0.7812 +0.25 0.1562 0.8125 +0.25 0.1562 0.8438 +0.25 0.1562 0.875 +0.25 0.1562 0.9062 +0.25 0.1562 0.9375 +0.25 0.1562 0.9688 +0.25 0.1562 1 +0.25 0.1875 0 +0.25 0.1875 0.03125 +0.25 0.1875 0.0625 +0.25 0.1875 0.09375 +0.25 0.1875 0.125 +0.25 0.1875 0.1562 +0.25 0.1875 0.1875 +0.25 0.1875 0.2188 +0.25 0.1875 0.25 +0.25 0.1875 0.2812 +0.25 0.1875 0.3125 +0.25 0.1875 0.3438 +0.25 0.1875 0.375 +0.25 0.1875 0.4062 +0.25 0.1875 0.4375 +0.25 0.1875 0.4688 +0.25 0.1875 0.5 +0.25 0.1875 0.5312 +0.25 0.1875 0.5625 +0.25 0.1875 0.5938 +0.25 0.1875 0.625 +0.25 0.1875 0.6562 +0.25 0.1875 0.6875 +0.25 0.1875 0.7188 +0.25 0.1875 0.75 +0.25 0.1875 0.7812 +0.25 0.1875 0.8125 +0.25 0.1875 0.8438 +0.25 0.1875 0.875 +0.25 0.1875 0.9062 +0.25 0.1875 0.9375 +0.25 0.1875 0.9688 +0.25 0.1875 1 +0.25 0.2188 0 +0.25 0.2188 0.03125 +0.25 0.2188 0.0625 +0.25 0.2188 0.09375 +0.25 0.2188 0.125 +0.25 0.2188 0.1562 +0.25 0.2188 0.1875 +0.25 0.2188 0.2188 +0.25 0.2188 0.25 +0.25 0.2188 0.2812 +0.25 0.2188 0.3125 +0.25 0.2188 0.3438 +0.25 0.2188 0.375 +0.25 0.2188 0.4062 +0.25 0.2188 0.4375 +0.25 0.2188 0.4688 +0.25 0.2188 0.5 +0.25 0.2188 0.5312 +0.25 0.2188 0.5625 +0.25 0.2188 0.5938 +0.25 0.2188 0.625 +0.25 0.2188 0.6562 +0.25 0.2188 0.6875 +0.25 0.2188 0.7188 +0.25 0.2188 0.75 +0.25 0.2188 0.7812 +0.25 0.2188 0.8125 +0.25 0.2188 0.8438 +0.25 0.2188 0.875 +0.25 0.2188 0.9062 +0.25 0.2188 0.9375 +0.25 0.2188 0.9688 +0.25 0.2188 1 +0.25 0.25 0 +0.25 0.25 0.03125 +0.25 0.25 0.0625 +0.25 0.25 0.09375 +0.25 0.25 0.125 +0.25 0.25 0.1562 +0.25 0.25 0.1875 +0.25 0.25 0.2188 +0.25 0.25 0.25 +0.25 0.25 0.2812 +0.25 0.25 0.3125 +0.25 0.25 0.3438 +0.25 0.25 0.375 +0.25 0.25 0.4062 +0.25 0.25 0.4375 +0.25 0.25 0.4688 +0.25 0.25 0.5 +0.25 0.25 0.5312 +0.25 0.25 0.5625 +0.25 0.25 0.5938 +0.25 0.25 0.625 +0.25 0.25 0.6562 +0.25 0.25 0.6875 +0.25 0.25 0.7188 +0.25 0.25 0.75 +0.25 0.25 0.7812 +0.25 0.25 0.8125 +0.25 0.25 0.8438 +0.25 0.25 0.875 +0.25 0.25 0.9062 +0.25 0.25 0.9375 +0.25 0.25 0.9688 +0.25 0.25 1 +0.25 0.2812 0 +0.25 0.2812 0.03125 +0.25 0.2812 0.0625 +0.25 0.2812 0.09375 +0.25 0.2812 0.125 +0.25 0.2812 0.1562 +0.25 0.2812 0.1875 +0.25 0.2812 0.2188 +0.25 0.2812 0.25 +0.25 0.2812 0.2812 +0.25 0.2812 0.3125 +0.25 0.2812 0.3438 +0.25 0.2812 0.375 +0.25 0.2812 0.4062 +0.25 0.2812 0.4375 +0.25 0.2812 0.4688 +0.25 0.2812 0.5 +0.25 0.2812 0.5312 +0.25 0.2812 0.5625 +0.25 0.2812 0.5938 +0.25 0.2812 0.625 +0.25 0.2812 0.6562 +0.25 0.2812 0.6875 +0.25 0.2812 0.7188 +0.25 0.2812 0.75 +0.25 0.2812 0.7812 +0.25 0.2812 0.8125 +0.25 0.2812 0.8438 +0.25 0.2812 0.875 +0.25 0.2812 0.9062 +0.25 0.2812 0.9375 +0.25 0.2812 0.9688 +0.25 0.2812 1 +0.25 0.3125 0 +0.25 0.3125 0.03125 +0.25 0.3125 0.0625 +0.25 0.3125 0.09375 +0.25 0.3125 0.125 +0.25 0.3125 0.1562 +0.25 0.3125 0.1875 +0.25 0.3125 0.2188 +0.25 0.3125 0.25 +0.25 0.3125 0.2812 +0.25 0.3125 0.3125 +0.25 0.3125 0.3438 +0.25 0.3125 0.375 +0.25 0.3125 0.4062 +0.25 0.3125 0.4375 +0.25 0.3125 0.4688 +0.25 0.3125 0.5 +0.25 0.3125 0.5312 +0.25 0.3125 0.5625 +0.25 0.3125 0.5938 +0.25 0.3125 0.625 +0.25 0.3125 0.6562 +0.25 0.3125 0.6875 +0.25 0.3125 0.7188 +0.25 0.3125 0.75 +0.25 0.3125 0.7812 +0.25 0.3125 0.8125 +0.25 0.3125 0.8438 +0.25 0.3125 0.875 +0.25 0.3125 0.9062 +0.25 0.3125 0.9375 +0.25 0.3125 0.9688 +0.25 0.3125 1 +0.25 0.3438 0 +0.25 0.3438 0.03125 +0.25 0.3438 0.0625 +0.25 0.3438 0.09375 +0.25 0.3438 0.125 +0.25 0.3438 0.1562 +0.25 0.3438 0.1875 +0.25 0.3438 0.2188 +0.25 0.3438 0.25 +0.25 0.3438 0.2812 +0.25 0.3438 0.3125 +0.25 0.3438 0.3438 +0.25 0.3438 0.375 +0.25 0.3438 0.4062 +0.25 0.3438 0.4375 +0.25 0.3438 0.4688 +0.25 0.3438 0.5 +0.25 0.3438 0.5312 +0.25 0.3438 0.5625 +0.25 0.3438 0.5938 +0.25 0.3438 0.625 +0.25 0.3438 0.6562 +0.25 0.3438 0.6875 +0.25 0.3438 0.7188 +0.25 0.3438 0.75 +0.25 0.3438 0.7812 +0.25 0.3438 0.8125 +0.25 0.3438 0.8438 +0.25 0.3438 0.875 +0.25 0.3438 0.9062 +0.25 0.3438 0.9375 +0.25 0.3438 0.9688 +0.25 0.3438 1 +0.25 0.375 0 +0.25 0.375 0.03125 +0.25 0.375 0.0625 +0.25 0.375 0.09375 +0.25 0.375 0.125 +0.25 0.375 0.1562 +0.25 0.375 0.1875 +0.25 0.375 0.2188 +0.25 0.375 0.25 +0.25 0.375 0.2812 +0.25 0.375 0.3125 +0.25 0.375 0.3438 +0.25 0.375 0.375 +0.25 0.375 0.4062 +0.25 0.375 0.4375 +0.25 0.375 0.4688 +0.25 0.375 0.5 +0.25 0.375 0.5312 +0.25 0.375 0.5625 +0.25 0.375 0.5938 +0.25 0.375 0.625 +0.25 0.375 0.6562 +0.25 0.375 0.6875 +0.25 0.375 0.7188 +0.25 0.375 0.75 +0.25 0.375 0.7812 +0.25 0.375 0.8125 +0.25 0.375 0.8438 +0.25 0.375 0.875 +0.25 0.375 0.9062 +0.25 0.375 0.9375 +0.25 0.375 0.9688 +0.25 0.375 1 +0.25 0.4062 0 +0.25 0.4062 0.03125 +0.25 0.4062 0.0625 +0.25 0.4062 0.09375 +0.25 0.4062 0.125 +0.25 0.4062 0.1562 +0.25 0.4062 0.1875 +0.25 0.4062 0.2188 +0.25 0.4062 0.25 +0.25 0.4062 0.2812 +0.25 0.4062 0.3125 +0.25 0.4062 0.3438 +0.25 0.4062 0.375 +0.25 0.4062 0.4062 +0.25 0.4062 0.4375 +0.25 0.4062 0.4688 +0.25 0.4062 0.5 +0.25 0.4062 0.5312 +0.25 0.4062 0.5625 +0.25 0.4062 0.5938 +0.25 0.4062 0.625 +0.25 0.4062 0.6562 +0.25 0.4062 0.6875 +0.25 0.4062 0.7188 +0.25 0.4062 0.75 +0.25 0.4062 0.7812 +0.25 0.4062 0.8125 +0.25 0.4062 0.8438 +0.25 0.4062 0.875 +0.25 0.4062 0.9062 +0.25 0.4062 0.9375 +0.25 0.4062 0.9688 +0.25 0.4062 1 +0.25 0.4375 0 +0.25 0.4375 0.03125 +0.25 0.4375 0.0625 +0.25 0.4375 0.09375 +0.25 0.4375 0.125 +0.25 0.4375 0.1562 +0.25 0.4375 0.1875 +0.25 0.4375 0.2188 +0.25 0.4375 0.25 +0.25 0.4375 0.2812 +0.25 0.4375 0.3125 +0.25 0.4375 0.3438 +0.25 0.4375 0.375 +0.25 0.4375 0.4062 +0.25 0.4375 0.4375 +0.25 0.4375 0.4688 +0.25 0.4375 0.5 +0.25 0.4375 0.5312 +0.25 0.4375 0.5625 +0.25 0.4375 0.5938 +0.25 0.4375 0.625 +0.25 0.4375 0.6562 +0.25 0.4375 0.6875 +0.25 0.4375 0.7188 +0.25 0.4375 0.75 +0.25 0.4375 0.7812 +0.25 0.4375 0.8125 +0.25 0.4375 0.8438 +0.25 0.4375 0.875 +0.25 0.4375 0.9062 +0.25 0.4375 0.9375 +0.25 0.4375 0.9688 +0.25 0.4375 1 +0.25 0.4688 0 +0.25 0.4688 0.03125 +0.25 0.4688 0.0625 +0.25 0.4688 0.09375 +0.25 0.4688 0.125 +0.25 0.4688 0.1562 +0.25 0.4688 0.1875 +0.25 0.4688 0.2188 +0.25 0.4688 0.25 +0.25 0.4688 0.2812 +0.25 0.4688 0.3125 +0.25 0.4688 0.3438 +0.25 0.4688 0.375 +0.25 0.4688 0.4062 +0.25 0.4688 0.4375 +0.25 0.4688 0.4688 +0.25 0.4688 0.5 +0.25 0.4688 0.5312 +0.25 0.4688 0.5625 +0.25 0.4688 0.5938 +0.25 0.4688 0.625 +0.25 0.4688 0.6562 +0.25 0.4688 0.6875 +0.25 0.4688 0.7188 +0.25 0.4688 0.75 +0.25 0.4688 0.7812 +0.25 0.4688 0.8125 +0.25 0.4688 0.8438 +0.25 0.4688 0.875 +0.25 0.4688 0.9062 +0.25 0.4688 0.9375 +0.25 0.4688 0.9688 +0.25 0.4688 1 +0.25 0.5 0 +0.25 0.5 0.03125 +0.25 0.5 0.0625 +0.25 0.5 0.09375 +0.25 0.5 0.125 +0.25 0.5 0.1562 +0.25 0.5 0.1875 +0.25 0.5 0.2188 +0.25 0.5 0.25 +0.25 0.5 0.2812 +0.25 0.5 0.3125 +0.25 0.5 0.3438 +0.25 0.5 0.375 +0.25 0.5 0.4062 +0.25 0.5 0.4375 +0.25 0.5 0.4688 +0.25 0.5 0.5 +0.25 0.5 0.5312 +0.25 0.5 0.5625 +0.25 0.5 0.5938 +0.25 0.5 0.625 +0.25 0.5 0.6562 +0.25 0.5 0.6875 +0.25 0.5 0.7188 +0.25 0.5 0.75 +0.25 0.5 0.7812 +0.25 0.5 0.8125 +0.25 0.5 0.8438 +0.25 0.5 0.875 +0.25 0.5 0.9062 +0.25 0.5 0.9375 +0.25 0.5 0.9688 +0.25 0.5 1 +0.25 0.5312 0 +0.25 0.5312 0.03125 +0.25 0.5312 0.0625 +0.25 0.5312 0.09375 +0.25 0.5312 0.125 +0.25 0.5312 0.1562 +0.25 0.5312 0.1875 +0.25 0.5312 0.2188 +0.25 0.5312 0.25 +0.25 0.5312 0.2812 +0.25 0.5312 0.3125 +0.25 0.5312 0.3438 +0.25 0.5312 0.375 +0.25 0.5312 0.4062 +0.25 0.5312 0.4375 +0.25 0.5312 0.4688 +0.25 0.5312 0.5 +0.25 0.5312 0.5312 +0.25 0.5312 0.5625 +0.25 0.5312 0.5938 +0.25 0.5312 0.625 +0.25 0.5312 0.6562 +0.25 0.5312 0.6875 +0.25 0.5312 0.7188 +0.25 0.5312 0.75 +0.25 0.5312 0.7812 +0.25 0.5312 0.8125 +0.25 0.5312 0.8438 +0.25 0.5312 0.875 +0.25 0.5312 0.9062 +0.25 0.5312 0.9375 +0.25 0.5312 0.9688 +0.25 0.5312 1 +0.25 0.5625 0 +0.25 0.5625 0.03125 +0.25 0.5625 0.0625 +0.25 0.5625 0.09375 +0.25 0.5625 0.125 +0.25 0.5625 0.1562 +0.25 0.5625 0.1875 +0.25 0.5625 0.2188 +0.25 0.5625 0.25 +0.25 0.5625 0.2812 +0.25 0.5625 0.3125 +0.25 0.5625 0.3438 +0.25 0.5625 0.375 +0.25 0.5625 0.4062 +0.25 0.5625 0.4375 +0.25 0.5625 0.4688 +0.25 0.5625 0.5 +0.25 0.5625 0.5312 +0.25 0.5625 0.5625 +0.25 0.5625 0.5938 +0.25 0.5625 0.625 +0.25 0.5625 0.6562 +0.25 0.5625 0.6875 +0.25 0.5625 0.7188 +0.25 0.5625 0.75 +0.25 0.5625 0.7812 +0.25 0.5625 0.8125 +0.25 0.5625 0.8438 +0.25 0.5625 0.875 +0.25 0.5625 0.9062 +0.25 0.5625 0.9375 +0.25 0.5625 0.9688 +0.25 0.5625 1 +0.25 0.5938 0 +0.25 0.5938 0.03125 +0.25 0.5938 0.0625 +0.25 0.5938 0.09375 +0.25 0.5938 0.125 +0.25 0.5938 0.1562 +0.25 0.5938 0.1875 +0.25 0.5938 0.2188 +0.25 0.5938 0.25 +0.25 0.5938 0.2812 +0.25 0.5938 0.3125 +0.25 0.5938 0.3438 +0.25 0.5938 0.375 +0.25 0.5938 0.4062 +0.25 0.5938 0.4375 +0.25 0.5938 0.4688 +0.25 0.5938 0.5 +0.25 0.5938 0.5312 +0.25 0.5938 0.5625 +0.25 0.5938 0.5938 +0.25 0.5938 0.625 +0.25 0.5938 0.6562 +0.25 0.5938 0.6875 +0.25 0.5938 0.7188 +0.25 0.5938 0.75 +0.25 0.5938 0.7812 +0.25 0.5938 0.8125 +0.25 0.5938 0.8438 +0.25 0.5938 0.875 +0.25 0.5938 0.9062 +0.25 0.5938 0.9375 +0.25 0.5938 0.9688 +0.25 0.5938 1 +0.25 0.625 0 +0.25 0.625 0.03125 +0.25 0.625 0.0625 +0.25 0.625 0.09375 +0.25 0.625 0.125 +0.25 0.625 0.1562 +0.25 0.625 0.1875 +0.25 0.625 0.2188 +0.25 0.625 0.25 +0.25 0.625 0.2812 +0.25 0.625 0.3125 +0.25 0.625 0.3438 +0.25 0.625 0.375 +0.25 0.625 0.4062 +0.25 0.625 0.4375 +0.25 0.625 0.4688 +0.25 0.625 0.5 +0.25 0.625 0.5312 +0.25 0.625 0.5625 +0.25 0.625 0.5938 +0.25 0.625 0.625 +0.25 0.625 0.6562 +0.25 0.625 0.6875 +0.25 0.625 0.7188 +0.25 0.625 0.75 +0.25 0.625 0.7812 +0.25 0.625 0.8125 +0.25 0.625 0.8438 +0.25 0.625 0.875 +0.25 0.625 0.9062 +0.25 0.625 0.9375 +0.25 0.625 0.9688 +0.25 0.625 1 +0.25 0.6562 0 +0.25 0.6562 0.03125 +0.25 0.6562 0.0625 +0.25 0.6562 0.09375 +0.25 0.6562 0.125 +0.25 0.6562 0.1562 +0.25 0.6562 0.1875 +0.25 0.6562 0.2188 +0.25 0.6562 0.25 +0.25 0.6562 0.2812 +0.25 0.6562 0.3125 +0.25 0.6562 0.3438 +0.25 0.6562 0.375 +0.25 0.6562 0.4062 +0.25 0.6562 0.4375 +0.25 0.6562 0.4688 +0.25 0.6562 0.5 +0.25 0.6562 0.5312 +0.25 0.6562 0.5625 +0.25 0.6562 0.5938 +0.25 0.6562 0.625 +0.25 0.6562 0.6562 +0.25 0.6562 0.6875 +0.25 0.6562 0.7188 +0.25 0.6562 0.75 +0.25 0.6562 0.7812 +0.25 0.6562 0.8125 +0.25 0.6562 0.8438 +0.25 0.6562 0.875 +0.25 0.6562 0.9062 +0.25 0.6562 0.9375 +0.25 0.6562 0.9688 +0.25 0.6562 1 +0.25 0.6875 0 +0.25 0.6875 0.03125 +0.25 0.6875 0.0625 +0.25 0.6875 0.09375 +0.25 0.6875 0.125 +0.25 0.6875 0.1562 +0.25 0.6875 0.1875 +0.25 0.6875 0.2188 +0.25 0.6875 0.25 +0.25 0.6875 0.2812 +0.25 0.6875 0.3125 +0.25 0.6875 0.3438 +0.25 0.6875 0.375 +0.25 0.6875 0.4062 +0.25 0.6875 0.4375 +0.25 0.6875 0.4688 +0.25 0.6875 0.5 +0.25 0.6875 0.5312 +0.25 0.6875 0.5625 +0.25 0.6875 0.5938 +0.25 0.6875 0.625 +0.25 0.6875 0.6562 +0.25 0.6875 0.6875 +0.25 0.6875 0.7188 +0.25 0.6875 0.75 +0.25 0.6875 0.7812 +0.25 0.6875 0.8125 +0.25 0.6875 0.8438 +0.25 0.6875 0.875 +0.25 0.6875 0.9062 +0.25 0.6875 0.9375 +0.25 0.6875 0.9688 +0.25 0.6875 1 +0.25 0.7188 0 +0.25 0.7188 0.03125 +0.25 0.7188 0.0625 +0.25 0.7188 0.09375 +0.25 0.7188 0.125 +0.25 0.7188 0.1562 +0.25 0.7188 0.1875 +0.25 0.7188 0.2188 +0.25 0.7188 0.25 +0.25 0.7188 0.2812 +0.25 0.7188 0.3125 +0.25 0.7188 0.3438 +0.25 0.7188 0.375 +0.25 0.7188 0.4062 +0.25 0.7188 0.4375 +0.25 0.7188 0.4688 +0.25 0.7188 0.5 +0.25 0.7188 0.5312 +0.25 0.7188 0.5625 +0.25 0.7188 0.5938 +0.25 0.7188 0.625 +0.25 0.7188 0.6562 +0.25 0.7188 0.6875 +0.25 0.7188 0.7188 +0.25 0.7188 0.75 +0.25 0.7188 0.7812 +0.25 0.7188 0.8125 +0.25 0.7188 0.8438 +0.25 0.7188 0.875 +0.25 0.7188 0.9062 +0.25 0.7188 0.9375 +0.25 0.7188 0.9688 +0.25 0.7188 1 +0.25 0.75 0 +0.25 0.75 0.03125 +0.25 0.75 0.0625 +0.25 0.75 0.09375 +0.25 0.75 0.125 +0.25 0.75 0.1562 +0.25 0.75 0.1875 +0.25 0.75 0.2188 +0.25 0.75 0.25 +0.25 0.75 0.2812 +0.25 0.75 0.3125 +0.25 0.75 0.3438 +0.25 0.75 0.375 +0.25 0.75 0.4062 +0.25 0.75 0.4375 +0.25 0.75 0.4688 +0.25 0.75 0.5 +0.25 0.75 0.5312 +0.25 0.75 0.5625 +0.25 0.75 0.5938 +0.25 0.75 0.625 +0.25 0.75 0.6562 +0.25 0.75 0.6875 +0.25 0.75 0.7188 +0.25 0.75 0.75 +0.25 0.75 0.7812 +0.25 0.75 0.8125 +0.25 0.75 0.8438 +0.25 0.75 0.875 +0.25 0.75 0.9062 +0.25 0.75 0.9375 +0.25 0.75 0.9688 +0.25 0.75 1 +0.25 0.7812 0 +0.25 0.7812 0.03125 +0.25 0.7812 0.0625 +0.25 0.7812 0.09375 +0.25 0.7812 0.125 +0.25 0.7812 0.1562 +0.25 0.7812 0.1875 +0.25 0.7812 0.2188 +0.25 0.7812 0.25 +0.25 0.7812 0.2812 +0.25 0.7812 0.3125 +0.25 0.7812 0.3438 +0.25 0.7812 0.375 +0.25 0.7812 0.4062 +0.25 0.7812 0.4375 +0.25 0.7812 0.4688 +0.25 0.7812 0.5 +0.25 0.7812 0.5312 +0.25 0.7812 0.5625 +0.25 0.7812 0.5938 +0.25 0.7812 0.625 +0.25 0.7812 0.6562 +0.25 0.7812 0.6875 +0.25 0.7812 0.7188 +0.25 0.7812 0.75 +0.25 0.7812 0.7812 +0.25 0.7812 0.8125 +0.25 0.7812 0.8438 +0.25 0.7812 0.875 +0.25 0.7812 0.9062 +0.25 0.7812 0.9375 +0.25 0.7812 0.9688 +0.25 0.7812 1 +0.25 0.8125 0 +0.25 0.8125 0.03125 +0.25 0.8125 0.0625 +0.25 0.8125 0.09375 +0.25 0.8125 0.125 +0.25 0.8125 0.1562 +0.25 0.8125 0.1875 +0.25 0.8125 0.2188 +0.25 0.8125 0.25 +0.25 0.8125 0.2812 +0.25 0.8125 0.3125 +0.25 0.8125 0.3438 +0.25 0.8125 0.375 +0.25 0.8125 0.4062 +0.25 0.8125 0.4375 +0.25 0.8125 0.4688 +0.25 0.8125 0.5 +0.25 0.8125 0.5312 +0.25 0.8125 0.5625 +0.25 0.8125 0.5938 +0.25 0.8125 0.625 +0.25 0.8125 0.6562 +0.25 0.8125 0.6875 +0.25 0.8125 0.7188 +0.25 0.8125 0.75 +0.25 0.8125 0.7812 +0.25 0.8125 0.8125 +0.25 0.8125 0.8438 +0.25 0.8125 0.875 +0.25 0.8125 0.9062 +0.25 0.8125 0.9375 +0.25 0.8125 0.9688 +0.25 0.8125 1 +0.25 0.8438 0 +0.25 0.8438 0.03125 +0.25 0.8438 0.0625 +0.25 0.8438 0.09375 +0.25 0.8438 0.125 +0.25 0.8438 0.1562 +0.25 0.8438 0.1875 +0.25 0.8438 0.2188 +0.25 0.8438 0.25 +0.25 0.8438 0.2812 +0.25 0.8438 0.3125 +0.25 0.8438 0.3438 +0.25 0.8438 0.375 +0.25 0.8438 0.4062 +0.25 0.8438 0.4375 +0.25 0.8438 0.4688 +0.25 0.8438 0.5 +0.25 0.8438 0.5312 +0.25 0.8438 0.5625 +0.25 0.8438 0.5938 +0.25 0.8438 0.625 +0.25 0.8438 0.6562 +0.25 0.8438 0.6875 +0.25 0.8438 0.7188 +0.25 0.8438 0.75 +0.25 0.8438 0.7812 +0.25 0.8438 0.8125 +0.25 0.8438 0.8438 +0.25 0.8438 0.875 +0.25 0.8438 0.9062 +0.25 0.8438 0.9375 +0.25 0.8438 0.9688 +0.25 0.8438 1 +0.25 0.875 0 +0.25 0.875 0.03125 +0.25 0.875 0.0625 +0.25 0.875 0.09375 +0.25 0.875 0.125 +0.25 0.875 0.1562 +0.25 0.875 0.1875 +0.25 0.875 0.2188 +0.25 0.875 0.25 +0.25 0.875 0.2812 +0.25 0.875 0.3125 +0.25 0.875 0.3438 +0.25 0.875 0.375 +0.25 0.875 0.4062 +0.25 0.875 0.4375 +0.25 0.875 0.4688 +0.25 0.875 0.5 +0.25 0.875 0.5312 +0.25 0.875 0.5625 +0.25 0.875 0.5938 +0.25 0.875 0.625 +0.25 0.875 0.6562 +0.25 0.875 0.6875 +0.25 0.875 0.7188 +0.25 0.875 0.75 +0.25 0.875 0.7812 +0.25 0.875 0.8125 +0.25 0.875 0.8438 +0.25 0.875 0.875 +0.25 0.875 0.9062 +0.25 0.875 0.9375 +0.25 0.875 0.9688 +0.25 0.875 1 +0.25 0.9062 0 +0.25 0.9062 0.03125 +0.25 0.9062 0.0625 +0.25 0.9062 0.09375 +0.25 0.9062 0.125 +0.25 0.9062 0.1562 +0.25 0.9062 0.1875 +0.25 0.9062 0.2188 +0.25 0.9062 0.25 +0.25 0.9062 0.2812 +0.25 0.9062 0.3125 +0.25 0.9062 0.3438 +0.25 0.9062 0.375 +0.25 0.9062 0.4062 +0.25 0.9062 0.4375 +0.25 0.9062 0.4688 +0.25 0.9062 0.5 +0.25 0.9062 0.5312 +0.25 0.9062 0.5625 +0.25 0.9062 0.5938 +0.25 0.9062 0.625 +0.25 0.9062 0.6562 +0.25 0.9062 0.6875 +0.25 0.9062 0.7188 +0.25 0.9062 0.75 +0.25 0.9062 0.7812 +0.25 0.9062 0.8125 +0.25 0.9062 0.8438 +0.25 0.9062 0.875 +0.25 0.9062 0.9062 +0.25 0.9062 0.9375 +0.25 0.9062 0.9688 +0.25 0.9062 1 +0.25 0.9375 0 +0.25 0.9375 0.03125 +0.25 0.9375 0.0625 +0.25 0.9375 0.09375 +0.25 0.9375 0.125 +0.25 0.9375 0.1562 +0.25 0.9375 0.1875 +0.25 0.9375 0.2188 +0.25 0.9375 0.25 +0.25 0.9375 0.2812 +0.25 0.9375 0.3125 +0.25 0.9375 0.3438 +0.25 0.9375 0.375 +0.25 0.9375 0.4062 +0.25 0.9375 0.4375 +0.25 0.9375 0.4688 +0.25 0.9375 0.5 +0.25 0.9375 0.5312 +0.25 0.9375 0.5625 +0.25 0.9375 0.5938 +0.25 0.9375 0.625 +0.25 0.9375 0.6562 +0.25 0.9375 0.6875 +0.25 0.9375 0.7188 +0.25 0.9375 0.75 +0.25 0.9375 0.7812 +0.25 0.9375 0.8125 +0.25 0.9375 0.8438 +0.25 0.9375 0.875 +0.25 0.9375 0.9062 +0.25 0.9375 0.9375 +0.25 0.9375 0.9688 +0.25 0.9375 1 +0.25 0.9688 0 +0.25 0.9688 0.03125 +0.25 0.9688 0.0625 +0.25 0.9688 0.09375 +0.25 0.9688 0.125 +0.25 0.9688 0.1562 +0.25 0.9688 0.1875 +0.25 0.9688 0.2188 +0.25 0.9688 0.25 +0.25 0.9688 0.2812 +0.25 0.9688 0.3125 +0.25 0.9688 0.3438 +0.25 0.9688 0.375 +0.25 0.9688 0.4062 +0.25 0.9688 0.4375 +0.25 0.9688 0.4688 +0.25 0.9688 0.5 +0.25 0.9688 0.5312 +0.25 0.9688 0.5625 +0.25 0.9688 0.5938 +0.25 0.9688 0.625 +0.25 0.9688 0.6562 +0.25 0.9688 0.6875 +0.25 0.9688 0.7188 +0.25 0.9688 0.75 +0.25 0.9688 0.7812 +0.25 0.9688 0.8125 +0.25 0.9688 0.8438 +0.25 0.9688 0.875 +0.25 0.9688 0.9062 +0.25 0.9688 0.9375 +0.25 0.9688 0.9688 +0.25 0.9688 1 +0.25 1 0 +0.25 1 0.03125 +0.25 1 0.0625 +0.25 1 0.09375 +0.25 1 0.125 +0.25 1 0.1562 +0.25 1 0.1875 +0.25 1 0.2188 +0.25 1 0.25 +0.25 1 0.2812 +0.25 1 0.3125 +0.25 1 0.3438 +0.25 1 0.375 +0.25 1 0.4062 +0.25 1 0.4375 +0.25 1 0.4688 +0.25 1 0.5 +0.25 1 0.5312 +0.25 1 0.5625 +0.25 1 0.5938 +0.25 1 0.625 +0.25 1 0.6562 +0.25 1 0.6875 +0.25 1 0.7188 +0.25 1 0.75 +0.25 1 0.7812 +0.25 1 0.8125 +0.25 1 0.8438 +0.25 1 0.875 +0.25 1 0.9062 +0.25 1 0.9375 +0.25 1 0.9688 +0.25 1 1 +0.2812 0 0 +0.2812 0 0.03125 +0.2812 0 0.0625 +0.2812 0 0.09375 +0.2812 0 0.125 +0.2812 0 0.1562 +0.2812 0 0.1875 +0.2812 0 0.2188 +0.2812 0 0.25 +0.2812 0 0.2812 +0.2812 0 0.3125 +0.2812 0 0.3438 +0.2812 0 0.375 +0.2812 0 0.4062 +0.2812 0 0.4375 +0.2812 0 0.4688 +0.2812 0 0.5 +0.2812 0 0.5312 +0.2812 0 0.5625 +0.2812 0 0.5938 +0.2812 0 0.625 +0.2812 0 0.6562 +0.2812 0 0.6875 +0.2812 0 0.7188 +0.2812 0 0.75 +0.2812 0 0.7812 +0.2812 0 0.8125 +0.2812 0 0.8438 +0.2812 0 0.875 +0.2812 0 0.9062 +0.2812 0 0.9375 +0.2812 0 0.9688 +0.2812 0 1 +0.2812 0.03125 0 +0.2812 0.03125 0.03125 +0.2812 0.03125 0.0625 +0.2812 0.03125 0.09375 +0.2812 0.03125 0.125 +0.2812 0.03125 0.1562 +0.2812 0.03125 0.1875 +0.2812 0.03125 0.2188 +0.2812 0.03125 0.25 +0.2812 0.03125 0.2812 +0.2812 0.03125 0.3125 +0.2812 0.03125 0.3438 +0.2812 0.03125 0.375 +0.2812 0.03125 0.4062 +0.2812 0.03125 0.4375 +0.2812 0.03125 0.4688 +0.2812 0.03125 0.5 +0.2812 0.03125 0.5312 +0.2812 0.03125 0.5625 +0.2812 0.03125 0.5938 +0.2812 0.03125 0.625 +0.2812 0.03125 0.6562 +0.2812 0.03125 0.6875 +0.2812 0.03125 0.7188 +0.2812 0.03125 0.75 +0.2812 0.03125 0.7812 +0.2812 0.03125 0.8125 +0.2812 0.03125 0.8438 +0.2812 0.03125 0.875 +0.2812 0.03125 0.9062 +0.2812 0.03125 0.9375 +0.2812 0.03125 0.9688 +0.2812 0.03125 1 +0.2812 0.0625 0 +0.2812 0.0625 0.03125 +0.2812 0.0625 0.0625 +0.2812 0.0625 0.09375 +0.2812 0.0625 0.125 +0.2812 0.0625 0.1562 +0.2812 0.0625 0.1875 +0.2812 0.0625 0.2188 +0.2812 0.0625 0.25 +0.2812 0.0625 0.2812 +0.2812 0.0625 0.3125 +0.2812 0.0625 0.3438 +0.2812 0.0625 0.375 +0.2812 0.0625 0.4062 +0.2812 0.0625 0.4375 +0.2812 0.0625 0.4688 +0.2812 0.0625 0.5 +0.2812 0.0625 0.5312 +0.2812 0.0625 0.5625 +0.2812 0.0625 0.5938 +0.2812 0.0625 0.625 +0.2812 0.0625 0.6562 +0.2812 0.0625 0.6875 +0.2812 0.0625 0.7188 +0.2812 0.0625 0.75 +0.2812 0.0625 0.7812 +0.2812 0.0625 0.8125 +0.2812 0.0625 0.8438 +0.2812 0.0625 0.875 +0.2812 0.0625 0.9062 +0.2812 0.0625 0.9375 +0.2812 0.0625 0.9688 +0.2812 0.0625 1 +0.2812 0.09375 0 +0.2812 0.09375 0.03125 +0.2812 0.09375 0.0625 +0.2812 0.09375 0.09375 +0.2812 0.09375 0.125 +0.2812 0.09375 0.1562 +0.2812 0.09375 0.1875 +0.2812 0.09375 0.2188 +0.2812 0.09375 0.25 +0.2812 0.09375 0.2812 +0.2812 0.09375 0.3125 +0.2812 0.09375 0.3438 +0.2812 0.09375 0.375 +0.2812 0.09375 0.4062 +0.2812 0.09375 0.4375 +0.2812 0.09375 0.4688 +0.2812 0.09375 0.5 +0.2812 0.09375 0.5312 +0.2812 0.09375 0.5625 +0.2812 0.09375 0.5938 +0.2812 0.09375 0.625 +0.2812 0.09375 0.6562 +0.2812 0.09375 0.6875 +0.2812 0.09375 0.7188 +0.2812 0.09375 0.75 +0.2812 0.09375 0.7812 +0.2812 0.09375 0.8125 +0.2812 0.09375 0.8438 +0.2812 0.09375 0.875 +0.2812 0.09375 0.9062 +0.2812 0.09375 0.9375 +0.2812 0.09375 0.9688 +0.2812 0.09375 1 +0.2812 0.125 0 +0.2812 0.125 0.03125 +0.2812 0.125 0.0625 +0.2812 0.125 0.09375 +0.2812 0.125 0.125 +0.2812 0.125 0.1562 +0.2812 0.125 0.1875 +0.2812 0.125 0.2188 +0.2812 0.125 0.25 +0.2812 0.125 0.2812 +0.2812 0.125 0.3125 +0.2812 0.125 0.3438 +0.2812 0.125 0.375 +0.2812 0.125 0.4062 +0.2812 0.125 0.4375 +0.2812 0.125 0.4688 +0.2812 0.125 0.5 +0.2812 0.125 0.5312 +0.2812 0.125 0.5625 +0.2812 0.125 0.5938 +0.2812 0.125 0.625 +0.2812 0.125 0.6562 +0.2812 0.125 0.6875 +0.2812 0.125 0.7188 +0.2812 0.125 0.75 +0.2812 0.125 0.7812 +0.2812 0.125 0.8125 +0.2812 0.125 0.8438 +0.2812 0.125 0.875 +0.2812 0.125 0.9062 +0.2812 0.125 0.9375 +0.2812 0.125 0.9688 +0.2812 0.125 1 +0.2812 0.1562 0 +0.2812 0.1562 0.03125 +0.2812 0.1562 0.0625 +0.2812 0.1562 0.09375 +0.2812 0.1562 0.125 +0.2812 0.1562 0.1562 +0.2812 0.1562 0.1875 +0.2812 0.1562 0.2188 +0.2812 0.1562 0.25 +0.2812 0.1562 0.2812 +0.2812 0.1562 0.3125 +0.2812 0.1562 0.3438 +0.2812 0.1562 0.375 +0.2812 0.1562 0.4062 +0.2812 0.1562 0.4375 +0.2812 0.1562 0.4688 +0.2812 0.1562 0.5 +0.2812 0.1562 0.5312 +0.2812 0.1562 0.5625 +0.2812 0.1562 0.5938 +0.2812 0.1562 0.625 +0.2812 0.1562 0.6562 +0.2812 0.1562 0.6875 +0.2812 0.1562 0.7188 +0.2812 0.1562 0.75 +0.2812 0.1562 0.7812 +0.2812 0.1562 0.8125 +0.2812 0.1562 0.8438 +0.2812 0.1562 0.875 +0.2812 0.1562 0.9062 +0.2812 0.1562 0.9375 +0.2812 0.1562 0.9688 +0.2812 0.1562 1 +0.2812 0.1875 0 +0.2812 0.1875 0.03125 +0.2812 0.1875 0.0625 +0.2812 0.1875 0.09375 +0.2812 0.1875 0.125 +0.2812 0.1875 0.1562 +0.2812 0.1875 0.1875 +0.2812 0.1875 0.2188 +0.2812 0.1875 0.25 +0.2812 0.1875 0.2812 +0.2812 0.1875 0.3125 +0.2812 0.1875 0.3438 +0.2812 0.1875 0.375 +0.2812 0.1875 0.4062 +0.2812 0.1875 0.4375 +0.2812 0.1875 0.4688 +0.2812 0.1875 0.5 +0.2812 0.1875 0.5312 +0.2812 0.1875 0.5625 +0.2812 0.1875 0.5938 +0.2812 0.1875 0.625 +0.2812 0.1875 0.6562 +0.2812 0.1875 0.6875 +0.2812 0.1875 0.7188 +0.2812 0.1875 0.75 +0.2812 0.1875 0.7812 +0.2812 0.1875 0.8125 +0.2812 0.1875 0.8438 +0.2812 0.1875 0.875 +0.2812 0.1875 0.9062 +0.2812 0.1875 0.9375 +0.2812 0.1875 0.9688 +0.2812 0.1875 1 +0.2812 0.2188 0 +0.2812 0.2188 0.03125 +0.2812 0.2188 0.0625 +0.2812 0.2188 0.09375 +0.2812 0.2188 0.125 +0.2812 0.2188 0.1562 +0.2812 0.2188 0.1875 +0.2812 0.2188 0.2188 +0.2812 0.2188 0.25 +0.2812 0.2188 0.2812 +0.2812 0.2188 0.3125 +0.2812 0.2188 0.3438 +0.2812 0.2188 0.375 +0.2812 0.2188 0.4062 +0.2812 0.2188 0.4375 +0.2812 0.2188 0.4688 +0.2812 0.2188 0.5 +0.2812 0.2188 0.5312 +0.2812 0.2188 0.5625 +0.2812 0.2188 0.5938 +0.2812 0.2188 0.625 +0.2812 0.2188 0.6562 +0.2812 0.2188 0.6875 +0.2812 0.2188 0.7188 +0.2812 0.2188 0.75 +0.2812 0.2188 0.7812 +0.2812 0.2188 0.8125 +0.2812 0.2188 0.8438 +0.2812 0.2188 0.875 +0.2812 0.2188 0.9062 +0.2812 0.2188 0.9375 +0.2812 0.2188 0.9688 +0.2812 0.2188 1 +0.2812 0.25 0 +0.2812 0.25 0.03125 +0.2812 0.25 0.0625 +0.2812 0.25 0.09375 +0.2812 0.25 0.125 +0.2812 0.25 0.1562 +0.2812 0.25 0.1875 +0.2812 0.25 0.2188 +0.2812 0.25 0.25 +0.2812 0.25 0.2812 +0.2812 0.25 0.3125 +0.2812 0.25 0.3438 +0.2812 0.25 0.375 +0.2812 0.25 0.4062 +0.2812 0.25 0.4375 +0.2812 0.25 0.4688 +0.2812 0.25 0.5 +0.2812 0.25 0.5312 +0.2812 0.25 0.5625 +0.2812 0.25 0.5938 +0.2812 0.25 0.625 +0.2812 0.25 0.6562 +0.2812 0.25 0.6875 +0.2812 0.25 0.7188 +0.2812 0.25 0.75 +0.2812 0.25 0.7812 +0.2812 0.25 0.8125 +0.2812 0.25 0.8438 +0.2812 0.25 0.875 +0.2812 0.25 0.9062 +0.2812 0.25 0.9375 +0.2812 0.25 0.9688 +0.2812 0.25 1 +0.2812 0.2812 0 +0.2812 0.2812 0.03125 +0.2812 0.2812 0.0625 +0.2812 0.2812 0.09375 +0.2812 0.2812 0.125 +0.2812 0.2812 0.1562 +0.2812 0.2812 0.1875 +0.2812 0.2812 0.2188 +0.2812 0.2812 0.25 +0.2812 0.2812 0.2812 +0.2812 0.2812 0.3125 +0.2812 0.2812 0.3438 +0.2812 0.2812 0.375 +0.2812 0.2812 0.4062 +0.2812 0.2812 0.4375 +0.2812 0.2812 0.4688 +0.2812 0.2812 0.5 +0.2812 0.2812 0.5312 +0.2812 0.2812 0.5625 +0.2812 0.2812 0.5938 +0.2812 0.2812 0.625 +0.2812 0.2812 0.6562 +0.2812 0.2812 0.6875 +0.2812 0.2812 0.7188 +0.2812 0.2812 0.75 +0.2812 0.2812 0.7812 +0.2812 0.2812 0.8125 +0.2812 0.2812 0.8438 +0.2812 0.2812 0.875 +0.2812 0.2812 0.9062 +0.2812 0.2812 0.9375 +0.2812 0.2812 0.9688 +0.2812 0.2812 1 +0.2812 0.3125 0 +0.2812 0.3125 0.03125 +0.2812 0.3125 0.0625 +0.2812 0.3125 0.09375 +0.2812 0.3125 0.125 +0.2812 0.3125 0.1562 +0.2812 0.3125 0.1875 +0.2812 0.3125 0.2188 +0.2812 0.3125 0.25 +0.2812 0.3125 0.2812 +0.2812 0.3125 0.3125 +0.2812 0.3125 0.3438 +0.2812 0.3125 0.375 +0.2812 0.3125 0.4062 +0.2812 0.3125 0.4375 +0.2812 0.3125 0.4688 +0.2812 0.3125 0.5 +0.2812 0.3125 0.5312 +0.2812 0.3125 0.5625 +0.2812 0.3125 0.5938 +0.2812 0.3125 0.625 +0.2812 0.3125 0.6562 +0.2812 0.3125 0.6875 +0.2812 0.3125 0.7188 +0.2812 0.3125 0.75 +0.2812 0.3125 0.7812 +0.2812 0.3125 0.8125 +0.2812 0.3125 0.8438 +0.2812 0.3125 0.875 +0.2812 0.3125 0.9062 +0.2812 0.3125 0.9375 +0.2812 0.3125 0.9688 +0.2812 0.3125 1 +0.2812 0.3438 0 +0.2812 0.3438 0.03125 +0.2812 0.3438 0.0625 +0.2812 0.3438 0.09375 +0.2812 0.3438 0.125 +0.2812 0.3438 0.1562 +0.2812 0.3438 0.1875 +0.2812 0.3438 0.2188 +0.2812 0.3438 0.25 +0.2812 0.3438 0.2812 +0.2812 0.3438 0.3125 +0.2812 0.3438 0.3438 +0.2812 0.3438 0.375 +0.2812 0.3438 0.4062 +0.2812 0.3438 0.4375 +0.2812 0.3438 0.4688 +0.2812 0.3438 0.5 +0.2812 0.3438 0.5312 +0.2812 0.3438 0.5625 +0.2812 0.3438 0.5938 +0.2812 0.3438 0.625 +0.2812 0.3438 0.6562 +0.2812 0.3438 0.6875 +0.2812 0.3438 0.7188 +0.2812 0.3438 0.75 +0.2812 0.3438 0.7812 +0.2812 0.3438 0.8125 +0.2812 0.3438 0.8438 +0.2812 0.3438 0.875 +0.2812 0.3438 0.9062 +0.2812 0.3438 0.9375 +0.2812 0.3438 0.9688 +0.2812 0.3438 1 +0.2812 0.375 0 +0.2812 0.375 0.03125 +0.2812 0.375 0.0625 +0.2812 0.375 0.09375 +0.2812 0.375 0.125 +0.2812 0.375 0.1562 +0.2812 0.375 0.1875 +0.2812 0.375 0.2188 +0.2812 0.375 0.25 +0.2812 0.375 0.2812 +0.2812 0.375 0.3125 +0.2812 0.375 0.3438 +0.2812 0.375 0.375 +0.2812 0.375 0.4062 +0.2812 0.375 0.4375 +0.2812 0.375 0.4688 +0.2812 0.375 0.5 +0.2812 0.375 0.5312 +0.2812 0.375 0.5625 +0.2812 0.375 0.5938 +0.2812 0.375 0.625 +0.2812 0.375 0.6562 +0.2812 0.375 0.6875 +0.2812 0.375 0.7188 +0.2812 0.375 0.75 +0.2812 0.375 0.7812 +0.2812 0.375 0.8125 +0.2812 0.375 0.8438 +0.2812 0.375 0.875 +0.2812 0.375 0.9062 +0.2812 0.375 0.9375 +0.2812 0.375 0.9688 +0.2812 0.375 1 +0.2812 0.4062 0 +0.2812 0.4062 0.03125 +0.2812 0.4062 0.0625 +0.2812 0.4062 0.09375 +0.2812 0.4062 0.125 +0.2812 0.4062 0.1562 +0.2812 0.4062 0.1875 +0.2812 0.4062 0.2188 +0.2812 0.4062 0.25 +0.2812 0.4062 0.2812 +0.2812 0.4062 0.3125 +0.2812 0.4062 0.3438 +0.2812 0.4062 0.375 +0.2812 0.4062 0.4062 +0.2812 0.4062 0.4375 +0.2812 0.4062 0.4688 +0.2812 0.4062 0.5 +0.2812 0.4062 0.5312 +0.2812 0.4062 0.5625 +0.2812 0.4062 0.5938 +0.2812 0.4062 0.625 +0.2812 0.4062 0.6562 +0.2812 0.4062 0.6875 +0.2812 0.4062 0.7188 +0.2812 0.4062 0.75 +0.2812 0.4062 0.7812 +0.2812 0.4062 0.8125 +0.2812 0.4062 0.8438 +0.2812 0.4062 0.875 +0.2812 0.4062 0.9062 +0.2812 0.4062 0.9375 +0.2812 0.4062 0.9688 +0.2812 0.4062 1 +0.2812 0.4375 0 +0.2812 0.4375 0.03125 +0.2812 0.4375 0.0625 +0.2812 0.4375 0.09375 +0.2812 0.4375 0.125 +0.2812 0.4375 0.1562 +0.2812 0.4375 0.1875 +0.2812 0.4375 0.2188 +0.2812 0.4375 0.25 +0.2812 0.4375 0.2812 +0.2812 0.4375 0.3125 +0.2812 0.4375 0.3438 +0.2812 0.4375 0.375 +0.2812 0.4375 0.4062 +0.2812 0.4375 0.4375 +0.2812 0.4375 0.4688 +0.2812 0.4375 0.5 +0.2812 0.4375 0.5312 +0.2812 0.4375 0.5625 +0.2812 0.4375 0.5938 +0.2812 0.4375 0.625 +0.2812 0.4375 0.6562 +0.2812 0.4375 0.6875 +0.2812 0.4375 0.7188 +0.2812 0.4375 0.75 +0.2812 0.4375 0.7812 +0.2812 0.4375 0.8125 +0.2812 0.4375 0.8438 +0.2812 0.4375 0.875 +0.2812 0.4375 0.9062 +0.2812 0.4375 0.9375 +0.2812 0.4375 0.9688 +0.2812 0.4375 1 +0.2812 0.4688 0 +0.2812 0.4688 0.03125 +0.2812 0.4688 0.0625 +0.2812 0.4688 0.09375 +0.2812 0.4688 0.125 +0.2812 0.4688 0.1562 +0.2812 0.4688 0.1875 +0.2812 0.4688 0.2188 +0.2812 0.4688 0.25 +0.2812 0.4688 0.2812 +0.2812 0.4688 0.3125 +0.2812 0.4688 0.3438 +0.2812 0.4688 0.375 +0.2812 0.4688 0.4062 +0.2812 0.4688 0.4375 +0.2812 0.4688 0.4688 +0.2812 0.4688 0.5 +0.2812 0.4688 0.5312 +0.2812 0.4688 0.5625 +0.2812 0.4688 0.5938 +0.2812 0.4688 0.625 +0.2812 0.4688 0.6562 +0.2812 0.4688 0.6875 +0.2812 0.4688 0.7188 +0.2812 0.4688 0.75 +0.2812 0.4688 0.7812 +0.2812 0.4688 0.8125 +0.2812 0.4688 0.8438 +0.2812 0.4688 0.875 +0.2812 0.4688 0.9062 +0.2812 0.4688 0.9375 +0.2812 0.4688 0.9688 +0.2812 0.4688 1 +0.2812 0.5 0 +0.2812 0.5 0.03125 +0.2812 0.5 0.0625 +0.2812 0.5 0.09375 +0.2812 0.5 0.125 +0.2812 0.5 0.1562 +0.2812 0.5 0.1875 +0.2812 0.5 0.2188 +0.2812 0.5 0.25 +0.2812 0.5 0.2812 +0.2812 0.5 0.3125 +0.2812 0.5 0.3438 +0.2812 0.5 0.375 +0.2812 0.5 0.4062 +0.2812 0.5 0.4375 +0.2812 0.5 0.4688 +0.2812 0.5 0.5 +0.2812 0.5 0.5312 +0.2812 0.5 0.5625 +0.2812 0.5 0.5938 +0.2812 0.5 0.625 +0.2812 0.5 0.6562 +0.2812 0.5 0.6875 +0.2812 0.5 0.7188 +0.2812 0.5 0.75 +0.2812 0.5 0.7812 +0.2812 0.5 0.8125 +0.2812 0.5 0.8438 +0.2812 0.5 0.875 +0.2812 0.5 0.9062 +0.2812 0.5 0.9375 +0.2812 0.5 0.9688 +0.2812 0.5 1 +0.2812 0.5312 0 +0.2812 0.5312 0.03125 +0.2812 0.5312 0.0625 +0.2812 0.5312 0.09375 +0.2812 0.5312 0.125 +0.2812 0.5312 0.1562 +0.2812 0.5312 0.1875 +0.2812 0.5312 0.2188 +0.2812 0.5312 0.25 +0.2812 0.5312 0.2812 +0.2812 0.5312 0.3125 +0.2812 0.5312 0.3438 +0.2812 0.5312 0.375 +0.2812 0.5312 0.4062 +0.2812 0.5312 0.4375 +0.2812 0.5312 0.4688 +0.2812 0.5312 0.5 +0.2812 0.5312 0.5312 +0.2812 0.5312 0.5625 +0.2812 0.5312 0.5938 +0.2812 0.5312 0.625 +0.2812 0.5312 0.6562 +0.2812 0.5312 0.6875 +0.2812 0.5312 0.7188 +0.2812 0.5312 0.75 +0.2812 0.5312 0.7812 +0.2812 0.5312 0.8125 +0.2812 0.5312 0.8438 +0.2812 0.5312 0.875 +0.2812 0.5312 0.9062 +0.2812 0.5312 0.9375 +0.2812 0.5312 0.9688 +0.2812 0.5312 1 +0.2812 0.5625 0 +0.2812 0.5625 0.03125 +0.2812 0.5625 0.0625 +0.2812 0.5625 0.09375 +0.2812 0.5625 0.125 +0.2812 0.5625 0.1562 +0.2812 0.5625 0.1875 +0.2812 0.5625 0.2188 +0.2812 0.5625 0.25 +0.2812 0.5625 0.2812 +0.2812 0.5625 0.3125 +0.2812 0.5625 0.3438 +0.2812 0.5625 0.375 +0.2812 0.5625 0.4062 +0.2812 0.5625 0.4375 +0.2812 0.5625 0.4688 +0.2812 0.5625 0.5 +0.2812 0.5625 0.5312 +0.2812 0.5625 0.5625 +0.2812 0.5625 0.5938 +0.2812 0.5625 0.625 +0.2812 0.5625 0.6562 +0.2812 0.5625 0.6875 +0.2812 0.5625 0.7188 +0.2812 0.5625 0.75 +0.2812 0.5625 0.7812 +0.2812 0.5625 0.8125 +0.2812 0.5625 0.8438 +0.2812 0.5625 0.875 +0.2812 0.5625 0.9062 +0.2812 0.5625 0.9375 +0.2812 0.5625 0.9688 +0.2812 0.5625 1 +0.2812 0.5938 0 +0.2812 0.5938 0.03125 +0.2812 0.5938 0.0625 +0.2812 0.5938 0.09375 +0.2812 0.5938 0.125 +0.2812 0.5938 0.1562 +0.2812 0.5938 0.1875 +0.2812 0.5938 0.2188 +0.2812 0.5938 0.25 +0.2812 0.5938 0.2812 +0.2812 0.5938 0.3125 +0.2812 0.5938 0.3438 +0.2812 0.5938 0.375 +0.2812 0.5938 0.4062 +0.2812 0.5938 0.4375 +0.2812 0.5938 0.4688 +0.2812 0.5938 0.5 +0.2812 0.5938 0.5312 +0.2812 0.5938 0.5625 +0.2812 0.5938 0.5938 +0.2812 0.5938 0.625 +0.2812 0.5938 0.6562 +0.2812 0.5938 0.6875 +0.2812 0.5938 0.7188 +0.2812 0.5938 0.75 +0.2812 0.5938 0.7812 +0.2812 0.5938 0.8125 +0.2812 0.5938 0.8438 +0.2812 0.5938 0.875 +0.2812 0.5938 0.9062 +0.2812 0.5938 0.9375 +0.2812 0.5938 0.9688 +0.2812 0.5938 1 +0.2812 0.625 0 +0.2812 0.625 0.03125 +0.2812 0.625 0.0625 +0.2812 0.625 0.09375 +0.2812 0.625 0.125 +0.2812 0.625 0.1562 +0.2812 0.625 0.1875 +0.2812 0.625 0.2188 +0.2812 0.625 0.25 +0.2812 0.625 0.2812 +0.2812 0.625 0.3125 +0.2812 0.625 0.3438 +0.2812 0.625 0.375 +0.2812 0.625 0.4062 +0.2812 0.625 0.4375 +0.2812 0.625 0.4688 +0.2812 0.625 0.5 +0.2812 0.625 0.5312 +0.2812 0.625 0.5625 +0.2812 0.625 0.5938 +0.2812 0.625 0.625 +0.2812 0.625 0.6562 +0.2812 0.625 0.6875 +0.2812 0.625 0.7188 +0.2812 0.625 0.75 +0.2812 0.625 0.7812 +0.2812 0.625 0.8125 +0.2812 0.625 0.8438 +0.2812 0.625 0.875 +0.2812 0.625 0.9062 +0.2812 0.625 0.9375 +0.2812 0.625 0.9688 +0.2812 0.625 1 +0.2812 0.6562 0 +0.2812 0.6562 0.03125 +0.2812 0.6562 0.0625 +0.2812 0.6562 0.09375 +0.2812 0.6562 0.125 +0.2812 0.6562 0.1562 +0.2812 0.6562 0.1875 +0.2812 0.6562 0.2188 +0.2812 0.6562 0.25 +0.2812 0.6562 0.2812 +0.2812 0.6562 0.3125 +0.2812 0.6562 0.3438 +0.2812 0.6562 0.375 +0.2812 0.6562 0.4062 +0.2812 0.6562 0.4375 +0.2812 0.6562 0.4688 +0.2812 0.6562 0.5 +0.2812 0.6562 0.5312 +0.2812 0.6562 0.5625 +0.2812 0.6562 0.5938 +0.2812 0.6562 0.625 +0.2812 0.6562 0.6562 +0.2812 0.6562 0.6875 +0.2812 0.6562 0.7188 +0.2812 0.6562 0.75 +0.2812 0.6562 0.7812 +0.2812 0.6562 0.8125 +0.2812 0.6562 0.8438 +0.2812 0.6562 0.875 +0.2812 0.6562 0.9062 +0.2812 0.6562 0.9375 +0.2812 0.6562 0.9688 +0.2812 0.6562 1 +0.2812 0.6875 0 +0.2812 0.6875 0.03125 +0.2812 0.6875 0.0625 +0.2812 0.6875 0.09375 +0.2812 0.6875 0.125 +0.2812 0.6875 0.1562 +0.2812 0.6875 0.1875 +0.2812 0.6875 0.2188 +0.2812 0.6875 0.25 +0.2812 0.6875 0.2812 +0.2812 0.6875 0.3125 +0.2812 0.6875 0.3438 +0.2812 0.6875 0.375 +0.2812 0.6875 0.4062 +0.2812 0.6875 0.4375 +0.2812 0.6875 0.4688 +0.2812 0.6875 0.5 +0.2812 0.6875 0.5312 +0.2812 0.6875 0.5625 +0.2812 0.6875 0.5938 +0.2812 0.6875 0.625 +0.2812 0.6875 0.6562 +0.2812 0.6875 0.6875 +0.2812 0.6875 0.7188 +0.2812 0.6875 0.75 +0.2812 0.6875 0.7812 +0.2812 0.6875 0.8125 +0.2812 0.6875 0.8438 +0.2812 0.6875 0.875 +0.2812 0.6875 0.9062 +0.2812 0.6875 0.9375 +0.2812 0.6875 0.9688 +0.2812 0.6875 1 +0.2812 0.7188 0 +0.2812 0.7188 0.03125 +0.2812 0.7188 0.0625 +0.2812 0.7188 0.09375 +0.2812 0.7188 0.125 +0.2812 0.7188 0.1562 +0.2812 0.7188 0.1875 +0.2812 0.7188 0.2188 +0.2812 0.7188 0.25 +0.2812 0.7188 0.2812 +0.2812 0.7188 0.3125 +0.2812 0.7188 0.3438 +0.2812 0.7188 0.375 +0.2812 0.7188 0.4062 +0.2812 0.7188 0.4375 +0.2812 0.7188 0.4688 +0.2812 0.7188 0.5 +0.2812 0.7188 0.5312 +0.2812 0.7188 0.5625 +0.2812 0.7188 0.5938 +0.2812 0.7188 0.625 +0.2812 0.7188 0.6562 +0.2812 0.7188 0.6875 +0.2812 0.7188 0.7188 +0.2812 0.7188 0.75 +0.2812 0.7188 0.7812 +0.2812 0.7188 0.8125 +0.2812 0.7188 0.8438 +0.2812 0.7188 0.875 +0.2812 0.7188 0.9062 +0.2812 0.7188 0.9375 +0.2812 0.7188 0.9688 +0.2812 0.7188 1 +0.2812 0.75 0 +0.2812 0.75 0.03125 +0.2812 0.75 0.0625 +0.2812 0.75 0.09375 +0.2812 0.75 0.125 +0.2812 0.75 0.1562 +0.2812 0.75 0.1875 +0.2812 0.75 0.2188 +0.2812 0.75 0.25 +0.2812 0.75 0.2812 +0.2812 0.75 0.3125 +0.2812 0.75 0.3438 +0.2812 0.75 0.375 +0.2812 0.75 0.4062 +0.2812 0.75 0.4375 +0.2812 0.75 0.4688 +0.2812 0.75 0.5 +0.2812 0.75 0.5312 +0.2812 0.75 0.5625 +0.2812 0.75 0.5938 +0.2812 0.75 0.625 +0.2812 0.75 0.6562 +0.2812 0.75 0.6875 +0.2812 0.75 0.7188 +0.2812 0.75 0.75 +0.2812 0.75 0.7812 +0.2812 0.75 0.8125 +0.2812 0.75 0.8438 +0.2812 0.75 0.875 +0.2812 0.75 0.9062 +0.2812 0.75 0.9375 +0.2812 0.75 0.9688 +0.2812 0.75 1 +0.2812 0.7812 0 +0.2812 0.7812 0.03125 +0.2812 0.7812 0.0625 +0.2812 0.7812 0.09375 +0.2812 0.7812 0.125 +0.2812 0.7812 0.1562 +0.2812 0.7812 0.1875 +0.2812 0.7812 0.2188 +0.2812 0.7812 0.25 +0.2812 0.7812 0.2812 +0.2812 0.7812 0.3125 +0.2812 0.7812 0.3438 +0.2812 0.7812 0.375 +0.2812 0.7812 0.4062 +0.2812 0.7812 0.4375 +0.2812 0.7812 0.4688 +0.2812 0.7812 0.5 +0.2812 0.7812 0.5312 +0.2812 0.7812 0.5625 +0.2812 0.7812 0.5938 +0.2812 0.7812 0.625 +0.2812 0.7812 0.6562 +0.2812 0.7812 0.6875 +0.2812 0.7812 0.7188 +0.2812 0.7812 0.75 +0.2812 0.7812 0.7812 +0.2812 0.7812 0.8125 +0.2812 0.7812 0.8438 +0.2812 0.7812 0.875 +0.2812 0.7812 0.9062 +0.2812 0.7812 0.9375 +0.2812 0.7812 0.9688 +0.2812 0.7812 1 +0.2812 0.8125 0 +0.2812 0.8125 0.03125 +0.2812 0.8125 0.0625 +0.2812 0.8125 0.09375 +0.2812 0.8125 0.125 +0.2812 0.8125 0.1562 +0.2812 0.8125 0.1875 +0.2812 0.8125 0.2188 +0.2812 0.8125 0.25 +0.2812 0.8125 0.2812 +0.2812 0.8125 0.3125 +0.2812 0.8125 0.3438 +0.2812 0.8125 0.375 +0.2812 0.8125 0.4062 +0.2812 0.8125 0.4375 +0.2812 0.8125 0.4688 +0.2812 0.8125 0.5 +0.2812 0.8125 0.5312 +0.2812 0.8125 0.5625 +0.2812 0.8125 0.5938 +0.2812 0.8125 0.625 +0.2812 0.8125 0.6562 +0.2812 0.8125 0.6875 +0.2812 0.8125 0.7188 +0.2812 0.8125 0.75 +0.2812 0.8125 0.7812 +0.2812 0.8125 0.8125 +0.2812 0.8125 0.8438 +0.2812 0.8125 0.875 +0.2812 0.8125 0.9062 +0.2812 0.8125 0.9375 +0.2812 0.8125 0.9688 +0.2812 0.8125 1 +0.2812 0.8438 0 +0.2812 0.8438 0.03125 +0.2812 0.8438 0.0625 +0.2812 0.8438 0.09375 +0.2812 0.8438 0.125 +0.2812 0.8438 0.1562 +0.2812 0.8438 0.1875 +0.2812 0.8438 0.2188 +0.2812 0.8438 0.25 +0.2812 0.8438 0.2812 +0.2812 0.8438 0.3125 +0.2812 0.8438 0.3438 +0.2812 0.8438 0.375 +0.2812 0.8438 0.4062 +0.2812 0.8438 0.4375 +0.2812 0.8438 0.4688 +0.2812 0.8438 0.5 +0.2812 0.8438 0.5312 +0.2812 0.8438 0.5625 +0.2812 0.8438 0.5938 +0.2812 0.8438 0.625 +0.2812 0.8438 0.6562 +0.2812 0.8438 0.6875 +0.2812 0.8438 0.7188 +0.2812 0.8438 0.75 +0.2812 0.8438 0.7812 +0.2812 0.8438 0.8125 +0.2812 0.8438 0.8438 +0.2812 0.8438 0.875 +0.2812 0.8438 0.9062 +0.2812 0.8438 0.9375 +0.2812 0.8438 0.9688 +0.2812 0.8438 1 +0.2812 0.875 0 +0.2812 0.875 0.03125 +0.2812 0.875 0.0625 +0.2812 0.875 0.09375 +0.2812 0.875 0.125 +0.2812 0.875 0.1562 +0.2812 0.875 0.1875 +0.2812 0.875 0.2188 +0.2812 0.875 0.25 +0.2812 0.875 0.2812 +0.2812 0.875 0.3125 +0.2812 0.875 0.3438 +0.2812 0.875 0.375 +0.2812 0.875 0.4062 +0.2812 0.875 0.4375 +0.2812 0.875 0.4688 +0.2812 0.875 0.5 +0.2812 0.875 0.5312 +0.2812 0.875 0.5625 +0.2812 0.875 0.5938 +0.2812 0.875 0.625 +0.2812 0.875 0.6562 +0.2812 0.875 0.6875 +0.2812 0.875 0.7188 +0.2812 0.875 0.75 +0.2812 0.875 0.7812 +0.2812 0.875 0.8125 +0.2812 0.875 0.8438 +0.2812 0.875 0.875 +0.2812 0.875 0.9062 +0.2812 0.875 0.9375 +0.2812 0.875 0.9688 +0.2812 0.875 1 +0.2812 0.9062 0 +0.2812 0.9062 0.03125 +0.2812 0.9062 0.0625 +0.2812 0.9062 0.09375 +0.2812 0.9062 0.125 +0.2812 0.9062 0.1562 +0.2812 0.9062 0.1875 +0.2812 0.9062 0.2188 +0.2812 0.9062 0.25 +0.2812 0.9062 0.2812 +0.2812 0.9062 0.3125 +0.2812 0.9062 0.3438 +0.2812 0.9062 0.375 +0.2812 0.9062 0.4062 +0.2812 0.9062 0.4375 +0.2812 0.9062 0.4688 +0.2812 0.9062 0.5 +0.2812 0.9062 0.5312 +0.2812 0.9062 0.5625 +0.2812 0.9062 0.5938 +0.2812 0.9062 0.625 +0.2812 0.9062 0.6562 +0.2812 0.9062 0.6875 +0.2812 0.9062 0.7188 +0.2812 0.9062 0.75 +0.2812 0.9062 0.7812 +0.2812 0.9062 0.8125 +0.2812 0.9062 0.8438 +0.2812 0.9062 0.875 +0.2812 0.9062 0.9062 +0.2812 0.9062 0.9375 +0.2812 0.9062 0.9688 +0.2812 0.9062 1 +0.2812 0.9375 0 +0.2812 0.9375 0.03125 +0.2812 0.9375 0.0625 +0.2812 0.9375 0.09375 +0.2812 0.9375 0.125 +0.2812 0.9375 0.1562 +0.2812 0.9375 0.1875 +0.2812 0.9375 0.2188 +0.2812 0.9375 0.25 +0.2812 0.9375 0.2812 +0.2812 0.9375 0.3125 +0.2812 0.9375 0.3438 +0.2812 0.9375 0.375 +0.2812 0.9375 0.4062 +0.2812 0.9375 0.4375 +0.2812 0.9375 0.4688 +0.2812 0.9375 0.5 +0.2812 0.9375 0.5312 +0.2812 0.9375 0.5625 +0.2812 0.9375 0.5938 +0.2812 0.9375 0.625 +0.2812 0.9375 0.6562 +0.2812 0.9375 0.6875 +0.2812 0.9375 0.7188 +0.2812 0.9375 0.75 +0.2812 0.9375 0.7812 +0.2812 0.9375 0.8125 +0.2812 0.9375 0.8438 +0.2812 0.9375 0.875 +0.2812 0.9375 0.9062 +0.2812 0.9375 0.9375 +0.2812 0.9375 0.9688 +0.2812 0.9375 1 +0.2812 0.9688 0 +0.2812 0.9688 0.03125 +0.2812 0.9688 0.0625 +0.2812 0.9688 0.09375 +0.2812 0.9688 0.125 +0.2812 0.9688 0.1562 +0.2812 0.9688 0.1875 +0.2812 0.9688 0.2188 +0.2812 0.9688 0.25 +0.2812 0.9688 0.2812 +0.2812 0.9688 0.3125 +0.2812 0.9688 0.3438 +0.2812 0.9688 0.375 +0.2812 0.9688 0.4062 +0.2812 0.9688 0.4375 +0.2812 0.9688 0.4688 +0.2812 0.9688 0.5 +0.2812 0.9688 0.5312 +0.2812 0.9688 0.5625 +0.2812 0.9688 0.5938 +0.2812 0.9688 0.625 +0.2812 0.9688 0.6562 +0.2812 0.9688 0.6875 +0.2812 0.9688 0.7188 +0.2812 0.9688 0.75 +0.2812 0.9688 0.7812 +0.2812 0.9688 0.8125 +0.2812 0.9688 0.8438 +0.2812 0.9688 0.875 +0.2812 0.9688 0.9062 +0.2812 0.9688 0.9375 +0.2812 0.9688 0.9688 +0.2812 0.9688 1 +0.2812 1 0 +0.2812 1 0.03125 +0.2812 1 0.0625 +0.2812 1 0.09375 +0.2812 1 0.125 +0.2812 1 0.1562 +0.2812 1 0.1875 +0.2812 1 0.2188 +0.2812 1 0.25 +0.2812 1 0.2812 +0.2812 1 0.3125 +0.2812 1 0.3438 +0.2812 1 0.375 +0.2812 1 0.4062 +0.2812 1 0.4375 +0.2812 1 0.4688 +0.2812 1 0.5 +0.2812 1 0.5312 +0.2812 1 0.5625 +0.2812 1 0.5938 +0.2812 1 0.625 +0.2812 1 0.6562 +0.2812 1 0.6875 +0.2812 1 0.7188 +0.2812 1 0.75 +0.2812 1 0.7812 +0.2812 1 0.8125 +0.2812 1 0.8438 +0.2812 1 0.875 +0.2812 1 0.9062 +0.2812 1 0.9375 +0.2812 1 0.9688 +0.2812 1 1 +0.3125 0 0 +0.3125 0 0.03125 +0.3125 0 0.0625 +0.3125 0 0.09375 +0.3125 0 0.125 +0.3125 0 0.1562 +0.3125 0 0.1875 +0.3125 0 0.2188 +0.3125 0 0.25 +0.3125 0 0.2812 +0.3125 0 0.3125 +0.3125 0 0.3438 +0.3125 0 0.375 +0.3125 0 0.4062 +0.3125 0 0.4375 +0.3125 0 0.4688 +0.3125 0 0.5 +0.3125 0 0.5312 +0.3125 0 0.5625 +0.3125 0 0.5938 +0.3125 0 0.625 +0.3125 0 0.6562 +0.3125 0 0.6875 +0.3125 0 0.7188 +0.3125 0 0.75 +0.3125 0 0.7812 +0.3125 0 0.8125 +0.3125 0 0.8438 +0.3125 0 0.875 +0.3125 0 0.9062 +0.3125 0 0.9375 +0.3125 0 0.9688 +0.3125 0 1 +0.3125 0.03125 0 +0.3125 0.03125 0.03125 +0.3125 0.03125 0.0625 +0.3125 0.03125 0.09375 +0.3125 0.03125 0.125 +0.3125 0.03125 0.1562 +0.3125 0.03125 0.1875 +0.3125 0.03125 0.2188 +0.3125 0.03125 0.25 +0.3125 0.03125 0.2812 +0.3125 0.03125 0.3125 +0.3125 0.03125 0.3438 +0.3125 0.03125 0.375 +0.3125 0.03125 0.4062 +0.3125 0.03125 0.4375 +0.3125 0.03125 0.4688 +0.3125 0.03125 0.5 +0.3125 0.03125 0.5312 +0.3125 0.03125 0.5625 +0.3125 0.03125 0.5938 +0.3125 0.03125 0.625 +0.3125 0.03125 0.6562 +0.3125 0.03125 0.6875 +0.3125 0.03125 0.7188 +0.3125 0.03125 0.75 +0.3125 0.03125 0.7812 +0.3125 0.03125 0.8125 +0.3125 0.03125 0.8438 +0.3125 0.03125 0.875 +0.3125 0.03125 0.9062 +0.3125 0.03125 0.9375 +0.3125 0.03125 0.9688 +0.3125 0.03125 1 +0.3125 0.0625 0 +0.3125 0.0625 0.03125 +0.3125 0.0625 0.0625 +0.3125 0.0625 0.09375 +0.3125 0.0625 0.125 +0.3125 0.0625 0.1562 +0.3125 0.0625 0.1875 +0.3125 0.0625 0.2188 +0.3125 0.0625 0.25 +0.3125 0.0625 0.2812 +0.3125 0.0625 0.3125 +0.3125 0.0625 0.3438 +0.3125 0.0625 0.375 +0.3125 0.0625 0.4062 +0.3125 0.0625 0.4375 +0.3125 0.0625 0.4688 +0.3125 0.0625 0.5 +0.3125 0.0625 0.5312 +0.3125 0.0625 0.5625 +0.3125 0.0625 0.5938 +0.3125 0.0625 0.625 +0.3125 0.0625 0.6562 +0.3125 0.0625 0.6875 +0.3125 0.0625 0.7188 +0.3125 0.0625 0.75 +0.3125 0.0625 0.7812 +0.3125 0.0625 0.8125 +0.3125 0.0625 0.8438 +0.3125 0.0625 0.875 +0.3125 0.0625 0.9062 +0.3125 0.0625 0.9375 +0.3125 0.0625 0.9688 +0.3125 0.0625 1 +0.3125 0.09375 0 +0.3125 0.09375 0.03125 +0.3125 0.09375 0.0625 +0.3125 0.09375 0.09375 +0.3125 0.09375 0.125 +0.3125 0.09375 0.1562 +0.3125 0.09375 0.1875 +0.3125 0.09375 0.2188 +0.3125 0.09375 0.25 +0.3125 0.09375 0.2812 +0.3125 0.09375 0.3125 +0.3125 0.09375 0.3438 +0.3125 0.09375 0.375 +0.3125 0.09375 0.4062 +0.3125 0.09375 0.4375 +0.3125 0.09375 0.4688 +0.3125 0.09375 0.5 +0.3125 0.09375 0.5312 +0.3125 0.09375 0.5625 +0.3125 0.09375 0.5938 +0.3125 0.09375 0.625 +0.3125 0.09375 0.6562 +0.3125 0.09375 0.6875 +0.3125 0.09375 0.7188 +0.3125 0.09375 0.75 +0.3125 0.09375 0.7812 +0.3125 0.09375 0.8125 +0.3125 0.09375 0.8438 +0.3125 0.09375 0.875 +0.3125 0.09375 0.9062 +0.3125 0.09375 0.9375 +0.3125 0.09375 0.9688 +0.3125 0.09375 1 +0.3125 0.125 0 +0.3125 0.125 0.03125 +0.3125 0.125 0.0625 +0.3125 0.125 0.09375 +0.3125 0.125 0.125 +0.3125 0.125 0.1562 +0.3125 0.125 0.1875 +0.3125 0.125 0.2188 +0.3125 0.125 0.25 +0.3125 0.125 0.2812 +0.3125 0.125 0.3125 +0.3125 0.125 0.3438 +0.3125 0.125 0.375 +0.3125 0.125 0.4062 +0.3125 0.125 0.4375 +0.3125 0.125 0.4688 +0.3125 0.125 0.5 +0.3125 0.125 0.5312 +0.3125 0.125 0.5625 +0.3125 0.125 0.5938 +0.3125 0.125 0.625 +0.3125 0.125 0.6562 +0.3125 0.125 0.6875 +0.3125 0.125 0.7188 +0.3125 0.125 0.75 +0.3125 0.125 0.7812 +0.3125 0.125 0.8125 +0.3125 0.125 0.8438 +0.3125 0.125 0.875 +0.3125 0.125 0.9062 +0.3125 0.125 0.9375 +0.3125 0.125 0.9688 +0.3125 0.125 1 +0.3125 0.1562 0 +0.3125 0.1562 0.03125 +0.3125 0.1562 0.0625 +0.3125 0.1562 0.09375 +0.3125 0.1562 0.125 +0.3125 0.1562 0.1562 +0.3125 0.1562 0.1875 +0.3125 0.1562 0.2188 +0.3125 0.1562 0.25 +0.3125 0.1562 0.2812 +0.3125 0.1562 0.3125 +0.3125 0.1562 0.3438 +0.3125 0.1562 0.375 +0.3125 0.1562 0.4062 +0.3125 0.1562 0.4375 +0.3125 0.1562 0.4688 +0.3125 0.1562 0.5 +0.3125 0.1562 0.5312 +0.3125 0.1562 0.5625 +0.3125 0.1562 0.5938 +0.3125 0.1562 0.625 +0.3125 0.1562 0.6562 +0.3125 0.1562 0.6875 +0.3125 0.1562 0.7188 +0.3125 0.1562 0.75 +0.3125 0.1562 0.7812 +0.3125 0.1562 0.8125 +0.3125 0.1562 0.8438 +0.3125 0.1562 0.875 +0.3125 0.1562 0.9062 +0.3125 0.1562 0.9375 +0.3125 0.1562 0.9688 +0.3125 0.1562 1 +0.3125 0.1875 0 +0.3125 0.1875 0.03125 +0.3125 0.1875 0.0625 +0.3125 0.1875 0.09375 +0.3125 0.1875 0.125 +0.3125 0.1875 0.1562 +0.3125 0.1875 0.1875 +0.3125 0.1875 0.2188 +0.3125 0.1875 0.25 +0.3125 0.1875 0.2812 +0.3125 0.1875 0.3125 +0.3125 0.1875 0.3438 +0.3125 0.1875 0.375 +0.3125 0.1875 0.4062 +0.3125 0.1875 0.4375 +0.3125 0.1875 0.4688 +0.3125 0.1875 0.5 +0.3125 0.1875 0.5312 +0.3125 0.1875 0.5625 +0.3125 0.1875 0.5938 +0.3125 0.1875 0.625 +0.3125 0.1875 0.6562 +0.3125 0.1875 0.6875 +0.3125 0.1875 0.7188 +0.3125 0.1875 0.75 +0.3125 0.1875 0.7812 +0.3125 0.1875 0.8125 +0.3125 0.1875 0.8438 +0.3125 0.1875 0.875 +0.3125 0.1875 0.9062 +0.3125 0.1875 0.9375 +0.3125 0.1875 0.9688 +0.3125 0.1875 1 +0.3125 0.2188 0 +0.3125 0.2188 0.03125 +0.3125 0.2188 0.0625 +0.3125 0.2188 0.09375 +0.3125 0.2188 0.125 +0.3125 0.2188 0.1562 +0.3125 0.2188 0.1875 +0.3125 0.2188 0.2188 +0.3125 0.2188 0.25 +0.3125 0.2188 0.2812 +0.3125 0.2188 0.3125 +0.3125 0.2188 0.3438 +0.3125 0.2188 0.375 +0.3125 0.2188 0.4062 +0.3125 0.2188 0.4375 +0.3125 0.2188 0.4688 +0.3125 0.2188 0.5 +0.3125 0.2188 0.5312 +0.3125 0.2188 0.5625 +0.3125 0.2188 0.5938 +0.3125 0.2188 0.625 +0.3125 0.2188 0.6562 +0.3125 0.2188 0.6875 +0.3125 0.2188 0.7188 +0.3125 0.2188 0.75 +0.3125 0.2188 0.7812 +0.3125 0.2188 0.8125 +0.3125 0.2188 0.8438 +0.3125 0.2188 0.875 +0.3125 0.2188 0.9062 +0.3125 0.2188 0.9375 +0.3125 0.2188 0.9688 +0.3125 0.2188 1 +0.3125 0.25 0 +0.3125 0.25 0.03125 +0.3125 0.25 0.0625 +0.3125 0.25 0.09375 +0.3125 0.25 0.125 +0.3125 0.25 0.1562 +0.3125 0.25 0.1875 +0.3125 0.25 0.2188 +0.3125 0.25 0.25 +0.3125 0.25 0.2812 +0.3125 0.25 0.3125 +0.3125 0.25 0.3438 +0.3125 0.25 0.375 +0.3125 0.25 0.4062 +0.3125 0.25 0.4375 +0.3125 0.25 0.4688 +0.3125 0.25 0.5 +0.3125 0.25 0.5312 +0.3125 0.25 0.5625 +0.3125 0.25 0.5938 +0.3125 0.25 0.625 +0.3125 0.25 0.6562 +0.3125 0.25 0.6875 +0.3125 0.25 0.7188 +0.3125 0.25 0.75 +0.3125 0.25 0.7812 +0.3125 0.25 0.8125 +0.3125 0.25 0.8438 +0.3125 0.25 0.875 +0.3125 0.25 0.9062 +0.3125 0.25 0.9375 +0.3125 0.25 0.9688 +0.3125 0.25 1 +0.3125 0.2812 0 +0.3125 0.2812 0.03125 +0.3125 0.2812 0.0625 +0.3125 0.2812 0.09375 +0.3125 0.2812 0.125 +0.3125 0.2812 0.1562 +0.3125 0.2812 0.1875 +0.3125 0.2812 0.2188 +0.3125 0.2812 0.25 +0.3125 0.2812 0.2812 +0.3125 0.2812 0.3125 +0.3125 0.2812 0.3438 +0.3125 0.2812 0.375 +0.3125 0.2812 0.4062 +0.3125 0.2812 0.4375 +0.3125 0.2812 0.4688 +0.3125 0.2812 0.5 +0.3125 0.2812 0.5312 +0.3125 0.2812 0.5625 +0.3125 0.2812 0.5938 +0.3125 0.2812 0.625 +0.3125 0.2812 0.6562 +0.3125 0.2812 0.6875 +0.3125 0.2812 0.7188 +0.3125 0.2812 0.75 +0.3125 0.2812 0.7812 +0.3125 0.2812 0.8125 +0.3125 0.2812 0.8438 +0.3125 0.2812 0.875 +0.3125 0.2812 0.9062 +0.3125 0.2812 0.9375 +0.3125 0.2812 0.9688 +0.3125 0.2812 1 +0.3125 0.3125 0 +0.3125 0.3125 0.03125 +0.3125 0.3125 0.0625 +0.3125 0.3125 0.09375 +0.3125 0.3125 0.125 +0.3125 0.3125 0.1562 +0.3125 0.3125 0.1875 +0.3125 0.3125 0.2188 +0.3125 0.3125 0.25 +0.3125 0.3125 0.2812 +0.3125 0.3125 0.3125 +0.3125 0.3125 0.3438 +0.3125 0.3125 0.375 +0.3125 0.3125 0.4062 +0.3125 0.3125 0.4375 +0.3125 0.3125 0.4688 +0.3125 0.3125 0.5 +0.3125 0.3125 0.5312 +0.3125 0.3125 0.5625 +0.3125 0.3125 0.5938 +0.3125 0.3125 0.625 +0.3125 0.3125 0.6562 +0.3125 0.3125 0.6875 +0.3125 0.3125 0.7188 +0.3125 0.3125 0.75 +0.3125 0.3125 0.7812 +0.3125 0.3125 0.8125 +0.3125 0.3125 0.8438 +0.3125 0.3125 0.875 +0.3125 0.3125 0.9062 +0.3125 0.3125 0.9375 +0.3125 0.3125 0.9688 +0.3125 0.3125 1 +0.3125 0.3438 0 +0.3125 0.3438 0.03125 +0.3125 0.3438 0.0625 +0.3125 0.3438 0.09375 +0.3125 0.3438 0.125 +0.3125 0.3438 0.1562 +0.3125 0.3438 0.1875 +0.3125 0.3438 0.2188 +0.3125 0.3438 0.25 +0.3125 0.3438 0.2812 +0.3125 0.3438 0.3125 +0.3125 0.3438 0.3438 +0.3125 0.3438 0.375 +0.3125 0.3438 0.4062 +0.3125 0.3438 0.4375 +0.3125 0.3438 0.4688 +0.3125 0.3438 0.5 +0.3125 0.3438 0.5312 +0.3125 0.3438 0.5625 +0.3125 0.3438 0.5938 +0.3125 0.3438 0.625 +0.3125 0.3438 0.6562 +0.3125 0.3438 0.6875 +0.3125 0.3438 0.7188 +0.3125 0.3438 0.75 +0.3125 0.3438 0.7812 +0.3125 0.3438 0.8125 +0.3125 0.3438 0.8438 +0.3125 0.3438 0.875 +0.3125 0.3438 0.9062 +0.3125 0.3438 0.9375 +0.3125 0.3438 0.9688 +0.3125 0.3438 1 +0.3125 0.375 0 +0.3125 0.375 0.03125 +0.3125 0.375 0.0625 +0.3125 0.375 0.09375 +0.3125 0.375 0.125 +0.3125 0.375 0.1562 +0.3125 0.375 0.1875 +0.3125 0.375 0.2188 +0.3125 0.375 0.25 +0.3125 0.375 0.2812 +0.3125 0.375 0.3125 +0.3125 0.375 0.3438 +0.3125 0.375 0.375 +0.3125 0.375 0.4062 +0.3125 0.375 0.4375 +0.3125 0.375 0.4688 +0.3125 0.375 0.5 +0.3125 0.375 0.5312 +0.3125 0.375 0.5625 +0.3125 0.375 0.5938 +0.3125 0.375 0.625 +0.3125 0.375 0.6562 +0.3125 0.375 0.6875 +0.3125 0.375 0.7188 +0.3125 0.375 0.75 +0.3125 0.375 0.7812 +0.3125 0.375 0.8125 +0.3125 0.375 0.8438 +0.3125 0.375 0.875 +0.3125 0.375 0.9062 +0.3125 0.375 0.9375 +0.3125 0.375 0.9688 +0.3125 0.375 1 +0.3125 0.4062 0 +0.3125 0.4062 0.03125 +0.3125 0.4062 0.0625 +0.3125 0.4062 0.09375 +0.3125 0.4062 0.125 +0.3125 0.4062 0.1562 +0.3125 0.4062 0.1875 +0.3125 0.4062 0.2188 +0.3125 0.4062 0.25 +0.3125 0.4062 0.2812 +0.3125 0.4062 0.3125 +0.3125 0.4062 0.3438 +0.3125 0.4062 0.375 +0.3125 0.4062 0.4062 +0.3125 0.4062 0.4375 +0.3125 0.4062 0.4688 +0.3125 0.4062 0.5 +0.3125 0.4062 0.5312 +0.3125 0.4062 0.5625 +0.3125 0.4062 0.5938 +0.3125 0.4062 0.625 +0.3125 0.4062 0.6562 +0.3125 0.4062 0.6875 +0.3125 0.4062 0.7188 +0.3125 0.4062 0.75 +0.3125 0.4062 0.7812 +0.3125 0.4062 0.8125 +0.3125 0.4062 0.8438 +0.3125 0.4062 0.875 +0.3125 0.4062 0.9062 +0.3125 0.4062 0.9375 +0.3125 0.4062 0.9688 +0.3125 0.4062 1 +0.3125 0.4375 0 +0.3125 0.4375 0.03125 +0.3125 0.4375 0.0625 +0.3125 0.4375 0.09375 +0.3125 0.4375 0.125 +0.3125 0.4375 0.1562 +0.3125 0.4375 0.1875 +0.3125 0.4375 0.2188 +0.3125 0.4375 0.25 +0.3125 0.4375 0.2812 +0.3125 0.4375 0.3125 +0.3125 0.4375 0.3438 +0.3125 0.4375 0.375 +0.3125 0.4375 0.4062 +0.3125 0.4375 0.4375 +0.3125 0.4375 0.4688 +0.3125 0.4375 0.5 +0.3125 0.4375 0.5312 +0.3125 0.4375 0.5625 +0.3125 0.4375 0.5938 +0.3125 0.4375 0.625 +0.3125 0.4375 0.6562 +0.3125 0.4375 0.6875 +0.3125 0.4375 0.7188 +0.3125 0.4375 0.75 +0.3125 0.4375 0.7812 +0.3125 0.4375 0.8125 +0.3125 0.4375 0.8438 +0.3125 0.4375 0.875 +0.3125 0.4375 0.9062 +0.3125 0.4375 0.9375 +0.3125 0.4375 0.9688 +0.3125 0.4375 1 +0.3125 0.4688 0 +0.3125 0.4688 0.03125 +0.3125 0.4688 0.0625 +0.3125 0.4688 0.09375 +0.3125 0.4688 0.125 +0.3125 0.4688 0.1562 +0.3125 0.4688 0.1875 +0.3125 0.4688 0.2188 +0.3125 0.4688 0.25 +0.3125 0.4688 0.2812 +0.3125 0.4688 0.3125 +0.3125 0.4688 0.3438 +0.3125 0.4688 0.375 +0.3125 0.4688 0.4062 +0.3125 0.4688 0.4375 +0.3125 0.4688 0.4688 +0.3125 0.4688 0.5 +0.3125 0.4688 0.5312 +0.3125 0.4688 0.5625 +0.3125 0.4688 0.5938 +0.3125 0.4688 0.625 +0.3125 0.4688 0.6562 +0.3125 0.4688 0.6875 +0.3125 0.4688 0.7188 +0.3125 0.4688 0.75 +0.3125 0.4688 0.7812 +0.3125 0.4688 0.8125 +0.3125 0.4688 0.8438 +0.3125 0.4688 0.875 +0.3125 0.4688 0.9062 +0.3125 0.4688 0.9375 +0.3125 0.4688 0.9688 +0.3125 0.4688 1 +0.3125 0.5 0 +0.3125 0.5 0.03125 +0.3125 0.5 0.0625 +0.3125 0.5 0.09375 +0.3125 0.5 0.125 +0.3125 0.5 0.1562 +0.3125 0.5 0.1875 +0.3125 0.5 0.2188 +0.3125 0.5 0.25 +0.3125 0.5 0.2812 +0.3125 0.5 0.3125 +0.3125 0.5 0.3438 +0.3125 0.5 0.375 +0.3125 0.5 0.4062 +0.3125 0.5 0.4375 +0.3125 0.5 0.4688 +0.3125 0.5 0.5 +0.3125 0.5 0.5312 +0.3125 0.5 0.5625 +0.3125 0.5 0.5938 +0.3125 0.5 0.625 +0.3125 0.5 0.6562 +0.3125 0.5 0.6875 +0.3125 0.5 0.7188 +0.3125 0.5 0.75 +0.3125 0.5 0.7812 +0.3125 0.5 0.8125 +0.3125 0.5 0.8438 +0.3125 0.5 0.875 +0.3125 0.5 0.9062 +0.3125 0.5 0.9375 +0.3125 0.5 0.9688 +0.3125 0.5 1 +0.3125 0.5312 0 +0.3125 0.5312 0.03125 +0.3125 0.5312 0.0625 +0.3125 0.5312 0.09375 +0.3125 0.5312 0.125 +0.3125 0.5312 0.1562 +0.3125 0.5312 0.1875 +0.3125 0.5312 0.2188 +0.3125 0.5312 0.25 +0.3125 0.5312 0.2812 +0.3125 0.5312 0.3125 +0.3125 0.5312 0.3438 +0.3125 0.5312 0.375 +0.3125 0.5312 0.4062 +0.3125 0.5312 0.4375 +0.3125 0.5312 0.4688 +0.3125 0.5312 0.5 +0.3125 0.5312 0.5312 +0.3125 0.5312 0.5625 +0.3125 0.5312 0.5938 +0.3125 0.5312 0.625 +0.3125 0.5312 0.6562 +0.3125 0.5312 0.6875 +0.3125 0.5312 0.7188 +0.3125 0.5312 0.75 +0.3125 0.5312 0.7812 +0.3125 0.5312 0.8125 +0.3125 0.5312 0.8438 +0.3125 0.5312 0.875 +0.3125 0.5312 0.9062 +0.3125 0.5312 0.9375 +0.3125 0.5312 0.9688 +0.3125 0.5312 1 +0.3125 0.5625 0 +0.3125 0.5625 0.03125 +0.3125 0.5625 0.0625 +0.3125 0.5625 0.09375 +0.3125 0.5625 0.125 +0.3125 0.5625 0.1562 +0.3125 0.5625 0.1875 +0.3125 0.5625 0.2188 +0.3125 0.5625 0.25 +0.3125 0.5625 0.2812 +0.3125 0.5625 0.3125 +0.3125 0.5625 0.3438 +0.3125 0.5625 0.375 +0.3125 0.5625 0.4062 +0.3125 0.5625 0.4375 +0.3125 0.5625 0.4688 +0.3125 0.5625 0.5 +0.3125 0.5625 0.5312 +0.3125 0.5625 0.5625 +0.3125 0.5625 0.5938 +0.3125 0.5625 0.625 +0.3125 0.5625 0.6562 +0.3125 0.5625 0.6875 +0.3125 0.5625 0.7188 +0.3125 0.5625 0.75 +0.3125 0.5625 0.7812 +0.3125 0.5625 0.8125 +0.3125 0.5625 0.8438 +0.3125 0.5625 0.875 +0.3125 0.5625 0.9062 +0.3125 0.5625 0.9375 +0.3125 0.5625 0.9688 +0.3125 0.5625 1 +0.3125 0.5938 0 +0.3125 0.5938 0.03125 +0.3125 0.5938 0.0625 +0.3125 0.5938 0.09375 +0.3125 0.5938 0.125 +0.3125 0.5938 0.1562 +0.3125 0.5938 0.1875 +0.3125 0.5938 0.2188 +0.3125 0.5938 0.25 +0.3125 0.5938 0.2812 +0.3125 0.5938 0.3125 +0.3125 0.5938 0.3438 +0.3125 0.5938 0.375 +0.3125 0.5938 0.4062 +0.3125 0.5938 0.4375 +0.3125 0.5938 0.4688 +0.3125 0.5938 0.5 +0.3125 0.5938 0.5312 +0.3125 0.5938 0.5625 +0.3125 0.5938 0.5938 +0.3125 0.5938 0.625 +0.3125 0.5938 0.6562 +0.3125 0.5938 0.6875 +0.3125 0.5938 0.7188 +0.3125 0.5938 0.75 +0.3125 0.5938 0.7812 +0.3125 0.5938 0.8125 +0.3125 0.5938 0.8438 +0.3125 0.5938 0.875 +0.3125 0.5938 0.9062 +0.3125 0.5938 0.9375 +0.3125 0.5938 0.9688 +0.3125 0.5938 1 +0.3125 0.625 0 +0.3125 0.625 0.03125 +0.3125 0.625 0.0625 +0.3125 0.625 0.09375 +0.3125 0.625 0.125 +0.3125 0.625 0.1562 +0.3125 0.625 0.1875 +0.3125 0.625 0.2188 +0.3125 0.625 0.25 +0.3125 0.625 0.2812 +0.3125 0.625 0.3125 +0.3125 0.625 0.3438 +0.3125 0.625 0.375 +0.3125 0.625 0.4062 +0.3125 0.625 0.4375 +0.3125 0.625 0.4688 +0.3125 0.625 0.5 +0.3125 0.625 0.5312 +0.3125 0.625 0.5625 +0.3125 0.625 0.5938 +0.3125 0.625 0.625 +0.3125 0.625 0.6562 +0.3125 0.625 0.6875 +0.3125 0.625 0.7188 +0.3125 0.625 0.75 +0.3125 0.625 0.7812 +0.3125 0.625 0.8125 +0.3125 0.625 0.8438 +0.3125 0.625 0.875 +0.3125 0.625 0.9062 +0.3125 0.625 0.9375 +0.3125 0.625 0.9688 +0.3125 0.625 1 +0.3125 0.6562 0 +0.3125 0.6562 0.03125 +0.3125 0.6562 0.0625 +0.3125 0.6562 0.09375 +0.3125 0.6562 0.125 +0.3125 0.6562 0.1562 +0.3125 0.6562 0.1875 +0.3125 0.6562 0.2188 +0.3125 0.6562 0.25 +0.3125 0.6562 0.2812 +0.3125 0.6562 0.3125 +0.3125 0.6562 0.3438 +0.3125 0.6562 0.375 +0.3125 0.6562 0.4062 +0.3125 0.6562 0.4375 +0.3125 0.6562 0.4688 +0.3125 0.6562 0.5 +0.3125 0.6562 0.5312 +0.3125 0.6562 0.5625 +0.3125 0.6562 0.5938 +0.3125 0.6562 0.625 +0.3125 0.6562 0.6562 +0.3125 0.6562 0.6875 +0.3125 0.6562 0.7188 +0.3125 0.6562 0.75 +0.3125 0.6562 0.7812 +0.3125 0.6562 0.8125 +0.3125 0.6562 0.8438 +0.3125 0.6562 0.875 +0.3125 0.6562 0.9062 +0.3125 0.6562 0.9375 +0.3125 0.6562 0.9688 +0.3125 0.6562 1 +0.3125 0.6875 0 +0.3125 0.6875 0.03125 +0.3125 0.6875 0.0625 +0.3125 0.6875 0.09375 +0.3125 0.6875 0.125 +0.3125 0.6875 0.1562 +0.3125 0.6875 0.1875 +0.3125 0.6875 0.2188 +0.3125 0.6875 0.25 +0.3125 0.6875 0.2812 +0.3125 0.6875 0.3125 +0.3125 0.6875 0.3438 +0.3125 0.6875 0.375 +0.3125 0.6875 0.4062 +0.3125 0.6875 0.4375 +0.3125 0.6875 0.4688 +0.3125 0.6875 0.5 +0.3125 0.6875 0.5312 +0.3125 0.6875 0.5625 +0.3125 0.6875 0.5938 +0.3125 0.6875 0.625 +0.3125 0.6875 0.6562 +0.3125 0.6875 0.6875 +0.3125 0.6875 0.7188 +0.3125 0.6875 0.75 +0.3125 0.6875 0.7812 +0.3125 0.6875 0.8125 +0.3125 0.6875 0.8438 +0.3125 0.6875 0.875 +0.3125 0.6875 0.9062 +0.3125 0.6875 0.9375 +0.3125 0.6875 0.9688 +0.3125 0.6875 1 +0.3125 0.7188 0 +0.3125 0.7188 0.03125 +0.3125 0.7188 0.0625 +0.3125 0.7188 0.09375 +0.3125 0.7188 0.125 +0.3125 0.7188 0.1562 +0.3125 0.7188 0.1875 +0.3125 0.7188 0.2188 +0.3125 0.7188 0.25 +0.3125 0.7188 0.2812 +0.3125 0.7188 0.3125 +0.3125 0.7188 0.3438 +0.3125 0.7188 0.375 +0.3125 0.7188 0.4062 +0.3125 0.7188 0.4375 +0.3125 0.7188 0.4688 +0.3125 0.7188 0.5 +0.3125 0.7188 0.5312 +0.3125 0.7188 0.5625 +0.3125 0.7188 0.5938 +0.3125 0.7188 0.625 +0.3125 0.7188 0.6562 +0.3125 0.7188 0.6875 +0.3125 0.7188 0.7188 +0.3125 0.7188 0.75 +0.3125 0.7188 0.7812 +0.3125 0.7188 0.8125 +0.3125 0.7188 0.8438 +0.3125 0.7188 0.875 +0.3125 0.7188 0.9062 +0.3125 0.7188 0.9375 +0.3125 0.7188 0.9688 +0.3125 0.7188 1 +0.3125 0.75 0 +0.3125 0.75 0.03125 +0.3125 0.75 0.0625 +0.3125 0.75 0.09375 +0.3125 0.75 0.125 +0.3125 0.75 0.1562 +0.3125 0.75 0.1875 +0.3125 0.75 0.2188 +0.3125 0.75 0.25 +0.3125 0.75 0.2812 +0.3125 0.75 0.3125 +0.3125 0.75 0.3438 +0.3125 0.75 0.375 +0.3125 0.75 0.4062 +0.3125 0.75 0.4375 +0.3125 0.75 0.4688 +0.3125 0.75 0.5 +0.3125 0.75 0.5312 +0.3125 0.75 0.5625 +0.3125 0.75 0.5938 +0.3125 0.75 0.625 +0.3125 0.75 0.6562 +0.3125 0.75 0.6875 +0.3125 0.75 0.7188 +0.3125 0.75 0.75 +0.3125 0.75 0.7812 +0.3125 0.75 0.8125 +0.3125 0.75 0.8438 +0.3125 0.75 0.875 +0.3125 0.75 0.9062 +0.3125 0.75 0.9375 +0.3125 0.75 0.9688 +0.3125 0.75 1 +0.3125 0.7812 0 +0.3125 0.7812 0.03125 +0.3125 0.7812 0.0625 +0.3125 0.7812 0.09375 +0.3125 0.7812 0.125 +0.3125 0.7812 0.1562 +0.3125 0.7812 0.1875 +0.3125 0.7812 0.2188 +0.3125 0.7812 0.25 +0.3125 0.7812 0.2812 +0.3125 0.7812 0.3125 +0.3125 0.7812 0.3438 +0.3125 0.7812 0.375 +0.3125 0.7812 0.4062 +0.3125 0.7812 0.4375 +0.3125 0.7812 0.4688 +0.3125 0.7812 0.5 +0.3125 0.7812 0.5312 +0.3125 0.7812 0.5625 +0.3125 0.7812 0.5938 +0.3125 0.7812 0.625 +0.3125 0.7812 0.6562 +0.3125 0.7812 0.6875 +0.3125 0.7812 0.7188 +0.3125 0.7812 0.75 +0.3125 0.7812 0.7812 +0.3125 0.7812 0.8125 +0.3125 0.7812 0.8438 +0.3125 0.7812 0.875 +0.3125 0.7812 0.9062 +0.3125 0.7812 0.9375 +0.3125 0.7812 0.9688 +0.3125 0.7812 1 +0.3125 0.8125 0 +0.3125 0.8125 0.03125 +0.3125 0.8125 0.0625 +0.3125 0.8125 0.09375 +0.3125 0.8125 0.125 +0.3125 0.8125 0.1562 +0.3125 0.8125 0.1875 +0.3125 0.8125 0.2188 +0.3125 0.8125 0.25 +0.3125 0.8125 0.2812 +0.3125 0.8125 0.3125 +0.3125 0.8125 0.3438 +0.3125 0.8125 0.375 +0.3125 0.8125 0.4062 +0.3125 0.8125 0.4375 +0.3125 0.8125 0.4688 +0.3125 0.8125 0.5 +0.3125 0.8125 0.5312 +0.3125 0.8125 0.5625 +0.3125 0.8125 0.5938 +0.3125 0.8125 0.625 +0.3125 0.8125 0.6562 +0.3125 0.8125 0.6875 +0.3125 0.8125 0.7188 +0.3125 0.8125 0.75 +0.3125 0.8125 0.7812 +0.3125 0.8125 0.8125 +0.3125 0.8125 0.8438 +0.3125 0.8125 0.875 +0.3125 0.8125 0.9062 +0.3125 0.8125 0.9375 +0.3125 0.8125 0.9688 +0.3125 0.8125 1 +0.3125 0.8438 0 +0.3125 0.8438 0.03125 +0.3125 0.8438 0.0625 +0.3125 0.8438 0.09375 +0.3125 0.8438 0.125 +0.3125 0.8438 0.1562 +0.3125 0.8438 0.1875 +0.3125 0.8438 0.2188 +0.3125 0.8438 0.25 +0.3125 0.8438 0.2812 +0.3125 0.8438 0.3125 +0.3125 0.8438 0.3438 +0.3125 0.8438 0.375 +0.3125 0.8438 0.4062 +0.3125 0.8438 0.4375 +0.3125 0.8438 0.4688 +0.3125 0.8438 0.5 +0.3125 0.8438 0.5312 +0.3125 0.8438 0.5625 +0.3125 0.8438 0.5938 +0.3125 0.8438 0.625 +0.3125 0.8438 0.6562 +0.3125 0.8438 0.6875 +0.3125 0.8438 0.7188 +0.3125 0.8438 0.75 +0.3125 0.8438 0.7812 +0.3125 0.8438 0.8125 +0.3125 0.8438 0.8438 +0.3125 0.8438 0.875 +0.3125 0.8438 0.9062 +0.3125 0.8438 0.9375 +0.3125 0.8438 0.9688 +0.3125 0.8438 1 +0.3125 0.875 0 +0.3125 0.875 0.03125 +0.3125 0.875 0.0625 +0.3125 0.875 0.09375 +0.3125 0.875 0.125 +0.3125 0.875 0.1562 +0.3125 0.875 0.1875 +0.3125 0.875 0.2188 +0.3125 0.875 0.25 +0.3125 0.875 0.2812 +0.3125 0.875 0.3125 +0.3125 0.875 0.3438 +0.3125 0.875 0.375 +0.3125 0.875 0.4062 +0.3125 0.875 0.4375 +0.3125 0.875 0.4688 +0.3125 0.875 0.5 +0.3125 0.875 0.5312 +0.3125 0.875 0.5625 +0.3125 0.875 0.5938 +0.3125 0.875 0.625 +0.3125 0.875 0.6562 +0.3125 0.875 0.6875 +0.3125 0.875 0.7188 +0.3125 0.875 0.75 +0.3125 0.875 0.7812 +0.3125 0.875 0.8125 +0.3125 0.875 0.8438 +0.3125 0.875 0.875 +0.3125 0.875 0.9062 +0.3125 0.875 0.9375 +0.3125 0.875 0.9688 +0.3125 0.875 1 +0.3125 0.9062 0 +0.3125 0.9062 0.03125 +0.3125 0.9062 0.0625 +0.3125 0.9062 0.09375 +0.3125 0.9062 0.125 +0.3125 0.9062 0.1562 +0.3125 0.9062 0.1875 +0.3125 0.9062 0.2188 +0.3125 0.9062 0.25 +0.3125 0.9062 0.2812 +0.3125 0.9062 0.3125 +0.3125 0.9062 0.3438 +0.3125 0.9062 0.375 +0.3125 0.9062 0.4062 +0.3125 0.9062 0.4375 +0.3125 0.9062 0.4688 +0.3125 0.9062 0.5 +0.3125 0.9062 0.5312 +0.3125 0.9062 0.5625 +0.3125 0.9062 0.5938 +0.3125 0.9062 0.625 +0.3125 0.9062 0.6562 +0.3125 0.9062 0.6875 +0.3125 0.9062 0.7188 +0.3125 0.9062 0.75 +0.3125 0.9062 0.7812 +0.3125 0.9062 0.8125 +0.3125 0.9062 0.8438 +0.3125 0.9062 0.875 +0.3125 0.9062 0.9062 +0.3125 0.9062 0.9375 +0.3125 0.9062 0.9688 +0.3125 0.9062 1 +0.3125 0.9375 0 +0.3125 0.9375 0.03125 +0.3125 0.9375 0.0625 +0.3125 0.9375 0.09375 +0.3125 0.9375 0.125 +0.3125 0.9375 0.1562 +0.3125 0.9375 0.1875 +0.3125 0.9375 0.2188 +0.3125 0.9375 0.25 +0.3125 0.9375 0.2812 +0.3125 0.9375 0.3125 +0.3125 0.9375 0.3438 +0.3125 0.9375 0.375 +0.3125 0.9375 0.4062 +0.3125 0.9375 0.4375 +0.3125 0.9375 0.4688 +0.3125 0.9375 0.5 +0.3125 0.9375 0.5312 +0.3125 0.9375 0.5625 +0.3125 0.9375 0.5938 +0.3125 0.9375 0.625 +0.3125 0.9375 0.6562 +0.3125 0.9375 0.6875 +0.3125 0.9375 0.7188 +0.3125 0.9375 0.75 +0.3125 0.9375 0.7812 +0.3125 0.9375 0.8125 +0.3125 0.9375 0.8438 +0.3125 0.9375 0.875 +0.3125 0.9375 0.9062 +0.3125 0.9375 0.9375 +0.3125 0.9375 0.9688 +0.3125 0.9375 1 +0.3125 0.9688 0 +0.3125 0.9688 0.03125 +0.3125 0.9688 0.0625 +0.3125 0.9688 0.09375 +0.3125 0.9688 0.125 +0.3125 0.9688 0.1562 +0.3125 0.9688 0.1875 +0.3125 0.9688 0.2188 +0.3125 0.9688 0.25 +0.3125 0.9688 0.2812 +0.3125 0.9688 0.3125 +0.3125 0.9688 0.3438 +0.3125 0.9688 0.375 +0.3125 0.9688 0.4062 +0.3125 0.9688 0.4375 +0.3125 0.9688 0.4688 +0.3125 0.9688 0.5 +0.3125 0.9688 0.5312 +0.3125 0.9688 0.5625 +0.3125 0.9688 0.5938 +0.3125 0.9688 0.625 +0.3125 0.9688 0.6562 +0.3125 0.9688 0.6875 +0.3125 0.9688 0.7188 +0.3125 0.9688 0.75 +0.3125 0.9688 0.7812 +0.3125 0.9688 0.8125 +0.3125 0.9688 0.8438 +0.3125 0.9688 0.875 +0.3125 0.9688 0.9062 +0.3125 0.9688 0.9375 +0.3125 0.9688 0.9688 +0.3125 0.9688 1 +0.3125 1 0 +0.3125 1 0.03125 +0.3125 1 0.0625 +0.3125 1 0.09375 +0.3125 1 0.125 +0.3125 1 0.1562 +0.3125 1 0.1875 +0.3125 1 0.2188 +0.3125 1 0.25 +0.3125 1 0.2812 +0.3125 1 0.3125 +0.3125 1 0.3438 +0.3125 1 0.375 +0.3125 1 0.4062 +0.3125 1 0.4375 +0.3125 1 0.4688 +0.3125 1 0.5 +0.3125 1 0.5312 +0.3125 1 0.5625 +0.3125 1 0.5938 +0.3125 1 0.625 +0.3125 1 0.6562 +0.3125 1 0.6875 +0.3125 1 0.7188 +0.3125 1 0.75 +0.3125 1 0.7812 +0.3125 1 0.8125 +0.3125 1 0.8438 +0.3125 1 0.875 +0.3125 1 0.9062 +0.3125 1 0.9375 +0.3125 1 0.9688 +0.3125 1 1 +0.3438 0 0 +0.3438 0 0.03125 +0.3438 0 0.0625 +0.3438 0 0.09375 +0.3438 0 0.125 +0.3438 0 0.1562 +0.3438 0 0.1875 +0.3438 0 0.2188 +0.3438 0 0.25 +0.3438 0 0.2812 +0.3438 0 0.3125 +0.3438 0 0.3438 +0.3438 0 0.375 +0.3438 0 0.4062 +0.3438 0 0.4375 +0.3438 0 0.4688 +0.3438 0 0.5 +0.3438 0 0.5312 +0.3438 0 0.5625 +0.3438 0 0.5938 +0.3438 0 0.625 +0.3438 0 0.6562 +0.3438 0 0.6875 +0.3438 0 0.7188 +0.3438 0 0.75 +0.3438 0 0.7812 +0.3438 0 0.8125 +0.3438 0 0.8438 +0.3438 0 0.875 +0.3438 0 0.9062 +0.3438 0 0.9375 +0.3438 0 0.9688 +0.3438 0 1 +0.3438 0.03125 0 +0.3438 0.03125 0.03125 +0.3438 0.03125 0.0625 +0.3438 0.03125 0.09375 +0.3438 0.03125 0.125 +0.3438 0.03125 0.1562 +0.3438 0.03125 0.1875 +0.3438 0.03125 0.2188 +0.3438 0.03125 0.25 +0.3438 0.03125 0.2812 +0.3438 0.03125 0.3125 +0.3438 0.03125 0.3438 +0.3438 0.03125 0.375 +0.3438 0.03125 0.4062 +0.3438 0.03125 0.4375 +0.3438 0.03125 0.4688 +0.3438 0.03125 0.5 +0.3438 0.03125 0.5312 +0.3438 0.03125 0.5625 +0.3438 0.03125 0.5938 +0.3438 0.03125 0.625 +0.3438 0.03125 0.6562 +0.3438 0.03125 0.6875 +0.3438 0.03125 0.7188 +0.3438 0.03125 0.75 +0.3438 0.03125 0.7812 +0.3438 0.03125 0.8125 +0.3438 0.03125 0.8438 +0.3438 0.03125 0.875 +0.3438 0.03125 0.9062 +0.3438 0.03125 0.9375 +0.3438 0.03125 0.9688 +0.3438 0.03125 1 +0.3438 0.0625 0 +0.3438 0.0625 0.03125 +0.3438 0.0625 0.0625 +0.3438 0.0625 0.09375 +0.3438 0.0625 0.125 +0.3438 0.0625 0.1562 +0.3438 0.0625 0.1875 +0.3438 0.0625 0.2188 +0.3438 0.0625 0.25 +0.3438 0.0625 0.2812 +0.3438 0.0625 0.3125 +0.3438 0.0625 0.3438 +0.3438 0.0625 0.375 +0.3438 0.0625 0.4062 +0.3438 0.0625 0.4375 +0.3438 0.0625 0.4688 +0.3438 0.0625 0.5 +0.3438 0.0625 0.5312 +0.3438 0.0625 0.5625 +0.3438 0.0625 0.5938 +0.3438 0.0625 0.625 +0.3438 0.0625 0.6562 +0.3438 0.0625 0.6875 +0.3438 0.0625 0.7188 +0.3438 0.0625 0.75 +0.3438 0.0625 0.7812 +0.3438 0.0625 0.8125 +0.3438 0.0625 0.8438 +0.3438 0.0625 0.875 +0.3438 0.0625 0.9062 +0.3438 0.0625 0.9375 +0.3438 0.0625 0.9688 +0.3438 0.0625 1 +0.3438 0.09375 0 +0.3438 0.09375 0.03125 +0.3438 0.09375 0.0625 +0.3438 0.09375 0.09375 +0.3438 0.09375 0.125 +0.3438 0.09375 0.1562 +0.3438 0.09375 0.1875 +0.3438 0.09375 0.2188 +0.3438 0.09375 0.25 +0.3438 0.09375 0.2812 +0.3438 0.09375 0.3125 +0.3438 0.09375 0.3438 +0.3438 0.09375 0.375 +0.3438 0.09375 0.4062 +0.3438 0.09375 0.4375 +0.3438 0.09375 0.4688 +0.3438 0.09375 0.5 +0.3438 0.09375 0.5312 +0.3438 0.09375 0.5625 +0.3438 0.09375 0.5938 +0.3438 0.09375 0.625 +0.3438 0.09375 0.6562 +0.3438 0.09375 0.6875 +0.3438 0.09375 0.7188 +0.3438 0.09375 0.75 +0.3438 0.09375 0.7812 +0.3438 0.09375 0.8125 +0.3438 0.09375 0.8438 +0.3438 0.09375 0.875 +0.3438 0.09375 0.9062 +0.3438 0.09375 0.9375 +0.3438 0.09375 0.9688 +0.3438 0.09375 1 +0.3438 0.125 0 +0.3438 0.125 0.03125 +0.3438 0.125 0.0625 +0.3438 0.125 0.09375 +0.3438 0.125 0.125 +0.3438 0.125 0.1562 +0.3438 0.125 0.1875 +0.3438 0.125 0.2188 +0.3438 0.125 0.25 +0.3438 0.125 0.2812 +0.3438 0.125 0.3125 +0.3438 0.125 0.3438 +0.3438 0.125 0.375 +0.3438 0.125 0.4062 +0.3438 0.125 0.4375 +0.3438 0.125 0.4688 +0.3438 0.125 0.5 +0.3438 0.125 0.5312 +0.3438 0.125 0.5625 +0.3438 0.125 0.5938 +0.3438 0.125 0.625 +0.3438 0.125 0.6562 +0.3438 0.125 0.6875 +0.3438 0.125 0.7188 +0.3438 0.125 0.75 +0.3438 0.125 0.7812 +0.3438 0.125 0.8125 +0.3438 0.125 0.8438 +0.3438 0.125 0.875 +0.3438 0.125 0.9062 +0.3438 0.125 0.9375 +0.3438 0.125 0.9688 +0.3438 0.125 1 +0.3438 0.1562 0 +0.3438 0.1562 0.03125 +0.3438 0.1562 0.0625 +0.3438 0.1562 0.09375 +0.3438 0.1562 0.125 +0.3438 0.1562 0.1562 +0.3438 0.1562 0.1875 +0.3438 0.1562 0.2188 +0.3438 0.1562 0.25 +0.3438 0.1562 0.2812 +0.3438 0.1562 0.3125 +0.3438 0.1562 0.3438 +0.3438 0.1562 0.375 +0.3438 0.1562 0.4062 +0.3438 0.1562 0.4375 +0.3438 0.1562 0.4688 +0.3438 0.1562 0.5 +0.3438 0.1562 0.5312 +0.3438 0.1562 0.5625 +0.3438 0.1562 0.5938 +0.3438 0.1562 0.625 +0.3438 0.1562 0.6562 +0.3438 0.1562 0.6875 +0.3438 0.1562 0.7188 +0.3438 0.1562 0.75 +0.3438 0.1562 0.7812 +0.3438 0.1562 0.8125 +0.3438 0.1562 0.8438 +0.3438 0.1562 0.875 +0.3438 0.1562 0.9062 +0.3438 0.1562 0.9375 +0.3438 0.1562 0.9688 +0.3438 0.1562 1 +0.3438 0.1875 0 +0.3438 0.1875 0.03125 +0.3438 0.1875 0.0625 +0.3438 0.1875 0.09375 +0.3438 0.1875 0.125 +0.3438 0.1875 0.1562 +0.3438 0.1875 0.1875 +0.3438 0.1875 0.2188 +0.3438 0.1875 0.25 +0.3438 0.1875 0.2812 +0.3438 0.1875 0.3125 +0.3438 0.1875 0.3438 +0.3438 0.1875 0.375 +0.3438 0.1875 0.4062 +0.3438 0.1875 0.4375 +0.3438 0.1875 0.4688 +0.3438 0.1875 0.5 +0.3438 0.1875 0.5312 +0.3438 0.1875 0.5625 +0.3438 0.1875 0.5938 +0.3438 0.1875 0.625 +0.3438 0.1875 0.6562 +0.3438 0.1875 0.6875 +0.3438 0.1875 0.7188 +0.3438 0.1875 0.75 +0.3438 0.1875 0.7812 +0.3438 0.1875 0.8125 +0.3438 0.1875 0.8438 +0.3438 0.1875 0.875 +0.3438 0.1875 0.9062 +0.3438 0.1875 0.9375 +0.3438 0.1875 0.9688 +0.3438 0.1875 1 +0.3438 0.2188 0 +0.3438 0.2188 0.03125 +0.3438 0.2188 0.0625 +0.3438 0.2188 0.09375 +0.3438 0.2188 0.125 +0.3438 0.2188 0.1562 +0.3438 0.2188 0.1875 +0.3438 0.2188 0.2188 +0.3438 0.2188 0.25 +0.3438 0.2188 0.2812 +0.3438 0.2188 0.3125 +0.3438 0.2188 0.3438 +0.3438 0.2188 0.375 +0.3438 0.2188 0.4062 +0.3438 0.2188 0.4375 +0.3438 0.2188 0.4688 +0.3438 0.2188 0.5 +0.3438 0.2188 0.5312 +0.3438 0.2188 0.5625 +0.3438 0.2188 0.5938 +0.3438 0.2188 0.625 +0.3438 0.2188 0.6562 +0.3438 0.2188 0.6875 +0.3438 0.2188 0.7188 +0.3438 0.2188 0.75 +0.3438 0.2188 0.7812 +0.3438 0.2188 0.8125 +0.3438 0.2188 0.8438 +0.3438 0.2188 0.875 +0.3438 0.2188 0.9062 +0.3438 0.2188 0.9375 +0.3438 0.2188 0.9688 +0.3438 0.2188 1 +0.3438 0.25 0 +0.3438 0.25 0.03125 +0.3438 0.25 0.0625 +0.3438 0.25 0.09375 +0.3438 0.25 0.125 +0.3438 0.25 0.1562 +0.3438 0.25 0.1875 +0.3438 0.25 0.2188 +0.3438 0.25 0.25 +0.3438 0.25 0.2812 +0.3438 0.25 0.3125 +0.3438 0.25 0.3438 +0.3438 0.25 0.375 +0.3438 0.25 0.4062 +0.3438 0.25 0.4375 +0.3438 0.25 0.4688 +0.3438 0.25 0.5 +0.3438 0.25 0.5312 +0.3438 0.25 0.5625 +0.3438 0.25 0.5938 +0.3438 0.25 0.625 +0.3438 0.25 0.6562 +0.3438 0.25 0.6875 +0.3438 0.25 0.7188 +0.3438 0.25 0.75 +0.3438 0.25 0.7812 +0.3438 0.25 0.8125 +0.3438 0.25 0.8438 +0.3438 0.25 0.875 +0.3438 0.25 0.9062 +0.3438 0.25 0.9375 +0.3438 0.25 0.9688 +0.3438 0.25 1 +0.3438 0.2812 0 +0.3438 0.2812 0.03125 +0.3438 0.2812 0.0625 +0.3438 0.2812 0.09375 +0.3438 0.2812 0.125 +0.3438 0.2812 0.1562 +0.3438 0.2812 0.1875 +0.3438 0.2812 0.2188 +0.3438 0.2812 0.25 +0.3438 0.2812 0.2812 +0.3438 0.2812 0.3125 +0.3438 0.2812 0.3438 +0.3438 0.2812 0.375 +0.3438 0.2812 0.4062 +0.3438 0.2812 0.4375 +0.3438 0.2812 0.4688 +0.3438 0.2812 0.5 +0.3438 0.2812 0.5312 +0.3438 0.2812 0.5625 +0.3438 0.2812 0.5938 +0.3438 0.2812 0.625 +0.3438 0.2812 0.6562 +0.3438 0.2812 0.6875 +0.3438 0.2812 0.7188 +0.3438 0.2812 0.75 +0.3438 0.2812 0.7812 +0.3438 0.2812 0.8125 +0.3438 0.2812 0.8438 +0.3438 0.2812 0.875 +0.3438 0.2812 0.9062 +0.3438 0.2812 0.9375 +0.3438 0.2812 0.9688 +0.3438 0.2812 1 +0.3438 0.3125 0 +0.3438 0.3125 0.03125 +0.3438 0.3125 0.0625 +0.3438 0.3125 0.09375 +0.3438 0.3125 0.125 +0.3438 0.3125 0.1562 +0.3438 0.3125 0.1875 +0.3438 0.3125 0.2188 +0.3438 0.3125 0.25 +0.3438 0.3125 0.2812 +0.3438 0.3125 0.3125 +0.3438 0.3125 0.3438 +0.3438 0.3125 0.375 +0.3438 0.3125 0.4062 +0.3438 0.3125 0.4375 +0.3438 0.3125 0.4688 +0.3438 0.3125 0.5 +0.3438 0.3125 0.5312 +0.3438 0.3125 0.5625 +0.3438 0.3125 0.5938 +0.3438 0.3125 0.625 +0.3438 0.3125 0.6562 +0.3438 0.3125 0.6875 +0.3438 0.3125 0.7188 +0.3438 0.3125 0.75 +0.3438 0.3125 0.7812 +0.3438 0.3125 0.8125 +0.3438 0.3125 0.8438 +0.3438 0.3125 0.875 +0.3438 0.3125 0.9062 +0.3438 0.3125 0.9375 +0.3438 0.3125 0.9688 +0.3438 0.3125 1 +0.3438 0.3438 0 +0.3438 0.3438 0.03125 +0.3438 0.3438 0.0625 +0.3438 0.3438 0.09375 +0.3438 0.3438 0.125 +0.3438 0.3438 0.1562 +0.3438 0.3438 0.1875 +0.3438 0.3438 0.2188 +0.3438 0.3438 0.25 +0.3438 0.3438 0.2812 +0.3438 0.3438 0.3125 +0.3438 0.3438 0.3438 +0.3438 0.3438 0.375 +0.3438 0.3438 0.4062 +0.3438 0.3438 0.4375 +0.3438 0.3438 0.4688 +0.3438 0.3438 0.5 +0.3438 0.3438 0.5312 +0.3438 0.3438 0.5625 +0.3438 0.3438 0.5938 +0.3438 0.3438 0.625 +0.3438 0.3438 0.6562 +0.3438 0.3438 0.6875 +0.3438 0.3438 0.7188 +0.3438 0.3438 0.75 +0.3438 0.3438 0.7812 +0.3438 0.3438 0.8125 +0.3438 0.3438 0.8438 +0.3438 0.3438 0.875 +0.3438 0.3438 0.9062 +0.3438 0.3438 0.9375 +0.3438 0.3438 0.9688 +0.3438 0.3438 1 +0.3438 0.375 0 +0.3438 0.375 0.03125 +0.3438 0.375 0.0625 +0.3438 0.375 0.09375 +0.3438 0.375 0.125 +0.3438 0.375 0.1562 +0.3438 0.375 0.1875 +0.3438 0.375 0.2188 +0.3438 0.375 0.25 +0.3438 0.375 0.2812 +0.3438 0.375 0.3125 +0.3438 0.375 0.3438 +0.3438 0.375 0.375 +0.3438 0.375 0.4062 +0.3438 0.375 0.4375 +0.3438 0.375 0.4688 +0.3438 0.375 0.5 +0.3438 0.375 0.5312 +0.3438 0.375 0.5625 +0.3438 0.375 0.5938 +0.3438 0.375 0.625 +0.3438 0.375 0.6562 +0.3438 0.375 0.6875 +0.3438 0.375 0.7188 +0.3438 0.375 0.75 +0.3438 0.375 0.7812 +0.3438 0.375 0.8125 +0.3438 0.375 0.8438 +0.3438 0.375 0.875 +0.3438 0.375 0.9062 +0.3438 0.375 0.9375 +0.3438 0.375 0.9688 +0.3438 0.375 1 +0.3438 0.4062 0 +0.3438 0.4062 0.03125 +0.3438 0.4062 0.0625 +0.3438 0.4062 0.09375 +0.3438 0.4062 0.125 +0.3438 0.4062 0.1562 +0.3438 0.4062 0.1875 +0.3438 0.4062 0.2188 +0.3438 0.4062 0.25 +0.3438 0.4062 0.2812 +0.3438 0.4062 0.3125 +0.3438 0.4062 0.3438 +0.3438 0.4062 0.375 +0.3438 0.4062 0.4062 +0.3438 0.4062 0.4375 +0.3438 0.4062 0.4688 +0.3438 0.4062 0.5 +0.3438 0.4062 0.5312 +0.3438 0.4062 0.5625 +0.3438 0.4062 0.5938 +0.3438 0.4062 0.625 +0.3438 0.4062 0.6562 +0.3438 0.4062 0.6875 +0.3438 0.4062 0.7188 +0.3438 0.4062 0.75 +0.3438 0.4062 0.7812 +0.3438 0.4062 0.8125 +0.3438 0.4062 0.8438 +0.3438 0.4062 0.875 +0.3438 0.4062 0.9062 +0.3438 0.4062 0.9375 +0.3438 0.4062 0.9688 +0.3438 0.4062 1 +0.3438 0.4375 0 +0.3438 0.4375 0.03125 +0.3438 0.4375 0.0625 +0.3438 0.4375 0.09375 +0.3438 0.4375 0.125 +0.3438 0.4375 0.1562 +0.3438 0.4375 0.1875 +0.3438 0.4375 0.2188 +0.3438 0.4375 0.25 +0.3438 0.4375 0.2812 +0.3438 0.4375 0.3125 +0.3438 0.4375 0.3438 +0.3438 0.4375 0.375 +0.3438 0.4375 0.4062 +0.3438 0.4375 0.4375 +0.3438 0.4375 0.4688 +0.3438 0.4375 0.5 +0.3438 0.4375 0.5312 +0.3438 0.4375 0.5625 +0.3438 0.4375 0.5938 +0.3438 0.4375 0.625 +0.3438 0.4375 0.6562 +0.3438 0.4375 0.6875 +0.3438 0.4375 0.7188 +0.3438 0.4375 0.75 +0.3438 0.4375 0.7812 +0.3438 0.4375 0.8125 +0.3438 0.4375 0.8438 +0.3438 0.4375 0.875 +0.3438 0.4375 0.9062 +0.3438 0.4375 0.9375 +0.3438 0.4375 0.9688 +0.3438 0.4375 1 +0.3438 0.4688 0 +0.3438 0.4688 0.03125 +0.3438 0.4688 0.0625 +0.3438 0.4688 0.09375 +0.3438 0.4688 0.125 +0.3438 0.4688 0.1562 +0.3438 0.4688 0.1875 +0.3438 0.4688 0.2188 +0.3438 0.4688 0.25 +0.3438 0.4688 0.2812 +0.3438 0.4688 0.3125 +0.3438 0.4688 0.3438 +0.3438 0.4688 0.375 +0.3438 0.4688 0.4062 +0.3438 0.4688 0.4375 +0.3438 0.4688 0.4688 +0.3438 0.4688 0.5 +0.3438 0.4688 0.5312 +0.3438 0.4688 0.5625 +0.3438 0.4688 0.5938 +0.3438 0.4688 0.625 +0.3438 0.4688 0.6562 +0.3438 0.4688 0.6875 +0.3438 0.4688 0.7188 +0.3438 0.4688 0.75 +0.3438 0.4688 0.7812 +0.3438 0.4688 0.8125 +0.3438 0.4688 0.8438 +0.3438 0.4688 0.875 +0.3438 0.4688 0.9062 +0.3438 0.4688 0.9375 +0.3438 0.4688 0.9688 +0.3438 0.4688 1 +0.3438 0.5 0 +0.3438 0.5 0.03125 +0.3438 0.5 0.0625 +0.3438 0.5 0.09375 +0.3438 0.5 0.125 +0.3438 0.5 0.1562 +0.3438 0.5 0.1875 +0.3438 0.5 0.2188 +0.3438 0.5 0.25 +0.3438 0.5 0.2812 +0.3438 0.5 0.3125 +0.3438 0.5 0.3438 +0.3438 0.5 0.375 +0.3438 0.5 0.4062 +0.3438 0.5 0.4375 +0.3438 0.5 0.4688 +0.3438 0.5 0.5 +0.3438 0.5 0.5312 +0.3438 0.5 0.5625 +0.3438 0.5 0.5938 +0.3438 0.5 0.625 +0.3438 0.5 0.6562 +0.3438 0.5 0.6875 +0.3438 0.5 0.7188 +0.3438 0.5 0.75 +0.3438 0.5 0.7812 +0.3438 0.5 0.8125 +0.3438 0.5 0.8438 +0.3438 0.5 0.875 +0.3438 0.5 0.9062 +0.3438 0.5 0.9375 +0.3438 0.5 0.9688 +0.3438 0.5 1 +0.3438 0.5312 0 +0.3438 0.5312 0.03125 +0.3438 0.5312 0.0625 +0.3438 0.5312 0.09375 +0.3438 0.5312 0.125 +0.3438 0.5312 0.1562 +0.3438 0.5312 0.1875 +0.3438 0.5312 0.2188 +0.3438 0.5312 0.25 +0.3438 0.5312 0.2812 +0.3438 0.5312 0.3125 +0.3438 0.5312 0.3438 +0.3438 0.5312 0.375 +0.3438 0.5312 0.4062 +0.3438 0.5312 0.4375 +0.3438 0.5312 0.4688 +0.3438 0.5312 0.5 +0.3438 0.5312 0.5312 +0.3438 0.5312 0.5625 +0.3438 0.5312 0.5938 +0.3438 0.5312 0.625 +0.3438 0.5312 0.6562 +0.3438 0.5312 0.6875 +0.3438 0.5312 0.7188 +0.3438 0.5312 0.75 +0.3438 0.5312 0.7812 +0.3438 0.5312 0.8125 +0.3438 0.5312 0.8438 +0.3438 0.5312 0.875 +0.3438 0.5312 0.9062 +0.3438 0.5312 0.9375 +0.3438 0.5312 0.9688 +0.3438 0.5312 1 +0.3438 0.5625 0 +0.3438 0.5625 0.03125 +0.3438 0.5625 0.0625 +0.3438 0.5625 0.09375 +0.3438 0.5625 0.125 +0.3438 0.5625 0.1562 +0.3438 0.5625 0.1875 +0.3438 0.5625 0.2188 +0.3438 0.5625 0.25 +0.3438 0.5625 0.2812 +0.3438 0.5625 0.3125 +0.3438 0.5625 0.3438 +0.3438 0.5625 0.375 +0.3438 0.5625 0.4062 +0.3438 0.5625 0.4375 +0.3438 0.5625 0.4688 +0.3438 0.5625 0.5 +0.3438 0.5625 0.5312 +0.3438 0.5625 0.5625 +0.3438 0.5625 0.5938 +0.3438 0.5625 0.625 +0.3438 0.5625 0.6562 +0.3438 0.5625 0.6875 +0.3438 0.5625 0.7188 +0.3438 0.5625 0.75 +0.3438 0.5625 0.7812 +0.3438 0.5625 0.8125 +0.3438 0.5625 0.8438 +0.3438 0.5625 0.875 +0.3438 0.5625 0.9062 +0.3438 0.5625 0.9375 +0.3438 0.5625 0.9688 +0.3438 0.5625 1 +0.3438 0.5938 0 +0.3438 0.5938 0.03125 +0.3438 0.5938 0.0625 +0.3438 0.5938 0.09375 +0.3438 0.5938 0.125 +0.3438 0.5938 0.1562 +0.3438 0.5938 0.1875 +0.3438 0.5938 0.2188 +0.3438 0.5938 0.25 +0.3438 0.5938 0.2812 +0.3438 0.5938 0.3125 +0.3438 0.5938 0.3438 +0.3438 0.5938 0.375 +0.3438 0.5938 0.4062 +0.3438 0.5938 0.4375 +0.3438 0.5938 0.4688 +0.3438 0.5938 0.5 +0.3438 0.5938 0.5312 +0.3438 0.5938 0.5625 +0.3438 0.5938 0.5938 +0.3438 0.5938 0.625 +0.3438 0.5938 0.6562 +0.3438 0.5938 0.6875 +0.3438 0.5938 0.7188 +0.3438 0.5938 0.75 +0.3438 0.5938 0.7812 +0.3438 0.5938 0.8125 +0.3438 0.5938 0.8438 +0.3438 0.5938 0.875 +0.3438 0.5938 0.9062 +0.3438 0.5938 0.9375 +0.3438 0.5938 0.9688 +0.3438 0.5938 1 +0.3438 0.625 0 +0.3438 0.625 0.03125 +0.3438 0.625 0.0625 +0.3438 0.625 0.09375 +0.3438 0.625 0.125 +0.3438 0.625 0.1562 +0.3438 0.625 0.1875 +0.3438 0.625 0.2188 +0.3438 0.625 0.25 +0.3438 0.625 0.2812 +0.3438 0.625 0.3125 +0.3438 0.625 0.3438 +0.3438 0.625 0.375 +0.3438 0.625 0.4062 +0.3438 0.625 0.4375 +0.3438 0.625 0.4688 +0.3438 0.625 0.5 +0.3438 0.625 0.5312 +0.3438 0.625 0.5625 +0.3438 0.625 0.5938 +0.3438 0.625 0.625 +0.3438 0.625 0.6562 +0.3438 0.625 0.6875 +0.3438 0.625 0.7188 +0.3438 0.625 0.75 +0.3438 0.625 0.7812 +0.3438 0.625 0.8125 +0.3438 0.625 0.8438 +0.3438 0.625 0.875 +0.3438 0.625 0.9062 +0.3438 0.625 0.9375 +0.3438 0.625 0.9688 +0.3438 0.625 1 +0.3438 0.6562 0 +0.3438 0.6562 0.03125 +0.3438 0.6562 0.0625 +0.3438 0.6562 0.09375 +0.3438 0.6562 0.125 +0.3438 0.6562 0.1562 +0.3438 0.6562 0.1875 +0.3438 0.6562 0.2188 +0.3438 0.6562 0.25 +0.3438 0.6562 0.2812 +0.3438 0.6562 0.3125 +0.3438 0.6562 0.3438 +0.3438 0.6562 0.375 +0.3438 0.6562 0.4062 +0.3438 0.6562 0.4375 +0.3438 0.6562 0.4688 +0.3438 0.6562 0.5 +0.3438 0.6562 0.5312 +0.3438 0.6562 0.5625 +0.3438 0.6562 0.5938 +0.3438 0.6562 0.625 +0.3438 0.6562 0.6562 +0.3438 0.6562 0.6875 +0.3438 0.6562 0.7188 +0.3438 0.6562 0.75 +0.3438 0.6562 0.7812 +0.3438 0.6562 0.8125 +0.3438 0.6562 0.8438 +0.3438 0.6562 0.875 +0.3438 0.6562 0.9062 +0.3438 0.6562 0.9375 +0.3438 0.6562 0.9688 +0.3438 0.6562 1 +0.3438 0.6875 0 +0.3438 0.6875 0.03125 +0.3438 0.6875 0.0625 +0.3438 0.6875 0.09375 +0.3438 0.6875 0.125 +0.3438 0.6875 0.1562 +0.3438 0.6875 0.1875 +0.3438 0.6875 0.2188 +0.3438 0.6875 0.25 +0.3438 0.6875 0.2812 +0.3438 0.6875 0.3125 +0.3438 0.6875 0.3438 +0.3438 0.6875 0.375 +0.3438 0.6875 0.4062 +0.3438 0.6875 0.4375 +0.3438 0.6875 0.4688 +0.3438 0.6875 0.5 +0.3438 0.6875 0.5312 +0.3438 0.6875 0.5625 +0.3438 0.6875 0.5938 +0.3438 0.6875 0.625 +0.3438 0.6875 0.6562 +0.3438 0.6875 0.6875 +0.3438 0.6875 0.7188 +0.3438 0.6875 0.75 +0.3438 0.6875 0.7812 +0.3438 0.6875 0.8125 +0.3438 0.6875 0.8438 +0.3438 0.6875 0.875 +0.3438 0.6875 0.9062 +0.3438 0.6875 0.9375 +0.3438 0.6875 0.9688 +0.3438 0.6875 1 +0.3438 0.7188 0 +0.3438 0.7188 0.03125 +0.3438 0.7188 0.0625 +0.3438 0.7188 0.09375 +0.3438 0.7188 0.125 +0.3438 0.7188 0.1562 +0.3438 0.7188 0.1875 +0.3438 0.7188 0.2188 +0.3438 0.7188 0.25 +0.3438 0.7188 0.2812 +0.3438 0.7188 0.3125 +0.3438 0.7188 0.3438 +0.3438 0.7188 0.375 +0.3438 0.7188 0.4062 +0.3438 0.7188 0.4375 +0.3438 0.7188 0.4688 +0.3438 0.7188 0.5 +0.3438 0.7188 0.5312 +0.3438 0.7188 0.5625 +0.3438 0.7188 0.5938 +0.3438 0.7188 0.625 +0.3438 0.7188 0.6562 +0.3438 0.7188 0.6875 +0.3438 0.7188 0.7188 +0.3438 0.7188 0.75 +0.3438 0.7188 0.7812 +0.3438 0.7188 0.8125 +0.3438 0.7188 0.8438 +0.3438 0.7188 0.875 +0.3438 0.7188 0.9062 +0.3438 0.7188 0.9375 +0.3438 0.7188 0.9688 +0.3438 0.7188 1 +0.3438 0.75 0 +0.3438 0.75 0.03125 +0.3438 0.75 0.0625 +0.3438 0.75 0.09375 +0.3438 0.75 0.125 +0.3438 0.75 0.1562 +0.3438 0.75 0.1875 +0.3438 0.75 0.2188 +0.3438 0.75 0.25 +0.3438 0.75 0.2812 +0.3438 0.75 0.3125 +0.3438 0.75 0.3438 +0.3438 0.75 0.375 +0.3438 0.75 0.4062 +0.3438 0.75 0.4375 +0.3438 0.75 0.4688 +0.3438 0.75 0.5 +0.3438 0.75 0.5312 +0.3438 0.75 0.5625 +0.3438 0.75 0.5938 +0.3438 0.75 0.625 +0.3438 0.75 0.6562 +0.3438 0.75 0.6875 +0.3438 0.75 0.7188 +0.3438 0.75 0.75 +0.3438 0.75 0.7812 +0.3438 0.75 0.8125 +0.3438 0.75 0.8438 +0.3438 0.75 0.875 +0.3438 0.75 0.9062 +0.3438 0.75 0.9375 +0.3438 0.75 0.9688 +0.3438 0.75 1 +0.3438 0.7812 0 +0.3438 0.7812 0.03125 +0.3438 0.7812 0.0625 +0.3438 0.7812 0.09375 +0.3438 0.7812 0.125 +0.3438 0.7812 0.1562 +0.3438 0.7812 0.1875 +0.3438 0.7812 0.2188 +0.3438 0.7812 0.25 +0.3438 0.7812 0.2812 +0.3438 0.7812 0.3125 +0.3438 0.7812 0.3438 +0.3438 0.7812 0.375 +0.3438 0.7812 0.4062 +0.3438 0.7812 0.4375 +0.3438 0.7812 0.4688 +0.3438 0.7812 0.5 +0.3438 0.7812 0.5312 +0.3438 0.7812 0.5625 +0.3438 0.7812 0.5938 +0.3438 0.7812 0.625 +0.3438 0.7812 0.6562 +0.3438 0.7812 0.6875 +0.3438 0.7812 0.7188 +0.3438 0.7812 0.75 +0.3438 0.7812 0.7812 +0.3438 0.7812 0.8125 +0.3438 0.7812 0.8438 +0.3438 0.7812 0.875 +0.3438 0.7812 0.9062 +0.3438 0.7812 0.9375 +0.3438 0.7812 0.9688 +0.3438 0.7812 1 +0.3438 0.8125 0 +0.3438 0.8125 0.03125 +0.3438 0.8125 0.0625 +0.3438 0.8125 0.09375 +0.3438 0.8125 0.125 +0.3438 0.8125 0.1562 +0.3438 0.8125 0.1875 +0.3438 0.8125 0.2188 +0.3438 0.8125 0.25 +0.3438 0.8125 0.2812 +0.3438 0.8125 0.3125 +0.3438 0.8125 0.3438 +0.3438 0.8125 0.375 +0.3438 0.8125 0.4062 +0.3438 0.8125 0.4375 +0.3438 0.8125 0.4688 +0.3438 0.8125 0.5 +0.3438 0.8125 0.5312 +0.3438 0.8125 0.5625 +0.3438 0.8125 0.5938 +0.3438 0.8125 0.625 +0.3438 0.8125 0.6562 +0.3438 0.8125 0.6875 +0.3438 0.8125 0.7188 +0.3438 0.8125 0.75 +0.3438 0.8125 0.7812 +0.3438 0.8125 0.8125 +0.3438 0.8125 0.8438 +0.3438 0.8125 0.875 +0.3438 0.8125 0.9062 +0.3438 0.8125 0.9375 +0.3438 0.8125 0.9688 +0.3438 0.8125 1 +0.3438 0.8438 0 +0.3438 0.8438 0.03125 +0.3438 0.8438 0.0625 +0.3438 0.8438 0.09375 +0.3438 0.8438 0.125 +0.3438 0.8438 0.1562 +0.3438 0.8438 0.1875 +0.3438 0.8438 0.2188 +0.3438 0.8438 0.25 +0.3438 0.8438 0.2812 +0.3438 0.8438 0.3125 +0.3438 0.8438 0.3438 +0.3438 0.8438 0.375 +0.3438 0.8438 0.4062 +0.3438 0.8438 0.4375 +0.3438 0.8438 0.4688 +0.3438 0.8438 0.5 +0.3438 0.8438 0.5312 +0.3438 0.8438 0.5625 +0.3438 0.8438 0.5938 +0.3438 0.8438 0.625 +0.3438 0.8438 0.6562 +0.3438 0.8438 0.6875 +0.3438 0.8438 0.7188 +0.3438 0.8438 0.75 +0.3438 0.8438 0.7812 +0.3438 0.8438 0.8125 +0.3438 0.8438 0.8438 +0.3438 0.8438 0.875 +0.3438 0.8438 0.9062 +0.3438 0.8438 0.9375 +0.3438 0.8438 0.9688 +0.3438 0.8438 1 +0.3438 0.875 0 +0.3438 0.875 0.03125 +0.3438 0.875 0.0625 +0.3438 0.875 0.09375 +0.3438 0.875 0.125 +0.3438 0.875 0.1562 +0.3438 0.875 0.1875 +0.3438 0.875 0.2188 +0.3438 0.875 0.25 +0.3438 0.875 0.2812 +0.3438 0.875 0.3125 +0.3438 0.875 0.3438 +0.3438 0.875 0.375 +0.3438 0.875 0.4062 +0.3438 0.875 0.4375 +0.3438 0.875 0.4688 +0.3438 0.875 0.5 +0.3438 0.875 0.5312 +0.3438 0.875 0.5625 +0.3438 0.875 0.5938 +0.3438 0.875 0.625 +0.3438 0.875 0.6562 +0.3438 0.875 0.6875 +0.3438 0.875 0.7188 +0.3438 0.875 0.75 +0.3438 0.875 0.7812 +0.3438 0.875 0.8125 +0.3438 0.875 0.8438 +0.3438 0.875 0.875 +0.3438 0.875 0.9062 +0.3438 0.875 0.9375 +0.3438 0.875 0.9688 +0.3438 0.875 1 +0.3438 0.9062 0 +0.3438 0.9062 0.03125 +0.3438 0.9062 0.0625 +0.3438 0.9062 0.09375 +0.3438 0.9062 0.125 +0.3438 0.9062 0.1562 +0.3438 0.9062 0.1875 +0.3438 0.9062 0.2188 +0.3438 0.9062 0.25 +0.3438 0.9062 0.2812 +0.3438 0.9062 0.3125 +0.3438 0.9062 0.3438 +0.3438 0.9062 0.375 +0.3438 0.9062 0.4062 +0.3438 0.9062 0.4375 +0.3438 0.9062 0.4688 +0.3438 0.9062 0.5 +0.3438 0.9062 0.5312 +0.3438 0.9062 0.5625 +0.3438 0.9062 0.5938 +0.3438 0.9062 0.625 +0.3438 0.9062 0.6562 +0.3438 0.9062 0.6875 +0.3438 0.9062 0.7188 +0.3438 0.9062 0.75 +0.3438 0.9062 0.7812 +0.3438 0.9062 0.8125 +0.3438 0.9062 0.8438 +0.3438 0.9062 0.875 +0.3438 0.9062 0.9062 +0.3438 0.9062 0.9375 +0.3438 0.9062 0.9688 +0.3438 0.9062 1 +0.3438 0.9375 0 +0.3438 0.9375 0.03125 +0.3438 0.9375 0.0625 +0.3438 0.9375 0.09375 +0.3438 0.9375 0.125 +0.3438 0.9375 0.1562 +0.3438 0.9375 0.1875 +0.3438 0.9375 0.2188 +0.3438 0.9375 0.25 +0.3438 0.9375 0.2812 +0.3438 0.9375 0.3125 +0.3438 0.9375 0.3438 +0.3438 0.9375 0.375 +0.3438 0.9375 0.4062 +0.3438 0.9375 0.4375 +0.3438 0.9375 0.4688 +0.3438 0.9375 0.5 +0.3438 0.9375 0.5312 +0.3438 0.9375 0.5625 +0.3438 0.9375 0.5938 +0.3438 0.9375 0.625 +0.3438 0.9375 0.6562 +0.3438 0.9375 0.6875 +0.3438 0.9375 0.7188 +0.3438 0.9375 0.75 +0.3438 0.9375 0.7812 +0.3438 0.9375 0.8125 +0.3438 0.9375 0.8438 +0.3438 0.9375 0.875 +0.3438 0.9375 0.9062 +0.3438 0.9375 0.9375 +0.3438 0.9375 0.9688 +0.3438 0.9375 1 +0.3438 0.9688 0 +0.3438 0.9688 0.03125 +0.3438 0.9688 0.0625 +0.3438 0.9688 0.09375 +0.3438 0.9688 0.125 +0.3438 0.9688 0.1562 +0.3438 0.9688 0.1875 +0.3438 0.9688 0.2188 +0.3438 0.9688 0.25 +0.3438 0.9688 0.2812 +0.3438 0.9688 0.3125 +0.3438 0.9688 0.3438 +0.3438 0.9688 0.375 +0.3438 0.9688 0.4062 +0.3438 0.9688 0.4375 +0.3438 0.9688 0.4688 +0.3438 0.9688 0.5 +0.3438 0.9688 0.5312 +0.3438 0.9688 0.5625 +0.3438 0.9688 0.5938 +0.3438 0.9688 0.625 +0.3438 0.9688 0.6562 +0.3438 0.9688 0.6875 +0.3438 0.9688 0.7188 +0.3438 0.9688 0.75 +0.3438 0.9688 0.7812 +0.3438 0.9688 0.8125 +0.3438 0.9688 0.8438 +0.3438 0.9688 0.875 +0.3438 0.9688 0.9062 +0.3438 0.9688 0.9375 +0.3438 0.9688 0.9688 +0.3438 0.9688 1 +0.3438 1 0 +0.3438 1 0.03125 +0.3438 1 0.0625 +0.3438 1 0.09375 +0.3438 1 0.125 +0.3438 1 0.1562 +0.3438 1 0.1875 +0.3438 1 0.2188 +0.3438 1 0.25 +0.3438 1 0.2812 +0.3438 1 0.3125 +0.3438 1 0.3438 +0.3438 1 0.375 +0.3438 1 0.4062 +0.3438 1 0.4375 +0.3438 1 0.4688 +0.3438 1 0.5 +0.3438 1 0.5312 +0.3438 1 0.5625 +0.3438 1 0.5938 +0.3438 1 0.625 +0.3438 1 0.6562 +0.3438 1 0.6875 +0.3438 1 0.7188 +0.3438 1 0.75 +0.3438 1 0.7812 +0.3438 1 0.8125 +0.3438 1 0.8438 +0.3438 1 0.875 +0.3438 1 0.9062 +0.3438 1 0.9375 +0.3438 1 0.9688 +0.3438 1 1 +0.375 0 0 +0.375 0 0.03125 +0.375 0 0.0625 +0.375 0 0.09375 +0.375 0 0.125 +0.375 0 0.1562 +0.375 0 0.1875 +0.375 0 0.2188 +0.375 0 0.25 +0.375 0 0.2812 +0.375 0 0.3125 +0.375 0 0.3438 +0.375 0 0.375 +0.375 0 0.4062 +0.375 0 0.4375 +0.375 0 0.4688 +0.375 0 0.5 +0.375 0 0.5312 +0.375 0 0.5625 +0.375 0 0.5938 +0.375 0 0.625 +0.375 0 0.6562 +0.375 0 0.6875 +0.375 0 0.7188 +0.375 0 0.75 +0.375 0 0.7812 +0.375 0 0.8125 +0.375 0 0.8438 +0.375 0 0.875 +0.375 0 0.9062 +0.375 0 0.9375 +0.375 0 0.9688 +0.375 0 1 +0.375 0.03125 0 +0.375 0.03125 0.03125 +0.375 0.03125 0.0625 +0.375 0.03125 0.09375 +0.375 0.03125 0.125 +0.375 0.03125 0.1562 +0.375 0.03125 0.1875 +0.375 0.03125 0.2188 +0.375 0.03125 0.25 +0.375 0.03125 0.2812 +0.375 0.03125 0.3125 +0.375 0.03125 0.3438 +0.375 0.03125 0.375 +0.375 0.03125 0.4062 +0.375 0.03125 0.4375 +0.375 0.03125 0.4688 +0.375 0.03125 0.5 +0.375 0.03125 0.5312 +0.375 0.03125 0.5625 +0.375 0.03125 0.5938 +0.375 0.03125 0.625 +0.375 0.03125 0.6562 +0.375 0.03125 0.6875 +0.375 0.03125 0.7188 +0.375 0.03125 0.75 +0.375 0.03125 0.7812 +0.375 0.03125 0.8125 +0.375 0.03125 0.8438 +0.375 0.03125 0.875 +0.375 0.03125 0.9062 +0.375 0.03125 0.9375 +0.375 0.03125 0.9688 +0.375 0.03125 1 +0.375 0.0625 0 +0.375 0.0625 0.03125 +0.375 0.0625 0.0625 +0.375 0.0625 0.09375 +0.375 0.0625 0.125 +0.375 0.0625 0.1562 +0.375 0.0625 0.1875 +0.375 0.0625 0.2188 +0.375 0.0625 0.25 +0.375 0.0625 0.2812 +0.375 0.0625 0.3125 +0.375 0.0625 0.3438 +0.375 0.0625 0.375 +0.375 0.0625 0.4062 +0.375 0.0625 0.4375 +0.375 0.0625 0.4688 +0.375 0.0625 0.5 +0.375 0.0625 0.5312 +0.375 0.0625 0.5625 +0.375 0.0625 0.5938 +0.375 0.0625 0.625 +0.375 0.0625 0.6562 +0.375 0.0625 0.6875 +0.375 0.0625 0.7188 +0.375 0.0625 0.75 +0.375 0.0625 0.7812 +0.375 0.0625 0.8125 +0.375 0.0625 0.8438 +0.375 0.0625 0.875 +0.375 0.0625 0.9062 +0.375 0.0625 0.9375 +0.375 0.0625 0.9688 +0.375 0.0625 1 +0.375 0.09375 0 +0.375 0.09375 0.03125 +0.375 0.09375 0.0625 +0.375 0.09375 0.09375 +0.375 0.09375 0.125 +0.375 0.09375 0.1562 +0.375 0.09375 0.1875 +0.375 0.09375 0.2188 +0.375 0.09375 0.25 +0.375 0.09375 0.2812 +0.375 0.09375 0.3125 +0.375 0.09375 0.3438 +0.375 0.09375 0.375 +0.375 0.09375 0.4062 +0.375 0.09375 0.4375 +0.375 0.09375 0.4688 +0.375 0.09375 0.5 +0.375 0.09375 0.5312 +0.375 0.09375 0.5625 +0.375 0.09375 0.5938 +0.375 0.09375 0.625 +0.375 0.09375 0.6562 +0.375 0.09375 0.6875 +0.375 0.09375 0.7188 +0.375 0.09375 0.75 +0.375 0.09375 0.7812 +0.375 0.09375 0.8125 +0.375 0.09375 0.8438 +0.375 0.09375 0.875 +0.375 0.09375 0.9062 +0.375 0.09375 0.9375 +0.375 0.09375 0.9688 +0.375 0.09375 1 +0.375 0.125 0 +0.375 0.125 0.03125 +0.375 0.125 0.0625 +0.375 0.125 0.09375 +0.375 0.125 0.125 +0.375 0.125 0.1562 +0.375 0.125 0.1875 +0.375 0.125 0.2188 +0.375 0.125 0.25 +0.375 0.125 0.2812 +0.375 0.125 0.3125 +0.375 0.125 0.3438 +0.375 0.125 0.375 +0.375 0.125 0.4062 +0.375 0.125 0.4375 +0.375 0.125 0.4688 +0.375 0.125 0.5 +0.375 0.125 0.5312 +0.375 0.125 0.5625 +0.375 0.125 0.5938 +0.375 0.125 0.625 +0.375 0.125 0.6562 +0.375 0.125 0.6875 +0.375 0.125 0.7188 +0.375 0.125 0.75 +0.375 0.125 0.7812 +0.375 0.125 0.8125 +0.375 0.125 0.8438 +0.375 0.125 0.875 +0.375 0.125 0.9062 +0.375 0.125 0.9375 +0.375 0.125 0.9688 +0.375 0.125 1 +0.375 0.1562 0 +0.375 0.1562 0.03125 +0.375 0.1562 0.0625 +0.375 0.1562 0.09375 +0.375 0.1562 0.125 +0.375 0.1562 0.1562 +0.375 0.1562 0.1875 +0.375 0.1562 0.2188 +0.375 0.1562 0.25 +0.375 0.1562 0.2812 +0.375 0.1562 0.3125 +0.375 0.1562 0.3438 +0.375 0.1562 0.375 +0.375 0.1562 0.4062 +0.375 0.1562 0.4375 +0.375 0.1562 0.4688 +0.375 0.1562 0.5 +0.375 0.1562 0.5312 +0.375 0.1562 0.5625 +0.375 0.1562 0.5938 +0.375 0.1562 0.625 +0.375 0.1562 0.6562 +0.375 0.1562 0.6875 +0.375 0.1562 0.7188 +0.375 0.1562 0.75 +0.375 0.1562 0.7812 +0.375 0.1562 0.8125 +0.375 0.1562 0.8438 +0.375 0.1562 0.875 +0.375 0.1562 0.9062 +0.375 0.1562 0.9375 +0.375 0.1562 0.9688 +0.375 0.1562 1 +0.375 0.1875 0 +0.375 0.1875 0.03125 +0.375 0.1875 0.0625 +0.375 0.1875 0.09375 +0.375 0.1875 0.125 +0.375 0.1875 0.1562 +0.375 0.1875 0.1875 +0.375 0.1875 0.2188 +0.375 0.1875 0.25 +0.375 0.1875 0.2812 +0.375 0.1875 0.3125 +0.375 0.1875 0.3438 +0.375 0.1875 0.375 +0.375 0.1875 0.4062 +0.375 0.1875 0.4375 +0.375 0.1875 0.4688 +0.375 0.1875 0.5 +0.375 0.1875 0.5312 +0.375 0.1875 0.5625 +0.375 0.1875 0.5938 +0.375 0.1875 0.625 +0.375 0.1875 0.6562 +0.375 0.1875 0.6875 +0.375 0.1875 0.7188 +0.375 0.1875 0.75 +0.375 0.1875 0.7812 +0.375 0.1875 0.8125 +0.375 0.1875 0.8438 +0.375 0.1875 0.875 +0.375 0.1875 0.9062 +0.375 0.1875 0.9375 +0.375 0.1875 0.9688 +0.375 0.1875 1 +0.375 0.2188 0 +0.375 0.2188 0.03125 +0.375 0.2188 0.0625 +0.375 0.2188 0.09375 +0.375 0.2188 0.125 +0.375 0.2188 0.1562 +0.375 0.2188 0.1875 +0.375 0.2188 0.2188 +0.375 0.2188 0.25 +0.375 0.2188 0.2812 +0.375 0.2188 0.3125 +0.375 0.2188 0.3438 +0.375 0.2188 0.375 +0.375 0.2188 0.4062 +0.375 0.2188 0.4375 +0.375 0.2188 0.4688 +0.375 0.2188 0.5 +0.375 0.2188 0.5312 +0.375 0.2188 0.5625 +0.375 0.2188 0.5938 +0.375 0.2188 0.625 +0.375 0.2188 0.6562 +0.375 0.2188 0.6875 +0.375 0.2188 0.7188 +0.375 0.2188 0.75 +0.375 0.2188 0.7812 +0.375 0.2188 0.8125 +0.375 0.2188 0.8438 +0.375 0.2188 0.875 +0.375 0.2188 0.9062 +0.375 0.2188 0.9375 +0.375 0.2188 0.9688 +0.375 0.2188 1 +0.375 0.25 0 +0.375 0.25 0.03125 +0.375 0.25 0.0625 +0.375 0.25 0.09375 +0.375 0.25 0.125 +0.375 0.25 0.1562 +0.375 0.25 0.1875 +0.375 0.25 0.2188 +0.375 0.25 0.25 +0.375 0.25 0.2812 +0.375 0.25 0.3125 +0.375 0.25 0.3438 +0.375 0.25 0.375 +0.375 0.25 0.4062 +0.375 0.25 0.4375 +0.375 0.25 0.4688 +0.375 0.25 0.5 +0.375 0.25 0.5312 +0.375 0.25 0.5625 +0.375 0.25 0.5938 +0.375 0.25 0.625 +0.375 0.25 0.6562 +0.375 0.25 0.6875 +0.375 0.25 0.7188 +0.375 0.25 0.75 +0.375 0.25 0.7812 +0.375 0.25 0.8125 +0.375 0.25 0.8438 +0.375 0.25 0.875 +0.375 0.25 0.9062 +0.375 0.25 0.9375 +0.375 0.25 0.9688 +0.375 0.25 1 +0.375 0.2812 0 +0.375 0.2812 0.03125 +0.375 0.2812 0.0625 +0.375 0.2812 0.09375 +0.375 0.2812 0.125 +0.375 0.2812 0.1562 +0.375 0.2812 0.1875 +0.375 0.2812 0.2188 +0.375 0.2812 0.25 +0.375 0.2812 0.2812 +0.375 0.2812 0.3125 +0.375 0.2812 0.3438 +0.375 0.2812 0.375 +0.375 0.2812 0.4062 +0.375 0.2812 0.4375 +0.375 0.2812 0.4688 +0.375 0.2812 0.5 +0.375 0.2812 0.5312 +0.375 0.2812 0.5625 +0.375 0.2812 0.5938 +0.375 0.2812 0.625 +0.375 0.2812 0.6562 +0.375 0.2812 0.6875 +0.375 0.2812 0.7188 +0.375 0.2812 0.75 +0.375 0.2812 0.7812 +0.375 0.2812 0.8125 +0.375 0.2812 0.8438 +0.375 0.2812 0.875 +0.375 0.2812 0.9062 +0.375 0.2812 0.9375 +0.375 0.2812 0.9688 +0.375 0.2812 1 +0.375 0.3125 0 +0.375 0.3125 0.03125 +0.375 0.3125 0.0625 +0.375 0.3125 0.09375 +0.375 0.3125 0.125 +0.375 0.3125 0.1562 +0.375 0.3125 0.1875 +0.375 0.3125 0.2188 +0.375 0.3125 0.25 +0.375 0.3125 0.2812 +0.375 0.3125 0.3125 +0.375 0.3125 0.3438 +0.375 0.3125 0.375 +0.375 0.3125 0.4062 +0.375 0.3125 0.4375 +0.375 0.3125 0.4688 +0.375 0.3125 0.5 +0.375 0.3125 0.5312 +0.375 0.3125 0.5625 +0.375 0.3125 0.5938 +0.375 0.3125 0.625 +0.375 0.3125 0.6562 +0.375 0.3125 0.6875 +0.375 0.3125 0.7188 +0.375 0.3125 0.75 +0.375 0.3125 0.7812 +0.375 0.3125 0.8125 +0.375 0.3125 0.8438 +0.375 0.3125 0.875 +0.375 0.3125 0.9062 +0.375 0.3125 0.9375 +0.375 0.3125 0.9688 +0.375 0.3125 1 +0.375 0.3438 0 +0.375 0.3438 0.03125 +0.375 0.3438 0.0625 +0.375 0.3438 0.09375 +0.375 0.3438 0.125 +0.375 0.3438 0.1562 +0.375 0.3438 0.1875 +0.375 0.3438 0.2188 +0.375 0.3438 0.25 +0.375 0.3438 0.2812 +0.375 0.3438 0.3125 +0.375 0.3438 0.3438 +0.375 0.3438 0.375 +0.375 0.3438 0.4062 +0.375 0.3438 0.4375 +0.375 0.3438 0.4688 +0.375 0.3438 0.5 +0.375 0.3438 0.5312 +0.375 0.3438 0.5625 +0.375 0.3438 0.5938 +0.375 0.3438 0.625 +0.375 0.3438 0.6562 +0.375 0.3438 0.6875 +0.375 0.3438 0.7188 +0.375 0.3438 0.75 +0.375 0.3438 0.7812 +0.375 0.3438 0.8125 +0.375 0.3438 0.8438 +0.375 0.3438 0.875 +0.375 0.3438 0.9062 +0.375 0.3438 0.9375 +0.375 0.3438 0.9688 +0.375 0.3438 1 +0.375 0.375 0 +0.375 0.375 0.03125 +0.375 0.375 0.0625 +0.375 0.375 0.09375 +0.375 0.375 0.125 +0.375 0.375 0.1562 +0.375 0.375 0.1875 +0.375 0.375 0.2188 +0.375 0.375 0.25 +0.375 0.375 0.2812 +0.375 0.375 0.3125 +0.375 0.375 0.3438 +0.375 0.375 0.375 +0.375 0.375 0.4062 +0.375 0.375 0.4375 +0.375 0.375 0.4688 +0.375 0.375 0.5 +0.375 0.375 0.5312 +0.375 0.375 0.5625 +0.375 0.375 0.5938 +0.375 0.375 0.625 +0.375 0.375 0.6562 +0.375 0.375 0.6875 +0.375 0.375 0.7188 +0.375 0.375 0.75 +0.375 0.375 0.7812 +0.375 0.375 0.8125 +0.375 0.375 0.8438 +0.375 0.375 0.875 +0.375 0.375 0.9062 +0.375 0.375 0.9375 +0.375 0.375 0.9688 +0.375 0.375 1 +0.375 0.4062 0 +0.375 0.4062 0.03125 +0.375 0.4062 0.0625 +0.375 0.4062 0.09375 +0.375 0.4062 0.125 +0.375 0.4062 0.1562 +0.375 0.4062 0.1875 +0.375 0.4062 0.2188 +0.375 0.4062 0.25 +0.375 0.4062 0.2812 +0.375 0.4062 0.3125 +0.375 0.4062 0.3438 +0.375 0.4062 0.375 +0.375 0.4062 0.4062 +0.375 0.4062 0.4375 +0.375 0.4062 0.4688 +0.375 0.4062 0.5 +0.375 0.4062 0.5312 +0.375 0.4062 0.5625 +0.375 0.4062 0.5938 +0.375 0.4062 0.625 +0.375 0.4062 0.6562 +0.375 0.4062 0.6875 +0.375 0.4062 0.7188 +0.375 0.4062 0.75 +0.375 0.4062 0.7812 +0.375 0.4062 0.8125 +0.375 0.4062 0.8438 +0.375 0.4062 0.875 +0.375 0.4062 0.9062 +0.375 0.4062 0.9375 +0.375 0.4062 0.9688 +0.375 0.4062 1 +0.375 0.4375 0 +0.375 0.4375 0.03125 +0.375 0.4375 0.0625 +0.375 0.4375 0.09375 +0.375 0.4375 0.125 +0.375 0.4375 0.1562 +0.375 0.4375 0.1875 +0.375 0.4375 0.2188 +0.375 0.4375 0.25 +0.375 0.4375 0.2812 +0.375 0.4375 0.3125 +0.375 0.4375 0.3438 +0.375 0.4375 0.375 +0.375 0.4375 0.4062 +0.375 0.4375 0.4375 +0.375 0.4375 0.4688 +0.375 0.4375 0.5 +0.375 0.4375 0.5312 +0.375 0.4375 0.5625 +0.375 0.4375 0.5938 +0.375 0.4375 0.625 +0.375 0.4375 0.6562 +0.375 0.4375 0.6875 +0.375 0.4375 0.7188 +0.375 0.4375 0.75 +0.375 0.4375 0.7812 +0.375 0.4375 0.8125 +0.375 0.4375 0.8438 +0.375 0.4375 0.875 +0.375 0.4375 0.9062 +0.375 0.4375 0.9375 +0.375 0.4375 0.9688 +0.375 0.4375 1 +0.375 0.4688 0 +0.375 0.4688 0.03125 +0.375 0.4688 0.0625 +0.375 0.4688 0.09375 +0.375 0.4688 0.125 +0.375 0.4688 0.1562 +0.375 0.4688 0.1875 +0.375 0.4688 0.2188 +0.375 0.4688 0.25 +0.375 0.4688 0.2812 +0.375 0.4688 0.3125 +0.375 0.4688 0.3438 +0.375 0.4688 0.375 +0.375 0.4688 0.4062 +0.375 0.4688 0.4375 +0.375 0.4688 0.4688 +0.375 0.4688 0.5 +0.375 0.4688 0.5312 +0.375 0.4688 0.5625 +0.375 0.4688 0.5938 +0.375 0.4688 0.625 +0.375 0.4688 0.6562 +0.375 0.4688 0.6875 +0.375 0.4688 0.7188 +0.375 0.4688 0.75 +0.375 0.4688 0.7812 +0.375 0.4688 0.8125 +0.375 0.4688 0.8438 +0.375 0.4688 0.875 +0.375 0.4688 0.9062 +0.375 0.4688 0.9375 +0.375 0.4688 0.9688 +0.375 0.4688 1 +0.375 0.5 0 +0.375 0.5 0.03125 +0.375 0.5 0.0625 +0.375 0.5 0.09375 +0.375 0.5 0.125 +0.375 0.5 0.1562 +0.375 0.5 0.1875 +0.375 0.5 0.2188 +0.375 0.5 0.25 +0.375 0.5 0.2812 +0.375 0.5 0.3125 +0.375 0.5 0.3438 +0.375 0.5 0.375 +0.375 0.5 0.4062 +0.375 0.5 0.4375 +0.375 0.5 0.4688 +0.375 0.5 0.5 +0.375 0.5 0.5312 +0.375 0.5 0.5625 +0.375 0.5 0.5938 +0.375 0.5 0.625 +0.375 0.5 0.6562 +0.375 0.5 0.6875 +0.375 0.5 0.7188 +0.375 0.5 0.75 +0.375 0.5 0.7812 +0.375 0.5 0.8125 +0.375 0.5 0.8438 +0.375 0.5 0.875 +0.375 0.5 0.9062 +0.375 0.5 0.9375 +0.375 0.5 0.9688 +0.375 0.5 1 +0.375 0.5312 0 +0.375 0.5312 0.03125 +0.375 0.5312 0.0625 +0.375 0.5312 0.09375 +0.375 0.5312 0.125 +0.375 0.5312 0.1562 +0.375 0.5312 0.1875 +0.375 0.5312 0.2188 +0.375 0.5312 0.25 +0.375 0.5312 0.2812 +0.375 0.5312 0.3125 +0.375 0.5312 0.3438 +0.375 0.5312 0.375 +0.375 0.5312 0.4062 +0.375 0.5312 0.4375 +0.375 0.5312 0.4688 +0.375 0.5312 0.5 +0.375 0.5312 0.5312 +0.375 0.5312 0.5625 +0.375 0.5312 0.5938 +0.375 0.5312 0.625 +0.375 0.5312 0.6562 +0.375 0.5312 0.6875 +0.375 0.5312 0.7188 +0.375 0.5312 0.75 +0.375 0.5312 0.7812 +0.375 0.5312 0.8125 +0.375 0.5312 0.8438 +0.375 0.5312 0.875 +0.375 0.5312 0.9062 +0.375 0.5312 0.9375 +0.375 0.5312 0.9688 +0.375 0.5312 1 +0.375 0.5625 0 +0.375 0.5625 0.03125 +0.375 0.5625 0.0625 +0.375 0.5625 0.09375 +0.375 0.5625 0.125 +0.375 0.5625 0.1562 +0.375 0.5625 0.1875 +0.375 0.5625 0.2188 +0.375 0.5625 0.25 +0.375 0.5625 0.2812 +0.375 0.5625 0.3125 +0.375 0.5625 0.3438 +0.375 0.5625 0.375 +0.375 0.5625 0.4062 +0.375 0.5625 0.4375 +0.375 0.5625 0.4688 +0.375 0.5625 0.5 +0.375 0.5625 0.5312 +0.375 0.5625 0.5625 +0.375 0.5625 0.5938 +0.375 0.5625 0.625 +0.375 0.5625 0.6562 +0.375 0.5625 0.6875 +0.375 0.5625 0.7188 +0.375 0.5625 0.75 +0.375 0.5625 0.7812 +0.375 0.5625 0.8125 +0.375 0.5625 0.8438 +0.375 0.5625 0.875 +0.375 0.5625 0.9062 +0.375 0.5625 0.9375 +0.375 0.5625 0.9688 +0.375 0.5625 1 +0.375 0.5938 0 +0.375 0.5938 0.03125 +0.375 0.5938 0.0625 +0.375 0.5938 0.09375 +0.375 0.5938 0.125 +0.375 0.5938 0.1562 +0.375 0.5938 0.1875 +0.375 0.5938 0.2188 +0.375 0.5938 0.25 +0.375 0.5938 0.2812 +0.375 0.5938 0.3125 +0.375 0.5938 0.3438 +0.375 0.5938 0.375 +0.375 0.5938 0.4062 +0.375 0.5938 0.4375 +0.375 0.5938 0.4688 +0.375 0.5938 0.5 +0.375 0.5938 0.5312 +0.375 0.5938 0.5625 +0.375 0.5938 0.5938 +0.375 0.5938 0.625 +0.375 0.5938 0.6562 +0.375 0.5938 0.6875 +0.375 0.5938 0.7188 +0.375 0.5938 0.75 +0.375 0.5938 0.7812 +0.375 0.5938 0.8125 +0.375 0.5938 0.8438 +0.375 0.5938 0.875 +0.375 0.5938 0.9062 +0.375 0.5938 0.9375 +0.375 0.5938 0.9688 +0.375 0.5938 1 +0.375 0.625 0 +0.375 0.625 0.03125 +0.375 0.625 0.0625 +0.375 0.625 0.09375 +0.375 0.625 0.125 +0.375 0.625 0.1562 +0.375 0.625 0.1875 +0.375 0.625 0.2188 +0.375 0.625 0.25 +0.375 0.625 0.2812 +0.375 0.625 0.3125 +0.375 0.625 0.3438 +0.375 0.625 0.375 +0.375 0.625 0.4062 +0.375 0.625 0.4375 +0.375 0.625 0.4688 +0.375 0.625 0.5 +0.375 0.625 0.5312 +0.375 0.625 0.5625 +0.375 0.625 0.5938 +0.375 0.625 0.625 +0.375 0.625 0.6562 +0.375 0.625 0.6875 +0.375 0.625 0.7188 +0.375 0.625 0.75 +0.375 0.625 0.7812 +0.375 0.625 0.8125 +0.375 0.625 0.8438 +0.375 0.625 0.875 +0.375 0.625 0.9062 +0.375 0.625 0.9375 +0.375 0.625 0.9688 +0.375 0.625 1 +0.375 0.6562 0 +0.375 0.6562 0.03125 +0.375 0.6562 0.0625 +0.375 0.6562 0.09375 +0.375 0.6562 0.125 +0.375 0.6562 0.1562 +0.375 0.6562 0.1875 +0.375 0.6562 0.2188 +0.375 0.6562 0.25 +0.375 0.6562 0.2812 +0.375 0.6562 0.3125 +0.375 0.6562 0.3438 +0.375 0.6562 0.375 +0.375 0.6562 0.4062 +0.375 0.6562 0.4375 +0.375 0.6562 0.4688 +0.375 0.6562 0.5 +0.375 0.6562 0.5312 +0.375 0.6562 0.5625 +0.375 0.6562 0.5938 +0.375 0.6562 0.625 +0.375 0.6562 0.6562 +0.375 0.6562 0.6875 +0.375 0.6562 0.7188 +0.375 0.6562 0.75 +0.375 0.6562 0.7812 +0.375 0.6562 0.8125 +0.375 0.6562 0.8438 +0.375 0.6562 0.875 +0.375 0.6562 0.9062 +0.375 0.6562 0.9375 +0.375 0.6562 0.9688 +0.375 0.6562 1 +0.375 0.6875 0 +0.375 0.6875 0.03125 +0.375 0.6875 0.0625 +0.375 0.6875 0.09375 +0.375 0.6875 0.125 +0.375 0.6875 0.1562 +0.375 0.6875 0.1875 +0.375 0.6875 0.2188 +0.375 0.6875 0.25 +0.375 0.6875 0.2812 +0.375 0.6875 0.3125 +0.375 0.6875 0.3438 +0.375 0.6875 0.375 +0.375 0.6875 0.4062 +0.375 0.6875 0.4375 +0.375 0.6875 0.4688 +0.375 0.6875 0.5 +0.375 0.6875 0.5312 +0.375 0.6875 0.5625 +0.375 0.6875 0.5938 +0.375 0.6875 0.625 +0.375 0.6875 0.6562 +0.375 0.6875 0.6875 +0.375 0.6875 0.7188 +0.375 0.6875 0.75 +0.375 0.6875 0.7812 +0.375 0.6875 0.8125 +0.375 0.6875 0.8438 +0.375 0.6875 0.875 +0.375 0.6875 0.9062 +0.375 0.6875 0.9375 +0.375 0.6875 0.9688 +0.375 0.6875 1 +0.375 0.7188 0 +0.375 0.7188 0.03125 +0.375 0.7188 0.0625 +0.375 0.7188 0.09375 +0.375 0.7188 0.125 +0.375 0.7188 0.1562 +0.375 0.7188 0.1875 +0.375 0.7188 0.2188 +0.375 0.7188 0.25 +0.375 0.7188 0.2812 +0.375 0.7188 0.3125 +0.375 0.7188 0.3438 +0.375 0.7188 0.375 +0.375 0.7188 0.4062 +0.375 0.7188 0.4375 +0.375 0.7188 0.4688 +0.375 0.7188 0.5 +0.375 0.7188 0.5312 +0.375 0.7188 0.5625 +0.375 0.7188 0.5938 +0.375 0.7188 0.625 +0.375 0.7188 0.6562 +0.375 0.7188 0.6875 +0.375 0.7188 0.7188 +0.375 0.7188 0.75 +0.375 0.7188 0.7812 +0.375 0.7188 0.8125 +0.375 0.7188 0.8438 +0.375 0.7188 0.875 +0.375 0.7188 0.9062 +0.375 0.7188 0.9375 +0.375 0.7188 0.9688 +0.375 0.7188 1 +0.375 0.75 0 +0.375 0.75 0.03125 +0.375 0.75 0.0625 +0.375 0.75 0.09375 +0.375 0.75 0.125 +0.375 0.75 0.1562 +0.375 0.75 0.1875 +0.375 0.75 0.2188 +0.375 0.75 0.25 +0.375 0.75 0.2812 +0.375 0.75 0.3125 +0.375 0.75 0.3438 +0.375 0.75 0.375 +0.375 0.75 0.4062 +0.375 0.75 0.4375 +0.375 0.75 0.4688 +0.375 0.75 0.5 +0.375 0.75 0.5312 +0.375 0.75 0.5625 +0.375 0.75 0.5938 +0.375 0.75 0.625 +0.375 0.75 0.6562 +0.375 0.75 0.6875 +0.375 0.75 0.7188 +0.375 0.75 0.75 +0.375 0.75 0.7812 +0.375 0.75 0.8125 +0.375 0.75 0.8438 +0.375 0.75 0.875 +0.375 0.75 0.9062 +0.375 0.75 0.9375 +0.375 0.75 0.9688 +0.375 0.75 1 +0.375 0.7812 0 +0.375 0.7812 0.03125 +0.375 0.7812 0.0625 +0.375 0.7812 0.09375 +0.375 0.7812 0.125 +0.375 0.7812 0.1562 +0.375 0.7812 0.1875 +0.375 0.7812 0.2188 +0.375 0.7812 0.25 +0.375 0.7812 0.2812 +0.375 0.7812 0.3125 +0.375 0.7812 0.3438 +0.375 0.7812 0.375 +0.375 0.7812 0.4062 +0.375 0.7812 0.4375 +0.375 0.7812 0.4688 +0.375 0.7812 0.5 +0.375 0.7812 0.5312 +0.375 0.7812 0.5625 +0.375 0.7812 0.5938 +0.375 0.7812 0.625 +0.375 0.7812 0.6562 +0.375 0.7812 0.6875 +0.375 0.7812 0.7188 +0.375 0.7812 0.75 +0.375 0.7812 0.7812 +0.375 0.7812 0.8125 +0.375 0.7812 0.8438 +0.375 0.7812 0.875 +0.375 0.7812 0.9062 +0.375 0.7812 0.9375 +0.375 0.7812 0.9688 +0.375 0.7812 1 +0.375 0.8125 0 +0.375 0.8125 0.03125 +0.375 0.8125 0.0625 +0.375 0.8125 0.09375 +0.375 0.8125 0.125 +0.375 0.8125 0.1562 +0.375 0.8125 0.1875 +0.375 0.8125 0.2188 +0.375 0.8125 0.25 +0.375 0.8125 0.2812 +0.375 0.8125 0.3125 +0.375 0.8125 0.3438 +0.375 0.8125 0.375 +0.375 0.8125 0.4062 +0.375 0.8125 0.4375 +0.375 0.8125 0.4688 +0.375 0.8125 0.5 +0.375 0.8125 0.5312 +0.375 0.8125 0.5625 +0.375 0.8125 0.5938 +0.375 0.8125 0.625 +0.375 0.8125 0.6562 +0.375 0.8125 0.6875 +0.375 0.8125 0.7188 +0.375 0.8125 0.75 +0.375 0.8125 0.7812 +0.375 0.8125 0.8125 +0.375 0.8125 0.8438 +0.375 0.8125 0.875 +0.375 0.8125 0.9062 +0.375 0.8125 0.9375 +0.375 0.8125 0.9688 +0.375 0.8125 1 +0.375 0.8438 0 +0.375 0.8438 0.03125 +0.375 0.8438 0.0625 +0.375 0.8438 0.09375 +0.375 0.8438 0.125 +0.375 0.8438 0.1562 +0.375 0.8438 0.1875 +0.375 0.8438 0.2188 +0.375 0.8438 0.25 +0.375 0.8438 0.2812 +0.375 0.8438 0.3125 +0.375 0.8438 0.3438 +0.375 0.8438 0.375 +0.375 0.8438 0.4062 +0.375 0.8438 0.4375 +0.375 0.8438 0.4688 +0.375 0.8438 0.5 +0.375 0.8438 0.5312 +0.375 0.8438 0.5625 +0.375 0.8438 0.5938 +0.375 0.8438 0.625 +0.375 0.8438 0.6562 +0.375 0.8438 0.6875 +0.375 0.8438 0.7188 +0.375 0.8438 0.75 +0.375 0.8438 0.7812 +0.375 0.8438 0.8125 +0.375 0.8438 0.8438 +0.375 0.8438 0.875 +0.375 0.8438 0.9062 +0.375 0.8438 0.9375 +0.375 0.8438 0.9688 +0.375 0.8438 1 +0.375 0.875 0 +0.375 0.875 0.03125 +0.375 0.875 0.0625 +0.375 0.875 0.09375 +0.375 0.875 0.125 +0.375 0.875 0.1562 +0.375 0.875 0.1875 +0.375 0.875 0.2188 +0.375 0.875 0.25 +0.375 0.875 0.2812 +0.375 0.875 0.3125 +0.375 0.875 0.3438 +0.375 0.875 0.375 +0.375 0.875 0.4062 +0.375 0.875 0.4375 +0.375 0.875 0.4688 +0.375 0.875 0.5 +0.375 0.875 0.5312 +0.375 0.875 0.5625 +0.375 0.875 0.5938 +0.375 0.875 0.625 +0.375 0.875 0.6562 +0.375 0.875 0.6875 +0.375 0.875 0.7188 +0.375 0.875 0.75 +0.375 0.875 0.7812 +0.375 0.875 0.8125 +0.375 0.875 0.8438 +0.375 0.875 0.875 +0.375 0.875 0.9062 +0.375 0.875 0.9375 +0.375 0.875 0.9688 +0.375 0.875 1 +0.375 0.9062 0 +0.375 0.9062 0.03125 +0.375 0.9062 0.0625 +0.375 0.9062 0.09375 +0.375 0.9062 0.125 +0.375 0.9062 0.1562 +0.375 0.9062 0.1875 +0.375 0.9062 0.2188 +0.375 0.9062 0.25 +0.375 0.9062 0.2812 +0.375 0.9062 0.3125 +0.375 0.9062 0.3438 +0.375 0.9062 0.375 +0.375 0.9062 0.4062 +0.375 0.9062 0.4375 +0.375 0.9062 0.4688 +0.375 0.9062 0.5 +0.375 0.9062 0.5312 +0.375 0.9062 0.5625 +0.375 0.9062 0.5938 +0.375 0.9062 0.625 +0.375 0.9062 0.6562 +0.375 0.9062 0.6875 +0.375 0.9062 0.7188 +0.375 0.9062 0.75 +0.375 0.9062 0.7812 +0.375 0.9062 0.8125 +0.375 0.9062 0.8438 +0.375 0.9062 0.875 +0.375 0.9062 0.9062 +0.375 0.9062 0.9375 +0.375 0.9062 0.9688 +0.375 0.9062 1 +0.375 0.9375 0 +0.375 0.9375 0.03125 +0.375 0.9375 0.0625 +0.375 0.9375 0.09375 +0.375 0.9375 0.125 +0.375 0.9375 0.1562 +0.375 0.9375 0.1875 +0.375 0.9375 0.2188 +0.375 0.9375 0.25 +0.375 0.9375 0.2812 +0.375 0.9375 0.3125 +0.375 0.9375 0.3438 +0.375 0.9375 0.375 +0.375 0.9375 0.4062 +0.375 0.9375 0.4375 +0.375 0.9375 0.4688 +0.375 0.9375 0.5 +0.375 0.9375 0.5312 +0.375 0.9375 0.5625 +0.375 0.9375 0.5938 +0.375 0.9375 0.625 +0.375 0.9375 0.6562 +0.375 0.9375 0.6875 +0.375 0.9375 0.7188 +0.375 0.9375 0.75 +0.375 0.9375 0.7812 +0.375 0.9375 0.8125 +0.375 0.9375 0.8438 +0.375 0.9375 0.875 +0.375 0.9375 0.9062 +0.375 0.9375 0.9375 +0.375 0.9375 0.9688 +0.375 0.9375 1 +0.375 0.9688 0 +0.375 0.9688 0.03125 +0.375 0.9688 0.0625 +0.375 0.9688 0.09375 +0.375 0.9688 0.125 +0.375 0.9688 0.1562 +0.375 0.9688 0.1875 +0.375 0.9688 0.2188 +0.375 0.9688 0.25 +0.375 0.9688 0.2812 +0.375 0.9688 0.3125 +0.375 0.9688 0.3438 +0.375 0.9688 0.375 +0.375 0.9688 0.4062 +0.375 0.9688 0.4375 +0.375 0.9688 0.4688 +0.375 0.9688 0.5 +0.375 0.9688 0.5312 +0.375 0.9688 0.5625 +0.375 0.9688 0.5938 +0.375 0.9688 0.625 +0.375 0.9688 0.6562 +0.375 0.9688 0.6875 +0.375 0.9688 0.7188 +0.375 0.9688 0.75 +0.375 0.9688 0.7812 +0.375 0.9688 0.8125 +0.375 0.9688 0.8438 +0.375 0.9688 0.875 +0.375 0.9688 0.9062 +0.375 0.9688 0.9375 +0.375 0.9688 0.9688 +0.375 0.9688 1 +0.375 1 0 +0.375 1 0.03125 +0.375 1 0.0625 +0.375 1 0.09375 +0.375 1 0.125 +0.375 1 0.1562 +0.375 1 0.1875 +0.375 1 0.2188 +0.375 1 0.25 +0.375 1 0.2812 +0.375 1 0.3125 +0.375 1 0.3438 +0.375 1 0.375 +0.375 1 0.4062 +0.375 1 0.4375 +0.375 1 0.4688 +0.375 1 0.5 +0.375 1 0.5312 +0.375 1 0.5625 +0.375 1 0.5938 +0.375 1 0.625 +0.375 1 0.6562 +0.375 1 0.6875 +0.375 1 0.7188 +0.375 1 0.75 +0.375 1 0.7812 +0.375 1 0.8125 +0.375 1 0.8438 +0.375 1 0.875 +0.375 1 0.9062 +0.375 1 0.9375 +0.375 1 0.9688 +0.375 1 1 +0.4062 0 0 +0.4062 0 0.03125 +0.4062 0 0.0625 +0.4062 0 0.09375 +0.4062 0 0.125 +0.4062 0 0.1562 +0.4062 0 0.1875 +0.4062 0 0.2188 +0.4062 0 0.25 +0.4062 0 0.2812 +0.4062 0 0.3125 +0.4062 0 0.3438 +0.4062 0 0.375 +0.4062 0 0.4062 +0.4062 0 0.4375 +0.4062 0 0.4688 +0.4062 0 0.5 +0.4062 0 0.5312 +0.4062 0 0.5625 +0.4062 0 0.5938 +0.4062 0 0.625 +0.4062 0 0.6562 +0.4062 0 0.6875 +0.4062 0 0.7188 +0.4062 0 0.75 +0.4062 0 0.7812 +0.4062 0 0.8125 +0.4062 0 0.8438 +0.4062 0 0.875 +0.4062 0 0.9062 +0.4062 0 0.9375 +0.4062 0 0.9688 +0.4062 0 1 +0.4062 0.03125 0 +0.4062 0.03125 0.03125 +0.4062 0.03125 0.0625 +0.4062 0.03125 0.09375 +0.4062 0.03125 0.125 +0.4062 0.03125 0.1562 +0.4062 0.03125 0.1875 +0.4062 0.03125 0.2188 +0.4062 0.03125 0.25 +0.4062 0.03125 0.2812 +0.4062 0.03125 0.3125 +0.4062 0.03125 0.3438 +0.4062 0.03125 0.375 +0.4062 0.03125 0.4062 +0.4062 0.03125 0.4375 +0.4062 0.03125 0.4688 +0.4062 0.03125 0.5 +0.4062 0.03125 0.5312 +0.4062 0.03125 0.5625 +0.4062 0.03125 0.5938 +0.4062 0.03125 0.625 +0.4062 0.03125 0.6562 +0.4062 0.03125 0.6875 +0.4062 0.03125 0.7188 +0.4062 0.03125 0.75 +0.4062 0.03125 0.7812 +0.4062 0.03125 0.8125 +0.4062 0.03125 0.8438 +0.4062 0.03125 0.875 +0.4062 0.03125 0.9062 +0.4062 0.03125 0.9375 +0.4062 0.03125 0.9688 +0.4062 0.03125 1 +0.4062 0.0625 0 +0.4062 0.0625 0.03125 +0.4062 0.0625 0.0625 +0.4062 0.0625 0.09375 +0.4062 0.0625 0.125 +0.4062 0.0625 0.1562 +0.4062 0.0625 0.1875 +0.4062 0.0625 0.2188 +0.4062 0.0625 0.25 +0.4062 0.0625 0.2812 +0.4062 0.0625 0.3125 +0.4062 0.0625 0.3438 +0.4062 0.0625 0.375 +0.4062 0.0625 0.4062 +0.4062 0.0625 0.4375 +0.4062 0.0625 0.4688 +0.4062 0.0625 0.5 +0.4062 0.0625 0.5312 +0.4062 0.0625 0.5625 +0.4062 0.0625 0.5938 +0.4062 0.0625 0.625 +0.4062 0.0625 0.6562 +0.4062 0.0625 0.6875 +0.4062 0.0625 0.7188 +0.4062 0.0625 0.75 +0.4062 0.0625 0.7812 +0.4062 0.0625 0.8125 +0.4062 0.0625 0.8438 +0.4062 0.0625 0.875 +0.4062 0.0625 0.9062 +0.4062 0.0625 0.9375 +0.4062 0.0625 0.9688 +0.4062 0.0625 1 +0.4062 0.09375 0 +0.4062 0.09375 0.03125 +0.4062 0.09375 0.0625 +0.4062 0.09375 0.09375 +0.4062 0.09375 0.125 +0.4062 0.09375 0.1562 +0.4062 0.09375 0.1875 +0.4062 0.09375 0.2188 +0.4062 0.09375 0.25 +0.4062 0.09375 0.2812 +0.4062 0.09375 0.3125 +0.4062 0.09375 0.3438 +0.4062 0.09375 0.375 +0.4062 0.09375 0.4062 +0.4062 0.09375 0.4375 +0.4062 0.09375 0.4688 +0.4062 0.09375 0.5 +0.4062 0.09375 0.5312 +0.4062 0.09375 0.5625 +0.4062 0.09375 0.5938 +0.4062 0.09375 0.625 +0.4062 0.09375 0.6562 +0.4062 0.09375 0.6875 +0.4062 0.09375 0.7188 +0.4062 0.09375 0.75 +0.4062 0.09375 0.7812 +0.4062 0.09375 0.8125 +0.4062 0.09375 0.8438 +0.4062 0.09375 0.875 +0.4062 0.09375 0.9062 +0.4062 0.09375 0.9375 +0.4062 0.09375 0.9688 +0.4062 0.09375 1 +0.4062 0.125 0 +0.4062 0.125 0.03125 +0.4062 0.125 0.0625 +0.4062 0.125 0.09375 +0.4062 0.125 0.125 +0.4062 0.125 0.1562 +0.4062 0.125 0.1875 +0.4062 0.125 0.2188 +0.4062 0.125 0.25 +0.4062 0.125 0.2812 +0.4062 0.125 0.3125 +0.4062 0.125 0.3438 +0.4062 0.125 0.375 +0.4062 0.125 0.4062 +0.4062 0.125 0.4375 +0.4062 0.125 0.4688 +0.4062 0.125 0.5 +0.4062 0.125 0.5312 +0.4062 0.125 0.5625 +0.4062 0.125 0.5938 +0.4062 0.125 0.625 +0.4062 0.125 0.6562 +0.4062 0.125 0.6875 +0.4062 0.125 0.7188 +0.4062 0.125 0.75 +0.4062 0.125 0.7812 +0.4062 0.125 0.8125 +0.4062 0.125 0.8438 +0.4062 0.125 0.875 +0.4062 0.125 0.9062 +0.4062 0.125 0.9375 +0.4062 0.125 0.9688 +0.4062 0.125 1 +0.4062 0.1562 0 +0.4062 0.1562 0.03125 +0.4062 0.1562 0.0625 +0.4062 0.1562 0.09375 +0.4062 0.1562 0.125 +0.4062 0.1562 0.1562 +0.4062 0.1562 0.1875 +0.4062 0.1562 0.2188 +0.4062 0.1562 0.25 +0.4062 0.1562 0.2812 +0.4062 0.1562 0.3125 +0.4062 0.1562 0.3438 +0.4062 0.1562 0.375 +0.4062 0.1562 0.4062 +0.4062 0.1562 0.4375 +0.4062 0.1562 0.4688 +0.4062 0.1562 0.5 +0.4062 0.1562 0.5312 +0.4062 0.1562 0.5625 +0.4062 0.1562 0.5938 +0.4062 0.1562 0.625 +0.4062 0.1562 0.6562 +0.4062 0.1562 0.6875 +0.4062 0.1562 0.7188 +0.4062 0.1562 0.75 +0.4062 0.1562 0.7812 +0.4062 0.1562 0.8125 +0.4062 0.1562 0.8438 +0.4062 0.1562 0.875 +0.4062 0.1562 0.9062 +0.4062 0.1562 0.9375 +0.4062 0.1562 0.9688 +0.4062 0.1562 1 +0.4062 0.1875 0 +0.4062 0.1875 0.03125 +0.4062 0.1875 0.0625 +0.4062 0.1875 0.09375 +0.4062 0.1875 0.125 +0.4062 0.1875 0.1562 +0.4062 0.1875 0.1875 +0.4062 0.1875 0.2188 +0.4062 0.1875 0.25 +0.4062 0.1875 0.2812 +0.4062 0.1875 0.3125 +0.4062 0.1875 0.3438 +0.4062 0.1875 0.375 +0.4062 0.1875 0.4062 +0.4062 0.1875 0.4375 +0.4062 0.1875 0.4688 +0.4062 0.1875 0.5 +0.4062 0.1875 0.5312 +0.4062 0.1875 0.5625 +0.4062 0.1875 0.5938 +0.4062 0.1875 0.625 +0.4062 0.1875 0.6562 +0.4062 0.1875 0.6875 +0.4062 0.1875 0.7188 +0.4062 0.1875 0.75 +0.4062 0.1875 0.7812 +0.4062 0.1875 0.8125 +0.4062 0.1875 0.8438 +0.4062 0.1875 0.875 +0.4062 0.1875 0.9062 +0.4062 0.1875 0.9375 +0.4062 0.1875 0.9688 +0.4062 0.1875 1 +0.4062 0.2188 0 +0.4062 0.2188 0.03125 +0.4062 0.2188 0.0625 +0.4062 0.2188 0.09375 +0.4062 0.2188 0.125 +0.4062 0.2188 0.1562 +0.4062 0.2188 0.1875 +0.4062 0.2188 0.2188 +0.4062 0.2188 0.25 +0.4062 0.2188 0.2812 +0.4062 0.2188 0.3125 +0.4062 0.2188 0.3438 +0.4062 0.2188 0.375 +0.4062 0.2188 0.4062 +0.4062 0.2188 0.4375 +0.4062 0.2188 0.4688 +0.4062 0.2188 0.5 +0.4062 0.2188 0.5312 +0.4062 0.2188 0.5625 +0.4062 0.2188 0.5938 +0.4062 0.2188 0.625 +0.4062 0.2188 0.6562 +0.4062 0.2188 0.6875 +0.4062 0.2188 0.7188 +0.4062 0.2188 0.75 +0.4062 0.2188 0.7812 +0.4062 0.2188 0.8125 +0.4062 0.2188 0.8438 +0.4062 0.2188 0.875 +0.4062 0.2188 0.9062 +0.4062 0.2188 0.9375 +0.4062 0.2188 0.9688 +0.4062 0.2188 1 +0.4062 0.25 0 +0.4062 0.25 0.03125 +0.4062 0.25 0.0625 +0.4062 0.25 0.09375 +0.4062 0.25 0.125 +0.4062 0.25 0.1562 +0.4062 0.25 0.1875 +0.4062 0.25 0.2188 +0.4062 0.25 0.25 +0.4062 0.25 0.2812 +0.4062 0.25 0.3125 +0.4062 0.25 0.3438 +0.4062 0.25 0.375 +0.4062 0.25 0.4062 +0.4062 0.25 0.4375 +0.4062 0.25 0.4688 +0.4062 0.25 0.5 +0.4062 0.25 0.5312 +0.4062 0.25 0.5625 +0.4062 0.25 0.5938 +0.4062 0.25 0.625 +0.4062 0.25 0.6562 +0.4062 0.25 0.6875 +0.4062 0.25 0.7188 +0.4062 0.25 0.75 +0.4062 0.25 0.7812 +0.4062 0.25 0.8125 +0.4062 0.25 0.8438 +0.4062 0.25 0.875 +0.4062 0.25 0.9062 +0.4062 0.25 0.9375 +0.4062 0.25 0.9688 +0.4062 0.25 1 +0.4062 0.2812 0 +0.4062 0.2812 0.03125 +0.4062 0.2812 0.0625 +0.4062 0.2812 0.09375 +0.4062 0.2812 0.125 +0.4062 0.2812 0.1562 +0.4062 0.2812 0.1875 +0.4062 0.2812 0.2188 +0.4062 0.2812 0.25 +0.4062 0.2812 0.2812 +0.4062 0.2812 0.3125 +0.4062 0.2812 0.3438 +0.4062 0.2812 0.375 +0.4062 0.2812 0.4062 +0.4062 0.2812 0.4375 +0.4062 0.2812 0.4688 +0.4062 0.2812 0.5 +0.4062 0.2812 0.5312 +0.4062 0.2812 0.5625 +0.4062 0.2812 0.5938 +0.4062 0.2812 0.625 +0.4062 0.2812 0.6562 +0.4062 0.2812 0.6875 +0.4062 0.2812 0.7188 +0.4062 0.2812 0.75 +0.4062 0.2812 0.7812 +0.4062 0.2812 0.8125 +0.4062 0.2812 0.8438 +0.4062 0.2812 0.875 +0.4062 0.2812 0.9062 +0.4062 0.2812 0.9375 +0.4062 0.2812 0.9688 +0.4062 0.2812 1 +0.4062 0.3125 0 +0.4062 0.3125 0.03125 +0.4062 0.3125 0.0625 +0.4062 0.3125 0.09375 +0.4062 0.3125 0.125 +0.4062 0.3125 0.1562 +0.4062 0.3125 0.1875 +0.4062 0.3125 0.2188 +0.4062 0.3125 0.25 +0.4062 0.3125 0.2812 +0.4062 0.3125 0.3125 +0.4062 0.3125 0.3438 +0.4062 0.3125 0.375 +0.4062 0.3125 0.4062 +0.4062 0.3125 0.4375 +0.4062 0.3125 0.4688 +0.4062 0.3125 0.5 +0.4062 0.3125 0.5312 +0.4062 0.3125 0.5625 +0.4062 0.3125 0.5938 +0.4062 0.3125 0.625 +0.4062 0.3125 0.6562 +0.4062 0.3125 0.6875 +0.4062 0.3125 0.7188 +0.4062 0.3125 0.75 +0.4062 0.3125 0.7812 +0.4062 0.3125 0.8125 +0.4062 0.3125 0.8438 +0.4062 0.3125 0.875 +0.4062 0.3125 0.9062 +0.4062 0.3125 0.9375 +0.4062 0.3125 0.9688 +0.4062 0.3125 1 +0.4062 0.3438 0 +0.4062 0.3438 0.03125 +0.4062 0.3438 0.0625 +0.4062 0.3438 0.09375 +0.4062 0.3438 0.125 +0.4062 0.3438 0.1562 +0.4062 0.3438 0.1875 +0.4062 0.3438 0.2188 +0.4062 0.3438 0.25 +0.4062 0.3438 0.2812 +0.4062 0.3438 0.3125 +0.4062 0.3438 0.3438 +0.4062 0.3438 0.375 +0.4062 0.3438 0.4062 +0.4062 0.3438 0.4375 +0.4062 0.3438 0.4688 +0.4062 0.3438 0.5 +0.4062 0.3438 0.5312 +0.4062 0.3438 0.5625 +0.4062 0.3438 0.5938 +0.4062 0.3438 0.625 +0.4062 0.3438 0.6562 +0.4062 0.3438 0.6875 +0.4062 0.3438 0.7188 +0.4062 0.3438 0.75 +0.4062 0.3438 0.7812 +0.4062 0.3438 0.8125 +0.4062 0.3438 0.8438 +0.4062 0.3438 0.875 +0.4062 0.3438 0.9062 +0.4062 0.3438 0.9375 +0.4062 0.3438 0.9688 +0.4062 0.3438 1 +0.4062 0.375 0 +0.4062 0.375 0.03125 +0.4062 0.375 0.0625 +0.4062 0.375 0.09375 +0.4062 0.375 0.125 +0.4062 0.375 0.1562 +0.4062 0.375 0.1875 +0.4062 0.375 0.2188 +0.4062 0.375 0.25 +0.4062 0.375 0.2812 +0.4062 0.375 0.3125 +0.4062 0.375 0.3438 +0.4062 0.375 0.375 +0.4062 0.375 0.4062 +0.4062 0.375 0.4375 +0.4062 0.375 0.4688 +0.4062 0.375 0.5 +0.4062 0.375 0.5312 +0.4062 0.375 0.5625 +0.4062 0.375 0.5938 +0.4062 0.375 0.625 +0.4062 0.375 0.6562 +0.4062 0.375 0.6875 +0.4062 0.375 0.7188 +0.4062 0.375 0.75 +0.4062 0.375 0.7812 +0.4062 0.375 0.8125 +0.4062 0.375 0.8438 +0.4062 0.375 0.875 +0.4062 0.375 0.9062 +0.4062 0.375 0.9375 +0.4062 0.375 0.9688 +0.4062 0.375 1 +0.4062 0.4062 0 +0.4062 0.4062 0.03125 +0.4062 0.4062 0.0625 +0.4062 0.4062 0.09375 +0.4062 0.4062 0.125 +0.4062 0.4062 0.1562 +0.4062 0.4062 0.1875 +0.4062 0.4062 0.2188 +0.4062 0.4062 0.25 +0.4062 0.4062 0.2812 +0.4062 0.4062 0.3125 +0.4062 0.4062 0.3438 +0.4062 0.4062 0.375 +0.4062 0.4062 0.4062 +0.4062 0.4062 0.4375 +0.4062 0.4062 0.4688 +0.4062 0.4062 0.5 +0.4062 0.4062 0.5312 +0.4062 0.4062 0.5625 +0.4062 0.4062 0.5938 +0.4062 0.4062 0.625 +0.4062 0.4062 0.6562 +0.4062 0.4062 0.6875 +0.4062 0.4062 0.7188 +0.4062 0.4062 0.75 +0.4062 0.4062 0.7812 +0.4062 0.4062 0.8125 +0.4062 0.4062 0.8438 +0.4062 0.4062 0.875 +0.4062 0.4062 0.9062 +0.4062 0.4062 0.9375 +0.4062 0.4062 0.9688 +0.4062 0.4062 1 +0.4062 0.4375 0 +0.4062 0.4375 0.03125 +0.4062 0.4375 0.0625 +0.4062 0.4375 0.09375 +0.4062 0.4375 0.125 +0.4062 0.4375 0.1562 +0.4062 0.4375 0.1875 +0.4062 0.4375 0.2188 +0.4062 0.4375 0.25 +0.4062 0.4375 0.2812 +0.4062 0.4375 0.3125 +0.4062 0.4375 0.3438 +0.4062 0.4375 0.375 +0.4062 0.4375 0.4062 +0.4062 0.4375 0.4375 +0.4062 0.4375 0.4688 +0.4062 0.4375 0.5 +0.4062 0.4375 0.5312 +0.4062 0.4375 0.5625 +0.4062 0.4375 0.5938 +0.4062 0.4375 0.625 +0.4062 0.4375 0.6562 +0.4062 0.4375 0.6875 +0.4062 0.4375 0.7188 +0.4062 0.4375 0.75 +0.4062 0.4375 0.7812 +0.4062 0.4375 0.8125 +0.4062 0.4375 0.8438 +0.4062 0.4375 0.875 +0.4062 0.4375 0.9062 +0.4062 0.4375 0.9375 +0.4062 0.4375 0.9688 +0.4062 0.4375 1 +0.4062 0.4688 0 +0.4062 0.4688 0.03125 +0.4062 0.4688 0.0625 +0.4062 0.4688 0.09375 +0.4062 0.4688 0.125 +0.4062 0.4688 0.1562 +0.4062 0.4688 0.1875 +0.4062 0.4688 0.2188 +0.4062 0.4688 0.25 +0.4062 0.4688 0.2812 +0.4062 0.4688 0.3125 +0.4062 0.4688 0.3438 +0.4062 0.4688 0.375 +0.4062 0.4688 0.4062 +0.4062 0.4688 0.4375 +0.4062 0.4688 0.4688 +0.4062 0.4688 0.5 +0.4062 0.4688 0.5312 +0.4062 0.4688 0.5625 +0.4062 0.4688 0.5938 +0.4062 0.4688 0.625 +0.4062 0.4688 0.6562 +0.4062 0.4688 0.6875 +0.4062 0.4688 0.7188 +0.4062 0.4688 0.75 +0.4062 0.4688 0.7812 +0.4062 0.4688 0.8125 +0.4062 0.4688 0.8438 +0.4062 0.4688 0.875 +0.4062 0.4688 0.9062 +0.4062 0.4688 0.9375 +0.4062 0.4688 0.9688 +0.4062 0.4688 1 +0.4062 0.5 0 +0.4062 0.5 0.03125 +0.4062 0.5 0.0625 +0.4062 0.5 0.09375 +0.4062 0.5 0.125 +0.4062 0.5 0.1562 +0.4062 0.5 0.1875 +0.4062 0.5 0.2188 +0.4062 0.5 0.25 +0.4062 0.5 0.2812 +0.4062 0.5 0.3125 +0.4062 0.5 0.3438 +0.4062 0.5 0.375 +0.4062 0.5 0.4062 +0.4062 0.5 0.4375 +0.4062 0.5 0.4688 +0.4062 0.5 0.5 +0.4062 0.5 0.5312 +0.4062 0.5 0.5625 +0.4062 0.5 0.5938 +0.4062 0.5 0.625 +0.4062 0.5 0.6562 +0.4062 0.5 0.6875 +0.4062 0.5 0.7188 +0.4062 0.5 0.75 +0.4062 0.5 0.7812 +0.4062 0.5 0.8125 +0.4062 0.5 0.8438 +0.4062 0.5 0.875 +0.4062 0.5 0.9062 +0.4062 0.5 0.9375 +0.4062 0.5 0.9688 +0.4062 0.5 1 +0.4062 0.5312 0 +0.4062 0.5312 0.03125 +0.4062 0.5312 0.0625 +0.4062 0.5312 0.09375 +0.4062 0.5312 0.125 +0.4062 0.5312 0.1562 +0.4062 0.5312 0.1875 +0.4062 0.5312 0.2188 +0.4062 0.5312 0.25 +0.4062 0.5312 0.2812 +0.4062 0.5312 0.3125 +0.4062 0.5312 0.3438 +0.4062 0.5312 0.375 +0.4062 0.5312 0.4062 +0.4062 0.5312 0.4375 +0.4062 0.5312 0.4688 +0.4062 0.5312 0.5 +0.4062 0.5312 0.5312 +0.4062 0.5312 0.5625 +0.4062 0.5312 0.5938 +0.4062 0.5312 0.625 +0.4062 0.5312 0.6562 +0.4062 0.5312 0.6875 +0.4062 0.5312 0.7188 +0.4062 0.5312 0.75 +0.4062 0.5312 0.7812 +0.4062 0.5312 0.8125 +0.4062 0.5312 0.8438 +0.4062 0.5312 0.875 +0.4062 0.5312 0.9062 +0.4062 0.5312 0.9375 +0.4062 0.5312 0.9688 +0.4062 0.5312 1 +0.4062 0.5625 0 +0.4062 0.5625 0.03125 +0.4062 0.5625 0.0625 +0.4062 0.5625 0.09375 +0.4062 0.5625 0.125 +0.4062 0.5625 0.1562 +0.4062 0.5625 0.1875 +0.4062 0.5625 0.2188 +0.4062 0.5625 0.25 +0.4062 0.5625 0.2812 +0.4062 0.5625 0.3125 +0.4062 0.5625 0.3438 +0.4062 0.5625 0.375 +0.4062 0.5625 0.4062 +0.4062 0.5625 0.4375 +0.4062 0.5625 0.4688 +0.4062 0.5625 0.5 +0.4062 0.5625 0.5312 +0.4062 0.5625 0.5625 +0.4062 0.5625 0.5938 +0.4062 0.5625 0.625 +0.4062 0.5625 0.6562 +0.4062 0.5625 0.6875 +0.4062 0.5625 0.7188 +0.4062 0.5625 0.75 +0.4062 0.5625 0.7812 +0.4062 0.5625 0.8125 +0.4062 0.5625 0.8438 +0.4062 0.5625 0.875 +0.4062 0.5625 0.9062 +0.4062 0.5625 0.9375 +0.4062 0.5625 0.9688 +0.4062 0.5625 1 +0.4062 0.5938 0 +0.4062 0.5938 0.03125 +0.4062 0.5938 0.0625 +0.4062 0.5938 0.09375 +0.4062 0.5938 0.125 +0.4062 0.5938 0.1562 +0.4062 0.5938 0.1875 +0.4062 0.5938 0.2188 +0.4062 0.5938 0.25 +0.4062 0.5938 0.2812 +0.4062 0.5938 0.3125 +0.4062 0.5938 0.3438 +0.4062 0.5938 0.375 +0.4062 0.5938 0.4062 +0.4062 0.5938 0.4375 +0.4062 0.5938 0.4688 +0.4062 0.5938 0.5 +0.4062 0.5938 0.5312 +0.4062 0.5938 0.5625 +0.4062 0.5938 0.5938 +0.4062 0.5938 0.625 +0.4062 0.5938 0.6562 +0.4062 0.5938 0.6875 +0.4062 0.5938 0.7188 +0.4062 0.5938 0.75 +0.4062 0.5938 0.7812 +0.4062 0.5938 0.8125 +0.4062 0.5938 0.8438 +0.4062 0.5938 0.875 +0.4062 0.5938 0.9062 +0.4062 0.5938 0.9375 +0.4062 0.5938 0.9688 +0.4062 0.5938 1 +0.4062 0.625 0 +0.4062 0.625 0.03125 +0.4062 0.625 0.0625 +0.4062 0.625 0.09375 +0.4062 0.625 0.125 +0.4062 0.625 0.1562 +0.4062 0.625 0.1875 +0.4062 0.625 0.2188 +0.4062 0.625 0.25 +0.4062 0.625 0.2812 +0.4062 0.625 0.3125 +0.4062 0.625 0.3438 +0.4062 0.625 0.375 +0.4062 0.625 0.4062 +0.4062 0.625 0.4375 +0.4062 0.625 0.4688 +0.4062 0.625 0.5 +0.4062 0.625 0.5312 +0.4062 0.625 0.5625 +0.4062 0.625 0.5938 +0.4062 0.625 0.625 +0.4062 0.625 0.6562 +0.4062 0.625 0.6875 +0.4062 0.625 0.7188 +0.4062 0.625 0.75 +0.4062 0.625 0.7812 +0.4062 0.625 0.8125 +0.4062 0.625 0.8438 +0.4062 0.625 0.875 +0.4062 0.625 0.9062 +0.4062 0.625 0.9375 +0.4062 0.625 0.9688 +0.4062 0.625 1 +0.4062 0.6562 0 +0.4062 0.6562 0.03125 +0.4062 0.6562 0.0625 +0.4062 0.6562 0.09375 +0.4062 0.6562 0.125 +0.4062 0.6562 0.1562 +0.4062 0.6562 0.1875 +0.4062 0.6562 0.2188 +0.4062 0.6562 0.25 +0.4062 0.6562 0.2812 +0.4062 0.6562 0.3125 +0.4062 0.6562 0.3438 +0.4062 0.6562 0.375 +0.4062 0.6562 0.4062 +0.4062 0.6562 0.4375 +0.4062 0.6562 0.4688 +0.4062 0.6562 0.5 +0.4062 0.6562 0.5312 +0.4062 0.6562 0.5625 +0.4062 0.6562 0.5938 +0.4062 0.6562 0.625 +0.4062 0.6562 0.6562 +0.4062 0.6562 0.6875 +0.4062 0.6562 0.7188 +0.4062 0.6562 0.75 +0.4062 0.6562 0.7812 +0.4062 0.6562 0.8125 +0.4062 0.6562 0.8438 +0.4062 0.6562 0.875 +0.4062 0.6562 0.9062 +0.4062 0.6562 0.9375 +0.4062 0.6562 0.9688 +0.4062 0.6562 1 +0.4062 0.6875 0 +0.4062 0.6875 0.03125 +0.4062 0.6875 0.0625 +0.4062 0.6875 0.09375 +0.4062 0.6875 0.125 +0.4062 0.6875 0.1562 +0.4062 0.6875 0.1875 +0.4062 0.6875 0.2188 +0.4062 0.6875 0.25 +0.4062 0.6875 0.2812 +0.4062 0.6875 0.3125 +0.4062 0.6875 0.3438 +0.4062 0.6875 0.375 +0.4062 0.6875 0.4062 +0.4062 0.6875 0.4375 +0.4062 0.6875 0.4688 +0.4062 0.6875 0.5 +0.4062 0.6875 0.5312 +0.4062 0.6875 0.5625 +0.4062 0.6875 0.5938 +0.4062 0.6875 0.625 +0.4062 0.6875 0.6562 +0.4062 0.6875 0.6875 +0.4062 0.6875 0.7188 +0.4062 0.6875 0.75 +0.4062 0.6875 0.7812 +0.4062 0.6875 0.8125 +0.4062 0.6875 0.8438 +0.4062 0.6875 0.875 +0.4062 0.6875 0.9062 +0.4062 0.6875 0.9375 +0.4062 0.6875 0.9688 +0.4062 0.6875 1 +0.4062 0.7188 0 +0.4062 0.7188 0.03125 +0.4062 0.7188 0.0625 +0.4062 0.7188 0.09375 +0.4062 0.7188 0.125 +0.4062 0.7188 0.1562 +0.4062 0.7188 0.1875 +0.4062 0.7188 0.2188 +0.4062 0.7188 0.25 +0.4062 0.7188 0.2812 +0.4062 0.7188 0.3125 +0.4062 0.7188 0.3438 +0.4062 0.7188 0.375 +0.4062 0.7188 0.4062 +0.4062 0.7188 0.4375 +0.4062 0.7188 0.4688 +0.4062 0.7188 0.5 +0.4062 0.7188 0.5312 +0.4062 0.7188 0.5625 +0.4062 0.7188 0.5938 +0.4062 0.7188 0.625 +0.4062 0.7188 0.6562 +0.4062 0.7188 0.6875 +0.4062 0.7188 0.7188 +0.4062 0.7188 0.75 +0.4062 0.7188 0.7812 +0.4062 0.7188 0.8125 +0.4062 0.7188 0.8438 +0.4062 0.7188 0.875 +0.4062 0.7188 0.9062 +0.4062 0.7188 0.9375 +0.4062 0.7188 0.9688 +0.4062 0.7188 1 +0.4062 0.75 0 +0.4062 0.75 0.03125 +0.4062 0.75 0.0625 +0.4062 0.75 0.09375 +0.4062 0.75 0.125 +0.4062 0.75 0.1562 +0.4062 0.75 0.1875 +0.4062 0.75 0.2188 +0.4062 0.75 0.25 +0.4062 0.75 0.2812 +0.4062 0.75 0.3125 +0.4062 0.75 0.3438 +0.4062 0.75 0.375 +0.4062 0.75 0.4062 +0.4062 0.75 0.4375 +0.4062 0.75 0.4688 +0.4062 0.75 0.5 +0.4062 0.75 0.5312 +0.4062 0.75 0.5625 +0.4062 0.75 0.5938 +0.4062 0.75 0.625 +0.4062 0.75 0.6562 +0.4062 0.75 0.6875 +0.4062 0.75 0.7188 +0.4062 0.75 0.75 +0.4062 0.75 0.7812 +0.4062 0.75 0.8125 +0.4062 0.75 0.8438 +0.4062 0.75 0.875 +0.4062 0.75 0.9062 +0.4062 0.75 0.9375 +0.4062 0.75 0.9688 +0.4062 0.75 1 +0.4062 0.7812 0 +0.4062 0.7812 0.03125 +0.4062 0.7812 0.0625 +0.4062 0.7812 0.09375 +0.4062 0.7812 0.125 +0.4062 0.7812 0.1562 +0.4062 0.7812 0.1875 +0.4062 0.7812 0.2188 +0.4062 0.7812 0.25 +0.4062 0.7812 0.2812 +0.4062 0.7812 0.3125 +0.4062 0.7812 0.3438 +0.4062 0.7812 0.375 +0.4062 0.7812 0.4062 +0.4062 0.7812 0.4375 +0.4062 0.7812 0.4688 +0.4062 0.7812 0.5 +0.4062 0.7812 0.5312 +0.4062 0.7812 0.5625 +0.4062 0.7812 0.5938 +0.4062 0.7812 0.625 +0.4062 0.7812 0.6562 +0.4062 0.7812 0.6875 +0.4062 0.7812 0.7188 +0.4062 0.7812 0.75 +0.4062 0.7812 0.7812 +0.4062 0.7812 0.8125 +0.4062 0.7812 0.8438 +0.4062 0.7812 0.875 +0.4062 0.7812 0.9062 +0.4062 0.7812 0.9375 +0.4062 0.7812 0.9688 +0.4062 0.7812 1 +0.4062 0.8125 0 +0.4062 0.8125 0.03125 +0.4062 0.8125 0.0625 +0.4062 0.8125 0.09375 +0.4062 0.8125 0.125 +0.4062 0.8125 0.1562 +0.4062 0.8125 0.1875 +0.4062 0.8125 0.2188 +0.4062 0.8125 0.25 +0.4062 0.8125 0.2812 +0.4062 0.8125 0.3125 +0.4062 0.8125 0.3438 +0.4062 0.8125 0.375 +0.4062 0.8125 0.4062 +0.4062 0.8125 0.4375 +0.4062 0.8125 0.4688 +0.4062 0.8125 0.5 +0.4062 0.8125 0.5312 +0.4062 0.8125 0.5625 +0.4062 0.8125 0.5938 +0.4062 0.8125 0.625 +0.4062 0.8125 0.6562 +0.4062 0.8125 0.6875 +0.4062 0.8125 0.7188 +0.4062 0.8125 0.75 +0.4062 0.8125 0.7812 +0.4062 0.8125 0.8125 +0.4062 0.8125 0.8438 +0.4062 0.8125 0.875 +0.4062 0.8125 0.9062 +0.4062 0.8125 0.9375 +0.4062 0.8125 0.9688 +0.4062 0.8125 1 +0.4062 0.8438 0 +0.4062 0.8438 0.03125 +0.4062 0.8438 0.0625 +0.4062 0.8438 0.09375 +0.4062 0.8438 0.125 +0.4062 0.8438 0.1562 +0.4062 0.8438 0.1875 +0.4062 0.8438 0.2188 +0.4062 0.8438 0.25 +0.4062 0.8438 0.2812 +0.4062 0.8438 0.3125 +0.4062 0.8438 0.3438 +0.4062 0.8438 0.375 +0.4062 0.8438 0.4062 +0.4062 0.8438 0.4375 +0.4062 0.8438 0.4688 +0.4062 0.8438 0.5 +0.4062 0.8438 0.5312 +0.4062 0.8438 0.5625 +0.4062 0.8438 0.5938 +0.4062 0.8438 0.625 +0.4062 0.8438 0.6562 +0.4062 0.8438 0.6875 +0.4062 0.8438 0.7188 +0.4062 0.8438 0.75 +0.4062 0.8438 0.7812 +0.4062 0.8438 0.8125 +0.4062 0.8438 0.8438 +0.4062 0.8438 0.875 +0.4062 0.8438 0.9062 +0.4062 0.8438 0.9375 +0.4062 0.8438 0.9688 +0.4062 0.8438 1 +0.4062 0.875 0 +0.4062 0.875 0.03125 +0.4062 0.875 0.0625 +0.4062 0.875 0.09375 +0.4062 0.875 0.125 +0.4062 0.875 0.1562 +0.4062 0.875 0.1875 +0.4062 0.875 0.2188 +0.4062 0.875 0.25 +0.4062 0.875 0.2812 +0.4062 0.875 0.3125 +0.4062 0.875 0.3438 +0.4062 0.875 0.375 +0.4062 0.875 0.4062 +0.4062 0.875 0.4375 +0.4062 0.875 0.4688 +0.4062 0.875 0.5 +0.4062 0.875 0.5312 +0.4062 0.875 0.5625 +0.4062 0.875 0.5938 +0.4062 0.875 0.625 +0.4062 0.875 0.6562 +0.4062 0.875 0.6875 +0.4062 0.875 0.7188 +0.4062 0.875 0.75 +0.4062 0.875 0.7812 +0.4062 0.875 0.8125 +0.4062 0.875 0.8438 +0.4062 0.875 0.875 +0.4062 0.875 0.9062 +0.4062 0.875 0.9375 +0.4062 0.875 0.9688 +0.4062 0.875 1 +0.4062 0.9062 0 +0.4062 0.9062 0.03125 +0.4062 0.9062 0.0625 +0.4062 0.9062 0.09375 +0.4062 0.9062 0.125 +0.4062 0.9062 0.1562 +0.4062 0.9062 0.1875 +0.4062 0.9062 0.2188 +0.4062 0.9062 0.25 +0.4062 0.9062 0.2812 +0.4062 0.9062 0.3125 +0.4062 0.9062 0.3438 +0.4062 0.9062 0.375 +0.4062 0.9062 0.4062 +0.4062 0.9062 0.4375 +0.4062 0.9062 0.4688 +0.4062 0.9062 0.5 +0.4062 0.9062 0.5312 +0.4062 0.9062 0.5625 +0.4062 0.9062 0.5938 +0.4062 0.9062 0.625 +0.4062 0.9062 0.6562 +0.4062 0.9062 0.6875 +0.4062 0.9062 0.7188 +0.4062 0.9062 0.75 +0.4062 0.9062 0.7812 +0.4062 0.9062 0.8125 +0.4062 0.9062 0.8438 +0.4062 0.9062 0.875 +0.4062 0.9062 0.9062 +0.4062 0.9062 0.9375 +0.4062 0.9062 0.9688 +0.4062 0.9062 1 +0.4062 0.9375 0 +0.4062 0.9375 0.03125 +0.4062 0.9375 0.0625 +0.4062 0.9375 0.09375 +0.4062 0.9375 0.125 +0.4062 0.9375 0.1562 +0.4062 0.9375 0.1875 +0.4062 0.9375 0.2188 +0.4062 0.9375 0.25 +0.4062 0.9375 0.2812 +0.4062 0.9375 0.3125 +0.4062 0.9375 0.3438 +0.4062 0.9375 0.375 +0.4062 0.9375 0.4062 +0.4062 0.9375 0.4375 +0.4062 0.9375 0.4688 +0.4062 0.9375 0.5 +0.4062 0.9375 0.5312 +0.4062 0.9375 0.5625 +0.4062 0.9375 0.5938 +0.4062 0.9375 0.625 +0.4062 0.9375 0.6562 +0.4062 0.9375 0.6875 +0.4062 0.9375 0.7188 +0.4062 0.9375 0.75 +0.4062 0.9375 0.7812 +0.4062 0.9375 0.8125 +0.4062 0.9375 0.8438 +0.4062 0.9375 0.875 +0.4062 0.9375 0.9062 +0.4062 0.9375 0.9375 +0.4062 0.9375 0.9688 +0.4062 0.9375 1 +0.4062 0.9688 0 +0.4062 0.9688 0.03125 +0.4062 0.9688 0.0625 +0.4062 0.9688 0.09375 +0.4062 0.9688 0.125 +0.4062 0.9688 0.1562 +0.4062 0.9688 0.1875 +0.4062 0.9688 0.2188 +0.4062 0.9688 0.25 +0.4062 0.9688 0.2812 +0.4062 0.9688 0.3125 +0.4062 0.9688 0.3438 +0.4062 0.9688 0.375 +0.4062 0.9688 0.4062 +0.4062 0.9688 0.4375 +0.4062 0.9688 0.4688 +0.4062 0.9688 0.5 +0.4062 0.9688 0.5312 +0.4062 0.9688 0.5625 +0.4062 0.9688 0.5938 +0.4062 0.9688 0.625 +0.4062 0.9688 0.6562 +0.4062 0.9688 0.6875 +0.4062 0.9688 0.7188 +0.4062 0.9688 0.75 +0.4062 0.9688 0.7812 +0.4062 0.9688 0.8125 +0.4062 0.9688 0.8438 +0.4062 0.9688 0.875 +0.4062 0.9688 0.9062 +0.4062 0.9688 0.9375 +0.4062 0.9688 0.9688 +0.4062 0.9688 1 +0.4062 1 0 +0.4062 1 0.03125 +0.4062 1 0.0625 +0.4062 1 0.09375 +0.4062 1 0.125 +0.4062 1 0.1562 +0.4062 1 0.1875 +0.4062 1 0.2188 +0.4062 1 0.25 +0.4062 1 0.2812 +0.4062 1 0.3125 +0.4062 1 0.3438 +0.4062 1 0.375 +0.4062 1 0.4062 +0.4062 1 0.4375 +0.4062 1 0.4688 +0.4062 1 0.5 +0.4062 1 0.5312 +0.4062 1 0.5625 +0.4062 1 0.5938 +0.4062 1 0.625 +0.4062 1 0.6562 +0.4062 1 0.6875 +0.4062 1 0.7188 +0.4062 1 0.75 +0.4062 1 0.7812 +0.4062 1 0.8125 +0.4062 1 0.8438 +0.4062 1 0.875 +0.4062 1 0.9062 +0.4062 1 0.9375 +0.4062 1 0.9688 +0.4062 1 1 +0.4375 0 0 +0.4375 0 0.03125 +0.4375 0 0.0625 +0.4375 0 0.09375 +0.4375 0 0.125 +0.4375 0 0.1562 +0.4375 0 0.1875 +0.4375 0 0.2188 +0.4375 0 0.25 +0.4375 0 0.2812 +0.4375 0 0.3125 +0.4375 0 0.3438 +0.4375 0 0.375 +0.4375 0 0.4062 +0.4375 0 0.4375 +0.4375 0 0.4688 +0.4375 0 0.5 +0.4375 0 0.5312 +0.4375 0 0.5625 +0.4375 0 0.5938 +0.4375 0 0.625 +0.4375 0 0.6562 +0.4375 0 0.6875 +0.4375 0 0.7188 +0.4375 0 0.75 +0.4375 0 0.7812 +0.4375 0 0.8125 +0.4375 0 0.8438 +0.4375 0 0.875 +0.4375 0 0.9062 +0.4375 0 0.9375 +0.4375 0 0.9688 +0.4375 0 1 +0.4375 0.03125 0 +0.4375 0.03125 0.03125 +0.4375 0.03125 0.0625 +0.4375 0.03125 0.09375 +0.4375 0.03125 0.125 +0.4375 0.03125 0.1562 +0.4375 0.03125 0.1875 +0.4375 0.03125 0.2188 +0.4375 0.03125 0.25 +0.4375 0.03125 0.2812 +0.4375 0.03125 0.3125 +0.4375 0.03125 0.3438 +0.4375 0.03125 0.375 +0.4375 0.03125 0.4062 +0.4375 0.03125 0.4375 +0.4375 0.03125 0.4688 +0.4375 0.03125 0.5 +0.4375 0.03125 0.5312 +0.4375 0.03125 0.5625 +0.4375 0.03125 0.5938 +0.4375 0.03125 0.625 +0.4375 0.03125 0.6562 +0.4375 0.03125 0.6875 +0.4375 0.03125 0.7188 +0.4375 0.03125 0.75 +0.4375 0.03125 0.7812 +0.4375 0.03125 0.8125 +0.4375 0.03125 0.8438 +0.4375 0.03125 0.875 +0.4375 0.03125 0.9062 +0.4375 0.03125 0.9375 +0.4375 0.03125 0.9688 +0.4375 0.03125 1 +0.4375 0.0625 0 +0.4375 0.0625 0.03125 +0.4375 0.0625 0.0625 +0.4375 0.0625 0.09375 +0.4375 0.0625 0.125 +0.4375 0.0625 0.1562 +0.4375 0.0625 0.1875 +0.4375 0.0625 0.2188 +0.4375 0.0625 0.25 +0.4375 0.0625 0.2812 +0.4375 0.0625 0.3125 +0.4375 0.0625 0.3438 +0.4375 0.0625 0.375 +0.4375 0.0625 0.4062 +0.4375 0.0625 0.4375 +0.4375 0.0625 0.4688 +0.4375 0.0625 0.5 +0.4375 0.0625 0.5312 +0.4375 0.0625 0.5625 +0.4375 0.0625 0.5938 +0.4375 0.0625 0.625 +0.4375 0.0625 0.6562 +0.4375 0.0625 0.6875 +0.4375 0.0625 0.7188 +0.4375 0.0625 0.75 +0.4375 0.0625 0.7812 +0.4375 0.0625 0.8125 +0.4375 0.0625 0.8438 +0.4375 0.0625 0.875 +0.4375 0.0625 0.9062 +0.4375 0.0625 0.9375 +0.4375 0.0625 0.9688 +0.4375 0.0625 1 +0.4375 0.09375 0 +0.4375 0.09375 0.03125 +0.4375 0.09375 0.0625 +0.4375 0.09375 0.09375 +0.4375 0.09375 0.125 +0.4375 0.09375 0.1562 +0.4375 0.09375 0.1875 +0.4375 0.09375 0.2188 +0.4375 0.09375 0.25 +0.4375 0.09375 0.2812 +0.4375 0.09375 0.3125 +0.4375 0.09375 0.3438 +0.4375 0.09375 0.375 +0.4375 0.09375 0.4062 +0.4375 0.09375 0.4375 +0.4375 0.09375 0.4688 +0.4375 0.09375 0.5 +0.4375 0.09375 0.5312 +0.4375 0.09375 0.5625 +0.4375 0.09375 0.5938 +0.4375 0.09375 0.625 +0.4375 0.09375 0.6562 +0.4375 0.09375 0.6875 +0.4375 0.09375 0.7188 +0.4375 0.09375 0.75 +0.4375 0.09375 0.7812 +0.4375 0.09375 0.8125 +0.4375 0.09375 0.8438 +0.4375 0.09375 0.875 +0.4375 0.09375 0.9062 +0.4375 0.09375 0.9375 +0.4375 0.09375 0.9688 +0.4375 0.09375 1 +0.4375 0.125 0 +0.4375 0.125 0.03125 +0.4375 0.125 0.0625 +0.4375 0.125 0.09375 +0.4375 0.125 0.125 +0.4375 0.125 0.1562 +0.4375 0.125 0.1875 +0.4375 0.125 0.2188 +0.4375 0.125 0.25 +0.4375 0.125 0.2812 +0.4375 0.125 0.3125 +0.4375 0.125 0.3438 +0.4375 0.125 0.375 +0.4375 0.125 0.4062 +0.4375 0.125 0.4375 +0.4375 0.125 0.4688 +0.4375 0.125 0.5 +0.4375 0.125 0.5312 +0.4375 0.125 0.5625 +0.4375 0.125 0.5938 +0.4375 0.125 0.625 +0.4375 0.125 0.6562 +0.4375 0.125 0.6875 +0.4375 0.125 0.7188 +0.4375 0.125 0.75 +0.4375 0.125 0.7812 +0.4375 0.125 0.8125 +0.4375 0.125 0.8438 +0.4375 0.125 0.875 +0.4375 0.125 0.9062 +0.4375 0.125 0.9375 +0.4375 0.125 0.9688 +0.4375 0.125 1 +0.4375 0.1562 0 +0.4375 0.1562 0.03125 +0.4375 0.1562 0.0625 +0.4375 0.1562 0.09375 +0.4375 0.1562 0.125 +0.4375 0.1562 0.1562 +0.4375 0.1562 0.1875 +0.4375 0.1562 0.2188 +0.4375 0.1562 0.25 +0.4375 0.1562 0.2812 +0.4375 0.1562 0.3125 +0.4375 0.1562 0.3438 +0.4375 0.1562 0.375 +0.4375 0.1562 0.4062 +0.4375 0.1562 0.4375 +0.4375 0.1562 0.4688 +0.4375 0.1562 0.5 +0.4375 0.1562 0.5312 +0.4375 0.1562 0.5625 +0.4375 0.1562 0.5938 +0.4375 0.1562 0.625 +0.4375 0.1562 0.6562 +0.4375 0.1562 0.6875 +0.4375 0.1562 0.7188 +0.4375 0.1562 0.75 +0.4375 0.1562 0.7812 +0.4375 0.1562 0.8125 +0.4375 0.1562 0.8438 +0.4375 0.1562 0.875 +0.4375 0.1562 0.9062 +0.4375 0.1562 0.9375 +0.4375 0.1562 0.9688 +0.4375 0.1562 1 +0.4375 0.1875 0 +0.4375 0.1875 0.03125 +0.4375 0.1875 0.0625 +0.4375 0.1875 0.09375 +0.4375 0.1875 0.125 +0.4375 0.1875 0.1562 +0.4375 0.1875 0.1875 +0.4375 0.1875 0.2188 +0.4375 0.1875 0.25 +0.4375 0.1875 0.2812 +0.4375 0.1875 0.3125 +0.4375 0.1875 0.3438 +0.4375 0.1875 0.375 +0.4375 0.1875 0.4062 +0.4375 0.1875 0.4375 +0.4375 0.1875 0.4688 +0.4375 0.1875 0.5 +0.4375 0.1875 0.5312 +0.4375 0.1875 0.5625 +0.4375 0.1875 0.5938 +0.4375 0.1875 0.625 +0.4375 0.1875 0.6562 +0.4375 0.1875 0.6875 +0.4375 0.1875 0.7188 +0.4375 0.1875 0.75 +0.4375 0.1875 0.7812 +0.4375 0.1875 0.8125 +0.4375 0.1875 0.8438 +0.4375 0.1875 0.875 +0.4375 0.1875 0.9062 +0.4375 0.1875 0.9375 +0.4375 0.1875 0.9688 +0.4375 0.1875 1 +0.4375 0.2188 0 +0.4375 0.2188 0.03125 +0.4375 0.2188 0.0625 +0.4375 0.2188 0.09375 +0.4375 0.2188 0.125 +0.4375 0.2188 0.1562 +0.4375 0.2188 0.1875 +0.4375 0.2188 0.2188 +0.4375 0.2188 0.25 +0.4375 0.2188 0.2812 +0.4375 0.2188 0.3125 +0.4375 0.2188 0.3438 +0.4375 0.2188 0.375 +0.4375 0.2188 0.4062 +0.4375 0.2188 0.4375 +0.4375 0.2188 0.4688 +0.4375 0.2188 0.5 +0.4375 0.2188 0.5312 +0.4375 0.2188 0.5625 +0.4375 0.2188 0.5938 +0.4375 0.2188 0.625 +0.4375 0.2188 0.6562 +0.4375 0.2188 0.6875 +0.4375 0.2188 0.7188 +0.4375 0.2188 0.75 +0.4375 0.2188 0.7812 +0.4375 0.2188 0.8125 +0.4375 0.2188 0.8438 +0.4375 0.2188 0.875 +0.4375 0.2188 0.9062 +0.4375 0.2188 0.9375 +0.4375 0.2188 0.9688 +0.4375 0.2188 1 +0.4375 0.25 0 +0.4375 0.25 0.03125 +0.4375 0.25 0.0625 +0.4375 0.25 0.09375 +0.4375 0.25 0.125 +0.4375 0.25 0.1562 +0.4375 0.25 0.1875 +0.4375 0.25 0.2188 +0.4375 0.25 0.25 +0.4375 0.25 0.2812 +0.4375 0.25 0.3125 +0.4375 0.25 0.3438 +0.4375 0.25 0.375 +0.4375 0.25 0.4062 +0.4375 0.25 0.4375 +0.4375 0.25 0.4688 +0.4375 0.25 0.5 +0.4375 0.25 0.5312 +0.4375 0.25 0.5625 +0.4375 0.25 0.5938 +0.4375 0.25 0.625 +0.4375 0.25 0.6562 +0.4375 0.25 0.6875 +0.4375 0.25 0.7188 +0.4375 0.25 0.75 +0.4375 0.25 0.7812 +0.4375 0.25 0.8125 +0.4375 0.25 0.8438 +0.4375 0.25 0.875 +0.4375 0.25 0.9062 +0.4375 0.25 0.9375 +0.4375 0.25 0.9688 +0.4375 0.25 1 +0.4375 0.2812 0 +0.4375 0.2812 0.03125 +0.4375 0.2812 0.0625 +0.4375 0.2812 0.09375 +0.4375 0.2812 0.125 +0.4375 0.2812 0.1562 +0.4375 0.2812 0.1875 +0.4375 0.2812 0.2188 +0.4375 0.2812 0.25 +0.4375 0.2812 0.2812 +0.4375 0.2812 0.3125 +0.4375 0.2812 0.3438 +0.4375 0.2812 0.375 +0.4375 0.2812 0.4062 +0.4375 0.2812 0.4375 +0.4375 0.2812 0.4688 +0.4375 0.2812 0.5 +0.4375 0.2812 0.5312 +0.4375 0.2812 0.5625 +0.4375 0.2812 0.5938 +0.4375 0.2812 0.625 +0.4375 0.2812 0.6562 +0.4375 0.2812 0.6875 +0.4375 0.2812 0.7188 +0.4375 0.2812 0.75 +0.4375 0.2812 0.7812 +0.4375 0.2812 0.8125 +0.4375 0.2812 0.8438 +0.4375 0.2812 0.875 +0.4375 0.2812 0.9062 +0.4375 0.2812 0.9375 +0.4375 0.2812 0.9688 +0.4375 0.2812 1 +0.4375 0.3125 0 +0.4375 0.3125 0.03125 +0.4375 0.3125 0.0625 +0.4375 0.3125 0.09375 +0.4375 0.3125 0.125 +0.4375 0.3125 0.1562 +0.4375 0.3125 0.1875 +0.4375 0.3125 0.2188 +0.4375 0.3125 0.25 +0.4375 0.3125 0.2812 +0.4375 0.3125 0.3125 +0.4375 0.3125 0.3438 +0.4375 0.3125 0.375 +0.4375 0.3125 0.4062 +0.4375 0.3125 0.4375 +0.4375 0.3125 0.4688 +0.4375 0.3125 0.5 +0.4375 0.3125 0.5312 +0.4375 0.3125 0.5625 +0.4375 0.3125 0.5938 +0.4375 0.3125 0.625 +0.4375 0.3125 0.6562 +0.4375 0.3125 0.6875 +0.4375 0.3125 0.7188 +0.4375 0.3125 0.75 +0.4375 0.3125 0.7812 +0.4375 0.3125 0.8125 +0.4375 0.3125 0.8438 +0.4375 0.3125 0.875 +0.4375 0.3125 0.9062 +0.4375 0.3125 0.9375 +0.4375 0.3125 0.9688 +0.4375 0.3125 1 +0.4375 0.3438 0 +0.4375 0.3438 0.03125 +0.4375 0.3438 0.0625 +0.4375 0.3438 0.09375 +0.4375 0.3438 0.125 +0.4375 0.3438 0.1562 +0.4375 0.3438 0.1875 +0.4375 0.3438 0.2188 +0.4375 0.3438 0.25 +0.4375 0.3438 0.2812 +0.4375 0.3438 0.3125 +0.4375 0.3438 0.3438 +0.4375 0.3438 0.375 +0.4375 0.3438 0.4062 +0.4375 0.3438 0.4375 +0.4375 0.3438 0.4688 +0.4375 0.3438 0.5 +0.4375 0.3438 0.5312 +0.4375 0.3438 0.5625 +0.4375 0.3438 0.5938 +0.4375 0.3438 0.625 +0.4375 0.3438 0.6562 +0.4375 0.3438 0.6875 +0.4375 0.3438 0.7188 +0.4375 0.3438 0.75 +0.4375 0.3438 0.7812 +0.4375 0.3438 0.8125 +0.4375 0.3438 0.8438 +0.4375 0.3438 0.875 +0.4375 0.3438 0.9062 +0.4375 0.3438 0.9375 +0.4375 0.3438 0.9688 +0.4375 0.3438 1 +0.4375 0.375 0 +0.4375 0.375 0.03125 +0.4375 0.375 0.0625 +0.4375 0.375 0.09375 +0.4375 0.375 0.125 +0.4375 0.375 0.1562 +0.4375 0.375 0.1875 +0.4375 0.375 0.2188 +0.4375 0.375 0.25 +0.4375 0.375 0.2812 +0.4375 0.375 0.3125 +0.4375 0.375 0.3438 +0.4375 0.375 0.375 +0.4375 0.375 0.4062 +0.4375 0.375 0.4375 +0.4375 0.375 0.4688 +0.4375 0.375 0.5 +0.4375 0.375 0.5312 +0.4375 0.375 0.5625 +0.4375 0.375 0.5938 +0.4375 0.375 0.625 +0.4375 0.375 0.6562 +0.4375 0.375 0.6875 +0.4375 0.375 0.7188 +0.4375 0.375 0.75 +0.4375 0.375 0.7812 +0.4375 0.375 0.8125 +0.4375 0.375 0.8438 +0.4375 0.375 0.875 +0.4375 0.375 0.9062 +0.4375 0.375 0.9375 +0.4375 0.375 0.9688 +0.4375 0.375 1 +0.4375 0.4062 0 +0.4375 0.4062 0.03125 +0.4375 0.4062 0.0625 +0.4375 0.4062 0.09375 +0.4375 0.4062 0.125 +0.4375 0.4062 0.1562 +0.4375 0.4062 0.1875 +0.4375 0.4062 0.2188 +0.4375 0.4062 0.25 +0.4375 0.4062 0.2812 +0.4375 0.4062 0.3125 +0.4375 0.4062 0.3438 +0.4375 0.4062 0.375 +0.4375 0.4062 0.4062 +0.4375 0.4062 0.4375 +0.4375 0.4062 0.4688 +0.4375 0.4062 0.5 +0.4375 0.4062 0.5312 +0.4375 0.4062 0.5625 +0.4375 0.4062 0.5938 +0.4375 0.4062 0.625 +0.4375 0.4062 0.6562 +0.4375 0.4062 0.6875 +0.4375 0.4062 0.7188 +0.4375 0.4062 0.75 +0.4375 0.4062 0.7812 +0.4375 0.4062 0.8125 +0.4375 0.4062 0.8438 +0.4375 0.4062 0.875 +0.4375 0.4062 0.9062 +0.4375 0.4062 0.9375 +0.4375 0.4062 0.9688 +0.4375 0.4062 1 +0.4375 0.4375 0 +0.4375 0.4375 0.03125 +0.4375 0.4375 0.0625 +0.4375 0.4375 0.09375 +0.4375 0.4375 0.125 +0.4375 0.4375 0.1562 +0.4375 0.4375 0.1875 +0.4375 0.4375 0.2188 +0.4375 0.4375 0.25 +0.4375 0.4375 0.2812 +0.4375 0.4375 0.3125 +0.4375 0.4375 0.3438 +0.4375 0.4375 0.375 +0.4375 0.4375 0.4062 +0.4375 0.4375 0.4375 +0.4375 0.4375 0.4688 +0.4375 0.4375 0.5 +0.4375 0.4375 0.5312 +0.4375 0.4375 0.5625 +0.4375 0.4375 0.5938 +0.4375 0.4375 0.625 +0.4375 0.4375 0.6562 +0.4375 0.4375 0.6875 +0.4375 0.4375 0.7188 +0.4375 0.4375 0.75 +0.4375 0.4375 0.7812 +0.4375 0.4375 0.8125 +0.4375 0.4375 0.8438 +0.4375 0.4375 0.875 +0.4375 0.4375 0.9062 +0.4375 0.4375 0.9375 +0.4375 0.4375 0.9688 +0.4375 0.4375 1 +0.4375 0.4688 0 +0.4375 0.4688 0.03125 +0.4375 0.4688 0.0625 +0.4375 0.4688 0.09375 +0.4375 0.4688 0.125 +0.4375 0.4688 0.1562 +0.4375 0.4688 0.1875 +0.4375 0.4688 0.2188 +0.4375 0.4688 0.25 +0.4375 0.4688 0.2812 +0.4375 0.4688 0.3125 +0.4375 0.4688 0.3438 +0.4375 0.4688 0.375 +0.4375 0.4688 0.4062 +0.4375 0.4688 0.4375 +0.4375 0.4688 0.4688 +0.4375 0.4688 0.5 +0.4375 0.4688 0.5312 +0.4375 0.4688 0.5625 +0.4375 0.4688 0.5938 +0.4375 0.4688 0.625 +0.4375 0.4688 0.6562 +0.4375 0.4688 0.6875 +0.4375 0.4688 0.7188 +0.4375 0.4688 0.75 +0.4375 0.4688 0.7812 +0.4375 0.4688 0.8125 +0.4375 0.4688 0.8438 +0.4375 0.4688 0.875 +0.4375 0.4688 0.9062 +0.4375 0.4688 0.9375 +0.4375 0.4688 0.9688 +0.4375 0.4688 1 +0.4375 0.5 0 +0.4375 0.5 0.03125 +0.4375 0.5 0.0625 +0.4375 0.5 0.09375 +0.4375 0.5 0.125 +0.4375 0.5 0.1562 +0.4375 0.5 0.1875 +0.4375 0.5 0.2188 +0.4375 0.5 0.25 +0.4375 0.5 0.2812 +0.4375 0.5 0.3125 +0.4375 0.5 0.3438 +0.4375 0.5 0.375 +0.4375 0.5 0.4062 +0.4375 0.5 0.4375 +0.4375 0.5 0.4688 +0.4375 0.5 0.5 +0.4375 0.5 0.5312 +0.4375 0.5 0.5625 +0.4375 0.5 0.5938 +0.4375 0.5 0.625 +0.4375 0.5 0.6562 +0.4375 0.5 0.6875 +0.4375 0.5 0.7188 +0.4375 0.5 0.75 +0.4375 0.5 0.7812 +0.4375 0.5 0.8125 +0.4375 0.5 0.8438 +0.4375 0.5 0.875 +0.4375 0.5 0.9062 +0.4375 0.5 0.9375 +0.4375 0.5 0.9688 +0.4375 0.5 1 +0.4375 0.5312 0 +0.4375 0.5312 0.03125 +0.4375 0.5312 0.0625 +0.4375 0.5312 0.09375 +0.4375 0.5312 0.125 +0.4375 0.5312 0.1562 +0.4375 0.5312 0.1875 +0.4375 0.5312 0.2188 +0.4375 0.5312 0.25 +0.4375 0.5312 0.2812 +0.4375 0.5312 0.3125 +0.4375 0.5312 0.3438 +0.4375 0.5312 0.375 +0.4375 0.5312 0.4062 +0.4375 0.5312 0.4375 +0.4375 0.5312 0.4688 +0.4375 0.5312 0.5 +0.4375 0.5312 0.5312 +0.4375 0.5312 0.5625 +0.4375 0.5312 0.5938 +0.4375 0.5312 0.625 +0.4375 0.5312 0.6562 +0.4375 0.5312 0.6875 +0.4375 0.5312 0.7188 +0.4375 0.5312 0.75 +0.4375 0.5312 0.7812 +0.4375 0.5312 0.8125 +0.4375 0.5312 0.8438 +0.4375 0.5312 0.875 +0.4375 0.5312 0.9062 +0.4375 0.5312 0.9375 +0.4375 0.5312 0.9688 +0.4375 0.5312 1 +0.4375 0.5625 0 +0.4375 0.5625 0.03125 +0.4375 0.5625 0.0625 +0.4375 0.5625 0.09375 +0.4375 0.5625 0.125 +0.4375 0.5625 0.1562 +0.4375 0.5625 0.1875 +0.4375 0.5625 0.2188 +0.4375 0.5625 0.25 +0.4375 0.5625 0.2812 +0.4375 0.5625 0.3125 +0.4375 0.5625 0.3438 +0.4375 0.5625 0.375 +0.4375 0.5625 0.4062 +0.4375 0.5625 0.4375 +0.4375 0.5625 0.4688 +0.4375 0.5625 0.5 +0.4375 0.5625 0.5312 +0.4375 0.5625 0.5625 +0.4375 0.5625 0.5938 +0.4375 0.5625 0.625 +0.4375 0.5625 0.6562 +0.4375 0.5625 0.6875 +0.4375 0.5625 0.7188 +0.4375 0.5625 0.75 +0.4375 0.5625 0.7812 +0.4375 0.5625 0.8125 +0.4375 0.5625 0.8438 +0.4375 0.5625 0.875 +0.4375 0.5625 0.9062 +0.4375 0.5625 0.9375 +0.4375 0.5625 0.9688 +0.4375 0.5625 1 +0.4375 0.5938 0 +0.4375 0.5938 0.03125 +0.4375 0.5938 0.0625 +0.4375 0.5938 0.09375 +0.4375 0.5938 0.125 +0.4375 0.5938 0.1562 +0.4375 0.5938 0.1875 +0.4375 0.5938 0.2188 +0.4375 0.5938 0.25 +0.4375 0.5938 0.2812 +0.4375 0.5938 0.3125 +0.4375 0.5938 0.3438 +0.4375 0.5938 0.375 +0.4375 0.5938 0.4062 +0.4375 0.5938 0.4375 +0.4375 0.5938 0.4688 +0.4375 0.5938 0.5 +0.4375 0.5938 0.5312 +0.4375 0.5938 0.5625 +0.4375 0.5938 0.5938 +0.4375 0.5938 0.625 +0.4375 0.5938 0.6562 +0.4375 0.5938 0.6875 +0.4375 0.5938 0.7188 +0.4375 0.5938 0.75 +0.4375 0.5938 0.7812 +0.4375 0.5938 0.8125 +0.4375 0.5938 0.8438 +0.4375 0.5938 0.875 +0.4375 0.5938 0.9062 +0.4375 0.5938 0.9375 +0.4375 0.5938 0.9688 +0.4375 0.5938 1 +0.4375 0.625 0 +0.4375 0.625 0.03125 +0.4375 0.625 0.0625 +0.4375 0.625 0.09375 +0.4375 0.625 0.125 +0.4375 0.625 0.1562 +0.4375 0.625 0.1875 +0.4375 0.625 0.2188 +0.4375 0.625 0.25 +0.4375 0.625 0.2812 +0.4375 0.625 0.3125 +0.4375 0.625 0.3438 +0.4375 0.625 0.375 +0.4375 0.625 0.4062 +0.4375 0.625 0.4375 +0.4375 0.625 0.4688 +0.4375 0.625 0.5 +0.4375 0.625 0.5312 +0.4375 0.625 0.5625 +0.4375 0.625 0.5938 +0.4375 0.625 0.625 +0.4375 0.625 0.6562 +0.4375 0.625 0.6875 +0.4375 0.625 0.7188 +0.4375 0.625 0.75 +0.4375 0.625 0.7812 +0.4375 0.625 0.8125 +0.4375 0.625 0.8438 +0.4375 0.625 0.875 +0.4375 0.625 0.9062 +0.4375 0.625 0.9375 +0.4375 0.625 0.9688 +0.4375 0.625 1 +0.4375 0.6562 0 +0.4375 0.6562 0.03125 +0.4375 0.6562 0.0625 +0.4375 0.6562 0.09375 +0.4375 0.6562 0.125 +0.4375 0.6562 0.1562 +0.4375 0.6562 0.1875 +0.4375 0.6562 0.2188 +0.4375 0.6562 0.25 +0.4375 0.6562 0.2812 +0.4375 0.6562 0.3125 +0.4375 0.6562 0.3438 +0.4375 0.6562 0.375 +0.4375 0.6562 0.4062 +0.4375 0.6562 0.4375 +0.4375 0.6562 0.4688 +0.4375 0.6562 0.5 +0.4375 0.6562 0.5312 +0.4375 0.6562 0.5625 +0.4375 0.6562 0.5938 +0.4375 0.6562 0.625 +0.4375 0.6562 0.6562 +0.4375 0.6562 0.6875 +0.4375 0.6562 0.7188 +0.4375 0.6562 0.75 +0.4375 0.6562 0.7812 +0.4375 0.6562 0.8125 +0.4375 0.6562 0.8438 +0.4375 0.6562 0.875 +0.4375 0.6562 0.9062 +0.4375 0.6562 0.9375 +0.4375 0.6562 0.9688 +0.4375 0.6562 1 +0.4375 0.6875 0 +0.4375 0.6875 0.03125 +0.4375 0.6875 0.0625 +0.4375 0.6875 0.09375 +0.4375 0.6875 0.125 +0.4375 0.6875 0.1562 +0.4375 0.6875 0.1875 +0.4375 0.6875 0.2188 +0.4375 0.6875 0.25 +0.4375 0.6875 0.2812 +0.4375 0.6875 0.3125 +0.4375 0.6875 0.3438 +0.4375 0.6875 0.375 +0.4375 0.6875 0.4062 +0.4375 0.6875 0.4375 +0.4375 0.6875 0.4688 +0.4375 0.6875 0.5 +0.4375 0.6875 0.5312 +0.4375 0.6875 0.5625 +0.4375 0.6875 0.5938 +0.4375 0.6875 0.625 +0.4375 0.6875 0.6562 +0.4375 0.6875 0.6875 +0.4375 0.6875 0.7188 +0.4375 0.6875 0.75 +0.4375 0.6875 0.7812 +0.4375 0.6875 0.8125 +0.4375 0.6875 0.8438 +0.4375 0.6875 0.875 +0.4375 0.6875 0.9062 +0.4375 0.6875 0.9375 +0.4375 0.6875 0.9688 +0.4375 0.6875 1 +0.4375 0.7188 0 +0.4375 0.7188 0.03125 +0.4375 0.7188 0.0625 +0.4375 0.7188 0.09375 +0.4375 0.7188 0.125 +0.4375 0.7188 0.1562 +0.4375 0.7188 0.1875 +0.4375 0.7188 0.2188 +0.4375 0.7188 0.25 +0.4375 0.7188 0.2812 +0.4375 0.7188 0.3125 +0.4375 0.7188 0.3438 +0.4375 0.7188 0.375 +0.4375 0.7188 0.4062 +0.4375 0.7188 0.4375 +0.4375 0.7188 0.4688 +0.4375 0.7188 0.5 +0.4375 0.7188 0.5312 +0.4375 0.7188 0.5625 +0.4375 0.7188 0.5938 +0.4375 0.7188 0.625 +0.4375 0.7188 0.6562 +0.4375 0.7188 0.6875 +0.4375 0.7188 0.7188 +0.4375 0.7188 0.75 +0.4375 0.7188 0.7812 +0.4375 0.7188 0.8125 +0.4375 0.7188 0.8438 +0.4375 0.7188 0.875 +0.4375 0.7188 0.9062 +0.4375 0.7188 0.9375 +0.4375 0.7188 0.9688 +0.4375 0.7188 1 +0.4375 0.75 0 +0.4375 0.75 0.03125 +0.4375 0.75 0.0625 +0.4375 0.75 0.09375 +0.4375 0.75 0.125 +0.4375 0.75 0.1562 +0.4375 0.75 0.1875 +0.4375 0.75 0.2188 +0.4375 0.75 0.25 +0.4375 0.75 0.2812 +0.4375 0.75 0.3125 +0.4375 0.75 0.3438 +0.4375 0.75 0.375 +0.4375 0.75 0.4062 +0.4375 0.75 0.4375 +0.4375 0.75 0.4688 +0.4375 0.75 0.5 +0.4375 0.75 0.5312 +0.4375 0.75 0.5625 +0.4375 0.75 0.5938 +0.4375 0.75 0.625 +0.4375 0.75 0.6562 +0.4375 0.75 0.6875 +0.4375 0.75 0.7188 +0.4375 0.75 0.75 +0.4375 0.75 0.7812 +0.4375 0.75 0.8125 +0.4375 0.75 0.8438 +0.4375 0.75 0.875 +0.4375 0.75 0.9062 +0.4375 0.75 0.9375 +0.4375 0.75 0.9688 +0.4375 0.75 1 +0.4375 0.7812 0 +0.4375 0.7812 0.03125 +0.4375 0.7812 0.0625 +0.4375 0.7812 0.09375 +0.4375 0.7812 0.125 +0.4375 0.7812 0.1562 +0.4375 0.7812 0.1875 +0.4375 0.7812 0.2188 +0.4375 0.7812 0.25 +0.4375 0.7812 0.2812 +0.4375 0.7812 0.3125 +0.4375 0.7812 0.3438 +0.4375 0.7812 0.375 +0.4375 0.7812 0.4062 +0.4375 0.7812 0.4375 +0.4375 0.7812 0.4688 +0.4375 0.7812 0.5 +0.4375 0.7812 0.5312 +0.4375 0.7812 0.5625 +0.4375 0.7812 0.5938 +0.4375 0.7812 0.625 +0.4375 0.7812 0.6562 +0.4375 0.7812 0.6875 +0.4375 0.7812 0.7188 +0.4375 0.7812 0.75 +0.4375 0.7812 0.7812 +0.4375 0.7812 0.8125 +0.4375 0.7812 0.8438 +0.4375 0.7812 0.875 +0.4375 0.7812 0.9062 +0.4375 0.7812 0.9375 +0.4375 0.7812 0.9688 +0.4375 0.7812 1 +0.4375 0.8125 0 +0.4375 0.8125 0.03125 +0.4375 0.8125 0.0625 +0.4375 0.8125 0.09375 +0.4375 0.8125 0.125 +0.4375 0.8125 0.1562 +0.4375 0.8125 0.1875 +0.4375 0.8125 0.2188 +0.4375 0.8125 0.25 +0.4375 0.8125 0.2812 +0.4375 0.8125 0.3125 +0.4375 0.8125 0.3438 +0.4375 0.8125 0.375 +0.4375 0.8125 0.4062 +0.4375 0.8125 0.4375 +0.4375 0.8125 0.4688 +0.4375 0.8125 0.5 +0.4375 0.8125 0.5312 +0.4375 0.8125 0.5625 +0.4375 0.8125 0.5938 +0.4375 0.8125 0.625 +0.4375 0.8125 0.6562 +0.4375 0.8125 0.6875 +0.4375 0.8125 0.7188 +0.4375 0.8125 0.75 +0.4375 0.8125 0.7812 +0.4375 0.8125 0.8125 +0.4375 0.8125 0.8438 +0.4375 0.8125 0.875 +0.4375 0.8125 0.9062 +0.4375 0.8125 0.9375 +0.4375 0.8125 0.9688 +0.4375 0.8125 1 +0.4375 0.8438 0 +0.4375 0.8438 0.03125 +0.4375 0.8438 0.0625 +0.4375 0.8438 0.09375 +0.4375 0.8438 0.125 +0.4375 0.8438 0.1562 +0.4375 0.8438 0.1875 +0.4375 0.8438 0.2188 +0.4375 0.8438 0.25 +0.4375 0.8438 0.2812 +0.4375 0.8438 0.3125 +0.4375 0.8438 0.3438 +0.4375 0.8438 0.375 +0.4375 0.8438 0.4062 +0.4375 0.8438 0.4375 +0.4375 0.8438 0.4688 +0.4375 0.8438 0.5 +0.4375 0.8438 0.5312 +0.4375 0.8438 0.5625 +0.4375 0.8438 0.5938 +0.4375 0.8438 0.625 +0.4375 0.8438 0.6562 +0.4375 0.8438 0.6875 +0.4375 0.8438 0.7188 +0.4375 0.8438 0.75 +0.4375 0.8438 0.7812 +0.4375 0.8438 0.8125 +0.4375 0.8438 0.8438 +0.4375 0.8438 0.875 +0.4375 0.8438 0.9062 +0.4375 0.8438 0.9375 +0.4375 0.8438 0.9688 +0.4375 0.8438 1 +0.4375 0.875 0 +0.4375 0.875 0.03125 +0.4375 0.875 0.0625 +0.4375 0.875 0.09375 +0.4375 0.875 0.125 +0.4375 0.875 0.1562 +0.4375 0.875 0.1875 +0.4375 0.875 0.2188 +0.4375 0.875 0.25 +0.4375 0.875 0.2812 +0.4375 0.875 0.3125 +0.4375 0.875 0.3438 +0.4375 0.875 0.375 +0.4375 0.875 0.4062 +0.4375 0.875 0.4375 +0.4375 0.875 0.4688 +0.4375 0.875 0.5 +0.4375 0.875 0.5312 +0.4375 0.875 0.5625 +0.4375 0.875 0.5938 +0.4375 0.875 0.625 +0.4375 0.875 0.6562 +0.4375 0.875 0.6875 +0.4375 0.875 0.7188 +0.4375 0.875 0.75 +0.4375 0.875 0.7812 +0.4375 0.875 0.8125 +0.4375 0.875 0.8438 +0.4375 0.875 0.875 +0.4375 0.875 0.9062 +0.4375 0.875 0.9375 +0.4375 0.875 0.9688 +0.4375 0.875 1 +0.4375 0.9062 0 +0.4375 0.9062 0.03125 +0.4375 0.9062 0.0625 +0.4375 0.9062 0.09375 +0.4375 0.9062 0.125 +0.4375 0.9062 0.1562 +0.4375 0.9062 0.1875 +0.4375 0.9062 0.2188 +0.4375 0.9062 0.25 +0.4375 0.9062 0.2812 +0.4375 0.9062 0.3125 +0.4375 0.9062 0.3438 +0.4375 0.9062 0.375 +0.4375 0.9062 0.4062 +0.4375 0.9062 0.4375 +0.4375 0.9062 0.4688 +0.4375 0.9062 0.5 +0.4375 0.9062 0.5312 +0.4375 0.9062 0.5625 +0.4375 0.9062 0.5938 +0.4375 0.9062 0.625 +0.4375 0.9062 0.6562 +0.4375 0.9062 0.6875 +0.4375 0.9062 0.7188 +0.4375 0.9062 0.75 +0.4375 0.9062 0.7812 +0.4375 0.9062 0.8125 +0.4375 0.9062 0.8438 +0.4375 0.9062 0.875 +0.4375 0.9062 0.9062 +0.4375 0.9062 0.9375 +0.4375 0.9062 0.9688 +0.4375 0.9062 1 +0.4375 0.9375 0 +0.4375 0.9375 0.03125 +0.4375 0.9375 0.0625 +0.4375 0.9375 0.09375 +0.4375 0.9375 0.125 +0.4375 0.9375 0.1562 +0.4375 0.9375 0.1875 +0.4375 0.9375 0.2188 +0.4375 0.9375 0.25 +0.4375 0.9375 0.2812 +0.4375 0.9375 0.3125 +0.4375 0.9375 0.3438 +0.4375 0.9375 0.375 +0.4375 0.9375 0.4062 +0.4375 0.9375 0.4375 +0.4375 0.9375 0.4688 +0.4375 0.9375 0.5 +0.4375 0.9375 0.5312 +0.4375 0.9375 0.5625 +0.4375 0.9375 0.5938 +0.4375 0.9375 0.625 +0.4375 0.9375 0.6562 +0.4375 0.9375 0.6875 +0.4375 0.9375 0.7188 +0.4375 0.9375 0.75 +0.4375 0.9375 0.7812 +0.4375 0.9375 0.8125 +0.4375 0.9375 0.8438 +0.4375 0.9375 0.875 +0.4375 0.9375 0.9062 +0.4375 0.9375 0.9375 +0.4375 0.9375 0.9688 +0.4375 0.9375 1 +0.4375 0.9688 0 +0.4375 0.9688 0.03125 +0.4375 0.9688 0.0625 +0.4375 0.9688 0.09375 +0.4375 0.9688 0.125 +0.4375 0.9688 0.1562 +0.4375 0.9688 0.1875 +0.4375 0.9688 0.2188 +0.4375 0.9688 0.25 +0.4375 0.9688 0.2812 +0.4375 0.9688 0.3125 +0.4375 0.9688 0.3438 +0.4375 0.9688 0.375 +0.4375 0.9688 0.4062 +0.4375 0.9688 0.4375 +0.4375 0.9688 0.4688 +0.4375 0.9688 0.5 +0.4375 0.9688 0.5312 +0.4375 0.9688 0.5625 +0.4375 0.9688 0.5938 +0.4375 0.9688 0.625 +0.4375 0.9688 0.6562 +0.4375 0.9688 0.6875 +0.4375 0.9688 0.7188 +0.4375 0.9688 0.75 +0.4375 0.9688 0.7812 +0.4375 0.9688 0.8125 +0.4375 0.9688 0.8438 +0.4375 0.9688 0.875 +0.4375 0.9688 0.9062 +0.4375 0.9688 0.9375 +0.4375 0.9688 0.9688 +0.4375 0.9688 1 +0.4375 1 0 +0.4375 1 0.03125 +0.4375 1 0.0625 +0.4375 1 0.09375 +0.4375 1 0.125 +0.4375 1 0.1562 +0.4375 1 0.1875 +0.4375 1 0.2188 +0.4375 1 0.25 +0.4375 1 0.2812 +0.4375 1 0.3125 +0.4375 1 0.3438 +0.4375 1 0.375 +0.4375 1 0.4062 +0.4375 1 0.4375 +0.4375 1 0.4688 +0.4375 1 0.5 +0.4375 1 0.5312 +0.4375 1 0.5625 +0.4375 1 0.5938 +0.4375 1 0.625 +0.4375 1 0.6562 +0.4375 1 0.6875 +0.4375 1 0.7188 +0.4375 1 0.75 +0.4375 1 0.7812 +0.4375 1 0.8125 +0.4375 1 0.8438 +0.4375 1 0.875 +0.4375 1 0.9062 +0.4375 1 0.9375 +0.4375 1 0.9688 +0.4375 1 1 +0.4688 0 0 +0.4688 0 0.03125 +0.4688 0 0.0625 +0.4688 0 0.09375 +0.4688 0 0.125 +0.4688 0 0.1562 +0.4688 0 0.1875 +0.4688 0 0.2188 +0.4688 0 0.25 +0.4688 0 0.2812 +0.4688 0 0.3125 +0.4688 0 0.3438 +0.4688 0 0.375 +0.4688 0 0.4062 +0.4688 0 0.4375 +0.4688 0 0.4688 +0.4688 0 0.5 +0.4688 0 0.5312 +0.4688 0 0.5625 +0.4688 0 0.5938 +0.4688 0 0.625 +0.4688 0 0.6562 +0.4688 0 0.6875 +0.4688 0 0.7188 +0.4688 0 0.75 +0.4688 0 0.7812 +0.4688 0 0.8125 +0.4688 0 0.8438 +0.4688 0 0.875 +0.4688 0 0.9062 +0.4688 0 0.9375 +0.4688 0 0.9688 +0.4688 0 1 +0.4688 0.03125 0 +0.4688 0.03125 0.03125 +0.4688 0.03125 0.0625 +0.4688 0.03125 0.09375 +0.4688 0.03125 0.125 +0.4688 0.03125 0.1562 +0.4688 0.03125 0.1875 +0.4688 0.03125 0.2188 +0.4688 0.03125 0.25 +0.4688 0.03125 0.2812 +0.4688 0.03125 0.3125 +0.4688 0.03125 0.3438 +0.4688 0.03125 0.375 +0.4688 0.03125 0.4062 +0.4688 0.03125 0.4375 +0.4688 0.03125 0.4688 +0.4688 0.03125 0.5 +0.4688 0.03125 0.5312 +0.4688 0.03125 0.5625 +0.4688 0.03125 0.5938 +0.4688 0.03125 0.625 +0.4688 0.03125 0.6562 +0.4688 0.03125 0.6875 +0.4688 0.03125 0.7188 +0.4688 0.03125 0.75 +0.4688 0.03125 0.7812 +0.4688 0.03125 0.8125 +0.4688 0.03125 0.8438 +0.4688 0.03125 0.875 +0.4688 0.03125 0.9062 +0.4688 0.03125 0.9375 +0.4688 0.03125 0.9688 +0.4688 0.03125 1 +0.4688 0.0625 0 +0.4688 0.0625 0.03125 +0.4688 0.0625 0.0625 +0.4688 0.0625 0.09375 +0.4688 0.0625 0.125 +0.4688 0.0625 0.1562 +0.4688 0.0625 0.1875 +0.4688 0.0625 0.2188 +0.4688 0.0625 0.25 +0.4688 0.0625 0.2812 +0.4688 0.0625 0.3125 +0.4688 0.0625 0.3438 +0.4688 0.0625 0.375 +0.4688 0.0625 0.4062 +0.4688 0.0625 0.4375 +0.4688 0.0625 0.4688 +0.4688 0.0625 0.5 +0.4688 0.0625 0.5312 +0.4688 0.0625 0.5625 +0.4688 0.0625 0.5938 +0.4688 0.0625 0.625 +0.4688 0.0625 0.6562 +0.4688 0.0625 0.6875 +0.4688 0.0625 0.7188 +0.4688 0.0625 0.75 +0.4688 0.0625 0.7812 +0.4688 0.0625 0.8125 +0.4688 0.0625 0.8438 +0.4688 0.0625 0.875 +0.4688 0.0625 0.9062 +0.4688 0.0625 0.9375 +0.4688 0.0625 0.9688 +0.4688 0.0625 1 +0.4688 0.09375 0 +0.4688 0.09375 0.03125 +0.4688 0.09375 0.0625 +0.4688 0.09375 0.09375 +0.4688 0.09375 0.125 +0.4688 0.09375 0.1562 +0.4688 0.09375 0.1875 +0.4688 0.09375 0.2188 +0.4688 0.09375 0.25 +0.4688 0.09375 0.2812 +0.4688 0.09375 0.3125 +0.4688 0.09375 0.3438 +0.4688 0.09375 0.375 +0.4688 0.09375 0.4062 +0.4688 0.09375 0.4375 +0.4688 0.09375 0.4688 +0.4688 0.09375 0.5 +0.4688 0.09375 0.5312 +0.4688 0.09375 0.5625 +0.4688 0.09375 0.5938 +0.4688 0.09375 0.625 +0.4688 0.09375 0.6562 +0.4688 0.09375 0.6875 +0.4688 0.09375 0.7188 +0.4688 0.09375 0.75 +0.4688 0.09375 0.7812 +0.4688 0.09375 0.8125 +0.4688 0.09375 0.8438 +0.4688 0.09375 0.875 +0.4688 0.09375 0.9062 +0.4688 0.09375 0.9375 +0.4688 0.09375 0.9688 +0.4688 0.09375 1 +0.4688 0.125 0 +0.4688 0.125 0.03125 +0.4688 0.125 0.0625 +0.4688 0.125 0.09375 +0.4688 0.125 0.125 +0.4688 0.125 0.1562 +0.4688 0.125 0.1875 +0.4688 0.125 0.2188 +0.4688 0.125 0.25 +0.4688 0.125 0.2812 +0.4688 0.125 0.3125 +0.4688 0.125 0.3438 +0.4688 0.125 0.375 +0.4688 0.125 0.4062 +0.4688 0.125 0.4375 +0.4688 0.125 0.4688 +0.4688 0.125 0.5 +0.4688 0.125 0.5312 +0.4688 0.125 0.5625 +0.4688 0.125 0.5938 +0.4688 0.125 0.625 +0.4688 0.125 0.6562 +0.4688 0.125 0.6875 +0.4688 0.125 0.7188 +0.4688 0.125 0.75 +0.4688 0.125 0.7812 +0.4688 0.125 0.8125 +0.4688 0.125 0.8438 +0.4688 0.125 0.875 +0.4688 0.125 0.9062 +0.4688 0.125 0.9375 +0.4688 0.125 0.9688 +0.4688 0.125 1 +0.4688 0.1562 0 +0.4688 0.1562 0.03125 +0.4688 0.1562 0.0625 +0.4688 0.1562 0.09375 +0.4688 0.1562 0.125 +0.4688 0.1562 0.1562 +0.4688 0.1562 0.1875 +0.4688 0.1562 0.2188 +0.4688 0.1562 0.25 +0.4688 0.1562 0.2812 +0.4688 0.1562 0.3125 +0.4688 0.1562 0.3438 +0.4688 0.1562 0.375 +0.4688 0.1562 0.4062 +0.4688 0.1562 0.4375 +0.4688 0.1562 0.4688 +0.4688 0.1562 0.5 +0.4688 0.1562 0.5312 +0.4688 0.1562 0.5625 +0.4688 0.1562 0.5938 +0.4688 0.1562 0.625 +0.4688 0.1562 0.6562 +0.4688 0.1562 0.6875 +0.4688 0.1562 0.7188 +0.4688 0.1562 0.75 +0.4688 0.1562 0.7812 +0.4688 0.1562 0.8125 +0.4688 0.1562 0.8438 +0.4688 0.1562 0.875 +0.4688 0.1562 0.9062 +0.4688 0.1562 0.9375 +0.4688 0.1562 0.9688 +0.4688 0.1562 1 +0.4688 0.1875 0 +0.4688 0.1875 0.03125 +0.4688 0.1875 0.0625 +0.4688 0.1875 0.09375 +0.4688 0.1875 0.125 +0.4688 0.1875 0.1562 +0.4688 0.1875 0.1875 +0.4688 0.1875 0.2188 +0.4688 0.1875 0.25 +0.4688 0.1875 0.2812 +0.4688 0.1875 0.3125 +0.4688 0.1875 0.3438 +0.4688 0.1875 0.375 +0.4688 0.1875 0.4062 +0.4688 0.1875 0.4375 +0.4688 0.1875 0.4688 +0.4688 0.1875 0.5 +0.4688 0.1875 0.5312 +0.4688 0.1875 0.5625 +0.4688 0.1875 0.5938 +0.4688 0.1875 0.625 +0.4688 0.1875 0.6562 +0.4688 0.1875 0.6875 +0.4688 0.1875 0.7188 +0.4688 0.1875 0.75 +0.4688 0.1875 0.7812 +0.4688 0.1875 0.8125 +0.4688 0.1875 0.8438 +0.4688 0.1875 0.875 +0.4688 0.1875 0.9062 +0.4688 0.1875 0.9375 +0.4688 0.1875 0.9688 +0.4688 0.1875 1 +0.4688 0.2188 0 +0.4688 0.2188 0.03125 +0.4688 0.2188 0.0625 +0.4688 0.2188 0.09375 +0.4688 0.2188 0.125 +0.4688 0.2188 0.1562 +0.4688 0.2188 0.1875 +0.4688 0.2188 0.2188 +0.4688 0.2188 0.25 +0.4688 0.2188 0.2812 +0.4688 0.2188 0.3125 +0.4688 0.2188 0.3438 +0.4688 0.2188 0.375 +0.4688 0.2188 0.4062 +0.4688 0.2188 0.4375 +0.4688 0.2188 0.4688 +0.4688 0.2188 0.5 +0.4688 0.2188 0.5312 +0.4688 0.2188 0.5625 +0.4688 0.2188 0.5938 +0.4688 0.2188 0.625 +0.4688 0.2188 0.6562 +0.4688 0.2188 0.6875 +0.4688 0.2188 0.7188 +0.4688 0.2188 0.75 +0.4688 0.2188 0.7812 +0.4688 0.2188 0.8125 +0.4688 0.2188 0.8438 +0.4688 0.2188 0.875 +0.4688 0.2188 0.9062 +0.4688 0.2188 0.9375 +0.4688 0.2188 0.9688 +0.4688 0.2188 1 +0.4688 0.25 0 +0.4688 0.25 0.03125 +0.4688 0.25 0.0625 +0.4688 0.25 0.09375 +0.4688 0.25 0.125 +0.4688 0.25 0.1562 +0.4688 0.25 0.1875 +0.4688 0.25 0.2188 +0.4688 0.25 0.25 +0.4688 0.25 0.2812 +0.4688 0.25 0.3125 +0.4688 0.25 0.3438 +0.4688 0.25 0.375 +0.4688 0.25 0.4062 +0.4688 0.25 0.4375 +0.4688 0.25 0.4688 +0.4688 0.25 0.5 +0.4688 0.25 0.5312 +0.4688 0.25 0.5625 +0.4688 0.25 0.5938 +0.4688 0.25 0.625 +0.4688 0.25 0.6562 +0.4688 0.25 0.6875 +0.4688 0.25 0.7188 +0.4688 0.25 0.75 +0.4688 0.25 0.7812 +0.4688 0.25 0.8125 +0.4688 0.25 0.8438 +0.4688 0.25 0.875 +0.4688 0.25 0.9062 +0.4688 0.25 0.9375 +0.4688 0.25 0.9688 +0.4688 0.25 1 +0.4688 0.2812 0 +0.4688 0.2812 0.03125 +0.4688 0.2812 0.0625 +0.4688 0.2812 0.09375 +0.4688 0.2812 0.125 +0.4688 0.2812 0.1562 +0.4688 0.2812 0.1875 +0.4688 0.2812 0.2188 +0.4688 0.2812 0.25 +0.4688 0.2812 0.2812 +0.4688 0.2812 0.3125 +0.4688 0.2812 0.3438 +0.4688 0.2812 0.375 +0.4688 0.2812 0.4062 +0.4688 0.2812 0.4375 +0.4688 0.2812 0.4688 +0.4688 0.2812 0.5 +0.4688 0.2812 0.5312 +0.4688 0.2812 0.5625 +0.4688 0.2812 0.5938 +0.4688 0.2812 0.625 +0.4688 0.2812 0.6562 +0.4688 0.2812 0.6875 +0.4688 0.2812 0.7188 +0.4688 0.2812 0.75 +0.4688 0.2812 0.7812 +0.4688 0.2812 0.8125 +0.4688 0.2812 0.8438 +0.4688 0.2812 0.875 +0.4688 0.2812 0.9062 +0.4688 0.2812 0.9375 +0.4688 0.2812 0.9688 +0.4688 0.2812 1 +0.4688 0.3125 0 +0.4688 0.3125 0.03125 +0.4688 0.3125 0.0625 +0.4688 0.3125 0.09375 +0.4688 0.3125 0.125 +0.4688 0.3125 0.1562 +0.4688 0.3125 0.1875 +0.4688 0.3125 0.2188 +0.4688 0.3125 0.25 +0.4688 0.3125 0.2812 +0.4688 0.3125 0.3125 +0.4688 0.3125 0.3438 +0.4688 0.3125 0.375 +0.4688 0.3125 0.4062 +0.4688 0.3125 0.4375 +0.4688 0.3125 0.4688 +0.4688 0.3125 0.5 +0.4688 0.3125 0.5312 +0.4688 0.3125 0.5625 +0.4688 0.3125 0.5938 +0.4688 0.3125 0.625 +0.4688 0.3125 0.6562 +0.4688 0.3125 0.6875 +0.4688 0.3125 0.7188 +0.4688 0.3125 0.75 +0.4688 0.3125 0.7812 +0.4688 0.3125 0.8125 +0.4688 0.3125 0.8438 +0.4688 0.3125 0.875 +0.4688 0.3125 0.9062 +0.4688 0.3125 0.9375 +0.4688 0.3125 0.9688 +0.4688 0.3125 1 +0.4688 0.3438 0 +0.4688 0.3438 0.03125 +0.4688 0.3438 0.0625 +0.4688 0.3438 0.09375 +0.4688 0.3438 0.125 +0.4688 0.3438 0.1562 +0.4688 0.3438 0.1875 +0.4688 0.3438 0.2188 +0.4688 0.3438 0.25 +0.4688 0.3438 0.2812 +0.4688 0.3438 0.3125 +0.4688 0.3438 0.3438 +0.4688 0.3438 0.375 +0.4688 0.3438 0.4062 +0.4688 0.3438 0.4375 +0.4688 0.3438 0.4688 +0.4688 0.3438 0.5 +0.4688 0.3438 0.5312 +0.4688 0.3438 0.5625 +0.4688 0.3438 0.5938 +0.4688 0.3438 0.625 +0.4688 0.3438 0.6562 +0.4688 0.3438 0.6875 +0.4688 0.3438 0.7188 +0.4688 0.3438 0.75 +0.4688 0.3438 0.7812 +0.4688 0.3438 0.8125 +0.4688 0.3438 0.8438 +0.4688 0.3438 0.875 +0.4688 0.3438 0.9062 +0.4688 0.3438 0.9375 +0.4688 0.3438 0.9688 +0.4688 0.3438 1 +0.4688 0.375 0 +0.4688 0.375 0.03125 +0.4688 0.375 0.0625 +0.4688 0.375 0.09375 +0.4688 0.375 0.125 +0.4688 0.375 0.1562 +0.4688 0.375 0.1875 +0.4688 0.375 0.2188 +0.4688 0.375 0.25 +0.4688 0.375 0.2812 +0.4688 0.375 0.3125 +0.4688 0.375 0.3438 +0.4688 0.375 0.375 +0.4688 0.375 0.4062 +0.4688 0.375 0.4375 +0.4688 0.375 0.4688 +0.4688 0.375 0.5 +0.4688 0.375 0.5312 +0.4688 0.375 0.5625 +0.4688 0.375 0.5938 +0.4688 0.375 0.625 +0.4688 0.375 0.6562 +0.4688 0.375 0.6875 +0.4688 0.375 0.7188 +0.4688 0.375 0.75 +0.4688 0.375 0.7812 +0.4688 0.375 0.8125 +0.4688 0.375 0.8438 +0.4688 0.375 0.875 +0.4688 0.375 0.9062 +0.4688 0.375 0.9375 +0.4688 0.375 0.9688 +0.4688 0.375 1 +0.4688 0.4062 0 +0.4688 0.4062 0.03125 +0.4688 0.4062 0.0625 +0.4688 0.4062 0.09375 +0.4688 0.4062 0.125 +0.4688 0.4062 0.1562 +0.4688 0.4062 0.1875 +0.4688 0.4062 0.2188 +0.4688 0.4062 0.25 +0.4688 0.4062 0.2812 +0.4688 0.4062 0.3125 +0.4688 0.4062 0.3438 +0.4688 0.4062 0.375 +0.4688 0.4062 0.4062 +0.4688 0.4062 0.4375 +0.4688 0.4062 0.4688 +0.4688 0.4062 0.5 +0.4688 0.4062 0.5312 +0.4688 0.4062 0.5625 +0.4688 0.4062 0.5938 +0.4688 0.4062 0.625 +0.4688 0.4062 0.6562 +0.4688 0.4062 0.6875 +0.4688 0.4062 0.7188 +0.4688 0.4062 0.75 +0.4688 0.4062 0.7812 +0.4688 0.4062 0.8125 +0.4688 0.4062 0.8438 +0.4688 0.4062 0.875 +0.4688 0.4062 0.9062 +0.4688 0.4062 0.9375 +0.4688 0.4062 0.9688 +0.4688 0.4062 1 +0.4688 0.4375 0 +0.4688 0.4375 0.03125 +0.4688 0.4375 0.0625 +0.4688 0.4375 0.09375 +0.4688 0.4375 0.125 +0.4688 0.4375 0.1562 +0.4688 0.4375 0.1875 +0.4688 0.4375 0.2188 +0.4688 0.4375 0.25 +0.4688 0.4375 0.2812 +0.4688 0.4375 0.3125 +0.4688 0.4375 0.3438 +0.4688 0.4375 0.375 +0.4688 0.4375 0.4062 +0.4688 0.4375 0.4375 +0.4688 0.4375 0.4688 +0.4688 0.4375 0.5 +0.4688 0.4375 0.5312 +0.4688 0.4375 0.5625 +0.4688 0.4375 0.5938 +0.4688 0.4375 0.625 +0.4688 0.4375 0.6562 +0.4688 0.4375 0.6875 +0.4688 0.4375 0.7188 +0.4688 0.4375 0.75 +0.4688 0.4375 0.7812 +0.4688 0.4375 0.8125 +0.4688 0.4375 0.8438 +0.4688 0.4375 0.875 +0.4688 0.4375 0.9062 +0.4688 0.4375 0.9375 +0.4688 0.4375 0.9688 +0.4688 0.4375 1 +0.4688 0.4688 0 +0.4688 0.4688 0.03125 +0.4688 0.4688 0.0625 +0.4688 0.4688 0.09375 +0.4688 0.4688 0.125 +0.4688 0.4688 0.1562 +0.4688 0.4688 0.1875 +0.4688 0.4688 0.2188 +0.4688 0.4688 0.25 +0.4688 0.4688 0.2812 +0.4688 0.4688 0.3125 +0.4688 0.4688 0.3438 +0.4688 0.4688 0.375 +0.4688 0.4688 0.4062 +0.4688 0.4688 0.4375 +0.4688 0.4688 0.4688 +0.4688 0.4688 0.5 +0.4688 0.4688 0.5312 +0.4688 0.4688 0.5625 +0.4688 0.4688 0.5938 +0.4688 0.4688 0.625 +0.4688 0.4688 0.6562 +0.4688 0.4688 0.6875 +0.4688 0.4688 0.7188 +0.4688 0.4688 0.75 +0.4688 0.4688 0.7812 +0.4688 0.4688 0.8125 +0.4688 0.4688 0.8438 +0.4688 0.4688 0.875 +0.4688 0.4688 0.9062 +0.4688 0.4688 0.9375 +0.4688 0.4688 0.9688 +0.4688 0.4688 1 +0.4688 0.5 0 +0.4688 0.5 0.03125 +0.4688 0.5 0.0625 +0.4688 0.5 0.09375 +0.4688 0.5 0.125 +0.4688 0.5 0.1562 +0.4688 0.5 0.1875 +0.4688 0.5 0.2188 +0.4688 0.5 0.25 +0.4688 0.5 0.2812 +0.4688 0.5 0.3125 +0.4688 0.5 0.3438 +0.4688 0.5 0.375 +0.4688 0.5 0.4062 +0.4688 0.5 0.4375 +0.4688 0.5 0.4688 +0.4688 0.5 0.5 +0.4688 0.5 0.5312 +0.4688 0.5 0.5625 +0.4688 0.5 0.5938 +0.4688 0.5 0.625 +0.4688 0.5 0.6562 +0.4688 0.5 0.6875 +0.4688 0.5 0.7188 +0.4688 0.5 0.75 +0.4688 0.5 0.7812 +0.4688 0.5 0.8125 +0.4688 0.5 0.8438 +0.4688 0.5 0.875 +0.4688 0.5 0.9062 +0.4688 0.5 0.9375 +0.4688 0.5 0.9688 +0.4688 0.5 1 +0.4688 0.5312 0 +0.4688 0.5312 0.03125 +0.4688 0.5312 0.0625 +0.4688 0.5312 0.09375 +0.4688 0.5312 0.125 +0.4688 0.5312 0.1562 +0.4688 0.5312 0.1875 +0.4688 0.5312 0.2188 +0.4688 0.5312 0.25 +0.4688 0.5312 0.2812 +0.4688 0.5312 0.3125 +0.4688 0.5312 0.3438 +0.4688 0.5312 0.375 +0.4688 0.5312 0.4062 +0.4688 0.5312 0.4375 +0.4688 0.5312 0.4688 +0.4688 0.5312 0.5 +0.4688 0.5312 0.5312 +0.4688 0.5312 0.5625 +0.4688 0.5312 0.5938 +0.4688 0.5312 0.625 +0.4688 0.5312 0.6562 +0.4688 0.5312 0.6875 +0.4688 0.5312 0.7188 +0.4688 0.5312 0.75 +0.4688 0.5312 0.7812 +0.4688 0.5312 0.8125 +0.4688 0.5312 0.8438 +0.4688 0.5312 0.875 +0.4688 0.5312 0.9062 +0.4688 0.5312 0.9375 +0.4688 0.5312 0.9688 +0.4688 0.5312 1 +0.4688 0.5625 0 +0.4688 0.5625 0.03125 +0.4688 0.5625 0.0625 +0.4688 0.5625 0.09375 +0.4688 0.5625 0.125 +0.4688 0.5625 0.1562 +0.4688 0.5625 0.1875 +0.4688 0.5625 0.2188 +0.4688 0.5625 0.25 +0.4688 0.5625 0.2812 +0.4688 0.5625 0.3125 +0.4688 0.5625 0.3438 +0.4688 0.5625 0.375 +0.4688 0.5625 0.4062 +0.4688 0.5625 0.4375 +0.4688 0.5625 0.4688 +0.4688 0.5625 0.5 +0.4688 0.5625 0.5312 +0.4688 0.5625 0.5625 +0.4688 0.5625 0.5938 +0.4688 0.5625 0.625 +0.4688 0.5625 0.6562 +0.4688 0.5625 0.6875 +0.4688 0.5625 0.7188 +0.4688 0.5625 0.75 +0.4688 0.5625 0.7812 +0.4688 0.5625 0.8125 +0.4688 0.5625 0.8438 +0.4688 0.5625 0.875 +0.4688 0.5625 0.9062 +0.4688 0.5625 0.9375 +0.4688 0.5625 0.9688 +0.4688 0.5625 1 +0.4688 0.5938 0 +0.4688 0.5938 0.03125 +0.4688 0.5938 0.0625 +0.4688 0.5938 0.09375 +0.4688 0.5938 0.125 +0.4688 0.5938 0.1562 +0.4688 0.5938 0.1875 +0.4688 0.5938 0.2188 +0.4688 0.5938 0.25 +0.4688 0.5938 0.2812 +0.4688 0.5938 0.3125 +0.4688 0.5938 0.3438 +0.4688 0.5938 0.375 +0.4688 0.5938 0.4062 +0.4688 0.5938 0.4375 +0.4688 0.5938 0.4688 +0.4688 0.5938 0.5 +0.4688 0.5938 0.5312 +0.4688 0.5938 0.5625 +0.4688 0.5938 0.5938 +0.4688 0.5938 0.625 +0.4688 0.5938 0.6562 +0.4688 0.5938 0.6875 +0.4688 0.5938 0.7188 +0.4688 0.5938 0.75 +0.4688 0.5938 0.7812 +0.4688 0.5938 0.8125 +0.4688 0.5938 0.8438 +0.4688 0.5938 0.875 +0.4688 0.5938 0.9062 +0.4688 0.5938 0.9375 +0.4688 0.5938 0.9688 +0.4688 0.5938 1 +0.4688 0.625 0 +0.4688 0.625 0.03125 +0.4688 0.625 0.0625 +0.4688 0.625 0.09375 +0.4688 0.625 0.125 +0.4688 0.625 0.1562 +0.4688 0.625 0.1875 +0.4688 0.625 0.2188 +0.4688 0.625 0.25 +0.4688 0.625 0.2812 +0.4688 0.625 0.3125 +0.4688 0.625 0.3438 +0.4688 0.625 0.375 +0.4688 0.625 0.4062 +0.4688 0.625 0.4375 +0.4688 0.625 0.4688 +0.4688 0.625 0.5 +0.4688 0.625 0.5312 +0.4688 0.625 0.5625 +0.4688 0.625 0.5938 +0.4688 0.625 0.625 +0.4688 0.625 0.6562 +0.4688 0.625 0.6875 +0.4688 0.625 0.7188 +0.4688 0.625 0.75 +0.4688 0.625 0.7812 +0.4688 0.625 0.8125 +0.4688 0.625 0.8438 +0.4688 0.625 0.875 +0.4688 0.625 0.9062 +0.4688 0.625 0.9375 +0.4688 0.625 0.9688 +0.4688 0.625 1 +0.4688 0.6562 0 +0.4688 0.6562 0.03125 +0.4688 0.6562 0.0625 +0.4688 0.6562 0.09375 +0.4688 0.6562 0.125 +0.4688 0.6562 0.1562 +0.4688 0.6562 0.1875 +0.4688 0.6562 0.2188 +0.4688 0.6562 0.25 +0.4688 0.6562 0.2812 +0.4688 0.6562 0.3125 +0.4688 0.6562 0.3438 +0.4688 0.6562 0.375 +0.4688 0.6562 0.4062 +0.4688 0.6562 0.4375 +0.4688 0.6562 0.4688 +0.4688 0.6562 0.5 +0.4688 0.6562 0.5312 +0.4688 0.6562 0.5625 +0.4688 0.6562 0.5938 +0.4688 0.6562 0.625 +0.4688 0.6562 0.6562 +0.4688 0.6562 0.6875 +0.4688 0.6562 0.7188 +0.4688 0.6562 0.75 +0.4688 0.6562 0.7812 +0.4688 0.6562 0.8125 +0.4688 0.6562 0.8438 +0.4688 0.6562 0.875 +0.4688 0.6562 0.9062 +0.4688 0.6562 0.9375 +0.4688 0.6562 0.9688 +0.4688 0.6562 1 +0.4688 0.6875 0 +0.4688 0.6875 0.03125 +0.4688 0.6875 0.0625 +0.4688 0.6875 0.09375 +0.4688 0.6875 0.125 +0.4688 0.6875 0.1562 +0.4688 0.6875 0.1875 +0.4688 0.6875 0.2188 +0.4688 0.6875 0.25 +0.4688 0.6875 0.2812 +0.4688 0.6875 0.3125 +0.4688 0.6875 0.3438 +0.4688 0.6875 0.375 +0.4688 0.6875 0.4062 +0.4688 0.6875 0.4375 +0.4688 0.6875 0.4688 +0.4688 0.6875 0.5 +0.4688 0.6875 0.5312 +0.4688 0.6875 0.5625 +0.4688 0.6875 0.5938 +0.4688 0.6875 0.625 +0.4688 0.6875 0.6562 +0.4688 0.6875 0.6875 +0.4688 0.6875 0.7188 +0.4688 0.6875 0.75 +0.4688 0.6875 0.7812 +0.4688 0.6875 0.8125 +0.4688 0.6875 0.8438 +0.4688 0.6875 0.875 +0.4688 0.6875 0.9062 +0.4688 0.6875 0.9375 +0.4688 0.6875 0.9688 +0.4688 0.6875 1 +0.4688 0.7188 0 +0.4688 0.7188 0.03125 +0.4688 0.7188 0.0625 +0.4688 0.7188 0.09375 +0.4688 0.7188 0.125 +0.4688 0.7188 0.1562 +0.4688 0.7188 0.1875 +0.4688 0.7188 0.2188 +0.4688 0.7188 0.25 +0.4688 0.7188 0.2812 +0.4688 0.7188 0.3125 +0.4688 0.7188 0.3438 +0.4688 0.7188 0.375 +0.4688 0.7188 0.4062 +0.4688 0.7188 0.4375 +0.4688 0.7188 0.4688 +0.4688 0.7188 0.5 +0.4688 0.7188 0.5312 +0.4688 0.7188 0.5625 +0.4688 0.7188 0.5938 +0.4688 0.7188 0.625 +0.4688 0.7188 0.6562 +0.4688 0.7188 0.6875 +0.4688 0.7188 0.7188 +0.4688 0.7188 0.75 +0.4688 0.7188 0.7812 +0.4688 0.7188 0.8125 +0.4688 0.7188 0.8438 +0.4688 0.7188 0.875 +0.4688 0.7188 0.9062 +0.4688 0.7188 0.9375 +0.4688 0.7188 0.9688 +0.4688 0.7188 1 +0.4688 0.75 0 +0.4688 0.75 0.03125 +0.4688 0.75 0.0625 +0.4688 0.75 0.09375 +0.4688 0.75 0.125 +0.4688 0.75 0.1562 +0.4688 0.75 0.1875 +0.4688 0.75 0.2188 +0.4688 0.75 0.25 +0.4688 0.75 0.2812 +0.4688 0.75 0.3125 +0.4688 0.75 0.3438 +0.4688 0.75 0.375 +0.4688 0.75 0.4062 +0.4688 0.75 0.4375 +0.4688 0.75 0.4688 +0.4688 0.75 0.5 +0.4688 0.75 0.5312 +0.4688 0.75 0.5625 +0.4688 0.75 0.5938 +0.4688 0.75 0.625 +0.4688 0.75 0.6562 +0.4688 0.75 0.6875 +0.4688 0.75 0.7188 +0.4688 0.75 0.75 +0.4688 0.75 0.7812 +0.4688 0.75 0.8125 +0.4688 0.75 0.8438 +0.4688 0.75 0.875 +0.4688 0.75 0.9062 +0.4688 0.75 0.9375 +0.4688 0.75 0.9688 +0.4688 0.75 1 +0.4688 0.7812 0 +0.4688 0.7812 0.03125 +0.4688 0.7812 0.0625 +0.4688 0.7812 0.09375 +0.4688 0.7812 0.125 +0.4688 0.7812 0.1562 +0.4688 0.7812 0.1875 +0.4688 0.7812 0.2188 +0.4688 0.7812 0.25 +0.4688 0.7812 0.2812 +0.4688 0.7812 0.3125 +0.4688 0.7812 0.3438 +0.4688 0.7812 0.375 +0.4688 0.7812 0.4062 +0.4688 0.7812 0.4375 +0.4688 0.7812 0.4688 +0.4688 0.7812 0.5 +0.4688 0.7812 0.5312 +0.4688 0.7812 0.5625 +0.4688 0.7812 0.5938 +0.4688 0.7812 0.625 +0.4688 0.7812 0.6562 +0.4688 0.7812 0.6875 +0.4688 0.7812 0.7188 +0.4688 0.7812 0.75 +0.4688 0.7812 0.7812 +0.4688 0.7812 0.8125 +0.4688 0.7812 0.8438 +0.4688 0.7812 0.875 +0.4688 0.7812 0.9062 +0.4688 0.7812 0.9375 +0.4688 0.7812 0.9688 +0.4688 0.7812 1 +0.4688 0.8125 0 +0.4688 0.8125 0.03125 +0.4688 0.8125 0.0625 +0.4688 0.8125 0.09375 +0.4688 0.8125 0.125 +0.4688 0.8125 0.1562 +0.4688 0.8125 0.1875 +0.4688 0.8125 0.2188 +0.4688 0.8125 0.25 +0.4688 0.8125 0.2812 +0.4688 0.8125 0.3125 +0.4688 0.8125 0.3438 +0.4688 0.8125 0.375 +0.4688 0.8125 0.4062 +0.4688 0.8125 0.4375 +0.4688 0.8125 0.4688 +0.4688 0.8125 0.5 +0.4688 0.8125 0.5312 +0.4688 0.8125 0.5625 +0.4688 0.8125 0.5938 +0.4688 0.8125 0.625 +0.4688 0.8125 0.6562 +0.4688 0.8125 0.6875 +0.4688 0.8125 0.7188 +0.4688 0.8125 0.75 +0.4688 0.8125 0.7812 +0.4688 0.8125 0.8125 +0.4688 0.8125 0.8438 +0.4688 0.8125 0.875 +0.4688 0.8125 0.9062 +0.4688 0.8125 0.9375 +0.4688 0.8125 0.9688 +0.4688 0.8125 1 +0.4688 0.8438 0 +0.4688 0.8438 0.03125 +0.4688 0.8438 0.0625 +0.4688 0.8438 0.09375 +0.4688 0.8438 0.125 +0.4688 0.8438 0.1562 +0.4688 0.8438 0.1875 +0.4688 0.8438 0.2188 +0.4688 0.8438 0.25 +0.4688 0.8438 0.2812 +0.4688 0.8438 0.3125 +0.4688 0.8438 0.3438 +0.4688 0.8438 0.375 +0.4688 0.8438 0.4062 +0.4688 0.8438 0.4375 +0.4688 0.8438 0.4688 +0.4688 0.8438 0.5 +0.4688 0.8438 0.5312 +0.4688 0.8438 0.5625 +0.4688 0.8438 0.5938 +0.4688 0.8438 0.625 +0.4688 0.8438 0.6562 +0.4688 0.8438 0.6875 +0.4688 0.8438 0.7188 +0.4688 0.8438 0.75 +0.4688 0.8438 0.7812 +0.4688 0.8438 0.8125 +0.4688 0.8438 0.8438 +0.4688 0.8438 0.875 +0.4688 0.8438 0.9062 +0.4688 0.8438 0.9375 +0.4688 0.8438 0.9688 +0.4688 0.8438 1 +0.4688 0.875 0 +0.4688 0.875 0.03125 +0.4688 0.875 0.0625 +0.4688 0.875 0.09375 +0.4688 0.875 0.125 +0.4688 0.875 0.1562 +0.4688 0.875 0.1875 +0.4688 0.875 0.2188 +0.4688 0.875 0.25 +0.4688 0.875 0.2812 +0.4688 0.875 0.3125 +0.4688 0.875 0.3438 +0.4688 0.875 0.375 +0.4688 0.875 0.4062 +0.4688 0.875 0.4375 +0.4688 0.875 0.4688 +0.4688 0.875 0.5 +0.4688 0.875 0.5312 +0.4688 0.875 0.5625 +0.4688 0.875 0.5938 +0.4688 0.875 0.625 +0.4688 0.875 0.6562 +0.4688 0.875 0.6875 +0.4688 0.875 0.7188 +0.4688 0.875 0.75 +0.4688 0.875 0.7812 +0.4688 0.875 0.8125 +0.4688 0.875 0.8438 +0.4688 0.875 0.875 +0.4688 0.875 0.9062 +0.4688 0.875 0.9375 +0.4688 0.875 0.9688 +0.4688 0.875 1 +0.4688 0.9062 0 +0.4688 0.9062 0.03125 +0.4688 0.9062 0.0625 +0.4688 0.9062 0.09375 +0.4688 0.9062 0.125 +0.4688 0.9062 0.1562 +0.4688 0.9062 0.1875 +0.4688 0.9062 0.2188 +0.4688 0.9062 0.25 +0.4688 0.9062 0.2812 +0.4688 0.9062 0.3125 +0.4688 0.9062 0.3438 +0.4688 0.9062 0.375 +0.4688 0.9062 0.4062 +0.4688 0.9062 0.4375 +0.4688 0.9062 0.4688 +0.4688 0.9062 0.5 +0.4688 0.9062 0.5312 +0.4688 0.9062 0.5625 +0.4688 0.9062 0.5938 +0.4688 0.9062 0.625 +0.4688 0.9062 0.6562 +0.4688 0.9062 0.6875 +0.4688 0.9062 0.7188 +0.4688 0.9062 0.75 +0.4688 0.9062 0.7812 +0.4688 0.9062 0.8125 +0.4688 0.9062 0.8438 +0.4688 0.9062 0.875 +0.4688 0.9062 0.9062 +0.4688 0.9062 0.9375 +0.4688 0.9062 0.9688 +0.4688 0.9062 1 +0.4688 0.9375 0 +0.4688 0.9375 0.03125 +0.4688 0.9375 0.0625 +0.4688 0.9375 0.09375 +0.4688 0.9375 0.125 +0.4688 0.9375 0.1562 +0.4688 0.9375 0.1875 +0.4688 0.9375 0.2188 +0.4688 0.9375 0.25 +0.4688 0.9375 0.2812 +0.4688 0.9375 0.3125 +0.4688 0.9375 0.3438 +0.4688 0.9375 0.375 +0.4688 0.9375 0.4062 +0.4688 0.9375 0.4375 +0.4688 0.9375 0.4688 +0.4688 0.9375 0.5 +0.4688 0.9375 0.5312 +0.4688 0.9375 0.5625 +0.4688 0.9375 0.5938 +0.4688 0.9375 0.625 +0.4688 0.9375 0.6562 +0.4688 0.9375 0.6875 +0.4688 0.9375 0.7188 +0.4688 0.9375 0.75 +0.4688 0.9375 0.7812 +0.4688 0.9375 0.8125 +0.4688 0.9375 0.8438 +0.4688 0.9375 0.875 +0.4688 0.9375 0.9062 +0.4688 0.9375 0.9375 +0.4688 0.9375 0.9688 +0.4688 0.9375 1 +0.4688 0.9688 0 +0.4688 0.9688 0.03125 +0.4688 0.9688 0.0625 +0.4688 0.9688 0.09375 +0.4688 0.9688 0.125 +0.4688 0.9688 0.1562 +0.4688 0.9688 0.1875 +0.4688 0.9688 0.2188 +0.4688 0.9688 0.25 +0.4688 0.9688 0.2812 +0.4688 0.9688 0.3125 +0.4688 0.9688 0.3438 +0.4688 0.9688 0.375 +0.4688 0.9688 0.4062 +0.4688 0.9688 0.4375 +0.4688 0.9688 0.4688 +0.4688 0.9688 0.5 +0.4688 0.9688 0.5312 +0.4688 0.9688 0.5625 +0.4688 0.9688 0.5938 +0.4688 0.9688 0.625 +0.4688 0.9688 0.6562 +0.4688 0.9688 0.6875 +0.4688 0.9688 0.7188 +0.4688 0.9688 0.75 +0.4688 0.9688 0.7812 +0.4688 0.9688 0.8125 +0.4688 0.9688 0.8438 +0.4688 0.9688 0.875 +0.4688 0.9688 0.9062 +0.4688 0.9688 0.9375 +0.4688 0.9688 0.9688 +0.4688 0.9688 1 +0.4688 1 0 +0.4688 1 0.03125 +0.4688 1 0.0625 +0.4688 1 0.09375 +0.4688 1 0.125 +0.4688 1 0.1562 +0.4688 1 0.1875 +0.4688 1 0.2188 +0.4688 1 0.25 +0.4688 1 0.2812 +0.4688 1 0.3125 +0.4688 1 0.3438 +0.4688 1 0.375 +0.4688 1 0.4062 +0.4688 1 0.4375 +0.4688 1 0.4688 +0.4688 1 0.5 +0.4688 1 0.5312 +0.4688 1 0.5625 +0.4688 1 0.5938 +0.4688 1 0.625 +0.4688 1 0.6562 +0.4688 1 0.6875 +0.4688 1 0.7188 +0.4688 1 0.75 +0.4688 1 0.7812 +0.4688 1 0.8125 +0.4688 1 0.8438 +0.4688 1 0.875 +0.4688 1 0.9062 +0.4688 1 0.9375 +0.4688 1 0.9688 +0.4688 1 1 +0.5 0 0 +0.5 0 0.03125 +0.5 0 0.0625 +0.5 0 0.09375 +0.5 0 0.125 +0.5 0 0.1562 +0.5 0 0.1875 +0.5 0 0.2188 +0.5 0 0.25 +0.5 0 0.2812 +0.5 0 0.3125 +0.5 0 0.3438 +0.5 0 0.375 +0.5 0 0.4062 +0.5 0 0.4375 +0.5 0 0.4688 +0.5 0 0.5 +0.5 0 0.5312 +0.5 0 0.5625 +0.5 0 0.5938 +0.5 0 0.625 +0.5 0 0.6562 +0.5 0 0.6875 +0.5 0 0.7188 +0.5 0 0.75 +0.5 0 0.7812 +0.5 0 0.8125 +0.5 0 0.8438 +0.5 0 0.875 +0.5 0 0.9062 +0.5 0 0.9375 +0.5 0 0.9688 +0.5 0 1 +0.5 0.03125 0 +0.5 0.03125 0.03125 +0.5 0.03125 0.0625 +0.5 0.03125 0.09375 +0.5 0.03125 0.125 +0.5 0.03125 0.1562 +0.5 0.03125 0.1875 +0.5 0.03125 0.2188 +0.5 0.03125 0.25 +0.5 0.03125 0.2812 +0.5 0.03125 0.3125 +0.5 0.03125 0.3438 +0.5 0.03125 0.375 +0.5 0.03125 0.4062 +0.5 0.03125 0.4375 +0.5 0.03125 0.4688 +0.5 0.03125 0.5 +0.5 0.03125 0.5312 +0.5 0.03125 0.5625 +0.5 0.03125 0.5938 +0.5 0.03125 0.625 +0.5 0.03125 0.6562 +0.5 0.03125 0.6875 +0.5 0.03125 0.7188 +0.5 0.03125 0.75 +0.5 0.03125 0.7812 +0.5 0.03125 0.8125 +0.5 0.03125 0.8438 +0.5 0.03125 0.875 +0.5 0.03125 0.9062 +0.5 0.03125 0.9375 +0.5 0.03125 0.9688 +0.5 0.03125 1 +0.5 0.0625 0 +0.5 0.0625 0.03125 +0.5 0.0625 0.0625 +0.5 0.0625 0.09375 +0.5 0.0625 0.125 +0.5 0.0625 0.1562 +0.5 0.0625 0.1875 +0.5 0.0625 0.2188 +0.5 0.0625 0.25 +0.5 0.0625 0.2812 +0.5 0.0625 0.3125 +0.5 0.0625 0.3438 +0.5 0.0625 0.375 +0.5 0.0625 0.4062 +0.5 0.0625 0.4375 +0.5 0.0625 0.4688 +0.5 0.0625 0.5 +0.5 0.0625 0.5312 +0.5 0.0625 0.5625 +0.5 0.0625 0.5938 +0.5 0.0625 0.625 +0.5 0.0625 0.6562 +0.5 0.0625 0.6875 +0.5 0.0625 0.7188 +0.5 0.0625 0.75 +0.5 0.0625 0.7812 +0.5 0.0625 0.8125 +0.5 0.0625 0.8438 +0.5 0.0625 0.875 +0.5 0.0625 0.9062 +0.5 0.0625 0.9375 +0.5 0.0625 0.9688 +0.5 0.0625 1 +0.5 0.09375 0 +0.5 0.09375 0.03125 +0.5 0.09375 0.0625 +0.5 0.09375 0.09375 +0.5 0.09375 0.125 +0.5 0.09375 0.1562 +0.5 0.09375 0.1875 +0.5 0.09375 0.2188 +0.5 0.09375 0.25 +0.5 0.09375 0.2812 +0.5 0.09375 0.3125 +0.5 0.09375 0.3438 +0.5 0.09375 0.375 +0.5 0.09375 0.4062 +0.5 0.09375 0.4375 +0.5 0.09375 0.4688 +0.5 0.09375 0.5 +0.5 0.09375 0.5312 +0.5 0.09375 0.5625 +0.5 0.09375 0.5938 +0.5 0.09375 0.625 +0.5 0.09375 0.6562 +0.5 0.09375 0.6875 +0.5 0.09375 0.7188 +0.5 0.09375 0.75 +0.5 0.09375 0.7812 +0.5 0.09375 0.8125 +0.5 0.09375 0.8438 +0.5 0.09375 0.875 +0.5 0.09375 0.9062 +0.5 0.09375 0.9375 +0.5 0.09375 0.9688 +0.5 0.09375 1 +0.5 0.125 0 +0.5 0.125 0.03125 +0.5 0.125 0.0625 +0.5 0.125 0.09375 +0.5 0.125 0.125 +0.5 0.125 0.1562 +0.5 0.125 0.1875 +0.5 0.125 0.2188 +0.5 0.125 0.25 +0.5 0.125 0.2812 +0.5 0.125 0.3125 +0.5 0.125 0.3438 +0.5 0.125 0.375 +0.5 0.125 0.4062 +0.5 0.125 0.4375 +0.5 0.125 0.4688 +0.5 0.125 0.5 +0.5 0.125 0.5312 +0.5 0.125 0.5625 +0.5 0.125 0.5938 +0.5 0.125 0.625 +0.5 0.125 0.6562 +0.5 0.125 0.6875 +0.5 0.125 0.7188 +0.5 0.125 0.75 +0.5 0.125 0.7812 +0.5 0.125 0.8125 +0.5 0.125 0.8438 +0.5 0.125 0.875 +0.5 0.125 0.9062 +0.5 0.125 0.9375 +0.5 0.125 0.9688 +0.5 0.125 1 +0.5 0.1562 0 +0.5 0.1562 0.03125 +0.5 0.1562 0.0625 +0.5 0.1562 0.09375 +0.5 0.1562 0.125 +0.5 0.1562 0.1562 +0.5 0.1562 0.1875 +0.5 0.1562 0.2188 +0.5 0.1562 0.25 +0.5 0.1562 0.2812 +0.5 0.1562 0.3125 +0.5 0.1562 0.3438 +0.5 0.1562 0.375 +0.5 0.1562 0.4062 +0.5 0.1562 0.4375 +0.5 0.1562 0.4688 +0.5 0.1562 0.5 +0.5 0.1562 0.5312 +0.5 0.1562 0.5625 +0.5 0.1562 0.5938 +0.5 0.1562 0.625 +0.5 0.1562 0.6562 +0.5 0.1562 0.6875 +0.5 0.1562 0.7188 +0.5 0.1562 0.75 +0.5 0.1562 0.7812 +0.5 0.1562 0.8125 +0.5 0.1562 0.8438 +0.5 0.1562 0.875 +0.5 0.1562 0.9062 +0.5 0.1562 0.9375 +0.5 0.1562 0.9688 +0.5 0.1562 1 +0.5 0.1875 0 +0.5 0.1875 0.03125 +0.5 0.1875 0.0625 +0.5 0.1875 0.09375 +0.5 0.1875 0.125 +0.5 0.1875 0.1562 +0.5 0.1875 0.1875 +0.5 0.1875 0.2188 +0.5 0.1875 0.25 +0.5 0.1875 0.2812 +0.5 0.1875 0.3125 +0.5 0.1875 0.3438 +0.5 0.1875 0.375 +0.5 0.1875 0.4062 +0.5 0.1875 0.4375 +0.5 0.1875 0.4688 +0.5 0.1875 0.5 +0.5 0.1875 0.5312 +0.5 0.1875 0.5625 +0.5 0.1875 0.5938 +0.5 0.1875 0.625 +0.5 0.1875 0.6562 +0.5 0.1875 0.6875 +0.5 0.1875 0.7188 +0.5 0.1875 0.75 +0.5 0.1875 0.7812 +0.5 0.1875 0.8125 +0.5 0.1875 0.8438 +0.5 0.1875 0.875 +0.5 0.1875 0.9062 +0.5 0.1875 0.9375 +0.5 0.1875 0.9688 +0.5 0.1875 1 +0.5 0.2188 0 +0.5 0.2188 0.03125 +0.5 0.2188 0.0625 +0.5 0.2188 0.09375 +0.5 0.2188 0.125 +0.5 0.2188 0.1562 +0.5 0.2188 0.1875 +0.5 0.2188 0.2188 +0.5 0.2188 0.25 +0.5 0.2188 0.2812 +0.5 0.2188 0.3125 +0.5 0.2188 0.3438 +0.5 0.2188 0.375 +0.5 0.2188 0.4062 +0.5 0.2188 0.4375 +0.5 0.2188 0.4688 +0.5 0.2188 0.5 +0.5 0.2188 0.5312 +0.5 0.2188 0.5625 +0.5 0.2188 0.5938 +0.5 0.2188 0.625 +0.5 0.2188 0.6562 +0.5 0.2188 0.6875 +0.5 0.2188 0.7188 +0.5 0.2188 0.75 +0.5 0.2188 0.7812 +0.5 0.2188 0.8125 +0.5 0.2188 0.8438 +0.5 0.2188 0.875 +0.5 0.2188 0.9062 +0.5 0.2188 0.9375 +0.5 0.2188 0.9688 +0.5 0.2188 1 +0.5 0.25 0 +0.5 0.25 0.03125 +0.5 0.25 0.0625 +0.5 0.25 0.09375 +0.5 0.25 0.125 +0.5 0.25 0.1562 +0.5 0.25 0.1875 +0.5 0.25 0.2188 +0.5 0.25 0.25 +0.5 0.25 0.2812 +0.5 0.25 0.3125 +0.5 0.25 0.3438 +0.5 0.25 0.375 +0.5 0.25 0.4062 +0.5 0.25 0.4375 +0.5 0.25 0.4688 +0.5 0.25 0.5 +0.5 0.25 0.5312 +0.5 0.25 0.5625 +0.5 0.25 0.5938 +0.5 0.25 0.625 +0.5 0.25 0.6562 +0.5 0.25 0.6875 +0.5 0.25 0.7188 +0.5 0.25 0.75 +0.5 0.25 0.7812 +0.5 0.25 0.8125 +0.5 0.25 0.8438 +0.5 0.25 0.875 +0.5 0.25 0.9062 +0.5 0.25 0.9375 +0.5 0.25 0.9688 +0.5 0.25 1 +0.5 0.2812 0 +0.5 0.2812 0.03125 +0.5 0.2812 0.0625 +0.5 0.2812 0.09375 +0.5 0.2812 0.125 +0.5 0.2812 0.1562 +0.5 0.2812 0.1875 +0.5 0.2812 0.2188 +0.5 0.2812 0.25 +0.5 0.2812 0.2812 +0.5 0.2812 0.3125 +0.5 0.2812 0.3438 +0.5 0.2812 0.375 +0.5 0.2812 0.4062 +0.5 0.2812 0.4375 +0.5 0.2812 0.4688 +0.5 0.2812 0.5 +0.5 0.2812 0.5312 +0.5 0.2812 0.5625 +0.5 0.2812 0.5938 +0.5 0.2812 0.625 +0.5 0.2812 0.6562 +0.5 0.2812 0.6875 +0.5 0.2812 0.7188 +0.5 0.2812 0.75 +0.5 0.2812 0.7812 +0.5 0.2812 0.8125 +0.5 0.2812 0.8438 +0.5 0.2812 0.875 +0.5 0.2812 0.9062 +0.5 0.2812 0.9375 +0.5 0.2812 0.9688 +0.5 0.2812 1 +0.5 0.3125 0 +0.5 0.3125 0.03125 +0.5 0.3125 0.0625 +0.5 0.3125 0.09375 +0.5 0.3125 0.125 +0.5 0.3125 0.1562 +0.5 0.3125 0.1875 +0.5 0.3125 0.2188 +0.5 0.3125 0.25 +0.5 0.3125 0.2812 +0.5 0.3125 0.3125 +0.5 0.3125 0.3438 +0.5 0.3125 0.375 +0.5 0.3125 0.4062 +0.5 0.3125 0.4375 +0.5 0.3125 0.4688 +0.5 0.3125 0.5 +0.5 0.3125 0.5312 +0.5 0.3125 0.5625 +0.5 0.3125 0.5938 +0.5 0.3125 0.625 +0.5 0.3125 0.6562 +0.5 0.3125 0.6875 +0.5 0.3125 0.7188 +0.5 0.3125 0.75 +0.5 0.3125 0.7812 +0.5 0.3125 0.8125 +0.5 0.3125 0.8438 +0.5 0.3125 0.875 +0.5 0.3125 0.9062 +0.5 0.3125 0.9375 +0.5 0.3125 0.9688 +0.5 0.3125 1 +0.5 0.3438 0 +0.5 0.3438 0.03125 +0.5 0.3438 0.0625 +0.5 0.3438 0.09375 +0.5 0.3438 0.125 +0.5 0.3438 0.1562 +0.5 0.3438 0.1875 +0.5 0.3438 0.2188 +0.5 0.3438 0.25 +0.5 0.3438 0.2812 +0.5 0.3438 0.3125 +0.5 0.3438 0.3438 +0.5 0.3438 0.375 +0.5 0.3438 0.4062 +0.5 0.3438 0.4375 +0.5 0.3438 0.4688 +0.5 0.3438 0.5 +0.5 0.3438 0.5312 +0.5 0.3438 0.5625 +0.5 0.3438 0.5938 +0.5 0.3438 0.625 +0.5 0.3438 0.6562 +0.5 0.3438 0.6875 +0.5 0.3438 0.7188 +0.5 0.3438 0.75 +0.5 0.3438 0.7812 +0.5 0.3438 0.8125 +0.5 0.3438 0.8438 +0.5 0.3438 0.875 +0.5 0.3438 0.9062 +0.5 0.3438 0.9375 +0.5 0.3438 0.9688 +0.5 0.3438 1 +0.5 0.375 0 +0.5 0.375 0.03125 +0.5 0.375 0.0625 +0.5 0.375 0.09375 +0.5 0.375 0.125 +0.5 0.375 0.1562 +0.5 0.375 0.1875 +0.5 0.375 0.2188 +0.5 0.375 0.25 +0.5 0.375 0.2812 +0.5 0.375 0.3125 +0.5 0.375 0.3438 +0.5 0.375 0.375 +0.5 0.375 0.4062 +0.5 0.375 0.4375 +0.5 0.375 0.4688 +0.5 0.375 0.5 +0.5 0.375 0.5312 +0.5 0.375 0.5625 +0.5 0.375 0.5938 +0.5 0.375 0.625 +0.5 0.375 0.6562 +0.5 0.375 0.6875 +0.5 0.375 0.7188 +0.5 0.375 0.75 +0.5 0.375 0.7812 +0.5 0.375 0.8125 +0.5 0.375 0.8438 +0.5 0.375 0.875 +0.5 0.375 0.9062 +0.5 0.375 0.9375 +0.5 0.375 0.9688 +0.5 0.375 1 +0.5 0.4062 0 +0.5 0.4062 0.03125 +0.5 0.4062 0.0625 +0.5 0.4062 0.09375 +0.5 0.4062 0.125 +0.5 0.4062 0.1562 +0.5 0.4062 0.1875 +0.5 0.4062 0.2188 +0.5 0.4062 0.25 +0.5 0.4062 0.2812 +0.5 0.4062 0.3125 +0.5 0.4062 0.3438 +0.5 0.4062 0.375 +0.5 0.4062 0.4062 +0.5 0.4062 0.4375 +0.5 0.4062 0.4688 +0.5 0.4062 0.5 +0.5 0.4062 0.5312 +0.5 0.4062 0.5625 +0.5 0.4062 0.5938 +0.5 0.4062 0.625 +0.5 0.4062 0.6562 +0.5 0.4062 0.6875 +0.5 0.4062 0.7188 +0.5 0.4062 0.75 +0.5 0.4062 0.7812 +0.5 0.4062 0.8125 +0.5 0.4062 0.8438 +0.5 0.4062 0.875 +0.5 0.4062 0.9062 +0.5 0.4062 0.9375 +0.5 0.4062 0.9688 +0.5 0.4062 1 +0.5 0.4375 0 +0.5 0.4375 0.03125 +0.5 0.4375 0.0625 +0.5 0.4375 0.09375 +0.5 0.4375 0.125 +0.5 0.4375 0.1562 +0.5 0.4375 0.1875 +0.5 0.4375 0.2188 +0.5 0.4375 0.25 +0.5 0.4375 0.2812 +0.5 0.4375 0.3125 +0.5 0.4375 0.3438 +0.5 0.4375 0.375 +0.5 0.4375 0.4062 +0.5 0.4375 0.4375 +0.5 0.4375 0.4688 +0.5 0.4375 0.5 +0.5 0.4375 0.5312 +0.5 0.4375 0.5625 +0.5 0.4375 0.5938 +0.5 0.4375 0.625 +0.5 0.4375 0.6562 +0.5 0.4375 0.6875 +0.5 0.4375 0.7188 +0.5 0.4375 0.75 +0.5 0.4375 0.7812 +0.5 0.4375 0.8125 +0.5 0.4375 0.8438 +0.5 0.4375 0.875 +0.5 0.4375 0.9062 +0.5 0.4375 0.9375 +0.5 0.4375 0.9688 +0.5 0.4375 1 +0.5 0.4688 0 +0.5 0.4688 0.03125 +0.5 0.4688 0.0625 +0.5 0.4688 0.09375 +0.5 0.4688 0.125 +0.5 0.4688 0.1562 +0.5 0.4688 0.1875 +0.5 0.4688 0.2188 +0.5 0.4688 0.25 +0.5 0.4688 0.2812 +0.5 0.4688 0.3125 +0.5 0.4688 0.3438 +0.5 0.4688 0.375 +0.5 0.4688 0.4062 +0.5 0.4688 0.4375 +0.5 0.4688 0.4688 +0.5 0.4688 0.5 +0.5 0.4688 0.5312 +0.5 0.4688 0.5625 +0.5 0.4688 0.5938 +0.5 0.4688 0.625 +0.5 0.4688 0.6562 +0.5 0.4688 0.6875 +0.5 0.4688 0.7188 +0.5 0.4688 0.75 +0.5 0.4688 0.7812 +0.5 0.4688 0.8125 +0.5 0.4688 0.8438 +0.5 0.4688 0.875 +0.5 0.4688 0.9062 +0.5 0.4688 0.9375 +0.5 0.4688 0.9688 +0.5 0.4688 1 +0.5 0.5 0 +0.5 0.5 0.03125 +0.5 0.5 0.0625 +0.5 0.5 0.09375 +0.5 0.5 0.125 +0.5 0.5 0.1562 +0.5 0.5 0.1875 +0.5 0.5 0.2188 +0.5 0.5 0.25 +0.5 0.5 0.2812 +0.5 0.5 0.3125 +0.5 0.5 0.3438 +0.5 0.5 0.375 +0.5 0.5 0.4062 +0.5 0.5 0.4375 +0.5 0.5 0.4688 +0.5 0.5 0.5 +0.5 0.5 0.5312 +0.5 0.5 0.5625 +0.5 0.5 0.5938 +0.5 0.5 0.625 +0.5 0.5 0.6562 +0.5 0.5 0.6875 +0.5 0.5 0.7188 +0.5 0.5 0.75 +0.5 0.5 0.7812 +0.5 0.5 0.8125 +0.5 0.5 0.8438 +0.5 0.5 0.875 +0.5 0.5 0.9062 +0.5 0.5 0.9375 +0.5 0.5 0.9688 +0.5 0.5 1 +0.5 0.5312 0 +0.5 0.5312 0.03125 +0.5 0.5312 0.0625 +0.5 0.5312 0.09375 +0.5 0.5312 0.125 +0.5 0.5312 0.1562 +0.5 0.5312 0.1875 +0.5 0.5312 0.2188 +0.5 0.5312 0.25 +0.5 0.5312 0.2812 +0.5 0.5312 0.3125 +0.5 0.5312 0.3438 +0.5 0.5312 0.375 +0.5 0.5312 0.4062 +0.5 0.5312 0.4375 +0.5 0.5312 0.4688 +0.5 0.5312 0.5 +0.5 0.5312 0.5312 +0.5 0.5312 0.5625 +0.5 0.5312 0.5938 +0.5 0.5312 0.625 +0.5 0.5312 0.6562 +0.5 0.5312 0.6875 +0.5 0.5312 0.7188 +0.5 0.5312 0.75 +0.5 0.5312 0.7812 +0.5 0.5312 0.8125 +0.5 0.5312 0.8438 +0.5 0.5312 0.875 +0.5 0.5312 0.9062 +0.5 0.5312 0.9375 +0.5 0.5312 0.9688 +0.5 0.5312 1 +0.5 0.5625 0 +0.5 0.5625 0.03125 +0.5 0.5625 0.0625 +0.5 0.5625 0.09375 +0.5 0.5625 0.125 +0.5 0.5625 0.1562 +0.5 0.5625 0.1875 +0.5 0.5625 0.2188 +0.5 0.5625 0.25 +0.5 0.5625 0.2812 +0.5 0.5625 0.3125 +0.5 0.5625 0.3438 +0.5 0.5625 0.375 +0.5 0.5625 0.4062 +0.5 0.5625 0.4375 +0.5 0.5625 0.4688 +0.5 0.5625 0.5 +0.5 0.5625 0.5312 +0.5 0.5625 0.5625 +0.5 0.5625 0.5938 +0.5 0.5625 0.625 +0.5 0.5625 0.6562 +0.5 0.5625 0.6875 +0.5 0.5625 0.7188 +0.5 0.5625 0.75 +0.5 0.5625 0.7812 +0.5 0.5625 0.8125 +0.5 0.5625 0.8438 +0.5 0.5625 0.875 +0.5 0.5625 0.9062 +0.5 0.5625 0.9375 +0.5 0.5625 0.9688 +0.5 0.5625 1 +0.5 0.5938 0 +0.5 0.5938 0.03125 +0.5 0.5938 0.0625 +0.5 0.5938 0.09375 +0.5 0.5938 0.125 +0.5 0.5938 0.1562 +0.5 0.5938 0.1875 +0.5 0.5938 0.2188 +0.5 0.5938 0.25 +0.5 0.5938 0.2812 +0.5 0.5938 0.3125 +0.5 0.5938 0.3438 +0.5 0.5938 0.375 +0.5 0.5938 0.4062 +0.5 0.5938 0.4375 +0.5 0.5938 0.4688 +0.5 0.5938 0.5 +0.5 0.5938 0.5312 +0.5 0.5938 0.5625 +0.5 0.5938 0.5938 +0.5 0.5938 0.625 +0.5 0.5938 0.6562 +0.5 0.5938 0.6875 +0.5 0.5938 0.7188 +0.5 0.5938 0.75 +0.5 0.5938 0.7812 +0.5 0.5938 0.8125 +0.5 0.5938 0.8438 +0.5 0.5938 0.875 +0.5 0.5938 0.9062 +0.5 0.5938 0.9375 +0.5 0.5938 0.9688 +0.5 0.5938 1 +0.5 0.625 0 +0.5 0.625 0.03125 +0.5 0.625 0.0625 +0.5 0.625 0.09375 +0.5 0.625 0.125 +0.5 0.625 0.1562 +0.5 0.625 0.1875 +0.5 0.625 0.2188 +0.5 0.625 0.25 +0.5 0.625 0.2812 +0.5 0.625 0.3125 +0.5 0.625 0.3438 +0.5 0.625 0.375 +0.5 0.625 0.4062 +0.5 0.625 0.4375 +0.5 0.625 0.4688 +0.5 0.625 0.5 +0.5 0.625 0.5312 +0.5 0.625 0.5625 +0.5 0.625 0.5938 +0.5 0.625 0.625 +0.5 0.625 0.6562 +0.5 0.625 0.6875 +0.5 0.625 0.7188 +0.5 0.625 0.75 +0.5 0.625 0.7812 +0.5 0.625 0.8125 +0.5 0.625 0.8438 +0.5 0.625 0.875 +0.5 0.625 0.9062 +0.5 0.625 0.9375 +0.5 0.625 0.9688 +0.5 0.625 1 +0.5 0.6562 0 +0.5 0.6562 0.03125 +0.5 0.6562 0.0625 +0.5 0.6562 0.09375 +0.5 0.6562 0.125 +0.5 0.6562 0.1562 +0.5 0.6562 0.1875 +0.5 0.6562 0.2188 +0.5 0.6562 0.25 +0.5 0.6562 0.2812 +0.5 0.6562 0.3125 +0.5 0.6562 0.3438 +0.5 0.6562 0.375 +0.5 0.6562 0.4062 +0.5 0.6562 0.4375 +0.5 0.6562 0.4688 +0.5 0.6562 0.5 +0.5 0.6562 0.5312 +0.5 0.6562 0.5625 +0.5 0.6562 0.5938 +0.5 0.6562 0.625 +0.5 0.6562 0.6562 +0.5 0.6562 0.6875 +0.5 0.6562 0.7188 +0.5 0.6562 0.75 +0.5 0.6562 0.7812 +0.5 0.6562 0.8125 +0.5 0.6562 0.8438 +0.5 0.6562 0.875 +0.5 0.6562 0.9062 +0.5 0.6562 0.9375 +0.5 0.6562 0.9688 +0.5 0.6562 1 +0.5 0.6875 0 +0.5 0.6875 0.03125 +0.5 0.6875 0.0625 +0.5 0.6875 0.09375 +0.5 0.6875 0.125 +0.5 0.6875 0.1562 +0.5 0.6875 0.1875 +0.5 0.6875 0.2188 +0.5 0.6875 0.25 +0.5 0.6875 0.2812 +0.5 0.6875 0.3125 +0.5 0.6875 0.3438 +0.5 0.6875 0.375 +0.5 0.6875 0.4062 +0.5 0.6875 0.4375 +0.5 0.6875 0.4688 +0.5 0.6875 0.5 +0.5 0.6875 0.5312 +0.5 0.6875 0.5625 +0.5 0.6875 0.5938 +0.5 0.6875 0.625 +0.5 0.6875 0.6562 +0.5 0.6875 0.6875 +0.5 0.6875 0.7188 +0.5 0.6875 0.75 +0.5 0.6875 0.7812 +0.5 0.6875 0.8125 +0.5 0.6875 0.8438 +0.5 0.6875 0.875 +0.5 0.6875 0.9062 +0.5 0.6875 0.9375 +0.5 0.6875 0.9688 +0.5 0.6875 1 +0.5 0.7188 0 +0.5 0.7188 0.03125 +0.5 0.7188 0.0625 +0.5 0.7188 0.09375 +0.5 0.7188 0.125 +0.5 0.7188 0.1562 +0.5 0.7188 0.1875 +0.5 0.7188 0.2188 +0.5 0.7188 0.25 +0.5 0.7188 0.2812 +0.5 0.7188 0.3125 +0.5 0.7188 0.3438 +0.5 0.7188 0.375 +0.5 0.7188 0.4062 +0.5 0.7188 0.4375 +0.5 0.7188 0.4688 +0.5 0.7188 0.5 +0.5 0.7188 0.5312 +0.5 0.7188 0.5625 +0.5 0.7188 0.5938 +0.5 0.7188 0.625 +0.5 0.7188 0.6562 +0.5 0.7188 0.6875 +0.5 0.7188 0.7188 +0.5 0.7188 0.75 +0.5 0.7188 0.7812 +0.5 0.7188 0.8125 +0.5 0.7188 0.8438 +0.5 0.7188 0.875 +0.5 0.7188 0.9062 +0.5 0.7188 0.9375 +0.5 0.7188 0.9688 +0.5 0.7188 1 +0.5 0.75 0 +0.5 0.75 0.03125 +0.5 0.75 0.0625 +0.5 0.75 0.09375 +0.5 0.75 0.125 +0.5 0.75 0.1562 +0.5 0.75 0.1875 +0.5 0.75 0.2188 +0.5 0.75 0.25 +0.5 0.75 0.2812 +0.5 0.75 0.3125 +0.5 0.75 0.3438 +0.5 0.75 0.375 +0.5 0.75 0.4062 +0.5 0.75 0.4375 +0.5 0.75 0.4688 +0.5 0.75 0.5 +0.5 0.75 0.5312 +0.5 0.75 0.5625 +0.5 0.75 0.5938 +0.5 0.75 0.625 +0.5 0.75 0.6562 +0.5 0.75 0.6875 +0.5 0.75 0.7188 +0.5 0.75 0.75 +0.5 0.75 0.7812 +0.5 0.75 0.8125 +0.5 0.75 0.8438 +0.5 0.75 0.875 +0.5 0.75 0.9062 +0.5 0.75 0.9375 +0.5 0.75 0.9688 +0.5 0.75 1 +0.5 0.7812 0 +0.5 0.7812 0.03125 +0.5 0.7812 0.0625 +0.5 0.7812 0.09375 +0.5 0.7812 0.125 +0.5 0.7812 0.1562 +0.5 0.7812 0.1875 +0.5 0.7812 0.2188 +0.5 0.7812 0.25 +0.5 0.7812 0.2812 +0.5 0.7812 0.3125 +0.5 0.7812 0.3438 +0.5 0.7812 0.375 +0.5 0.7812 0.4062 +0.5 0.7812 0.4375 +0.5 0.7812 0.4688 +0.5 0.7812 0.5 +0.5 0.7812 0.5312 +0.5 0.7812 0.5625 +0.5 0.7812 0.5938 +0.5 0.7812 0.625 +0.5 0.7812 0.6562 +0.5 0.7812 0.6875 +0.5 0.7812 0.7188 +0.5 0.7812 0.75 +0.5 0.7812 0.7812 +0.5 0.7812 0.8125 +0.5 0.7812 0.8438 +0.5 0.7812 0.875 +0.5 0.7812 0.9062 +0.5 0.7812 0.9375 +0.5 0.7812 0.9688 +0.5 0.7812 1 +0.5 0.8125 0 +0.5 0.8125 0.03125 +0.5 0.8125 0.0625 +0.5 0.8125 0.09375 +0.5 0.8125 0.125 +0.5 0.8125 0.1562 +0.5 0.8125 0.1875 +0.5 0.8125 0.2188 +0.5 0.8125 0.25 +0.5 0.8125 0.2812 +0.5 0.8125 0.3125 +0.5 0.8125 0.3438 +0.5 0.8125 0.375 +0.5 0.8125 0.4062 +0.5 0.8125 0.4375 +0.5 0.8125 0.4688 +0.5 0.8125 0.5 +0.5 0.8125 0.5312 +0.5 0.8125 0.5625 +0.5 0.8125 0.5938 +0.5 0.8125 0.625 +0.5 0.8125 0.6562 +0.5 0.8125 0.6875 +0.5 0.8125 0.7188 +0.5 0.8125 0.75 +0.5 0.8125 0.7812 +0.5 0.8125 0.8125 +0.5 0.8125 0.8438 +0.5 0.8125 0.875 +0.5 0.8125 0.9062 +0.5 0.8125 0.9375 +0.5 0.8125 0.9688 +0.5 0.8125 1 +0.5 0.8438 0 +0.5 0.8438 0.03125 +0.5 0.8438 0.0625 +0.5 0.8438 0.09375 +0.5 0.8438 0.125 +0.5 0.8438 0.1562 +0.5 0.8438 0.1875 +0.5 0.8438 0.2188 +0.5 0.8438 0.25 +0.5 0.8438 0.2812 +0.5 0.8438 0.3125 +0.5 0.8438 0.3438 +0.5 0.8438 0.375 +0.5 0.8438 0.4062 +0.5 0.8438 0.4375 +0.5 0.8438 0.4688 +0.5 0.8438 0.5 +0.5 0.8438 0.5312 +0.5 0.8438 0.5625 +0.5 0.8438 0.5938 +0.5 0.8438 0.625 +0.5 0.8438 0.6562 +0.5 0.8438 0.6875 +0.5 0.8438 0.7188 +0.5 0.8438 0.75 +0.5 0.8438 0.7812 +0.5 0.8438 0.8125 +0.5 0.8438 0.8438 +0.5 0.8438 0.875 +0.5 0.8438 0.9062 +0.5 0.8438 0.9375 +0.5 0.8438 0.9688 +0.5 0.8438 1 +0.5 0.875 0 +0.5 0.875 0.03125 +0.5 0.875 0.0625 +0.5 0.875 0.09375 +0.5 0.875 0.125 +0.5 0.875 0.1562 +0.5 0.875 0.1875 +0.5 0.875 0.2188 +0.5 0.875 0.25 +0.5 0.875 0.2812 +0.5 0.875 0.3125 +0.5 0.875 0.3438 +0.5 0.875 0.375 +0.5 0.875 0.4062 +0.5 0.875 0.4375 +0.5 0.875 0.4688 +0.5 0.875 0.5 +0.5 0.875 0.5312 +0.5 0.875 0.5625 +0.5 0.875 0.5938 +0.5 0.875 0.625 +0.5 0.875 0.6562 +0.5 0.875 0.6875 +0.5 0.875 0.7188 +0.5 0.875 0.75 +0.5 0.875 0.7812 +0.5 0.875 0.8125 +0.5 0.875 0.8438 +0.5 0.875 0.875 +0.5 0.875 0.9062 +0.5 0.875 0.9375 +0.5 0.875 0.9688 +0.5 0.875 1 +0.5 0.9062 0 +0.5 0.9062 0.03125 +0.5 0.9062 0.0625 +0.5 0.9062 0.09375 +0.5 0.9062 0.125 +0.5 0.9062 0.1562 +0.5 0.9062 0.1875 +0.5 0.9062 0.2188 +0.5 0.9062 0.25 +0.5 0.9062 0.2812 +0.5 0.9062 0.3125 +0.5 0.9062 0.3438 +0.5 0.9062 0.375 +0.5 0.9062 0.4062 +0.5 0.9062 0.4375 +0.5 0.9062 0.4688 +0.5 0.9062 0.5 +0.5 0.9062 0.5312 +0.5 0.9062 0.5625 +0.5 0.9062 0.5938 +0.5 0.9062 0.625 +0.5 0.9062 0.6562 +0.5 0.9062 0.6875 +0.5 0.9062 0.7188 +0.5 0.9062 0.75 +0.5 0.9062 0.7812 +0.5 0.9062 0.8125 +0.5 0.9062 0.8438 +0.5 0.9062 0.875 +0.5 0.9062 0.9062 +0.5 0.9062 0.9375 +0.5 0.9062 0.9688 +0.5 0.9062 1 +0.5 0.9375 0 +0.5 0.9375 0.03125 +0.5 0.9375 0.0625 +0.5 0.9375 0.09375 +0.5 0.9375 0.125 +0.5 0.9375 0.1562 +0.5 0.9375 0.1875 +0.5 0.9375 0.2188 +0.5 0.9375 0.25 +0.5 0.9375 0.2812 +0.5 0.9375 0.3125 +0.5 0.9375 0.3438 +0.5 0.9375 0.375 +0.5 0.9375 0.4062 +0.5 0.9375 0.4375 +0.5 0.9375 0.4688 +0.5 0.9375 0.5 +0.5 0.9375 0.5312 +0.5 0.9375 0.5625 +0.5 0.9375 0.5938 +0.5 0.9375 0.625 +0.5 0.9375 0.6562 +0.5 0.9375 0.6875 +0.5 0.9375 0.7188 +0.5 0.9375 0.75 +0.5 0.9375 0.7812 +0.5 0.9375 0.8125 +0.5 0.9375 0.8438 +0.5 0.9375 0.875 +0.5 0.9375 0.9062 +0.5 0.9375 0.9375 +0.5 0.9375 0.9688 +0.5 0.9375 1 +0.5 0.9688 0 +0.5 0.9688 0.03125 +0.5 0.9688 0.0625 +0.5 0.9688 0.09375 +0.5 0.9688 0.125 +0.5 0.9688 0.1562 +0.5 0.9688 0.1875 +0.5 0.9688 0.2188 +0.5 0.9688 0.25 +0.5 0.9688 0.2812 +0.5 0.9688 0.3125 +0.5 0.9688 0.3438 +0.5 0.9688 0.375 +0.5 0.9688 0.4062 +0.5 0.9688 0.4375 +0.5 0.9688 0.4688 +0.5 0.9688 0.5 +0.5 0.9688 0.5312 +0.5 0.9688 0.5625 +0.5 0.9688 0.5938 +0.5 0.9688 0.625 +0.5 0.9688 0.6562 +0.5 0.9688 0.6875 +0.5 0.9688 0.7188 +0.5 0.9688 0.75 +0.5 0.9688 0.7812 +0.5 0.9688 0.8125 +0.5 0.9688 0.8438 +0.5 0.9688 0.875 +0.5 0.9688 0.9062 +0.5 0.9688 0.9375 +0.5 0.9688 0.9688 +0.5 0.9688 1 +0.5 1 0 +0.5 1 0.03125 +0.5 1 0.0625 +0.5 1 0.09375 +0.5 1 0.125 +0.5 1 0.1562 +0.5 1 0.1875 +0.5 1 0.2188 +0.5 1 0.25 +0.5 1 0.2812 +0.5 1 0.3125 +0.5 1 0.3438 +0.5 1 0.375 +0.5 1 0.4062 +0.5 1 0.4375 +0.5 1 0.4688 +0.5 1 0.5 +0.5 1 0.5312 +0.5 1 0.5625 +0.5 1 0.5938 +0.5 1 0.625 +0.5 1 0.6562 +0.5 1 0.6875 +0.5 1 0.7188 +0.5 1 0.75 +0.5 1 0.7812 +0.5 1 0.8125 +0.5 1 0.8438 +0.5 1 0.875 +0.5 1 0.9062 +0.5 1 0.9375 +0.5 1 0.9688 +0.5 1 1 +0.5312 0 0 +0.5312 0 0.03125 +0.5312 0 0.0625 +0.5312 0 0.09375 +0.5312 0 0.125 +0.5312 0 0.1562 +0.5312 0 0.1875 +0.5312 0 0.2188 +0.5312 0 0.25 +0.5312 0 0.2812 +0.5312 0 0.3125 +0.5312 0 0.3438 +0.5312 0 0.375 +0.5312 0 0.4062 +0.5312 0 0.4375 +0.5312 0 0.4688 +0.5312 0 0.5 +0.5312 0 0.5312 +0.5312 0 0.5625 +0.5312 0 0.5938 +0.5312 0 0.625 +0.5312 0 0.6562 +0.5312 0 0.6875 +0.5312 0 0.7188 +0.5312 0 0.75 +0.5312 0 0.7812 +0.5312 0 0.8125 +0.5312 0 0.8438 +0.5312 0 0.875 +0.5312 0 0.9062 +0.5312 0 0.9375 +0.5312 0 0.9688 +0.5312 0 1 +0.5312 0.03125 0 +0.5312 0.03125 0.03125 +0.5312 0.03125 0.0625 +0.5312 0.03125 0.09375 +0.5312 0.03125 0.125 +0.5312 0.03125 0.1562 +0.5312 0.03125 0.1875 +0.5312 0.03125 0.2188 +0.5312 0.03125 0.25 +0.5312 0.03125 0.2812 +0.5312 0.03125 0.3125 +0.5312 0.03125 0.3438 +0.5312 0.03125 0.375 +0.5312 0.03125 0.4062 +0.5312 0.03125 0.4375 +0.5312 0.03125 0.4688 +0.5312 0.03125 0.5 +0.5312 0.03125 0.5312 +0.5312 0.03125 0.5625 +0.5312 0.03125 0.5938 +0.5312 0.03125 0.625 +0.5312 0.03125 0.6562 +0.5312 0.03125 0.6875 +0.5312 0.03125 0.7188 +0.5312 0.03125 0.75 +0.5312 0.03125 0.7812 +0.5312 0.03125 0.8125 +0.5312 0.03125 0.8438 +0.5312 0.03125 0.875 +0.5312 0.03125 0.9062 +0.5312 0.03125 0.9375 +0.5312 0.03125 0.9688 +0.5312 0.03125 1 +0.5312 0.0625 0 +0.5312 0.0625 0.03125 +0.5312 0.0625 0.0625 +0.5312 0.0625 0.09375 +0.5312 0.0625 0.125 +0.5312 0.0625 0.1562 +0.5312 0.0625 0.1875 +0.5312 0.0625 0.2188 +0.5312 0.0625 0.25 +0.5312 0.0625 0.2812 +0.5312 0.0625 0.3125 +0.5312 0.0625 0.3438 +0.5312 0.0625 0.375 +0.5312 0.0625 0.4062 +0.5312 0.0625 0.4375 +0.5312 0.0625 0.4688 +0.5312 0.0625 0.5 +0.5312 0.0625 0.5312 +0.5312 0.0625 0.5625 +0.5312 0.0625 0.5938 +0.5312 0.0625 0.625 +0.5312 0.0625 0.6562 +0.5312 0.0625 0.6875 +0.5312 0.0625 0.7188 +0.5312 0.0625 0.75 +0.5312 0.0625 0.7812 +0.5312 0.0625 0.8125 +0.5312 0.0625 0.8438 +0.5312 0.0625 0.875 +0.5312 0.0625 0.9062 +0.5312 0.0625 0.9375 +0.5312 0.0625 0.9688 +0.5312 0.0625 1 +0.5312 0.09375 0 +0.5312 0.09375 0.03125 +0.5312 0.09375 0.0625 +0.5312 0.09375 0.09375 +0.5312 0.09375 0.125 +0.5312 0.09375 0.1562 +0.5312 0.09375 0.1875 +0.5312 0.09375 0.2188 +0.5312 0.09375 0.25 +0.5312 0.09375 0.2812 +0.5312 0.09375 0.3125 +0.5312 0.09375 0.3438 +0.5312 0.09375 0.375 +0.5312 0.09375 0.4062 +0.5312 0.09375 0.4375 +0.5312 0.09375 0.4688 +0.5312 0.09375 0.5 +0.5312 0.09375 0.5312 +0.5312 0.09375 0.5625 +0.5312 0.09375 0.5938 +0.5312 0.09375 0.625 +0.5312 0.09375 0.6562 +0.5312 0.09375 0.6875 +0.5312 0.09375 0.7188 +0.5312 0.09375 0.75 +0.5312 0.09375 0.7812 +0.5312 0.09375 0.8125 +0.5312 0.09375 0.8438 +0.5312 0.09375 0.875 +0.5312 0.09375 0.9062 +0.5312 0.09375 0.9375 +0.5312 0.09375 0.9688 +0.5312 0.09375 1 +0.5312 0.125 0 +0.5312 0.125 0.03125 +0.5312 0.125 0.0625 +0.5312 0.125 0.09375 +0.5312 0.125 0.125 +0.5312 0.125 0.1562 +0.5312 0.125 0.1875 +0.5312 0.125 0.2188 +0.5312 0.125 0.25 +0.5312 0.125 0.2812 +0.5312 0.125 0.3125 +0.5312 0.125 0.3438 +0.5312 0.125 0.375 +0.5312 0.125 0.4062 +0.5312 0.125 0.4375 +0.5312 0.125 0.4688 +0.5312 0.125 0.5 +0.5312 0.125 0.5312 +0.5312 0.125 0.5625 +0.5312 0.125 0.5938 +0.5312 0.125 0.625 +0.5312 0.125 0.6562 +0.5312 0.125 0.6875 +0.5312 0.125 0.7188 +0.5312 0.125 0.75 +0.5312 0.125 0.7812 +0.5312 0.125 0.8125 +0.5312 0.125 0.8438 +0.5312 0.125 0.875 +0.5312 0.125 0.9062 +0.5312 0.125 0.9375 +0.5312 0.125 0.9688 +0.5312 0.125 1 +0.5312 0.1562 0 +0.5312 0.1562 0.03125 +0.5312 0.1562 0.0625 +0.5312 0.1562 0.09375 +0.5312 0.1562 0.125 +0.5312 0.1562 0.1562 +0.5312 0.1562 0.1875 +0.5312 0.1562 0.2188 +0.5312 0.1562 0.25 +0.5312 0.1562 0.2812 +0.5312 0.1562 0.3125 +0.5312 0.1562 0.3438 +0.5312 0.1562 0.375 +0.5312 0.1562 0.4062 +0.5312 0.1562 0.4375 +0.5312 0.1562 0.4688 +0.5312 0.1562 0.5 +0.5312 0.1562 0.5312 +0.5312 0.1562 0.5625 +0.5312 0.1562 0.5938 +0.5312 0.1562 0.625 +0.5312 0.1562 0.6562 +0.5312 0.1562 0.6875 +0.5312 0.1562 0.7188 +0.5312 0.1562 0.75 +0.5312 0.1562 0.7812 +0.5312 0.1562 0.8125 +0.5312 0.1562 0.8438 +0.5312 0.1562 0.875 +0.5312 0.1562 0.9062 +0.5312 0.1562 0.9375 +0.5312 0.1562 0.9688 +0.5312 0.1562 1 +0.5312 0.1875 0 +0.5312 0.1875 0.03125 +0.5312 0.1875 0.0625 +0.5312 0.1875 0.09375 +0.5312 0.1875 0.125 +0.5312 0.1875 0.1562 +0.5312 0.1875 0.1875 +0.5312 0.1875 0.2188 +0.5312 0.1875 0.25 +0.5312 0.1875 0.2812 +0.5312 0.1875 0.3125 +0.5312 0.1875 0.3438 +0.5312 0.1875 0.375 +0.5312 0.1875 0.4062 +0.5312 0.1875 0.4375 +0.5312 0.1875 0.4688 +0.5312 0.1875 0.5 +0.5312 0.1875 0.5312 +0.5312 0.1875 0.5625 +0.5312 0.1875 0.5938 +0.5312 0.1875 0.625 +0.5312 0.1875 0.6562 +0.5312 0.1875 0.6875 +0.5312 0.1875 0.7188 +0.5312 0.1875 0.75 +0.5312 0.1875 0.7812 +0.5312 0.1875 0.8125 +0.5312 0.1875 0.8438 +0.5312 0.1875 0.875 +0.5312 0.1875 0.9062 +0.5312 0.1875 0.9375 +0.5312 0.1875 0.9688 +0.5312 0.1875 1 +0.5312 0.2188 0 +0.5312 0.2188 0.03125 +0.5312 0.2188 0.0625 +0.5312 0.2188 0.09375 +0.5312 0.2188 0.125 +0.5312 0.2188 0.1562 +0.5312 0.2188 0.1875 +0.5312 0.2188 0.2188 +0.5312 0.2188 0.25 +0.5312 0.2188 0.2812 +0.5312 0.2188 0.3125 +0.5312 0.2188 0.3438 +0.5312 0.2188 0.375 +0.5312 0.2188 0.4062 +0.5312 0.2188 0.4375 +0.5312 0.2188 0.4688 +0.5312 0.2188 0.5 +0.5312 0.2188 0.5312 +0.5312 0.2188 0.5625 +0.5312 0.2188 0.5938 +0.5312 0.2188 0.625 +0.5312 0.2188 0.6562 +0.5312 0.2188 0.6875 +0.5312 0.2188 0.7188 +0.5312 0.2188 0.75 +0.5312 0.2188 0.7812 +0.5312 0.2188 0.8125 +0.5312 0.2188 0.8438 +0.5312 0.2188 0.875 +0.5312 0.2188 0.9062 +0.5312 0.2188 0.9375 +0.5312 0.2188 0.9688 +0.5312 0.2188 1 +0.5312 0.25 0 +0.5312 0.25 0.03125 +0.5312 0.25 0.0625 +0.5312 0.25 0.09375 +0.5312 0.25 0.125 +0.5312 0.25 0.1562 +0.5312 0.25 0.1875 +0.5312 0.25 0.2188 +0.5312 0.25 0.25 +0.5312 0.25 0.2812 +0.5312 0.25 0.3125 +0.5312 0.25 0.3438 +0.5312 0.25 0.375 +0.5312 0.25 0.4062 +0.5312 0.25 0.4375 +0.5312 0.25 0.4688 +0.5312 0.25 0.5 +0.5312 0.25 0.5312 +0.5312 0.25 0.5625 +0.5312 0.25 0.5938 +0.5312 0.25 0.625 +0.5312 0.25 0.6562 +0.5312 0.25 0.6875 +0.5312 0.25 0.7188 +0.5312 0.25 0.75 +0.5312 0.25 0.7812 +0.5312 0.25 0.8125 +0.5312 0.25 0.8438 +0.5312 0.25 0.875 +0.5312 0.25 0.9062 +0.5312 0.25 0.9375 +0.5312 0.25 0.9688 +0.5312 0.25 1 +0.5312 0.2812 0 +0.5312 0.2812 0.03125 +0.5312 0.2812 0.0625 +0.5312 0.2812 0.09375 +0.5312 0.2812 0.125 +0.5312 0.2812 0.1562 +0.5312 0.2812 0.1875 +0.5312 0.2812 0.2188 +0.5312 0.2812 0.25 +0.5312 0.2812 0.2812 +0.5312 0.2812 0.3125 +0.5312 0.2812 0.3438 +0.5312 0.2812 0.375 +0.5312 0.2812 0.4062 +0.5312 0.2812 0.4375 +0.5312 0.2812 0.4688 +0.5312 0.2812 0.5 +0.5312 0.2812 0.5312 +0.5312 0.2812 0.5625 +0.5312 0.2812 0.5938 +0.5312 0.2812 0.625 +0.5312 0.2812 0.6562 +0.5312 0.2812 0.6875 +0.5312 0.2812 0.7188 +0.5312 0.2812 0.75 +0.5312 0.2812 0.7812 +0.5312 0.2812 0.8125 +0.5312 0.2812 0.8438 +0.5312 0.2812 0.875 +0.5312 0.2812 0.9062 +0.5312 0.2812 0.9375 +0.5312 0.2812 0.9688 +0.5312 0.2812 1 +0.5312 0.3125 0 +0.5312 0.3125 0.03125 +0.5312 0.3125 0.0625 +0.5312 0.3125 0.09375 +0.5312 0.3125 0.125 +0.5312 0.3125 0.1562 +0.5312 0.3125 0.1875 +0.5312 0.3125 0.2188 +0.5312 0.3125 0.25 +0.5312 0.3125 0.2812 +0.5312 0.3125 0.3125 +0.5312 0.3125 0.3438 +0.5312 0.3125 0.375 +0.5312 0.3125 0.4062 +0.5312 0.3125 0.4375 +0.5312 0.3125 0.4688 +0.5312 0.3125 0.5 +0.5312 0.3125 0.5312 +0.5312 0.3125 0.5625 +0.5312 0.3125 0.5938 +0.5312 0.3125 0.625 +0.5312 0.3125 0.6562 +0.5312 0.3125 0.6875 +0.5312 0.3125 0.7188 +0.5312 0.3125 0.75 +0.5312 0.3125 0.7812 +0.5312 0.3125 0.8125 +0.5312 0.3125 0.8438 +0.5312 0.3125 0.875 +0.5312 0.3125 0.9062 +0.5312 0.3125 0.9375 +0.5312 0.3125 0.9688 +0.5312 0.3125 1 +0.5312 0.3438 0 +0.5312 0.3438 0.03125 +0.5312 0.3438 0.0625 +0.5312 0.3438 0.09375 +0.5312 0.3438 0.125 +0.5312 0.3438 0.1562 +0.5312 0.3438 0.1875 +0.5312 0.3438 0.2188 +0.5312 0.3438 0.25 +0.5312 0.3438 0.2812 +0.5312 0.3438 0.3125 +0.5312 0.3438 0.3438 +0.5312 0.3438 0.375 +0.5312 0.3438 0.4062 +0.5312 0.3438 0.4375 +0.5312 0.3438 0.4688 +0.5312 0.3438 0.5 +0.5312 0.3438 0.5312 +0.5312 0.3438 0.5625 +0.5312 0.3438 0.5938 +0.5312 0.3438 0.625 +0.5312 0.3438 0.6562 +0.5312 0.3438 0.6875 +0.5312 0.3438 0.7188 +0.5312 0.3438 0.75 +0.5312 0.3438 0.7812 +0.5312 0.3438 0.8125 +0.5312 0.3438 0.8438 +0.5312 0.3438 0.875 +0.5312 0.3438 0.9062 +0.5312 0.3438 0.9375 +0.5312 0.3438 0.9688 +0.5312 0.3438 1 +0.5312 0.375 0 +0.5312 0.375 0.03125 +0.5312 0.375 0.0625 +0.5312 0.375 0.09375 +0.5312 0.375 0.125 +0.5312 0.375 0.1562 +0.5312 0.375 0.1875 +0.5312 0.375 0.2188 +0.5312 0.375 0.25 +0.5312 0.375 0.2812 +0.5312 0.375 0.3125 +0.5312 0.375 0.3438 +0.5312 0.375 0.375 +0.5312 0.375 0.4062 +0.5312 0.375 0.4375 +0.5312 0.375 0.4688 +0.5312 0.375 0.5 +0.5312 0.375 0.5312 +0.5312 0.375 0.5625 +0.5312 0.375 0.5938 +0.5312 0.375 0.625 +0.5312 0.375 0.6562 +0.5312 0.375 0.6875 +0.5312 0.375 0.7188 +0.5312 0.375 0.75 +0.5312 0.375 0.7812 +0.5312 0.375 0.8125 +0.5312 0.375 0.8438 +0.5312 0.375 0.875 +0.5312 0.375 0.9062 +0.5312 0.375 0.9375 +0.5312 0.375 0.9688 +0.5312 0.375 1 +0.5312 0.4062 0 +0.5312 0.4062 0.03125 +0.5312 0.4062 0.0625 +0.5312 0.4062 0.09375 +0.5312 0.4062 0.125 +0.5312 0.4062 0.1562 +0.5312 0.4062 0.1875 +0.5312 0.4062 0.2188 +0.5312 0.4062 0.25 +0.5312 0.4062 0.2812 +0.5312 0.4062 0.3125 +0.5312 0.4062 0.3438 +0.5312 0.4062 0.375 +0.5312 0.4062 0.4062 +0.5312 0.4062 0.4375 +0.5312 0.4062 0.4688 +0.5312 0.4062 0.5 +0.5312 0.4062 0.5312 +0.5312 0.4062 0.5625 +0.5312 0.4062 0.5938 +0.5312 0.4062 0.625 +0.5312 0.4062 0.6562 +0.5312 0.4062 0.6875 +0.5312 0.4062 0.7188 +0.5312 0.4062 0.75 +0.5312 0.4062 0.7812 +0.5312 0.4062 0.8125 +0.5312 0.4062 0.8438 +0.5312 0.4062 0.875 +0.5312 0.4062 0.9062 +0.5312 0.4062 0.9375 +0.5312 0.4062 0.9688 +0.5312 0.4062 1 +0.5312 0.4375 0 +0.5312 0.4375 0.03125 +0.5312 0.4375 0.0625 +0.5312 0.4375 0.09375 +0.5312 0.4375 0.125 +0.5312 0.4375 0.1562 +0.5312 0.4375 0.1875 +0.5312 0.4375 0.2188 +0.5312 0.4375 0.25 +0.5312 0.4375 0.2812 +0.5312 0.4375 0.3125 +0.5312 0.4375 0.3438 +0.5312 0.4375 0.375 +0.5312 0.4375 0.4062 +0.5312 0.4375 0.4375 +0.5312 0.4375 0.4688 +0.5312 0.4375 0.5 +0.5312 0.4375 0.5312 +0.5312 0.4375 0.5625 +0.5312 0.4375 0.5938 +0.5312 0.4375 0.625 +0.5312 0.4375 0.6562 +0.5312 0.4375 0.6875 +0.5312 0.4375 0.7188 +0.5312 0.4375 0.75 +0.5312 0.4375 0.7812 +0.5312 0.4375 0.8125 +0.5312 0.4375 0.8438 +0.5312 0.4375 0.875 +0.5312 0.4375 0.9062 +0.5312 0.4375 0.9375 +0.5312 0.4375 0.9688 +0.5312 0.4375 1 +0.5312 0.4688 0 +0.5312 0.4688 0.03125 +0.5312 0.4688 0.0625 +0.5312 0.4688 0.09375 +0.5312 0.4688 0.125 +0.5312 0.4688 0.1562 +0.5312 0.4688 0.1875 +0.5312 0.4688 0.2188 +0.5312 0.4688 0.25 +0.5312 0.4688 0.2812 +0.5312 0.4688 0.3125 +0.5312 0.4688 0.3438 +0.5312 0.4688 0.375 +0.5312 0.4688 0.4062 +0.5312 0.4688 0.4375 +0.5312 0.4688 0.4688 +0.5312 0.4688 0.5 +0.5312 0.4688 0.5312 +0.5312 0.4688 0.5625 +0.5312 0.4688 0.5938 +0.5312 0.4688 0.625 +0.5312 0.4688 0.6562 +0.5312 0.4688 0.6875 +0.5312 0.4688 0.7188 +0.5312 0.4688 0.75 +0.5312 0.4688 0.7812 +0.5312 0.4688 0.8125 +0.5312 0.4688 0.8438 +0.5312 0.4688 0.875 +0.5312 0.4688 0.9062 +0.5312 0.4688 0.9375 +0.5312 0.4688 0.9688 +0.5312 0.4688 1 +0.5312 0.5 0 +0.5312 0.5 0.03125 +0.5312 0.5 0.0625 +0.5312 0.5 0.09375 +0.5312 0.5 0.125 +0.5312 0.5 0.1562 +0.5312 0.5 0.1875 +0.5312 0.5 0.2188 +0.5312 0.5 0.25 +0.5312 0.5 0.2812 +0.5312 0.5 0.3125 +0.5312 0.5 0.3438 +0.5312 0.5 0.375 +0.5312 0.5 0.4062 +0.5312 0.5 0.4375 +0.5312 0.5 0.4688 +0.5312 0.5 0.5 +0.5312 0.5 0.5312 +0.5312 0.5 0.5625 +0.5312 0.5 0.5938 +0.5312 0.5 0.625 +0.5312 0.5 0.6562 +0.5312 0.5 0.6875 +0.5312 0.5 0.7188 +0.5312 0.5 0.75 +0.5312 0.5 0.7812 +0.5312 0.5 0.8125 +0.5312 0.5 0.8438 +0.5312 0.5 0.875 +0.5312 0.5 0.9062 +0.5312 0.5 0.9375 +0.5312 0.5 0.9688 +0.5312 0.5 1 +0.5312 0.5312 0 +0.5312 0.5312 0.03125 +0.5312 0.5312 0.0625 +0.5312 0.5312 0.09375 +0.5312 0.5312 0.125 +0.5312 0.5312 0.1562 +0.5312 0.5312 0.1875 +0.5312 0.5312 0.2188 +0.5312 0.5312 0.25 +0.5312 0.5312 0.2812 +0.5312 0.5312 0.3125 +0.5312 0.5312 0.3438 +0.5312 0.5312 0.375 +0.5312 0.5312 0.4062 +0.5312 0.5312 0.4375 +0.5312 0.5312 0.4688 +0.5312 0.5312 0.5 +0.5312 0.5312 0.5312 +0.5312 0.5312 0.5625 +0.5312 0.5312 0.5938 +0.5312 0.5312 0.625 +0.5312 0.5312 0.6562 +0.5312 0.5312 0.6875 +0.5312 0.5312 0.7188 +0.5312 0.5312 0.75 +0.5312 0.5312 0.7812 +0.5312 0.5312 0.8125 +0.5312 0.5312 0.8438 +0.5312 0.5312 0.875 +0.5312 0.5312 0.9062 +0.5312 0.5312 0.9375 +0.5312 0.5312 0.9688 +0.5312 0.5312 1 +0.5312 0.5625 0 +0.5312 0.5625 0.03125 +0.5312 0.5625 0.0625 +0.5312 0.5625 0.09375 +0.5312 0.5625 0.125 +0.5312 0.5625 0.1562 +0.5312 0.5625 0.1875 +0.5312 0.5625 0.2188 +0.5312 0.5625 0.25 +0.5312 0.5625 0.2812 +0.5312 0.5625 0.3125 +0.5312 0.5625 0.3438 +0.5312 0.5625 0.375 +0.5312 0.5625 0.4062 +0.5312 0.5625 0.4375 +0.5312 0.5625 0.4688 +0.5312 0.5625 0.5 +0.5312 0.5625 0.5312 +0.5312 0.5625 0.5625 +0.5312 0.5625 0.5938 +0.5312 0.5625 0.625 +0.5312 0.5625 0.6562 +0.5312 0.5625 0.6875 +0.5312 0.5625 0.7188 +0.5312 0.5625 0.75 +0.5312 0.5625 0.7812 +0.5312 0.5625 0.8125 +0.5312 0.5625 0.8438 +0.5312 0.5625 0.875 +0.5312 0.5625 0.9062 +0.5312 0.5625 0.9375 +0.5312 0.5625 0.9688 +0.5312 0.5625 1 +0.5312 0.5938 0 +0.5312 0.5938 0.03125 +0.5312 0.5938 0.0625 +0.5312 0.5938 0.09375 +0.5312 0.5938 0.125 +0.5312 0.5938 0.1562 +0.5312 0.5938 0.1875 +0.5312 0.5938 0.2188 +0.5312 0.5938 0.25 +0.5312 0.5938 0.2812 +0.5312 0.5938 0.3125 +0.5312 0.5938 0.3438 +0.5312 0.5938 0.375 +0.5312 0.5938 0.4062 +0.5312 0.5938 0.4375 +0.5312 0.5938 0.4688 +0.5312 0.5938 0.5 +0.5312 0.5938 0.5312 +0.5312 0.5938 0.5625 +0.5312 0.5938 0.5938 +0.5312 0.5938 0.625 +0.5312 0.5938 0.6562 +0.5312 0.5938 0.6875 +0.5312 0.5938 0.7188 +0.5312 0.5938 0.75 +0.5312 0.5938 0.7812 +0.5312 0.5938 0.8125 +0.5312 0.5938 0.8438 +0.5312 0.5938 0.875 +0.5312 0.5938 0.9062 +0.5312 0.5938 0.9375 +0.5312 0.5938 0.9688 +0.5312 0.5938 1 +0.5312 0.625 0 +0.5312 0.625 0.03125 +0.5312 0.625 0.0625 +0.5312 0.625 0.09375 +0.5312 0.625 0.125 +0.5312 0.625 0.1562 +0.5312 0.625 0.1875 +0.5312 0.625 0.2188 +0.5312 0.625 0.25 +0.5312 0.625 0.2812 +0.5312 0.625 0.3125 +0.5312 0.625 0.3438 +0.5312 0.625 0.375 +0.5312 0.625 0.4062 +0.5312 0.625 0.4375 +0.5312 0.625 0.4688 +0.5312 0.625 0.5 +0.5312 0.625 0.5312 +0.5312 0.625 0.5625 +0.5312 0.625 0.5938 +0.5312 0.625 0.625 +0.5312 0.625 0.6562 +0.5312 0.625 0.6875 +0.5312 0.625 0.7188 +0.5312 0.625 0.75 +0.5312 0.625 0.7812 +0.5312 0.625 0.8125 +0.5312 0.625 0.8438 +0.5312 0.625 0.875 +0.5312 0.625 0.9062 +0.5312 0.625 0.9375 +0.5312 0.625 0.9688 +0.5312 0.625 1 +0.5312 0.6562 0 +0.5312 0.6562 0.03125 +0.5312 0.6562 0.0625 +0.5312 0.6562 0.09375 +0.5312 0.6562 0.125 +0.5312 0.6562 0.1562 +0.5312 0.6562 0.1875 +0.5312 0.6562 0.2188 +0.5312 0.6562 0.25 +0.5312 0.6562 0.2812 +0.5312 0.6562 0.3125 +0.5312 0.6562 0.3438 +0.5312 0.6562 0.375 +0.5312 0.6562 0.4062 +0.5312 0.6562 0.4375 +0.5312 0.6562 0.4688 +0.5312 0.6562 0.5 +0.5312 0.6562 0.5312 +0.5312 0.6562 0.5625 +0.5312 0.6562 0.5938 +0.5312 0.6562 0.625 +0.5312 0.6562 0.6562 +0.5312 0.6562 0.6875 +0.5312 0.6562 0.7188 +0.5312 0.6562 0.75 +0.5312 0.6562 0.7812 +0.5312 0.6562 0.8125 +0.5312 0.6562 0.8438 +0.5312 0.6562 0.875 +0.5312 0.6562 0.9062 +0.5312 0.6562 0.9375 +0.5312 0.6562 0.9688 +0.5312 0.6562 1 +0.5312 0.6875 0 +0.5312 0.6875 0.03125 +0.5312 0.6875 0.0625 +0.5312 0.6875 0.09375 +0.5312 0.6875 0.125 +0.5312 0.6875 0.1562 +0.5312 0.6875 0.1875 +0.5312 0.6875 0.2188 +0.5312 0.6875 0.25 +0.5312 0.6875 0.2812 +0.5312 0.6875 0.3125 +0.5312 0.6875 0.3438 +0.5312 0.6875 0.375 +0.5312 0.6875 0.4062 +0.5312 0.6875 0.4375 +0.5312 0.6875 0.4688 +0.5312 0.6875 0.5 +0.5312 0.6875 0.5312 +0.5312 0.6875 0.5625 +0.5312 0.6875 0.5938 +0.5312 0.6875 0.625 +0.5312 0.6875 0.6562 +0.5312 0.6875 0.6875 +0.5312 0.6875 0.7188 +0.5312 0.6875 0.75 +0.5312 0.6875 0.7812 +0.5312 0.6875 0.8125 +0.5312 0.6875 0.8438 +0.5312 0.6875 0.875 +0.5312 0.6875 0.9062 +0.5312 0.6875 0.9375 +0.5312 0.6875 0.9688 +0.5312 0.6875 1 +0.5312 0.7188 0 +0.5312 0.7188 0.03125 +0.5312 0.7188 0.0625 +0.5312 0.7188 0.09375 +0.5312 0.7188 0.125 +0.5312 0.7188 0.1562 +0.5312 0.7188 0.1875 +0.5312 0.7188 0.2188 +0.5312 0.7188 0.25 +0.5312 0.7188 0.2812 +0.5312 0.7188 0.3125 +0.5312 0.7188 0.3438 +0.5312 0.7188 0.375 +0.5312 0.7188 0.4062 +0.5312 0.7188 0.4375 +0.5312 0.7188 0.4688 +0.5312 0.7188 0.5 +0.5312 0.7188 0.5312 +0.5312 0.7188 0.5625 +0.5312 0.7188 0.5938 +0.5312 0.7188 0.625 +0.5312 0.7188 0.6562 +0.5312 0.7188 0.6875 +0.5312 0.7188 0.7188 +0.5312 0.7188 0.75 +0.5312 0.7188 0.7812 +0.5312 0.7188 0.8125 +0.5312 0.7188 0.8438 +0.5312 0.7188 0.875 +0.5312 0.7188 0.9062 +0.5312 0.7188 0.9375 +0.5312 0.7188 0.9688 +0.5312 0.7188 1 +0.5312 0.75 0 +0.5312 0.75 0.03125 +0.5312 0.75 0.0625 +0.5312 0.75 0.09375 +0.5312 0.75 0.125 +0.5312 0.75 0.1562 +0.5312 0.75 0.1875 +0.5312 0.75 0.2188 +0.5312 0.75 0.25 +0.5312 0.75 0.2812 +0.5312 0.75 0.3125 +0.5312 0.75 0.3438 +0.5312 0.75 0.375 +0.5312 0.75 0.4062 +0.5312 0.75 0.4375 +0.5312 0.75 0.4688 +0.5312 0.75 0.5 +0.5312 0.75 0.5312 +0.5312 0.75 0.5625 +0.5312 0.75 0.5938 +0.5312 0.75 0.625 +0.5312 0.75 0.6562 +0.5312 0.75 0.6875 +0.5312 0.75 0.7188 +0.5312 0.75 0.75 +0.5312 0.75 0.7812 +0.5312 0.75 0.8125 +0.5312 0.75 0.8438 +0.5312 0.75 0.875 +0.5312 0.75 0.9062 +0.5312 0.75 0.9375 +0.5312 0.75 0.9688 +0.5312 0.75 1 +0.5312 0.7812 0 +0.5312 0.7812 0.03125 +0.5312 0.7812 0.0625 +0.5312 0.7812 0.09375 +0.5312 0.7812 0.125 +0.5312 0.7812 0.1562 +0.5312 0.7812 0.1875 +0.5312 0.7812 0.2188 +0.5312 0.7812 0.25 +0.5312 0.7812 0.2812 +0.5312 0.7812 0.3125 +0.5312 0.7812 0.3438 +0.5312 0.7812 0.375 +0.5312 0.7812 0.4062 +0.5312 0.7812 0.4375 +0.5312 0.7812 0.4688 +0.5312 0.7812 0.5 +0.5312 0.7812 0.5312 +0.5312 0.7812 0.5625 +0.5312 0.7812 0.5938 +0.5312 0.7812 0.625 +0.5312 0.7812 0.6562 +0.5312 0.7812 0.6875 +0.5312 0.7812 0.7188 +0.5312 0.7812 0.75 +0.5312 0.7812 0.7812 +0.5312 0.7812 0.8125 +0.5312 0.7812 0.8438 +0.5312 0.7812 0.875 +0.5312 0.7812 0.9062 +0.5312 0.7812 0.9375 +0.5312 0.7812 0.9688 +0.5312 0.7812 1 +0.5312 0.8125 0 +0.5312 0.8125 0.03125 +0.5312 0.8125 0.0625 +0.5312 0.8125 0.09375 +0.5312 0.8125 0.125 +0.5312 0.8125 0.1562 +0.5312 0.8125 0.1875 +0.5312 0.8125 0.2188 +0.5312 0.8125 0.25 +0.5312 0.8125 0.2812 +0.5312 0.8125 0.3125 +0.5312 0.8125 0.3438 +0.5312 0.8125 0.375 +0.5312 0.8125 0.4062 +0.5312 0.8125 0.4375 +0.5312 0.8125 0.4688 +0.5312 0.8125 0.5 +0.5312 0.8125 0.5312 +0.5312 0.8125 0.5625 +0.5312 0.8125 0.5938 +0.5312 0.8125 0.625 +0.5312 0.8125 0.6562 +0.5312 0.8125 0.6875 +0.5312 0.8125 0.7188 +0.5312 0.8125 0.75 +0.5312 0.8125 0.7812 +0.5312 0.8125 0.8125 +0.5312 0.8125 0.8438 +0.5312 0.8125 0.875 +0.5312 0.8125 0.9062 +0.5312 0.8125 0.9375 +0.5312 0.8125 0.9688 +0.5312 0.8125 1 +0.5312 0.8438 0 +0.5312 0.8438 0.03125 +0.5312 0.8438 0.0625 +0.5312 0.8438 0.09375 +0.5312 0.8438 0.125 +0.5312 0.8438 0.1562 +0.5312 0.8438 0.1875 +0.5312 0.8438 0.2188 +0.5312 0.8438 0.25 +0.5312 0.8438 0.2812 +0.5312 0.8438 0.3125 +0.5312 0.8438 0.3438 +0.5312 0.8438 0.375 +0.5312 0.8438 0.4062 +0.5312 0.8438 0.4375 +0.5312 0.8438 0.4688 +0.5312 0.8438 0.5 +0.5312 0.8438 0.5312 +0.5312 0.8438 0.5625 +0.5312 0.8438 0.5938 +0.5312 0.8438 0.625 +0.5312 0.8438 0.6562 +0.5312 0.8438 0.6875 +0.5312 0.8438 0.7188 +0.5312 0.8438 0.75 +0.5312 0.8438 0.7812 +0.5312 0.8438 0.8125 +0.5312 0.8438 0.8438 +0.5312 0.8438 0.875 +0.5312 0.8438 0.9062 +0.5312 0.8438 0.9375 +0.5312 0.8438 0.9688 +0.5312 0.8438 1 +0.5312 0.875 0 +0.5312 0.875 0.03125 +0.5312 0.875 0.0625 +0.5312 0.875 0.09375 +0.5312 0.875 0.125 +0.5312 0.875 0.1562 +0.5312 0.875 0.1875 +0.5312 0.875 0.2188 +0.5312 0.875 0.25 +0.5312 0.875 0.2812 +0.5312 0.875 0.3125 +0.5312 0.875 0.3438 +0.5312 0.875 0.375 +0.5312 0.875 0.4062 +0.5312 0.875 0.4375 +0.5312 0.875 0.4688 +0.5312 0.875 0.5 +0.5312 0.875 0.5312 +0.5312 0.875 0.5625 +0.5312 0.875 0.5938 +0.5312 0.875 0.625 +0.5312 0.875 0.6562 +0.5312 0.875 0.6875 +0.5312 0.875 0.7188 +0.5312 0.875 0.75 +0.5312 0.875 0.7812 +0.5312 0.875 0.8125 +0.5312 0.875 0.8438 +0.5312 0.875 0.875 +0.5312 0.875 0.9062 +0.5312 0.875 0.9375 +0.5312 0.875 0.9688 +0.5312 0.875 1 +0.5312 0.9062 0 +0.5312 0.9062 0.03125 +0.5312 0.9062 0.0625 +0.5312 0.9062 0.09375 +0.5312 0.9062 0.125 +0.5312 0.9062 0.1562 +0.5312 0.9062 0.1875 +0.5312 0.9062 0.2188 +0.5312 0.9062 0.25 +0.5312 0.9062 0.2812 +0.5312 0.9062 0.3125 +0.5312 0.9062 0.3438 +0.5312 0.9062 0.375 +0.5312 0.9062 0.4062 +0.5312 0.9062 0.4375 +0.5312 0.9062 0.4688 +0.5312 0.9062 0.5 +0.5312 0.9062 0.5312 +0.5312 0.9062 0.5625 +0.5312 0.9062 0.5938 +0.5312 0.9062 0.625 +0.5312 0.9062 0.6562 +0.5312 0.9062 0.6875 +0.5312 0.9062 0.7188 +0.5312 0.9062 0.75 +0.5312 0.9062 0.7812 +0.5312 0.9062 0.8125 +0.5312 0.9062 0.8438 +0.5312 0.9062 0.875 +0.5312 0.9062 0.9062 +0.5312 0.9062 0.9375 +0.5312 0.9062 0.9688 +0.5312 0.9062 1 +0.5312 0.9375 0 +0.5312 0.9375 0.03125 +0.5312 0.9375 0.0625 +0.5312 0.9375 0.09375 +0.5312 0.9375 0.125 +0.5312 0.9375 0.1562 +0.5312 0.9375 0.1875 +0.5312 0.9375 0.2188 +0.5312 0.9375 0.25 +0.5312 0.9375 0.2812 +0.5312 0.9375 0.3125 +0.5312 0.9375 0.3438 +0.5312 0.9375 0.375 +0.5312 0.9375 0.4062 +0.5312 0.9375 0.4375 +0.5312 0.9375 0.4688 +0.5312 0.9375 0.5 +0.5312 0.9375 0.5312 +0.5312 0.9375 0.5625 +0.5312 0.9375 0.5938 +0.5312 0.9375 0.625 +0.5312 0.9375 0.6562 +0.5312 0.9375 0.6875 +0.5312 0.9375 0.7188 +0.5312 0.9375 0.75 +0.5312 0.9375 0.7812 +0.5312 0.9375 0.8125 +0.5312 0.9375 0.8438 +0.5312 0.9375 0.875 +0.5312 0.9375 0.9062 +0.5312 0.9375 0.9375 +0.5312 0.9375 0.9688 +0.5312 0.9375 1 +0.5312 0.9688 0 +0.5312 0.9688 0.03125 +0.5312 0.9688 0.0625 +0.5312 0.9688 0.09375 +0.5312 0.9688 0.125 +0.5312 0.9688 0.1562 +0.5312 0.9688 0.1875 +0.5312 0.9688 0.2188 +0.5312 0.9688 0.25 +0.5312 0.9688 0.2812 +0.5312 0.9688 0.3125 +0.5312 0.9688 0.3438 +0.5312 0.9688 0.375 +0.5312 0.9688 0.4062 +0.5312 0.9688 0.4375 +0.5312 0.9688 0.4688 +0.5312 0.9688 0.5 +0.5312 0.9688 0.5312 +0.5312 0.9688 0.5625 +0.5312 0.9688 0.5938 +0.5312 0.9688 0.625 +0.5312 0.9688 0.6562 +0.5312 0.9688 0.6875 +0.5312 0.9688 0.7188 +0.5312 0.9688 0.75 +0.5312 0.9688 0.7812 +0.5312 0.9688 0.8125 +0.5312 0.9688 0.8438 +0.5312 0.9688 0.875 +0.5312 0.9688 0.9062 +0.5312 0.9688 0.9375 +0.5312 0.9688 0.9688 +0.5312 0.9688 1 +0.5312 1 0 +0.5312 1 0.03125 +0.5312 1 0.0625 +0.5312 1 0.09375 +0.5312 1 0.125 +0.5312 1 0.1562 +0.5312 1 0.1875 +0.5312 1 0.2188 +0.5312 1 0.25 +0.5312 1 0.2812 +0.5312 1 0.3125 +0.5312 1 0.3438 +0.5312 1 0.375 +0.5312 1 0.4062 +0.5312 1 0.4375 +0.5312 1 0.4688 +0.5312 1 0.5 +0.5312 1 0.5312 +0.5312 1 0.5625 +0.5312 1 0.5938 +0.5312 1 0.625 +0.5312 1 0.6562 +0.5312 1 0.6875 +0.5312 1 0.7188 +0.5312 1 0.75 +0.5312 1 0.7812 +0.5312 1 0.8125 +0.5312 1 0.8438 +0.5312 1 0.875 +0.5312 1 0.9062 +0.5312 1 0.9375 +0.5312 1 0.9688 +0.5312 1 1 +0.5625 0 0 +0.5625 0 0.03125 +0.5625 0 0.0625 +0.5625 0 0.09375 +0.5625 0 0.125 +0.5625 0 0.1562 +0.5625 0 0.1875 +0.5625 0 0.2188 +0.5625 0 0.25 +0.5625 0 0.2812 +0.5625 0 0.3125 +0.5625 0 0.3438 +0.5625 0 0.375 +0.5625 0 0.4062 +0.5625 0 0.4375 +0.5625 0 0.4688 +0.5625 0 0.5 +0.5625 0 0.5312 +0.5625 0 0.5625 +0.5625 0 0.5938 +0.5625 0 0.625 +0.5625 0 0.6562 +0.5625 0 0.6875 +0.5625 0 0.7188 +0.5625 0 0.75 +0.5625 0 0.7812 +0.5625 0 0.8125 +0.5625 0 0.8438 +0.5625 0 0.875 +0.5625 0 0.9062 +0.5625 0 0.9375 +0.5625 0 0.9688 +0.5625 0 1 +0.5625 0.03125 0 +0.5625 0.03125 0.03125 +0.5625 0.03125 0.0625 +0.5625 0.03125 0.09375 +0.5625 0.03125 0.125 +0.5625 0.03125 0.1562 +0.5625 0.03125 0.1875 +0.5625 0.03125 0.2188 +0.5625 0.03125 0.25 +0.5625 0.03125 0.2812 +0.5625 0.03125 0.3125 +0.5625 0.03125 0.3438 +0.5625 0.03125 0.375 +0.5625 0.03125 0.4062 +0.5625 0.03125 0.4375 +0.5625 0.03125 0.4688 +0.5625 0.03125 0.5 +0.5625 0.03125 0.5312 +0.5625 0.03125 0.5625 +0.5625 0.03125 0.5938 +0.5625 0.03125 0.625 +0.5625 0.03125 0.6562 +0.5625 0.03125 0.6875 +0.5625 0.03125 0.7188 +0.5625 0.03125 0.75 +0.5625 0.03125 0.7812 +0.5625 0.03125 0.8125 +0.5625 0.03125 0.8438 +0.5625 0.03125 0.875 +0.5625 0.03125 0.9062 +0.5625 0.03125 0.9375 +0.5625 0.03125 0.9688 +0.5625 0.03125 1 +0.5625 0.0625 0 +0.5625 0.0625 0.03125 +0.5625 0.0625 0.0625 +0.5625 0.0625 0.09375 +0.5625 0.0625 0.125 +0.5625 0.0625 0.1562 +0.5625 0.0625 0.1875 +0.5625 0.0625 0.2188 +0.5625 0.0625 0.25 +0.5625 0.0625 0.2812 +0.5625 0.0625 0.3125 +0.5625 0.0625 0.3438 +0.5625 0.0625 0.375 +0.5625 0.0625 0.4062 +0.5625 0.0625 0.4375 +0.5625 0.0625 0.4688 +0.5625 0.0625 0.5 +0.5625 0.0625 0.5312 +0.5625 0.0625 0.5625 +0.5625 0.0625 0.5938 +0.5625 0.0625 0.625 +0.5625 0.0625 0.6562 +0.5625 0.0625 0.6875 +0.5625 0.0625 0.7188 +0.5625 0.0625 0.75 +0.5625 0.0625 0.7812 +0.5625 0.0625 0.8125 +0.5625 0.0625 0.8438 +0.5625 0.0625 0.875 +0.5625 0.0625 0.9062 +0.5625 0.0625 0.9375 +0.5625 0.0625 0.9688 +0.5625 0.0625 1 +0.5625 0.09375 0 +0.5625 0.09375 0.03125 +0.5625 0.09375 0.0625 +0.5625 0.09375 0.09375 +0.5625 0.09375 0.125 +0.5625 0.09375 0.1562 +0.5625 0.09375 0.1875 +0.5625 0.09375 0.2188 +0.5625 0.09375 0.25 +0.5625 0.09375 0.2812 +0.5625 0.09375 0.3125 +0.5625 0.09375 0.3438 +0.5625 0.09375 0.375 +0.5625 0.09375 0.4062 +0.5625 0.09375 0.4375 +0.5625 0.09375 0.4688 +0.5625 0.09375 0.5 +0.5625 0.09375 0.5312 +0.5625 0.09375 0.5625 +0.5625 0.09375 0.5938 +0.5625 0.09375 0.625 +0.5625 0.09375 0.6562 +0.5625 0.09375 0.6875 +0.5625 0.09375 0.7188 +0.5625 0.09375 0.75 +0.5625 0.09375 0.7812 +0.5625 0.09375 0.8125 +0.5625 0.09375 0.8438 +0.5625 0.09375 0.875 +0.5625 0.09375 0.9062 +0.5625 0.09375 0.9375 +0.5625 0.09375 0.9688 +0.5625 0.09375 1 +0.5625 0.125 0 +0.5625 0.125 0.03125 +0.5625 0.125 0.0625 +0.5625 0.125 0.09375 +0.5625 0.125 0.125 +0.5625 0.125 0.1562 +0.5625 0.125 0.1875 +0.5625 0.125 0.2188 +0.5625 0.125 0.25 +0.5625 0.125 0.2812 +0.5625 0.125 0.3125 +0.5625 0.125 0.3438 +0.5625 0.125 0.375 +0.5625 0.125 0.4062 +0.5625 0.125 0.4375 +0.5625 0.125 0.4688 +0.5625 0.125 0.5 +0.5625 0.125 0.5312 +0.5625 0.125 0.5625 +0.5625 0.125 0.5938 +0.5625 0.125 0.625 +0.5625 0.125 0.6562 +0.5625 0.125 0.6875 +0.5625 0.125 0.7188 +0.5625 0.125 0.75 +0.5625 0.125 0.7812 +0.5625 0.125 0.8125 +0.5625 0.125 0.8438 +0.5625 0.125 0.875 +0.5625 0.125 0.9062 +0.5625 0.125 0.9375 +0.5625 0.125 0.9688 +0.5625 0.125 1 +0.5625 0.1562 0 +0.5625 0.1562 0.03125 +0.5625 0.1562 0.0625 +0.5625 0.1562 0.09375 +0.5625 0.1562 0.125 +0.5625 0.1562 0.1562 +0.5625 0.1562 0.1875 +0.5625 0.1562 0.2188 +0.5625 0.1562 0.25 +0.5625 0.1562 0.2812 +0.5625 0.1562 0.3125 +0.5625 0.1562 0.3438 +0.5625 0.1562 0.375 +0.5625 0.1562 0.4062 +0.5625 0.1562 0.4375 +0.5625 0.1562 0.4688 +0.5625 0.1562 0.5 +0.5625 0.1562 0.5312 +0.5625 0.1562 0.5625 +0.5625 0.1562 0.5938 +0.5625 0.1562 0.625 +0.5625 0.1562 0.6562 +0.5625 0.1562 0.6875 +0.5625 0.1562 0.7188 +0.5625 0.1562 0.75 +0.5625 0.1562 0.7812 +0.5625 0.1562 0.8125 +0.5625 0.1562 0.8438 +0.5625 0.1562 0.875 +0.5625 0.1562 0.9062 +0.5625 0.1562 0.9375 +0.5625 0.1562 0.9688 +0.5625 0.1562 1 +0.5625 0.1875 0 +0.5625 0.1875 0.03125 +0.5625 0.1875 0.0625 +0.5625 0.1875 0.09375 +0.5625 0.1875 0.125 +0.5625 0.1875 0.1562 +0.5625 0.1875 0.1875 +0.5625 0.1875 0.2188 +0.5625 0.1875 0.25 +0.5625 0.1875 0.2812 +0.5625 0.1875 0.3125 +0.5625 0.1875 0.3438 +0.5625 0.1875 0.375 +0.5625 0.1875 0.4062 +0.5625 0.1875 0.4375 +0.5625 0.1875 0.4688 +0.5625 0.1875 0.5 +0.5625 0.1875 0.5312 +0.5625 0.1875 0.5625 +0.5625 0.1875 0.5938 +0.5625 0.1875 0.625 +0.5625 0.1875 0.6562 +0.5625 0.1875 0.6875 +0.5625 0.1875 0.7188 +0.5625 0.1875 0.75 +0.5625 0.1875 0.7812 +0.5625 0.1875 0.8125 +0.5625 0.1875 0.8438 +0.5625 0.1875 0.875 +0.5625 0.1875 0.9062 +0.5625 0.1875 0.9375 +0.5625 0.1875 0.9688 +0.5625 0.1875 1 +0.5625 0.2188 0 +0.5625 0.2188 0.03125 +0.5625 0.2188 0.0625 +0.5625 0.2188 0.09375 +0.5625 0.2188 0.125 +0.5625 0.2188 0.1562 +0.5625 0.2188 0.1875 +0.5625 0.2188 0.2188 +0.5625 0.2188 0.25 +0.5625 0.2188 0.2812 +0.5625 0.2188 0.3125 +0.5625 0.2188 0.3438 +0.5625 0.2188 0.375 +0.5625 0.2188 0.4062 +0.5625 0.2188 0.4375 +0.5625 0.2188 0.4688 +0.5625 0.2188 0.5 +0.5625 0.2188 0.5312 +0.5625 0.2188 0.5625 +0.5625 0.2188 0.5938 +0.5625 0.2188 0.625 +0.5625 0.2188 0.6562 +0.5625 0.2188 0.6875 +0.5625 0.2188 0.7188 +0.5625 0.2188 0.75 +0.5625 0.2188 0.7812 +0.5625 0.2188 0.8125 +0.5625 0.2188 0.8438 +0.5625 0.2188 0.875 +0.5625 0.2188 0.9062 +0.5625 0.2188 0.9375 +0.5625 0.2188 0.9688 +0.5625 0.2188 1 +0.5625 0.25 0 +0.5625 0.25 0.03125 +0.5625 0.25 0.0625 +0.5625 0.25 0.09375 +0.5625 0.25 0.125 +0.5625 0.25 0.1562 +0.5625 0.25 0.1875 +0.5625 0.25 0.2188 +0.5625 0.25 0.25 +0.5625 0.25 0.2812 +0.5625 0.25 0.3125 +0.5625 0.25 0.3438 +0.5625 0.25 0.375 +0.5625 0.25 0.4062 +0.5625 0.25 0.4375 +0.5625 0.25 0.4688 +0.5625 0.25 0.5 +0.5625 0.25 0.5312 +0.5625 0.25 0.5625 +0.5625 0.25 0.5938 +0.5625 0.25 0.625 +0.5625 0.25 0.6562 +0.5625 0.25 0.6875 +0.5625 0.25 0.7188 +0.5625 0.25 0.75 +0.5625 0.25 0.7812 +0.5625 0.25 0.8125 +0.5625 0.25 0.8438 +0.5625 0.25 0.875 +0.5625 0.25 0.9062 +0.5625 0.25 0.9375 +0.5625 0.25 0.9688 +0.5625 0.25 1 +0.5625 0.2812 0 +0.5625 0.2812 0.03125 +0.5625 0.2812 0.0625 +0.5625 0.2812 0.09375 +0.5625 0.2812 0.125 +0.5625 0.2812 0.1562 +0.5625 0.2812 0.1875 +0.5625 0.2812 0.2188 +0.5625 0.2812 0.25 +0.5625 0.2812 0.2812 +0.5625 0.2812 0.3125 +0.5625 0.2812 0.3438 +0.5625 0.2812 0.375 +0.5625 0.2812 0.4062 +0.5625 0.2812 0.4375 +0.5625 0.2812 0.4688 +0.5625 0.2812 0.5 +0.5625 0.2812 0.5312 +0.5625 0.2812 0.5625 +0.5625 0.2812 0.5938 +0.5625 0.2812 0.625 +0.5625 0.2812 0.6562 +0.5625 0.2812 0.6875 +0.5625 0.2812 0.7188 +0.5625 0.2812 0.75 +0.5625 0.2812 0.7812 +0.5625 0.2812 0.8125 +0.5625 0.2812 0.8438 +0.5625 0.2812 0.875 +0.5625 0.2812 0.9062 +0.5625 0.2812 0.9375 +0.5625 0.2812 0.9688 +0.5625 0.2812 1 +0.5625 0.3125 0 +0.5625 0.3125 0.03125 +0.5625 0.3125 0.0625 +0.5625 0.3125 0.09375 +0.5625 0.3125 0.125 +0.5625 0.3125 0.1562 +0.5625 0.3125 0.1875 +0.5625 0.3125 0.2188 +0.5625 0.3125 0.25 +0.5625 0.3125 0.2812 +0.5625 0.3125 0.3125 +0.5625 0.3125 0.3438 +0.5625 0.3125 0.375 +0.5625 0.3125 0.4062 +0.5625 0.3125 0.4375 +0.5625 0.3125 0.4688 +0.5625 0.3125 0.5 +0.5625 0.3125 0.5312 +0.5625 0.3125 0.5625 +0.5625 0.3125 0.5938 +0.5625 0.3125 0.625 +0.5625 0.3125 0.6562 +0.5625 0.3125 0.6875 +0.5625 0.3125 0.7188 +0.5625 0.3125 0.75 +0.5625 0.3125 0.7812 +0.5625 0.3125 0.8125 +0.5625 0.3125 0.8438 +0.5625 0.3125 0.875 +0.5625 0.3125 0.9062 +0.5625 0.3125 0.9375 +0.5625 0.3125 0.9688 +0.5625 0.3125 1 +0.5625 0.3438 0 +0.5625 0.3438 0.03125 +0.5625 0.3438 0.0625 +0.5625 0.3438 0.09375 +0.5625 0.3438 0.125 +0.5625 0.3438 0.1562 +0.5625 0.3438 0.1875 +0.5625 0.3438 0.2188 +0.5625 0.3438 0.25 +0.5625 0.3438 0.2812 +0.5625 0.3438 0.3125 +0.5625 0.3438 0.3438 +0.5625 0.3438 0.375 +0.5625 0.3438 0.4062 +0.5625 0.3438 0.4375 +0.5625 0.3438 0.4688 +0.5625 0.3438 0.5 +0.5625 0.3438 0.5312 +0.5625 0.3438 0.5625 +0.5625 0.3438 0.5938 +0.5625 0.3438 0.625 +0.5625 0.3438 0.6562 +0.5625 0.3438 0.6875 +0.5625 0.3438 0.7188 +0.5625 0.3438 0.75 +0.5625 0.3438 0.7812 +0.5625 0.3438 0.8125 +0.5625 0.3438 0.8438 +0.5625 0.3438 0.875 +0.5625 0.3438 0.9062 +0.5625 0.3438 0.9375 +0.5625 0.3438 0.9688 +0.5625 0.3438 1 +0.5625 0.375 0 +0.5625 0.375 0.03125 +0.5625 0.375 0.0625 +0.5625 0.375 0.09375 +0.5625 0.375 0.125 +0.5625 0.375 0.1562 +0.5625 0.375 0.1875 +0.5625 0.375 0.2188 +0.5625 0.375 0.25 +0.5625 0.375 0.2812 +0.5625 0.375 0.3125 +0.5625 0.375 0.3438 +0.5625 0.375 0.375 +0.5625 0.375 0.4062 +0.5625 0.375 0.4375 +0.5625 0.375 0.4688 +0.5625 0.375 0.5 +0.5625 0.375 0.5312 +0.5625 0.375 0.5625 +0.5625 0.375 0.5938 +0.5625 0.375 0.625 +0.5625 0.375 0.6562 +0.5625 0.375 0.6875 +0.5625 0.375 0.7188 +0.5625 0.375 0.75 +0.5625 0.375 0.7812 +0.5625 0.375 0.8125 +0.5625 0.375 0.8438 +0.5625 0.375 0.875 +0.5625 0.375 0.9062 +0.5625 0.375 0.9375 +0.5625 0.375 0.9688 +0.5625 0.375 1 +0.5625 0.4062 0 +0.5625 0.4062 0.03125 +0.5625 0.4062 0.0625 +0.5625 0.4062 0.09375 +0.5625 0.4062 0.125 +0.5625 0.4062 0.1562 +0.5625 0.4062 0.1875 +0.5625 0.4062 0.2188 +0.5625 0.4062 0.25 +0.5625 0.4062 0.2812 +0.5625 0.4062 0.3125 +0.5625 0.4062 0.3438 +0.5625 0.4062 0.375 +0.5625 0.4062 0.4062 +0.5625 0.4062 0.4375 +0.5625 0.4062 0.4688 +0.5625 0.4062 0.5 +0.5625 0.4062 0.5312 +0.5625 0.4062 0.5625 +0.5625 0.4062 0.5938 +0.5625 0.4062 0.625 +0.5625 0.4062 0.6562 +0.5625 0.4062 0.6875 +0.5625 0.4062 0.7188 +0.5625 0.4062 0.75 +0.5625 0.4062 0.7812 +0.5625 0.4062 0.8125 +0.5625 0.4062 0.8438 +0.5625 0.4062 0.875 +0.5625 0.4062 0.9062 +0.5625 0.4062 0.9375 +0.5625 0.4062 0.9688 +0.5625 0.4062 1 +0.5625 0.4375 0 +0.5625 0.4375 0.03125 +0.5625 0.4375 0.0625 +0.5625 0.4375 0.09375 +0.5625 0.4375 0.125 +0.5625 0.4375 0.1562 +0.5625 0.4375 0.1875 +0.5625 0.4375 0.2188 +0.5625 0.4375 0.25 +0.5625 0.4375 0.2812 +0.5625 0.4375 0.3125 +0.5625 0.4375 0.3438 +0.5625 0.4375 0.375 +0.5625 0.4375 0.4062 +0.5625 0.4375 0.4375 +0.5625 0.4375 0.4688 +0.5625 0.4375 0.5 +0.5625 0.4375 0.5312 +0.5625 0.4375 0.5625 +0.5625 0.4375 0.5938 +0.5625 0.4375 0.625 +0.5625 0.4375 0.6562 +0.5625 0.4375 0.6875 +0.5625 0.4375 0.7188 +0.5625 0.4375 0.75 +0.5625 0.4375 0.7812 +0.5625 0.4375 0.8125 +0.5625 0.4375 0.8438 +0.5625 0.4375 0.875 +0.5625 0.4375 0.9062 +0.5625 0.4375 0.9375 +0.5625 0.4375 0.9688 +0.5625 0.4375 1 +0.5625 0.4688 0 +0.5625 0.4688 0.03125 +0.5625 0.4688 0.0625 +0.5625 0.4688 0.09375 +0.5625 0.4688 0.125 +0.5625 0.4688 0.1562 +0.5625 0.4688 0.1875 +0.5625 0.4688 0.2188 +0.5625 0.4688 0.25 +0.5625 0.4688 0.2812 +0.5625 0.4688 0.3125 +0.5625 0.4688 0.3438 +0.5625 0.4688 0.375 +0.5625 0.4688 0.4062 +0.5625 0.4688 0.4375 +0.5625 0.4688 0.4688 +0.5625 0.4688 0.5 +0.5625 0.4688 0.5312 +0.5625 0.4688 0.5625 +0.5625 0.4688 0.5938 +0.5625 0.4688 0.625 +0.5625 0.4688 0.6562 +0.5625 0.4688 0.6875 +0.5625 0.4688 0.7188 +0.5625 0.4688 0.75 +0.5625 0.4688 0.7812 +0.5625 0.4688 0.8125 +0.5625 0.4688 0.8438 +0.5625 0.4688 0.875 +0.5625 0.4688 0.9062 +0.5625 0.4688 0.9375 +0.5625 0.4688 0.9688 +0.5625 0.4688 1 +0.5625 0.5 0 +0.5625 0.5 0.03125 +0.5625 0.5 0.0625 +0.5625 0.5 0.09375 +0.5625 0.5 0.125 +0.5625 0.5 0.1562 +0.5625 0.5 0.1875 +0.5625 0.5 0.2188 +0.5625 0.5 0.25 +0.5625 0.5 0.2812 +0.5625 0.5 0.3125 +0.5625 0.5 0.3438 +0.5625 0.5 0.375 +0.5625 0.5 0.4062 +0.5625 0.5 0.4375 +0.5625 0.5 0.4688 +0.5625 0.5 0.5 +0.5625 0.5 0.5312 +0.5625 0.5 0.5625 +0.5625 0.5 0.5938 +0.5625 0.5 0.625 +0.5625 0.5 0.6562 +0.5625 0.5 0.6875 +0.5625 0.5 0.7188 +0.5625 0.5 0.75 +0.5625 0.5 0.7812 +0.5625 0.5 0.8125 +0.5625 0.5 0.8438 +0.5625 0.5 0.875 +0.5625 0.5 0.9062 +0.5625 0.5 0.9375 +0.5625 0.5 0.9688 +0.5625 0.5 1 +0.5625 0.5312 0 +0.5625 0.5312 0.03125 +0.5625 0.5312 0.0625 +0.5625 0.5312 0.09375 +0.5625 0.5312 0.125 +0.5625 0.5312 0.1562 +0.5625 0.5312 0.1875 +0.5625 0.5312 0.2188 +0.5625 0.5312 0.25 +0.5625 0.5312 0.2812 +0.5625 0.5312 0.3125 +0.5625 0.5312 0.3438 +0.5625 0.5312 0.375 +0.5625 0.5312 0.4062 +0.5625 0.5312 0.4375 +0.5625 0.5312 0.4688 +0.5625 0.5312 0.5 +0.5625 0.5312 0.5312 +0.5625 0.5312 0.5625 +0.5625 0.5312 0.5938 +0.5625 0.5312 0.625 +0.5625 0.5312 0.6562 +0.5625 0.5312 0.6875 +0.5625 0.5312 0.7188 +0.5625 0.5312 0.75 +0.5625 0.5312 0.7812 +0.5625 0.5312 0.8125 +0.5625 0.5312 0.8438 +0.5625 0.5312 0.875 +0.5625 0.5312 0.9062 +0.5625 0.5312 0.9375 +0.5625 0.5312 0.9688 +0.5625 0.5312 1 +0.5625 0.5625 0 +0.5625 0.5625 0.03125 +0.5625 0.5625 0.0625 +0.5625 0.5625 0.09375 +0.5625 0.5625 0.125 +0.5625 0.5625 0.1562 +0.5625 0.5625 0.1875 +0.5625 0.5625 0.2188 +0.5625 0.5625 0.25 +0.5625 0.5625 0.2812 +0.5625 0.5625 0.3125 +0.5625 0.5625 0.3438 +0.5625 0.5625 0.375 +0.5625 0.5625 0.4062 +0.5625 0.5625 0.4375 +0.5625 0.5625 0.4688 +0.5625 0.5625 0.5 +0.5625 0.5625 0.5312 +0.5625 0.5625 0.5625 +0.5625 0.5625 0.5938 +0.5625 0.5625 0.625 +0.5625 0.5625 0.6562 +0.5625 0.5625 0.6875 +0.5625 0.5625 0.7188 +0.5625 0.5625 0.75 +0.5625 0.5625 0.7812 +0.5625 0.5625 0.8125 +0.5625 0.5625 0.8438 +0.5625 0.5625 0.875 +0.5625 0.5625 0.9062 +0.5625 0.5625 0.9375 +0.5625 0.5625 0.9688 +0.5625 0.5625 1 +0.5625 0.5938 0 +0.5625 0.5938 0.03125 +0.5625 0.5938 0.0625 +0.5625 0.5938 0.09375 +0.5625 0.5938 0.125 +0.5625 0.5938 0.1562 +0.5625 0.5938 0.1875 +0.5625 0.5938 0.2188 +0.5625 0.5938 0.25 +0.5625 0.5938 0.2812 +0.5625 0.5938 0.3125 +0.5625 0.5938 0.3438 +0.5625 0.5938 0.375 +0.5625 0.5938 0.4062 +0.5625 0.5938 0.4375 +0.5625 0.5938 0.4688 +0.5625 0.5938 0.5 +0.5625 0.5938 0.5312 +0.5625 0.5938 0.5625 +0.5625 0.5938 0.5938 +0.5625 0.5938 0.625 +0.5625 0.5938 0.6562 +0.5625 0.5938 0.6875 +0.5625 0.5938 0.7188 +0.5625 0.5938 0.75 +0.5625 0.5938 0.7812 +0.5625 0.5938 0.8125 +0.5625 0.5938 0.8438 +0.5625 0.5938 0.875 +0.5625 0.5938 0.9062 +0.5625 0.5938 0.9375 +0.5625 0.5938 0.9688 +0.5625 0.5938 1 +0.5625 0.625 0 +0.5625 0.625 0.03125 +0.5625 0.625 0.0625 +0.5625 0.625 0.09375 +0.5625 0.625 0.125 +0.5625 0.625 0.1562 +0.5625 0.625 0.1875 +0.5625 0.625 0.2188 +0.5625 0.625 0.25 +0.5625 0.625 0.2812 +0.5625 0.625 0.3125 +0.5625 0.625 0.3438 +0.5625 0.625 0.375 +0.5625 0.625 0.4062 +0.5625 0.625 0.4375 +0.5625 0.625 0.4688 +0.5625 0.625 0.5 +0.5625 0.625 0.5312 +0.5625 0.625 0.5625 +0.5625 0.625 0.5938 +0.5625 0.625 0.625 +0.5625 0.625 0.6562 +0.5625 0.625 0.6875 +0.5625 0.625 0.7188 +0.5625 0.625 0.75 +0.5625 0.625 0.7812 +0.5625 0.625 0.8125 +0.5625 0.625 0.8438 +0.5625 0.625 0.875 +0.5625 0.625 0.9062 +0.5625 0.625 0.9375 +0.5625 0.625 0.9688 +0.5625 0.625 1 +0.5625 0.6562 0 +0.5625 0.6562 0.03125 +0.5625 0.6562 0.0625 +0.5625 0.6562 0.09375 +0.5625 0.6562 0.125 +0.5625 0.6562 0.1562 +0.5625 0.6562 0.1875 +0.5625 0.6562 0.2188 +0.5625 0.6562 0.25 +0.5625 0.6562 0.2812 +0.5625 0.6562 0.3125 +0.5625 0.6562 0.3438 +0.5625 0.6562 0.375 +0.5625 0.6562 0.4062 +0.5625 0.6562 0.4375 +0.5625 0.6562 0.4688 +0.5625 0.6562 0.5 +0.5625 0.6562 0.5312 +0.5625 0.6562 0.5625 +0.5625 0.6562 0.5938 +0.5625 0.6562 0.625 +0.5625 0.6562 0.6562 +0.5625 0.6562 0.6875 +0.5625 0.6562 0.7188 +0.5625 0.6562 0.75 +0.5625 0.6562 0.7812 +0.5625 0.6562 0.8125 +0.5625 0.6562 0.8438 +0.5625 0.6562 0.875 +0.5625 0.6562 0.9062 +0.5625 0.6562 0.9375 +0.5625 0.6562 0.9688 +0.5625 0.6562 1 +0.5625 0.6875 0 +0.5625 0.6875 0.03125 +0.5625 0.6875 0.0625 +0.5625 0.6875 0.09375 +0.5625 0.6875 0.125 +0.5625 0.6875 0.1562 +0.5625 0.6875 0.1875 +0.5625 0.6875 0.2188 +0.5625 0.6875 0.25 +0.5625 0.6875 0.2812 +0.5625 0.6875 0.3125 +0.5625 0.6875 0.3438 +0.5625 0.6875 0.375 +0.5625 0.6875 0.4062 +0.5625 0.6875 0.4375 +0.5625 0.6875 0.4688 +0.5625 0.6875 0.5 +0.5625 0.6875 0.5312 +0.5625 0.6875 0.5625 +0.5625 0.6875 0.5938 +0.5625 0.6875 0.625 +0.5625 0.6875 0.6562 +0.5625 0.6875 0.6875 +0.5625 0.6875 0.7188 +0.5625 0.6875 0.75 +0.5625 0.6875 0.7812 +0.5625 0.6875 0.8125 +0.5625 0.6875 0.8438 +0.5625 0.6875 0.875 +0.5625 0.6875 0.9062 +0.5625 0.6875 0.9375 +0.5625 0.6875 0.9688 +0.5625 0.6875 1 +0.5625 0.7188 0 +0.5625 0.7188 0.03125 +0.5625 0.7188 0.0625 +0.5625 0.7188 0.09375 +0.5625 0.7188 0.125 +0.5625 0.7188 0.1562 +0.5625 0.7188 0.1875 +0.5625 0.7188 0.2188 +0.5625 0.7188 0.25 +0.5625 0.7188 0.2812 +0.5625 0.7188 0.3125 +0.5625 0.7188 0.3438 +0.5625 0.7188 0.375 +0.5625 0.7188 0.4062 +0.5625 0.7188 0.4375 +0.5625 0.7188 0.4688 +0.5625 0.7188 0.5 +0.5625 0.7188 0.5312 +0.5625 0.7188 0.5625 +0.5625 0.7188 0.5938 +0.5625 0.7188 0.625 +0.5625 0.7188 0.6562 +0.5625 0.7188 0.6875 +0.5625 0.7188 0.7188 +0.5625 0.7188 0.75 +0.5625 0.7188 0.7812 +0.5625 0.7188 0.8125 +0.5625 0.7188 0.8438 +0.5625 0.7188 0.875 +0.5625 0.7188 0.9062 +0.5625 0.7188 0.9375 +0.5625 0.7188 0.9688 +0.5625 0.7188 1 +0.5625 0.75 0 +0.5625 0.75 0.03125 +0.5625 0.75 0.0625 +0.5625 0.75 0.09375 +0.5625 0.75 0.125 +0.5625 0.75 0.1562 +0.5625 0.75 0.1875 +0.5625 0.75 0.2188 +0.5625 0.75 0.25 +0.5625 0.75 0.2812 +0.5625 0.75 0.3125 +0.5625 0.75 0.3438 +0.5625 0.75 0.375 +0.5625 0.75 0.4062 +0.5625 0.75 0.4375 +0.5625 0.75 0.4688 +0.5625 0.75 0.5 +0.5625 0.75 0.5312 +0.5625 0.75 0.5625 +0.5625 0.75 0.5938 +0.5625 0.75 0.625 +0.5625 0.75 0.6562 +0.5625 0.75 0.6875 +0.5625 0.75 0.7188 +0.5625 0.75 0.75 +0.5625 0.75 0.7812 +0.5625 0.75 0.8125 +0.5625 0.75 0.8438 +0.5625 0.75 0.875 +0.5625 0.75 0.9062 +0.5625 0.75 0.9375 +0.5625 0.75 0.9688 +0.5625 0.75 1 +0.5625 0.7812 0 +0.5625 0.7812 0.03125 +0.5625 0.7812 0.0625 +0.5625 0.7812 0.09375 +0.5625 0.7812 0.125 +0.5625 0.7812 0.1562 +0.5625 0.7812 0.1875 +0.5625 0.7812 0.2188 +0.5625 0.7812 0.25 +0.5625 0.7812 0.2812 +0.5625 0.7812 0.3125 +0.5625 0.7812 0.3438 +0.5625 0.7812 0.375 +0.5625 0.7812 0.4062 +0.5625 0.7812 0.4375 +0.5625 0.7812 0.4688 +0.5625 0.7812 0.5 +0.5625 0.7812 0.5312 +0.5625 0.7812 0.5625 +0.5625 0.7812 0.5938 +0.5625 0.7812 0.625 +0.5625 0.7812 0.6562 +0.5625 0.7812 0.6875 +0.5625 0.7812 0.7188 +0.5625 0.7812 0.75 +0.5625 0.7812 0.7812 +0.5625 0.7812 0.8125 +0.5625 0.7812 0.8438 +0.5625 0.7812 0.875 +0.5625 0.7812 0.9062 +0.5625 0.7812 0.9375 +0.5625 0.7812 0.9688 +0.5625 0.7812 1 +0.5625 0.8125 0 +0.5625 0.8125 0.03125 +0.5625 0.8125 0.0625 +0.5625 0.8125 0.09375 +0.5625 0.8125 0.125 +0.5625 0.8125 0.1562 +0.5625 0.8125 0.1875 +0.5625 0.8125 0.2188 +0.5625 0.8125 0.25 +0.5625 0.8125 0.2812 +0.5625 0.8125 0.3125 +0.5625 0.8125 0.3438 +0.5625 0.8125 0.375 +0.5625 0.8125 0.4062 +0.5625 0.8125 0.4375 +0.5625 0.8125 0.4688 +0.5625 0.8125 0.5 +0.5625 0.8125 0.5312 +0.5625 0.8125 0.5625 +0.5625 0.8125 0.5938 +0.5625 0.8125 0.625 +0.5625 0.8125 0.6562 +0.5625 0.8125 0.6875 +0.5625 0.8125 0.7188 +0.5625 0.8125 0.75 +0.5625 0.8125 0.7812 +0.5625 0.8125 0.8125 +0.5625 0.8125 0.8438 +0.5625 0.8125 0.875 +0.5625 0.8125 0.9062 +0.5625 0.8125 0.9375 +0.5625 0.8125 0.9688 +0.5625 0.8125 1 +0.5625 0.8438 0 +0.5625 0.8438 0.03125 +0.5625 0.8438 0.0625 +0.5625 0.8438 0.09375 +0.5625 0.8438 0.125 +0.5625 0.8438 0.1562 +0.5625 0.8438 0.1875 +0.5625 0.8438 0.2188 +0.5625 0.8438 0.25 +0.5625 0.8438 0.2812 +0.5625 0.8438 0.3125 +0.5625 0.8438 0.3438 +0.5625 0.8438 0.375 +0.5625 0.8438 0.4062 +0.5625 0.8438 0.4375 +0.5625 0.8438 0.4688 +0.5625 0.8438 0.5 +0.5625 0.8438 0.5312 +0.5625 0.8438 0.5625 +0.5625 0.8438 0.5938 +0.5625 0.8438 0.625 +0.5625 0.8438 0.6562 +0.5625 0.8438 0.6875 +0.5625 0.8438 0.7188 +0.5625 0.8438 0.75 +0.5625 0.8438 0.7812 +0.5625 0.8438 0.8125 +0.5625 0.8438 0.8438 +0.5625 0.8438 0.875 +0.5625 0.8438 0.9062 +0.5625 0.8438 0.9375 +0.5625 0.8438 0.9688 +0.5625 0.8438 1 +0.5625 0.875 0 +0.5625 0.875 0.03125 +0.5625 0.875 0.0625 +0.5625 0.875 0.09375 +0.5625 0.875 0.125 +0.5625 0.875 0.1562 +0.5625 0.875 0.1875 +0.5625 0.875 0.2188 +0.5625 0.875 0.25 +0.5625 0.875 0.2812 +0.5625 0.875 0.3125 +0.5625 0.875 0.3438 +0.5625 0.875 0.375 +0.5625 0.875 0.4062 +0.5625 0.875 0.4375 +0.5625 0.875 0.4688 +0.5625 0.875 0.5 +0.5625 0.875 0.5312 +0.5625 0.875 0.5625 +0.5625 0.875 0.5938 +0.5625 0.875 0.625 +0.5625 0.875 0.6562 +0.5625 0.875 0.6875 +0.5625 0.875 0.7188 +0.5625 0.875 0.75 +0.5625 0.875 0.7812 +0.5625 0.875 0.8125 +0.5625 0.875 0.8438 +0.5625 0.875 0.875 +0.5625 0.875 0.9062 +0.5625 0.875 0.9375 +0.5625 0.875 0.9688 +0.5625 0.875 1 +0.5625 0.9062 0 +0.5625 0.9062 0.03125 +0.5625 0.9062 0.0625 +0.5625 0.9062 0.09375 +0.5625 0.9062 0.125 +0.5625 0.9062 0.1562 +0.5625 0.9062 0.1875 +0.5625 0.9062 0.2188 +0.5625 0.9062 0.25 +0.5625 0.9062 0.2812 +0.5625 0.9062 0.3125 +0.5625 0.9062 0.3438 +0.5625 0.9062 0.375 +0.5625 0.9062 0.4062 +0.5625 0.9062 0.4375 +0.5625 0.9062 0.4688 +0.5625 0.9062 0.5 +0.5625 0.9062 0.5312 +0.5625 0.9062 0.5625 +0.5625 0.9062 0.5938 +0.5625 0.9062 0.625 +0.5625 0.9062 0.6562 +0.5625 0.9062 0.6875 +0.5625 0.9062 0.7188 +0.5625 0.9062 0.75 +0.5625 0.9062 0.7812 +0.5625 0.9062 0.8125 +0.5625 0.9062 0.8438 +0.5625 0.9062 0.875 +0.5625 0.9062 0.9062 +0.5625 0.9062 0.9375 +0.5625 0.9062 0.9688 +0.5625 0.9062 1 +0.5625 0.9375 0 +0.5625 0.9375 0.03125 +0.5625 0.9375 0.0625 +0.5625 0.9375 0.09375 +0.5625 0.9375 0.125 +0.5625 0.9375 0.1562 +0.5625 0.9375 0.1875 +0.5625 0.9375 0.2188 +0.5625 0.9375 0.25 +0.5625 0.9375 0.2812 +0.5625 0.9375 0.3125 +0.5625 0.9375 0.3438 +0.5625 0.9375 0.375 +0.5625 0.9375 0.4062 +0.5625 0.9375 0.4375 +0.5625 0.9375 0.4688 +0.5625 0.9375 0.5 +0.5625 0.9375 0.5312 +0.5625 0.9375 0.5625 +0.5625 0.9375 0.5938 +0.5625 0.9375 0.625 +0.5625 0.9375 0.6562 +0.5625 0.9375 0.6875 +0.5625 0.9375 0.7188 +0.5625 0.9375 0.75 +0.5625 0.9375 0.7812 +0.5625 0.9375 0.8125 +0.5625 0.9375 0.8438 +0.5625 0.9375 0.875 +0.5625 0.9375 0.9062 +0.5625 0.9375 0.9375 +0.5625 0.9375 0.9688 +0.5625 0.9375 1 +0.5625 0.9688 0 +0.5625 0.9688 0.03125 +0.5625 0.9688 0.0625 +0.5625 0.9688 0.09375 +0.5625 0.9688 0.125 +0.5625 0.9688 0.1562 +0.5625 0.9688 0.1875 +0.5625 0.9688 0.2188 +0.5625 0.9688 0.25 +0.5625 0.9688 0.2812 +0.5625 0.9688 0.3125 +0.5625 0.9688 0.3438 +0.5625 0.9688 0.375 +0.5625 0.9688 0.4062 +0.5625 0.9688 0.4375 +0.5625 0.9688 0.4688 +0.5625 0.9688 0.5 +0.5625 0.9688 0.5312 +0.5625 0.9688 0.5625 +0.5625 0.9688 0.5938 +0.5625 0.9688 0.625 +0.5625 0.9688 0.6562 +0.5625 0.9688 0.6875 +0.5625 0.9688 0.7188 +0.5625 0.9688 0.75 +0.5625 0.9688 0.7812 +0.5625 0.9688 0.8125 +0.5625 0.9688 0.8438 +0.5625 0.9688 0.875 +0.5625 0.9688 0.9062 +0.5625 0.9688 0.9375 +0.5625 0.9688 0.9688 +0.5625 0.9688 1 +0.5625 1 0 +0.5625 1 0.03125 +0.5625 1 0.0625 +0.5625 1 0.09375 +0.5625 1 0.125 +0.5625 1 0.1562 +0.5625 1 0.1875 +0.5625 1 0.2188 +0.5625 1 0.25 +0.5625 1 0.2812 +0.5625 1 0.3125 +0.5625 1 0.3438 +0.5625 1 0.375 +0.5625 1 0.4062 +0.5625 1 0.4375 +0.5625 1 0.4688 +0.5625 1 0.5 +0.5625 1 0.5312 +0.5625 1 0.5625 +0.5625 1 0.5938 +0.5625 1 0.625 +0.5625 1 0.6562 +0.5625 1 0.6875 +0.5625 1 0.7188 +0.5625 1 0.75 +0.5625 1 0.7812 +0.5625 1 0.8125 +0.5625 1 0.8438 +0.5625 1 0.875 +0.5625 1 0.9062 +0.5625 1 0.9375 +0.5625 1 0.9688 +0.5625 1 1 +0.5938 0 0 +0.5938 0 0.03125 +0.5938 0 0.0625 +0.5938 0 0.09375 +0.5938 0 0.125 +0.5938 0 0.1562 +0.5938 0 0.1875 +0.5938 0 0.2188 +0.5938 0 0.25 +0.5938 0 0.2812 +0.5938 0 0.3125 +0.5938 0 0.3438 +0.5938 0 0.375 +0.5938 0 0.4062 +0.5938 0 0.4375 +0.5938 0 0.4688 +0.5938 0 0.5 +0.5938 0 0.5312 +0.5938 0 0.5625 +0.5938 0 0.5938 +0.5938 0 0.625 +0.5938 0 0.6562 +0.5938 0 0.6875 +0.5938 0 0.7188 +0.5938 0 0.75 +0.5938 0 0.7812 +0.5938 0 0.8125 +0.5938 0 0.8438 +0.5938 0 0.875 +0.5938 0 0.9062 +0.5938 0 0.9375 +0.5938 0 0.9688 +0.5938 0 1 +0.5938 0.03125 0 +0.5938 0.03125 0.03125 +0.5938 0.03125 0.0625 +0.5938 0.03125 0.09375 +0.5938 0.03125 0.125 +0.5938 0.03125 0.1562 +0.5938 0.03125 0.1875 +0.5938 0.03125 0.2188 +0.5938 0.03125 0.25 +0.5938 0.03125 0.2812 +0.5938 0.03125 0.3125 +0.5938 0.03125 0.3438 +0.5938 0.03125 0.375 +0.5938 0.03125 0.4062 +0.5938 0.03125 0.4375 +0.5938 0.03125 0.4688 +0.5938 0.03125 0.5 +0.5938 0.03125 0.5312 +0.5938 0.03125 0.5625 +0.5938 0.03125 0.5938 +0.5938 0.03125 0.625 +0.5938 0.03125 0.6562 +0.5938 0.03125 0.6875 +0.5938 0.03125 0.7188 +0.5938 0.03125 0.75 +0.5938 0.03125 0.7812 +0.5938 0.03125 0.8125 +0.5938 0.03125 0.8438 +0.5938 0.03125 0.875 +0.5938 0.03125 0.9062 +0.5938 0.03125 0.9375 +0.5938 0.03125 0.9688 +0.5938 0.03125 1 +0.5938 0.0625 0 +0.5938 0.0625 0.03125 +0.5938 0.0625 0.0625 +0.5938 0.0625 0.09375 +0.5938 0.0625 0.125 +0.5938 0.0625 0.1562 +0.5938 0.0625 0.1875 +0.5938 0.0625 0.2188 +0.5938 0.0625 0.25 +0.5938 0.0625 0.2812 +0.5938 0.0625 0.3125 +0.5938 0.0625 0.3438 +0.5938 0.0625 0.375 +0.5938 0.0625 0.4062 +0.5938 0.0625 0.4375 +0.5938 0.0625 0.4688 +0.5938 0.0625 0.5 +0.5938 0.0625 0.5312 +0.5938 0.0625 0.5625 +0.5938 0.0625 0.5938 +0.5938 0.0625 0.625 +0.5938 0.0625 0.6562 +0.5938 0.0625 0.6875 +0.5938 0.0625 0.7188 +0.5938 0.0625 0.75 +0.5938 0.0625 0.7812 +0.5938 0.0625 0.8125 +0.5938 0.0625 0.8438 +0.5938 0.0625 0.875 +0.5938 0.0625 0.9062 +0.5938 0.0625 0.9375 +0.5938 0.0625 0.9688 +0.5938 0.0625 1 +0.5938 0.09375 0 +0.5938 0.09375 0.03125 +0.5938 0.09375 0.0625 +0.5938 0.09375 0.09375 +0.5938 0.09375 0.125 +0.5938 0.09375 0.1562 +0.5938 0.09375 0.1875 +0.5938 0.09375 0.2188 +0.5938 0.09375 0.25 +0.5938 0.09375 0.2812 +0.5938 0.09375 0.3125 +0.5938 0.09375 0.3438 +0.5938 0.09375 0.375 +0.5938 0.09375 0.4062 +0.5938 0.09375 0.4375 +0.5938 0.09375 0.4688 +0.5938 0.09375 0.5 +0.5938 0.09375 0.5312 +0.5938 0.09375 0.5625 +0.5938 0.09375 0.5938 +0.5938 0.09375 0.625 +0.5938 0.09375 0.6562 +0.5938 0.09375 0.6875 +0.5938 0.09375 0.7188 +0.5938 0.09375 0.75 +0.5938 0.09375 0.7812 +0.5938 0.09375 0.8125 +0.5938 0.09375 0.8438 +0.5938 0.09375 0.875 +0.5938 0.09375 0.9062 +0.5938 0.09375 0.9375 +0.5938 0.09375 0.9688 +0.5938 0.09375 1 +0.5938 0.125 0 +0.5938 0.125 0.03125 +0.5938 0.125 0.0625 +0.5938 0.125 0.09375 +0.5938 0.125 0.125 +0.5938 0.125 0.1562 +0.5938 0.125 0.1875 +0.5938 0.125 0.2188 +0.5938 0.125 0.25 +0.5938 0.125 0.2812 +0.5938 0.125 0.3125 +0.5938 0.125 0.3438 +0.5938 0.125 0.375 +0.5938 0.125 0.4062 +0.5938 0.125 0.4375 +0.5938 0.125 0.4688 +0.5938 0.125 0.5 +0.5938 0.125 0.5312 +0.5938 0.125 0.5625 +0.5938 0.125 0.5938 +0.5938 0.125 0.625 +0.5938 0.125 0.6562 +0.5938 0.125 0.6875 +0.5938 0.125 0.7188 +0.5938 0.125 0.75 +0.5938 0.125 0.7812 +0.5938 0.125 0.8125 +0.5938 0.125 0.8438 +0.5938 0.125 0.875 +0.5938 0.125 0.9062 +0.5938 0.125 0.9375 +0.5938 0.125 0.9688 +0.5938 0.125 1 +0.5938 0.1562 0 +0.5938 0.1562 0.03125 +0.5938 0.1562 0.0625 +0.5938 0.1562 0.09375 +0.5938 0.1562 0.125 +0.5938 0.1562 0.1562 +0.5938 0.1562 0.1875 +0.5938 0.1562 0.2188 +0.5938 0.1562 0.25 +0.5938 0.1562 0.2812 +0.5938 0.1562 0.3125 +0.5938 0.1562 0.3438 +0.5938 0.1562 0.375 +0.5938 0.1562 0.4062 +0.5938 0.1562 0.4375 +0.5938 0.1562 0.4688 +0.5938 0.1562 0.5 +0.5938 0.1562 0.5312 +0.5938 0.1562 0.5625 +0.5938 0.1562 0.5938 +0.5938 0.1562 0.625 +0.5938 0.1562 0.6562 +0.5938 0.1562 0.6875 +0.5938 0.1562 0.7188 +0.5938 0.1562 0.75 +0.5938 0.1562 0.7812 +0.5938 0.1562 0.8125 +0.5938 0.1562 0.8438 +0.5938 0.1562 0.875 +0.5938 0.1562 0.9062 +0.5938 0.1562 0.9375 +0.5938 0.1562 0.9688 +0.5938 0.1562 1 +0.5938 0.1875 0 +0.5938 0.1875 0.03125 +0.5938 0.1875 0.0625 +0.5938 0.1875 0.09375 +0.5938 0.1875 0.125 +0.5938 0.1875 0.1562 +0.5938 0.1875 0.1875 +0.5938 0.1875 0.2188 +0.5938 0.1875 0.25 +0.5938 0.1875 0.2812 +0.5938 0.1875 0.3125 +0.5938 0.1875 0.3438 +0.5938 0.1875 0.375 +0.5938 0.1875 0.4062 +0.5938 0.1875 0.4375 +0.5938 0.1875 0.4688 +0.5938 0.1875 0.5 +0.5938 0.1875 0.5312 +0.5938 0.1875 0.5625 +0.5938 0.1875 0.5938 +0.5938 0.1875 0.625 +0.5938 0.1875 0.6562 +0.5938 0.1875 0.6875 +0.5938 0.1875 0.7188 +0.5938 0.1875 0.75 +0.5938 0.1875 0.7812 +0.5938 0.1875 0.8125 +0.5938 0.1875 0.8438 +0.5938 0.1875 0.875 +0.5938 0.1875 0.9062 +0.5938 0.1875 0.9375 +0.5938 0.1875 0.9688 +0.5938 0.1875 1 +0.5938 0.2188 0 +0.5938 0.2188 0.03125 +0.5938 0.2188 0.0625 +0.5938 0.2188 0.09375 +0.5938 0.2188 0.125 +0.5938 0.2188 0.1562 +0.5938 0.2188 0.1875 +0.5938 0.2188 0.2188 +0.5938 0.2188 0.25 +0.5938 0.2188 0.2812 +0.5938 0.2188 0.3125 +0.5938 0.2188 0.3438 +0.5938 0.2188 0.375 +0.5938 0.2188 0.4062 +0.5938 0.2188 0.4375 +0.5938 0.2188 0.4688 +0.5938 0.2188 0.5 +0.5938 0.2188 0.5312 +0.5938 0.2188 0.5625 +0.5938 0.2188 0.5938 +0.5938 0.2188 0.625 +0.5938 0.2188 0.6562 +0.5938 0.2188 0.6875 +0.5938 0.2188 0.7188 +0.5938 0.2188 0.75 +0.5938 0.2188 0.7812 +0.5938 0.2188 0.8125 +0.5938 0.2188 0.8438 +0.5938 0.2188 0.875 +0.5938 0.2188 0.9062 +0.5938 0.2188 0.9375 +0.5938 0.2188 0.9688 +0.5938 0.2188 1 +0.5938 0.25 0 +0.5938 0.25 0.03125 +0.5938 0.25 0.0625 +0.5938 0.25 0.09375 +0.5938 0.25 0.125 +0.5938 0.25 0.1562 +0.5938 0.25 0.1875 +0.5938 0.25 0.2188 +0.5938 0.25 0.25 +0.5938 0.25 0.2812 +0.5938 0.25 0.3125 +0.5938 0.25 0.3438 +0.5938 0.25 0.375 +0.5938 0.25 0.4062 +0.5938 0.25 0.4375 +0.5938 0.25 0.4688 +0.5938 0.25 0.5 +0.5938 0.25 0.5312 +0.5938 0.25 0.5625 +0.5938 0.25 0.5938 +0.5938 0.25 0.625 +0.5938 0.25 0.6562 +0.5938 0.25 0.6875 +0.5938 0.25 0.7188 +0.5938 0.25 0.75 +0.5938 0.25 0.7812 +0.5938 0.25 0.8125 +0.5938 0.25 0.8438 +0.5938 0.25 0.875 +0.5938 0.25 0.9062 +0.5938 0.25 0.9375 +0.5938 0.25 0.9688 +0.5938 0.25 1 +0.5938 0.2812 0 +0.5938 0.2812 0.03125 +0.5938 0.2812 0.0625 +0.5938 0.2812 0.09375 +0.5938 0.2812 0.125 +0.5938 0.2812 0.1562 +0.5938 0.2812 0.1875 +0.5938 0.2812 0.2188 +0.5938 0.2812 0.25 +0.5938 0.2812 0.2812 +0.5938 0.2812 0.3125 +0.5938 0.2812 0.3438 +0.5938 0.2812 0.375 +0.5938 0.2812 0.4062 +0.5938 0.2812 0.4375 +0.5938 0.2812 0.4688 +0.5938 0.2812 0.5 +0.5938 0.2812 0.5312 +0.5938 0.2812 0.5625 +0.5938 0.2812 0.5938 +0.5938 0.2812 0.625 +0.5938 0.2812 0.6562 +0.5938 0.2812 0.6875 +0.5938 0.2812 0.7188 +0.5938 0.2812 0.75 +0.5938 0.2812 0.7812 +0.5938 0.2812 0.8125 +0.5938 0.2812 0.8438 +0.5938 0.2812 0.875 +0.5938 0.2812 0.9062 +0.5938 0.2812 0.9375 +0.5938 0.2812 0.9688 +0.5938 0.2812 1 +0.5938 0.3125 0 +0.5938 0.3125 0.03125 +0.5938 0.3125 0.0625 +0.5938 0.3125 0.09375 +0.5938 0.3125 0.125 +0.5938 0.3125 0.1562 +0.5938 0.3125 0.1875 +0.5938 0.3125 0.2188 +0.5938 0.3125 0.25 +0.5938 0.3125 0.2812 +0.5938 0.3125 0.3125 +0.5938 0.3125 0.3438 +0.5938 0.3125 0.375 +0.5938 0.3125 0.4062 +0.5938 0.3125 0.4375 +0.5938 0.3125 0.4688 +0.5938 0.3125 0.5 +0.5938 0.3125 0.5312 +0.5938 0.3125 0.5625 +0.5938 0.3125 0.5938 +0.5938 0.3125 0.625 +0.5938 0.3125 0.6562 +0.5938 0.3125 0.6875 +0.5938 0.3125 0.7188 +0.5938 0.3125 0.75 +0.5938 0.3125 0.7812 +0.5938 0.3125 0.8125 +0.5938 0.3125 0.8438 +0.5938 0.3125 0.875 +0.5938 0.3125 0.9062 +0.5938 0.3125 0.9375 +0.5938 0.3125 0.9688 +0.5938 0.3125 1 +0.5938 0.3438 0 +0.5938 0.3438 0.03125 +0.5938 0.3438 0.0625 +0.5938 0.3438 0.09375 +0.5938 0.3438 0.125 +0.5938 0.3438 0.1562 +0.5938 0.3438 0.1875 +0.5938 0.3438 0.2188 +0.5938 0.3438 0.25 +0.5938 0.3438 0.2812 +0.5938 0.3438 0.3125 +0.5938 0.3438 0.3438 +0.5938 0.3438 0.375 +0.5938 0.3438 0.4062 +0.5938 0.3438 0.4375 +0.5938 0.3438 0.4688 +0.5938 0.3438 0.5 +0.5938 0.3438 0.5312 +0.5938 0.3438 0.5625 +0.5938 0.3438 0.5938 +0.5938 0.3438 0.625 +0.5938 0.3438 0.6562 +0.5938 0.3438 0.6875 +0.5938 0.3438 0.7188 +0.5938 0.3438 0.75 +0.5938 0.3438 0.7812 +0.5938 0.3438 0.8125 +0.5938 0.3438 0.8438 +0.5938 0.3438 0.875 +0.5938 0.3438 0.9062 +0.5938 0.3438 0.9375 +0.5938 0.3438 0.9688 +0.5938 0.3438 1 +0.5938 0.375 0 +0.5938 0.375 0.03125 +0.5938 0.375 0.0625 +0.5938 0.375 0.09375 +0.5938 0.375 0.125 +0.5938 0.375 0.1562 +0.5938 0.375 0.1875 +0.5938 0.375 0.2188 +0.5938 0.375 0.25 +0.5938 0.375 0.2812 +0.5938 0.375 0.3125 +0.5938 0.375 0.3438 +0.5938 0.375 0.375 +0.5938 0.375 0.4062 +0.5938 0.375 0.4375 +0.5938 0.375 0.4688 +0.5938 0.375 0.5 +0.5938 0.375 0.5312 +0.5938 0.375 0.5625 +0.5938 0.375 0.5938 +0.5938 0.375 0.625 +0.5938 0.375 0.6562 +0.5938 0.375 0.6875 +0.5938 0.375 0.7188 +0.5938 0.375 0.75 +0.5938 0.375 0.7812 +0.5938 0.375 0.8125 +0.5938 0.375 0.8438 +0.5938 0.375 0.875 +0.5938 0.375 0.9062 +0.5938 0.375 0.9375 +0.5938 0.375 0.9688 +0.5938 0.375 1 +0.5938 0.4062 0 +0.5938 0.4062 0.03125 +0.5938 0.4062 0.0625 +0.5938 0.4062 0.09375 +0.5938 0.4062 0.125 +0.5938 0.4062 0.1562 +0.5938 0.4062 0.1875 +0.5938 0.4062 0.2188 +0.5938 0.4062 0.25 +0.5938 0.4062 0.2812 +0.5938 0.4062 0.3125 +0.5938 0.4062 0.3438 +0.5938 0.4062 0.375 +0.5938 0.4062 0.4062 +0.5938 0.4062 0.4375 +0.5938 0.4062 0.4688 +0.5938 0.4062 0.5 +0.5938 0.4062 0.5312 +0.5938 0.4062 0.5625 +0.5938 0.4062 0.5938 +0.5938 0.4062 0.625 +0.5938 0.4062 0.6562 +0.5938 0.4062 0.6875 +0.5938 0.4062 0.7188 +0.5938 0.4062 0.75 +0.5938 0.4062 0.7812 +0.5938 0.4062 0.8125 +0.5938 0.4062 0.8438 +0.5938 0.4062 0.875 +0.5938 0.4062 0.9062 +0.5938 0.4062 0.9375 +0.5938 0.4062 0.9688 +0.5938 0.4062 1 +0.5938 0.4375 0 +0.5938 0.4375 0.03125 +0.5938 0.4375 0.0625 +0.5938 0.4375 0.09375 +0.5938 0.4375 0.125 +0.5938 0.4375 0.1562 +0.5938 0.4375 0.1875 +0.5938 0.4375 0.2188 +0.5938 0.4375 0.25 +0.5938 0.4375 0.2812 +0.5938 0.4375 0.3125 +0.5938 0.4375 0.3438 +0.5938 0.4375 0.375 +0.5938 0.4375 0.4062 +0.5938 0.4375 0.4375 +0.5938 0.4375 0.4688 +0.5938 0.4375 0.5 +0.5938 0.4375 0.5312 +0.5938 0.4375 0.5625 +0.5938 0.4375 0.5938 +0.5938 0.4375 0.625 +0.5938 0.4375 0.6562 +0.5938 0.4375 0.6875 +0.5938 0.4375 0.7188 +0.5938 0.4375 0.75 +0.5938 0.4375 0.7812 +0.5938 0.4375 0.8125 +0.5938 0.4375 0.8438 +0.5938 0.4375 0.875 +0.5938 0.4375 0.9062 +0.5938 0.4375 0.9375 +0.5938 0.4375 0.9688 +0.5938 0.4375 1 +0.5938 0.4688 0 +0.5938 0.4688 0.03125 +0.5938 0.4688 0.0625 +0.5938 0.4688 0.09375 +0.5938 0.4688 0.125 +0.5938 0.4688 0.1562 +0.5938 0.4688 0.1875 +0.5938 0.4688 0.2188 +0.5938 0.4688 0.25 +0.5938 0.4688 0.2812 +0.5938 0.4688 0.3125 +0.5938 0.4688 0.3438 +0.5938 0.4688 0.375 +0.5938 0.4688 0.4062 +0.5938 0.4688 0.4375 +0.5938 0.4688 0.4688 +0.5938 0.4688 0.5 +0.5938 0.4688 0.5312 +0.5938 0.4688 0.5625 +0.5938 0.4688 0.5938 +0.5938 0.4688 0.625 +0.5938 0.4688 0.6562 +0.5938 0.4688 0.6875 +0.5938 0.4688 0.7188 +0.5938 0.4688 0.75 +0.5938 0.4688 0.7812 +0.5938 0.4688 0.8125 +0.5938 0.4688 0.8438 +0.5938 0.4688 0.875 +0.5938 0.4688 0.9062 +0.5938 0.4688 0.9375 +0.5938 0.4688 0.9688 +0.5938 0.4688 1 +0.5938 0.5 0 +0.5938 0.5 0.03125 +0.5938 0.5 0.0625 +0.5938 0.5 0.09375 +0.5938 0.5 0.125 +0.5938 0.5 0.1562 +0.5938 0.5 0.1875 +0.5938 0.5 0.2188 +0.5938 0.5 0.25 +0.5938 0.5 0.2812 +0.5938 0.5 0.3125 +0.5938 0.5 0.3438 +0.5938 0.5 0.375 +0.5938 0.5 0.4062 +0.5938 0.5 0.4375 +0.5938 0.5 0.4688 +0.5938 0.5 0.5 +0.5938 0.5 0.5312 +0.5938 0.5 0.5625 +0.5938 0.5 0.5938 +0.5938 0.5 0.625 +0.5938 0.5 0.6562 +0.5938 0.5 0.6875 +0.5938 0.5 0.7188 +0.5938 0.5 0.75 +0.5938 0.5 0.7812 +0.5938 0.5 0.8125 +0.5938 0.5 0.8438 +0.5938 0.5 0.875 +0.5938 0.5 0.9062 +0.5938 0.5 0.9375 +0.5938 0.5 0.9688 +0.5938 0.5 1 +0.5938 0.5312 0 +0.5938 0.5312 0.03125 +0.5938 0.5312 0.0625 +0.5938 0.5312 0.09375 +0.5938 0.5312 0.125 +0.5938 0.5312 0.1562 +0.5938 0.5312 0.1875 +0.5938 0.5312 0.2188 +0.5938 0.5312 0.25 +0.5938 0.5312 0.2812 +0.5938 0.5312 0.3125 +0.5938 0.5312 0.3438 +0.5938 0.5312 0.375 +0.5938 0.5312 0.4062 +0.5938 0.5312 0.4375 +0.5938 0.5312 0.4688 +0.5938 0.5312 0.5 +0.5938 0.5312 0.5312 +0.5938 0.5312 0.5625 +0.5938 0.5312 0.5938 +0.5938 0.5312 0.625 +0.5938 0.5312 0.6562 +0.5938 0.5312 0.6875 +0.5938 0.5312 0.7188 +0.5938 0.5312 0.75 +0.5938 0.5312 0.7812 +0.5938 0.5312 0.8125 +0.5938 0.5312 0.8438 +0.5938 0.5312 0.875 +0.5938 0.5312 0.9062 +0.5938 0.5312 0.9375 +0.5938 0.5312 0.9688 +0.5938 0.5312 1 +0.5938 0.5625 0 +0.5938 0.5625 0.03125 +0.5938 0.5625 0.0625 +0.5938 0.5625 0.09375 +0.5938 0.5625 0.125 +0.5938 0.5625 0.1562 +0.5938 0.5625 0.1875 +0.5938 0.5625 0.2188 +0.5938 0.5625 0.25 +0.5938 0.5625 0.2812 +0.5938 0.5625 0.3125 +0.5938 0.5625 0.3438 +0.5938 0.5625 0.375 +0.5938 0.5625 0.4062 +0.5938 0.5625 0.4375 +0.5938 0.5625 0.4688 +0.5938 0.5625 0.5 +0.5938 0.5625 0.5312 +0.5938 0.5625 0.5625 +0.5938 0.5625 0.5938 +0.5938 0.5625 0.625 +0.5938 0.5625 0.6562 +0.5938 0.5625 0.6875 +0.5938 0.5625 0.7188 +0.5938 0.5625 0.75 +0.5938 0.5625 0.7812 +0.5938 0.5625 0.8125 +0.5938 0.5625 0.8438 +0.5938 0.5625 0.875 +0.5938 0.5625 0.9062 +0.5938 0.5625 0.9375 +0.5938 0.5625 0.9688 +0.5938 0.5625 1 +0.5938 0.5938 0 +0.5938 0.5938 0.03125 +0.5938 0.5938 0.0625 +0.5938 0.5938 0.09375 +0.5938 0.5938 0.125 +0.5938 0.5938 0.1562 +0.5938 0.5938 0.1875 +0.5938 0.5938 0.2188 +0.5938 0.5938 0.25 +0.5938 0.5938 0.2812 +0.5938 0.5938 0.3125 +0.5938 0.5938 0.3438 +0.5938 0.5938 0.375 +0.5938 0.5938 0.4062 +0.5938 0.5938 0.4375 +0.5938 0.5938 0.4688 +0.5938 0.5938 0.5 +0.5938 0.5938 0.5312 +0.5938 0.5938 0.5625 +0.5938 0.5938 0.5938 +0.5938 0.5938 0.625 +0.5938 0.5938 0.6562 +0.5938 0.5938 0.6875 +0.5938 0.5938 0.7188 +0.5938 0.5938 0.75 +0.5938 0.5938 0.7812 +0.5938 0.5938 0.8125 +0.5938 0.5938 0.8438 +0.5938 0.5938 0.875 +0.5938 0.5938 0.9062 +0.5938 0.5938 0.9375 +0.5938 0.5938 0.9688 +0.5938 0.5938 1 +0.5938 0.625 0 +0.5938 0.625 0.03125 +0.5938 0.625 0.0625 +0.5938 0.625 0.09375 +0.5938 0.625 0.125 +0.5938 0.625 0.1562 +0.5938 0.625 0.1875 +0.5938 0.625 0.2188 +0.5938 0.625 0.25 +0.5938 0.625 0.2812 +0.5938 0.625 0.3125 +0.5938 0.625 0.3438 +0.5938 0.625 0.375 +0.5938 0.625 0.4062 +0.5938 0.625 0.4375 +0.5938 0.625 0.4688 +0.5938 0.625 0.5 +0.5938 0.625 0.5312 +0.5938 0.625 0.5625 +0.5938 0.625 0.5938 +0.5938 0.625 0.625 +0.5938 0.625 0.6562 +0.5938 0.625 0.6875 +0.5938 0.625 0.7188 +0.5938 0.625 0.75 +0.5938 0.625 0.7812 +0.5938 0.625 0.8125 +0.5938 0.625 0.8438 +0.5938 0.625 0.875 +0.5938 0.625 0.9062 +0.5938 0.625 0.9375 +0.5938 0.625 0.9688 +0.5938 0.625 1 +0.5938 0.6562 0 +0.5938 0.6562 0.03125 +0.5938 0.6562 0.0625 +0.5938 0.6562 0.09375 +0.5938 0.6562 0.125 +0.5938 0.6562 0.1562 +0.5938 0.6562 0.1875 +0.5938 0.6562 0.2188 +0.5938 0.6562 0.25 +0.5938 0.6562 0.2812 +0.5938 0.6562 0.3125 +0.5938 0.6562 0.3438 +0.5938 0.6562 0.375 +0.5938 0.6562 0.4062 +0.5938 0.6562 0.4375 +0.5938 0.6562 0.4688 +0.5938 0.6562 0.5 +0.5938 0.6562 0.5312 +0.5938 0.6562 0.5625 +0.5938 0.6562 0.5938 +0.5938 0.6562 0.625 +0.5938 0.6562 0.6562 +0.5938 0.6562 0.6875 +0.5938 0.6562 0.7188 +0.5938 0.6562 0.75 +0.5938 0.6562 0.7812 +0.5938 0.6562 0.8125 +0.5938 0.6562 0.8438 +0.5938 0.6562 0.875 +0.5938 0.6562 0.9062 +0.5938 0.6562 0.9375 +0.5938 0.6562 0.9688 +0.5938 0.6562 1 +0.5938 0.6875 0 +0.5938 0.6875 0.03125 +0.5938 0.6875 0.0625 +0.5938 0.6875 0.09375 +0.5938 0.6875 0.125 +0.5938 0.6875 0.1562 +0.5938 0.6875 0.1875 +0.5938 0.6875 0.2188 +0.5938 0.6875 0.25 +0.5938 0.6875 0.2812 +0.5938 0.6875 0.3125 +0.5938 0.6875 0.3438 +0.5938 0.6875 0.375 +0.5938 0.6875 0.4062 +0.5938 0.6875 0.4375 +0.5938 0.6875 0.4688 +0.5938 0.6875 0.5 +0.5938 0.6875 0.5312 +0.5938 0.6875 0.5625 +0.5938 0.6875 0.5938 +0.5938 0.6875 0.625 +0.5938 0.6875 0.6562 +0.5938 0.6875 0.6875 +0.5938 0.6875 0.7188 +0.5938 0.6875 0.75 +0.5938 0.6875 0.7812 +0.5938 0.6875 0.8125 +0.5938 0.6875 0.8438 +0.5938 0.6875 0.875 +0.5938 0.6875 0.9062 +0.5938 0.6875 0.9375 +0.5938 0.6875 0.9688 +0.5938 0.6875 1 +0.5938 0.7188 0 +0.5938 0.7188 0.03125 +0.5938 0.7188 0.0625 +0.5938 0.7188 0.09375 +0.5938 0.7188 0.125 +0.5938 0.7188 0.1562 +0.5938 0.7188 0.1875 +0.5938 0.7188 0.2188 +0.5938 0.7188 0.25 +0.5938 0.7188 0.2812 +0.5938 0.7188 0.3125 +0.5938 0.7188 0.3438 +0.5938 0.7188 0.375 +0.5938 0.7188 0.4062 +0.5938 0.7188 0.4375 +0.5938 0.7188 0.4688 +0.5938 0.7188 0.5 +0.5938 0.7188 0.5312 +0.5938 0.7188 0.5625 +0.5938 0.7188 0.5938 +0.5938 0.7188 0.625 +0.5938 0.7188 0.6562 +0.5938 0.7188 0.6875 +0.5938 0.7188 0.7188 +0.5938 0.7188 0.75 +0.5938 0.7188 0.7812 +0.5938 0.7188 0.8125 +0.5938 0.7188 0.8438 +0.5938 0.7188 0.875 +0.5938 0.7188 0.9062 +0.5938 0.7188 0.9375 +0.5938 0.7188 0.9688 +0.5938 0.7188 1 +0.5938 0.75 0 +0.5938 0.75 0.03125 +0.5938 0.75 0.0625 +0.5938 0.75 0.09375 +0.5938 0.75 0.125 +0.5938 0.75 0.1562 +0.5938 0.75 0.1875 +0.5938 0.75 0.2188 +0.5938 0.75 0.25 +0.5938 0.75 0.2812 +0.5938 0.75 0.3125 +0.5938 0.75 0.3438 +0.5938 0.75 0.375 +0.5938 0.75 0.4062 +0.5938 0.75 0.4375 +0.5938 0.75 0.4688 +0.5938 0.75 0.5 +0.5938 0.75 0.5312 +0.5938 0.75 0.5625 +0.5938 0.75 0.5938 +0.5938 0.75 0.625 +0.5938 0.75 0.6562 +0.5938 0.75 0.6875 +0.5938 0.75 0.7188 +0.5938 0.75 0.75 +0.5938 0.75 0.7812 +0.5938 0.75 0.8125 +0.5938 0.75 0.8438 +0.5938 0.75 0.875 +0.5938 0.75 0.9062 +0.5938 0.75 0.9375 +0.5938 0.75 0.9688 +0.5938 0.75 1 +0.5938 0.7812 0 +0.5938 0.7812 0.03125 +0.5938 0.7812 0.0625 +0.5938 0.7812 0.09375 +0.5938 0.7812 0.125 +0.5938 0.7812 0.1562 +0.5938 0.7812 0.1875 +0.5938 0.7812 0.2188 +0.5938 0.7812 0.25 +0.5938 0.7812 0.2812 +0.5938 0.7812 0.3125 +0.5938 0.7812 0.3438 +0.5938 0.7812 0.375 +0.5938 0.7812 0.4062 +0.5938 0.7812 0.4375 +0.5938 0.7812 0.4688 +0.5938 0.7812 0.5 +0.5938 0.7812 0.5312 +0.5938 0.7812 0.5625 +0.5938 0.7812 0.5938 +0.5938 0.7812 0.625 +0.5938 0.7812 0.6562 +0.5938 0.7812 0.6875 +0.5938 0.7812 0.7188 +0.5938 0.7812 0.75 +0.5938 0.7812 0.7812 +0.5938 0.7812 0.8125 +0.5938 0.7812 0.8438 +0.5938 0.7812 0.875 +0.5938 0.7812 0.9062 +0.5938 0.7812 0.9375 +0.5938 0.7812 0.9688 +0.5938 0.7812 1 +0.5938 0.8125 0 +0.5938 0.8125 0.03125 +0.5938 0.8125 0.0625 +0.5938 0.8125 0.09375 +0.5938 0.8125 0.125 +0.5938 0.8125 0.1562 +0.5938 0.8125 0.1875 +0.5938 0.8125 0.2188 +0.5938 0.8125 0.25 +0.5938 0.8125 0.2812 +0.5938 0.8125 0.3125 +0.5938 0.8125 0.3438 +0.5938 0.8125 0.375 +0.5938 0.8125 0.4062 +0.5938 0.8125 0.4375 +0.5938 0.8125 0.4688 +0.5938 0.8125 0.5 +0.5938 0.8125 0.5312 +0.5938 0.8125 0.5625 +0.5938 0.8125 0.5938 +0.5938 0.8125 0.625 +0.5938 0.8125 0.6562 +0.5938 0.8125 0.6875 +0.5938 0.8125 0.7188 +0.5938 0.8125 0.75 +0.5938 0.8125 0.7812 +0.5938 0.8125 0.8125 +0.5938 0.8125 0.8438 +0.5938 0.8125 0.875 +0.5938 0.8125 0.9062 +0.5938 0.8125 0.9375 +0.5938 0.8125 0.9688 +0.5938 0.8125 1 +0.5938 0.8438 0 +0.5938 0.8438 0.03125 +0.5938 0.8438 0.0625 +0.5938 0.8438 0.09375 +0.5938 0.8438 0.125 +0.5938 0.8438 0.1562 +0.5938 0.8438 0.1875 +0.5938 0.8438 0.2188 +0.5938 0.8438 0.25 +0.5938 0.8438 0.2812 +0.5938 0.8438 0.3125 +0.5938 0.8438 0.3438 +0.5938 0.8438 0.375 +0.5938 0.8438 0.4062 +0.5938 0.8438 0.4375 +0.5938 0.8438 0.4688 +0.5938 0.8438 0.5 +0.5938 0.8438 0.5312 +0.5938 0.8438 0.5625 +0.5938 0.8438 0.5938 +0.5938 0.8438 0.625 +0.5938 0.8438 0.6562 +0.5938 0.8438 0.6875 +0.5938 0.8438 0.7188 +0.5938 0.8438 0.75 +0.5938 0.8438 0.7812 +0.5938 0.8438 0.8125 +0.5938 0.8438 0.8438 +0.5938 0.8438 0.875 +0.5938 0.8438 0.9062 +0.5938 0.8438 0.9375 +0.5938 0.8438 0.9688 +0.5938 0.8438 1 +0.5938 0.875 0 +0.5938 0.875 0.03125 +0.5938 0.875 0.0625 +0.5938 0.875 0.09375 +0.5938 0.875 0.125 +0.5938 0.875 0.1562 +0.5938 0.875 0.1875 +0.5938 0.875 0.2188 +0.5938 0.875 0.25 +0.5938 0.875 0.2812 +0.5938 0.875 0.3125 +0.5938 0.875 0.3438 +0.5938 0.875 0.375 +0.5938 0.875 0.4062 +0.5938 0.875 0.4375 +0.5938 0.875 0.4688 +0.5938 0.875 0.5 +0.5938 0.875 0.5312 +0.5938 0.875 0.5625 +0.5938 0.875 0.5938 +0.5938 0.875 0.625 +0.5938 0.875 0.6562 +0.5938 0.875 0.6875 +0.5938 0.875 0.7188 +0.5938 0.875 0.75 +0.5938 0.875 0.7812 +0.5938 0.875 0.8125 +0.5938 0.875 0.8438 +0.5938 0.875 0.875 +0.5938 0.875 0.9062 +0.5938 0.875 0.9375 +0.5938 0.875 0.9688 +0.5938 0.875 1 +0.5938 0.9062 0 +0.5938 0.9062 0.03125 +0.5938 0.9062 0.0625 +0.5938 0.9062 0.09375 +0.5938 0.9062 0.125 +0.5938 0.9062 0.1562 +0.5938 0.9062 0.1875 +0.5938 0.9062 0.2188 +0.5938 0.9062 0.25 +0.5938 0.9062 0.2812 +0.5938 0.9062 0.3125 +0.5938 0.9062 0.3438 +0.5938 0.9062 0.375 +0.5938 0.9062 0.4062 +0.5938 0.9062 0.4375 +0.5938 0.9062 0.4688 +0.5938 0.9062 0.5 +0.5938 0.9062 0.5312 +0.5938 0.9062 0.5625 +0.5938 0.9062 0.5938 +0.5938 0.9062 0.625 +0.5938 0.9062 0.6562 +0.5938 0.9062 0.6875 +0.5938 0.9062 0.7188 +0.5938 0.9062 0.75 +0.5938 0.9062 0.7812 +0.5938 0.9062 0.8125 +0.5938 0.9062 0.8438 +0.5938 0.9062 0.875 +0.5938 0.9062 0.9062 +0.5938 0.9062 0.9375 +0.5938 0.9062 0.9688 +0.5938 0.9062 1 +0.5938 0.9375 0 +0.5938 0.9375 0.03125 +0.5938 0.9375 0.0625 +0.5938 0.9375 0.09375 +0.5938 0.9375 0.125 +0.5938 0.9375 0.1562 +0.5938 0.9375 0.1875 +0.5938 0.9375 0.2188 +0.5938 0.9375 0.25 +0.5938 0.9375 0.2812 +0.5938 0.9375 0.3125 +0.5938 0.9375 0.3438 +0.5938 0.9375 0.375 +0.5938 0.9375 0.4062 +0.5938 0.9375 0.4375 +0.5938 0.9375 0.4688 +0.5938 0.9375 0.5 +0.5938 0.9375 0.5312 +0.5938 0.9375 0.5625 +0.5938 0.9375 0.5938 +0.5938 0.9375 0.625 +0.5938 0.9375 0.6562 +0.5938 0.9375 0.6875 +0.5938 0.9375 0.7188 +0.5938 0.9375 0.75 +0.5938 0.9375 0.7812 +0.5938 0.9375 0.8125 +0.5938 0.9375 0.8438 +0.5938 0.9375 0.875 +0.5938 0.9375 0.9062 +0.5938 0.9375 0.9375 +0.5938 0.9375 0.9688 +0.5938 0.9375 1 +0.5938 0.9688 0 +0.5938 0.9688 0.03125 +0.5938 0.9688 0.0625 +0.5938 0.9688 0.09375 +0.5938 0.9688 0.125 +0.5938 0.9688 0.1562 +0.5938 0.9688 0.1875 +0.5938 0.9688 0.2188 +0.5938 0.9688 0.25 +0.5938 0.9688 0.2812 +0.5938 0.9688 0.3125 +0.5938 0.9688 0.3438 +0.5938 0.9688 0.375 +0.5938 0.9688 0.4062 +0.5938 0.9688 0.4375 +0.5938 0.9688 0.4688 +0.5938 0.9688 0.5 +0.5938 0.9688 0.5312 +0.5938 0.9688 0.5625 +0.5938 0.9688 0.5938 +0.5938 0.9688 0.625 +0.5938 0.9688 0.6562 +0.5938 0.9688 0.6875 +0.5938 0.9688 0.7188 +0.5938 0.9688 0.75 +0.5938 0.9688 0.7812 +0.5938 0.9688 0.8125 +0.5938 0.9688 0.8438 +0.5938 0.9688 0.875 +0.5938 0.9688 0.9062 +0.5938 0.9688 0.9375 +0.5938 0.9688 0.9688 +0.5938 0.9688 1 +0.5938 1 0 +0.5938 1 0.03125 +0.5938 1 0.0625 +0.5938 1 0.09375 +0.5938 1 0.125 +0.5938 1 0.1562 +0.5938 1 0.1875 +0.5938 1 0.2188 +0.5938 1 0.25 +0.5938 1 0.2812 +0.5938 1 0.3125 +0.5938 1 0.3438 +0.5938 1 0.375 +0.5938 1 0.4062 +0.5938 1 0.4375 +0.5938 1 0.4688 +0.5938 1 0.5 +0.5938 1 0.5312 +0.5938 1 0.5625 +0.5938 1 0.5938 +0.5938 1 0.625 +0.5938 1 0.6562 +0.5938 1 0.6875 +0.5938 1 0.7188 +0.5938 1 0.75 +0.5938 1 0.7812 +0.5938 1 0.8125 +0.5938 1 0.8438 +0.5938 1 0.875 +0.5938 1 0.9062 +0.5938 1 0.9375 +0.5938 1 0.9688 +0.5938 1 1 +0.625 0 0 +0.625 0 0.03125 +0.625 0 0.0625 +0.625 0 0.09375 +0.625 0 0.125 +0.625 0 0.1562 +0.625 0 0.1875 +0.625 0 0.2188 +0.625 0 0.25 +0.625 0 0.2812 +0.625 0 0.3125 +0.625 0 0.3438 +0.625 0 0.375 +0.625 0 0.4062 +0.625 0 0.4375 +0.625 0 0.4688 +0.625 0 0.5 +0.625 0 0.5312 +0.625 0 0.5625 +0.625 0 0.5938 +0.625 0 0.625 +0.625 0 0.6562 +0.625 0 0.6875 +0.625 0 0.7188 +0.625 0 0.75 +0.625 0 0.7812 +0.625 0 0.8125 +0.625 0 0.8438 +0.625 0 0.875 +0.625 0 0.9062 +0.625 0 0.9375 +0.625 0 0.9688 +0.625 0 1 +0.625 0.03125 0 +0.625 0.03125 0.03125 +0.625 0.03125 0.0625 +0.625 0.03125 0.09375 +0.625 0.03125 0.125 +0.625 0.03125 0.1562 +0.625 0.03125 0.1875 +0.625 0.03125 0.2188 +0.625 0.03125 0.25 +0.625 0.03125 0.2812 +0.625 0.03125 0.3125 +0.625 0.03125 0.3438 +0.625 0.03125 0.375 +0.625 0.03125 0.4062 +0.625 0.03125 0.4375 +0.625 0.03125 0.4688 +0.625 0.03125 0.5 +0.625 0.03125 0.5312 +0.625 0.03125 0.5625 +0.625 0.03125 0.5938 +0.625 0.03125 0.625 +0.625 0.03125 0.6562 +0.625 0.03125 0.6875 +0.625 0.03125 0.7188 +0.625 0.03125 0.75 +0.625 0.03125 0.7812 +0.625 0.03125 0.8125 +0.625 0.03125 0.8438 +0.625 0.03125 0.875 +0.625 0.03125 0.9062 +0.625 0.03125 0.9375 +0.625 0.03125 0.9688 +0.625 0.03125 1 +0.625 0.0625 0 +0.625 0.0625 0.03125 +0.625 0.0625 0.0625 +0.625 0.0625 0.09375 +0.625 0.0625 0.125 +0.625 0.0625 0.1562 +0.625 0.0625 0.1875 +0.625 0.0625 0.2188 +0.625 0.0625 0.25 +0.625 0.0625 0.2812 +0.625 0.0625 0.3125 +0.625 0.0625 0.3438 +0.625 0.0625 0.375 +0.625 0.0625 0.4062 +0.625 0.0625 0.4375 +0.625 0.0625 0.4688 +0.625 0.0625 0.5 +0.625 0.0625 0.5312 +0.625 0.0625 0.5625 +0.625 0.0625 0.5938 +0.625 0.0625 0.625 +0.625 0.0625 0.6562 +0.625 0.0625 0.6875 +0.625 0.0625 0.7188 +0.625 0.0625 0.75 +0.625 0.0625 0.7812 +0.625 0.0625 0.8125 +0.625 0.0625 0.8438 +0.625 0.0625 0.875 +0.625 0.0625 0.9062 +0.625 0.0625 0.9375 +0.625 0.0625 0.9688 +0.625 0.0625 1 +0.625 0.09375 0 +0.625 0.09375 0.03125 +0.625 0.09375 0.0625 +0.625 0.09375 0.09375 +0.625 0.09375 0.125 +0.625 0.09375 0.1562 +0.625 0.09375 0.1875 +0.625 0.09375 0.2188 +0.625 0.09375 0.25 +0.625 0.09375 0.2812 +0.625 0.09375 0.3125 +0.625 0.09375 0.3438 +0.625 0.09375 0.375 +0.625 0.09375 0.4062 +0.625 0.09375 0.4375 +0.625 0.09375 0.4688 +0.625 0.09375 0.5 +0.625 0.09375 0.5312 +0.625 0.09375 0.5625 +0.625 0.09375 0.5938 +0.625 0.09375 0.625 +0.625 0.09375 0.6562 +0.625 0.09375 0.6875 +0.625 0.09375 0.7188 +0.625 0.09375 0.75 +0.625 0.09375 0.7812 +0.625 0.09375 0.8125 +0.625 0.09375 0.8438 +0.625 0.09375 0.875 +0.625 0.09375 0.9062 +0.625 0.09375 0.9375 +0.625 0.09375 0.9688 +0.625 0.09375 1 +0.625 0.125 0 +0.625 0.125 0.03125 +0.625 0.125 0.0625 +0.625 0.125 0.09375 +0.625 0.125 0.125 +0.625 0.125 0.1562 +0.625 0.125 0.1875 +0.625 0.125 0.2188 +0.625 0.125 0.25 +0.625 0.125 0.2812 +0.625 0.125 0.3125 +0.625 0.125 0.3438 +0.625 0.125 0.375 +0.625 0.125 0.4062 +0.625 0.125 0.4375 +0.625 0.125 0.4688 +0.625 0.125 0.5 +0.625 0.125 0.5312 +0.625 0.125 0.5625 +0.625 0.125 0.5938 +0.625 0.125 0.625 +0.625 0.125 0.6562 +0.625 0.125 0.6875 +0.625 0.125 0.7188 +0.625 0.125 0.75 +0.625 0.125 0.7812 +0.625 0.125 0.8125 +0.625 0.125 0.8438 +0.625 0.125 0.875 +0.625 0.125 0.9062 +0.625 0.125 0.9375 +0.625 0.125 0.9688 +0.625 0.125 1 +0.625 0.1562 0 +0.625 0.1562 0.03125 +0.625 0.1562 0.0625 +0.625 0.1562 0.09375 +0.625 0.1562 0.125 +0.625 0.1562 0.1562 +0.625 0.1562 0.1875 +0.625 0.1562 0.2188 +0.625 0.1562 0.25 +0.625 0.1562 0.2812 +0.625 0.1562 0.3125 +0.625 0.1562 0.3438 +0.625 0.1562 0.375 +0.625 0.1562 0.4062 +0.625 0.1562 0.4375 +0.625 0.1562 0.4688 +0.625 0.1562 0.5 +0.625 0.1562 0.5312 +0.625 0.1562 0.5625 +0.625 0.1562 0.5938 +0.625 0.1562 0.625 +0.625 0.1562 0.6562 +0.625 0.1562 0.6875 +0.625 0.1562 0.7188 +0.625 0.1562 0.75 +0.625 0.1562 0.7812 +0.625 0.1562 0.8125 +0.625 0.1562 0.8438 +0.625 0.1562 0.875 +0.625 0.1562 0.9062 +0.625 0.1562 0.9375 +0.625 0.1562 0.9688 +0.625 0.1562 1 +0.625 0.1875 0 +0.625 0.1875 0.03125 +0.625 0.1875 0.0625 +0.625 0.1875 0.09375 +0.625 0.1875 0.125 +0.625 0.1875 0.1562 +0.625 0.1875 0.1875 +0.625 0.1875 0.2188 +0.625 0.1875 0.25 +0.625 0.1875 0.2812 +0.625 0.1875 0.3125 +0.625 0.1875 0.3438 +0.625 0.1875 0.375 +0.625 0.1875 0.4062 +0.625 0.1875 0.4375 +0.625 0.1875 0.4688 +0.625 0.1875 0.5 +0.625 0.1875 0.5312 +0.625 0.1875 0.5625 +0.625 0.1875 0.5938 +0.625 0.1875 0.625 +0.625 0.1875 0.6562 +0.625 0.1875 0.6875 +0.625 0.1875 0.7188 +0.625 0.1875 0.75 +0.625 0.1875 0.7812 +0.625 0.1875 0.8125 +0.625 0.1875 0.8438 +0.625 0.1875 0.875 +0.625 0.1875 0.9062 +0.625 0.1875 0.9375 +0.625 0.1875 0.9688 +0.625 0.1875 1 +0.625 0.2188 0 +0.625 0.2188 0.03125 +0.625 0.2188 0.0625 +0.625 0.2188 0.09375 +0.625 0.2188 0.125 +0.625 0.2188 0.1562 +0.625 0.2188 0.1875 +0.625 0.2188 0.2188 +0.625 0.2188 0.25 +0.625 0.2188 0.2812 +0.625 0.2188 0.3125 +0.625 0.2188 0.3438 +0.625 0.2188 0.375 +0.625 0.2188 0.4062 +0.625 0.2188 0.4375 +0.625 0.2188 0.4688 +0.625 0.2188 0.5 +0.625 0.2188 0.5312 +0.625 0.2188 0.5625 +0.625 0.2188 0.5938 +0.625 0.2188 0.625 +0.625 0.2188 0.6562 +0.625 0.2188 0.6875 +0.625 0.2188 0.7188 +0.625 0.2188 0.75 +0.625 0.2188 0.7812 +0.625 0.2188 0.8125 +0.625 0.2188 0.8438 +0.625 0.2188 0.875 +0.625 0.2188 0.9062 +0.625 0.2188 0.9375 +0.625 0.2188 0.9688 +0.625 0.2188 1 +0.625 0.25 0 +0.625 0.25 0.03125 +0.625 0.25 0.0625 +0.625 0.25 0.09375 +0.625 0.25 0.125 +0.625 0.25 0.1562 +0.625 0.25 0.1875 +0.625 0.25 0.2188 +0.625 0.25 0.25 +0.625 0.25 0.2812 +0.625 0.25 0.3125 +0.625 0.25 0.3438 +0.625 0.25 0.375 +0.625 0.25 0.4062 +0.625 0.25 0.4375 +0.625 0.25 0.4688 +0.625 0.25 0.5 +0.625 0.25 0.5312 +0.625 0.25 0.5625 +0.625 0.25 0.5938 +0.625 0.25 0.625 +0.625 0.25 0.6562 +0.625 0.25 0.6875 +0.625 0.25 0.7188 +0.625 0.25 0.75 +0.625 0.25 0.7812 +0.625 0.25 0.8125 +0.625 0.25 0.8438 +0.625 0.25 0.875 +0.625 0.25 0.9062 +0.625 0.25 0.9375 +0.625 0.25 0.9688 +0.625 0.25 1 +0.625 0.2812 0 +0.625 0.2812 0.03125 +0.625 0.2812 0.0625 +0.625 0.2812 0.09375 +0.625 0.2812 0.125 +0.625 0.2812 0.1562 +0.625 0.2812 0.1875 +0.625 0.2812 0.2188 +0.625 0.2812 0.25 +0.625 0.2812 0.2812 +0.625 0.2812 0.3125 +0.625 0.2812 0.3438 +0.625 0.2812 0.375 +0.625 0.2812 0.4062 +0.625 0.2812 0.4375 +0.625 0.2812 0.4688 +0.625 0.2812 0.5 +0.625 0.2812 0.5312 +0.625 0.2812 0.5625 +0.625 0.2812 0.5938 +0.625 0.2812 0.625 +0.625 0.2812 0.6562 +0.625 0.2812 0.6875 +0.625 0.2812 0.7188 +0.625 0.2812 0.75 +0.625 0.2812 0.7812 +0.625 0.2812 0.8125 +0.625 0.2812 0.8438 +0.625 0.2812 0.875 +0.625 0.2812 0.9062 +0.625 0.2812 0.9375 +0.625 0.2812 0.9688 +0.625 0.2812 1 +0.625 0.3125 0 +0.625 0.3125 0.03125 +0.625 0.3125 0.0625 +0.625 0.3125 0.09375 +0.625 0.3125 0.125 +0.625 0.3125 0.1562 +0.625 0.3125 0.1875 +0.625 0.3125 0.2188 +0.625 0.3125 0.25 +0.625 0.3125 0.2812 +0.625 0.3125 0.3125 +0.625 0.3125 0.3438 +0.625 0.3125 0.375 +0.625 0.3125 0.4062 +0.625 0.3125 0.4375 +0.625 0.3125 0.4688 +0.625 0.3125 0.5 +0.625 0.3125 0.5312 +0.625 0.3125 0.5625 +0.625 0.3125 0.5938 +0.625 0.3125 0.625 +0.625 0.3125 0.6562 +0.625 0.3125 0.6875 +0.625 0.3125 0.7188 +0.625 0.3125 0.75 +0.625 0.3125 0.7812 +0.625 0.3125 0.8125 +0.625 0.3125 0.8438 +0.625 0.3125 0.875 +0.625 0.3125 0.9062 +0.625 0.3125 0.9375 +0.625 0.3125 0.9688 +0.625 0.3125 1 +0.625 0.3438 0 +0.625 0.3438 0.03125 +0.625 0.3438 0.0625 +0.625 0.3438 0.09375 +0.625 0.3438 0.125 +0.625 0.3438 0.1562 +0.625 0.3438 0.1875 +0.625 0.3438 0.2188 +0.625 0.3438 0.25 +0.625 0.3438 0.2812 +0.625 0.3438 0.3125 +0.625 0.3438 0.3438 +0.625 0.3438 0.375 +0.625 0.3438 0.4062 +0.625 0.3438 0.4375 +0.625 0.3438 0.4688 +0.625 0.3438 0.5 +0.625 0.3438 0.5312 +0.625 0.3438 0.5625 +0.625 0.3438 0.5938 +0.625 0.3438 0.625 +0.625 0.3438 0.6562 +0.625 0.3438 0.6875 +0.625 0.3438 0.7188 +0.625 0.3438 0.75 +0.625 0.3438 0.7812 +0.625 0.3438 0.8125 +0.625 0.3438 0.8438 +0.625 0.3438 0.875 +0.625 0.3438 0.9062 +0.625 0.3438 0.9375 +0.625 0.3438 0.9688 +0.625 0.3438 1 +0.625 0.375 0 +0.625 0.375 0.03125 +0.625 0.375 0.0625 +0.625 0.375 0.09375 +0.625 0.375 0.125 +0.625 0.375 0.1562 +0.625 0.375 0.1875 +0.625 0.375 0.2188 +0.625 0.375 0.25 +0.625 0.375 0.2812 +0.625 0.375 0.3125 +0.625 0.375 0.3438 +0.625 0.375 0.375 +0.625 0.375 0.4062 +0.625 0.375 0.4375 +0.625 0.375 0.4688 +0.625 0.375 0.5 +0.625 0.375 0.5312 +0.625 0.375 0.5625 +0.625 0.375 0.5938 +0.625 0.375 0.625 +0.625 0.375 0.6562 +0.625 0.375 0.6875 +0.625 0.375 0.7188 +0.625 0.375 0.75 +0.625 0.375 0.7812 +0.625 0.375 0.8125 +0.625 0.375 0.8438 +0.625 0.375 0.875 +0.625 0.375 0.9062 +0.625 0.375 0.9375 +0.625 0.375 0.9688 +0.625 0.375 1 +0.625 0.4062 0 +0.625 0.4062 0.03125 +0.625 0.4062 0.0625 +0.625 0.4062 0.09375 +0.625 0.4062 0.125 +0.625 0.4062 0.1562 +0.625 0.4062 0.1875 +0.625 0.4062 0.2188 +0.625 0.4062 0.25 +0.625 0.4062 0.2812 +0.625 0.4062 0.3125 +0.625 0.4062 0.3438 +0.625 0.4062 0.375 +0.625 0.4062 0.4062 +0.625 0.4062 0.4375 +0.625 0.4062 0.4688 +0.625 0.4062 0.5 +0.625 0.4062 0.5312 +0.625 0.4062 0.5625 +0.625 0.4062 0.5938 +0.625 0.4062 0.625 +0.625 0.4062 0.6562 +0.625 0.4062 0.6875 +0.625 0.4062 0.7188 +0.625 0.4062 0.75 +0.625 0.4062 0.7812 +0.625 0.4062 0.8125 +0.625 0.4062 0.8438 +0.625 0.4062 0.875 +0.625 0.4062 0.9062 +0.625 0.4062 0.9375 +0.625 0.4062 0.9688 +0.625 0.4062 1 +0.625 0.4375 0 +0.625 0.4375 0.03125 +0.625 0.4375 0.0625 +0.625 0.4375 0.09375 +0.625 0.4375 0.125 +0.625 0.4375 0.1562 +0.625 0.4375 0.1875 +0.625 0.4375 0.2188 +0.625 0.4375 0.25 +0.625 0.4375 0.2812 +0.625 0.4375 0.3125 +0.625 0.4375 0.3438 +0.625 0.4375 0.375 +0.625 0.4375 0.4062 +0.625 0.4375 0.4375 +0.625 0.4375 0.4688 +0.625 0.4375 0.5 +0.625 0.4375 0.5312 +0.625 0.4375 0.5625 +0.625 0.4375 0.5938 +0.625 0.4375 0.625 +0.625 0.4375 0.6562 +0.625 0.4375 0.6875 +0.625 0.4375 0.7188 +0.625 0.4375 0.75 +0.625 0.4375 0.7812 +0.625 0.4375 0.8125 +0.625 0.4375 0.8438 +0.625 0.4375 0.875 +0.625 0.4375 0.9062 +0.625 0.4375 0.9375 +0.625 0.4375 0.9688 +0.625 0.4375 1 +0.625 0.4688 0 +0.625 0.4688 0.03125 +0.625 0.4688 0.0625 +0.625 0.4688 0.09375 +0.625 0.4688 0.125 +0.625 0.4688 0.1562 +0.625 0.4688 0.1875 +0.625 0.4688 0.2188 +0.625 0.4688 0.25 +0.625 0.4688 0.2812 +0.625 0.4688 0.3125 +0.625 0.4688 0.3438 +0.625 0.4688 0.375 +0.625 0.4688 0.4062 +0.625 0.4688 0.4375 +0.625 0.4688 0.4688 +0.625 0.4688 0.5 +0.625 0.4688 0.5312 +0.625 0.4688 0.5625 +0.625 0.4688 0.5938 +0.625 0.4688 0.625 +0.625 0.4688 0.6562 +0.625 0.4688 0.6875 +0.625 0.4688 0.7188 +0.625 0.4688 0.75 +0.625 0.4688 0.7812 +0.625 0.4688 0.8125 +0.625 0.4688 0.8438 +0.625 0.4688 0.875 +0.625 0.4688 0.9062 +0.625 0.4688 0.9375 +0.625 0.4688 0.9688 +0.625 0.4688 1 +0.625 0.5 0 +0.625 0.5 0.03125 +0.625 0.5 0.0625 +0.625 0.5 0.09375 +0.625 0.5 0.125 +0.625 0.5 0.1562 +0.625 0.5 0.1875 +0.625 0.5 0.2188 +0.625 0.5 0.25 +0.625 0.5 0.2812 +0.625 0.5 0.3125 +0.625 0.5 0.3438 +0.625 0.5 0.375 +0.625 0.5 0.4062 +0.625 0.5 0.4375 +0.625 0.5 0.4688 +0.625 0.5 0.5 +0.625 0.5 0.5312 +0.625 0.5 0.5625 +0.625 0.5 0.5938 +0.625 0.5 0.625 +0.625 0.5 0.6562 +0.625 0.5 0.6875 +0.625 0.5 0.7188 +0.625 0.5 0.75 +0.625 0.5 0.7812 +0.625 0.5 0.8125 +0.625 0.5 0.8438 +0.625 0.5 0.875 +0.625 0.5 0.9062 +0.625 0.5 0.9375 +0.625 0.5 0.9688 +0.625 0.5 1 +0.625 0.5312 0 +0.625 0.5312 0.03125 +0.625 0.5312 0.0625 +0.625 0.5312 0.09375 +0.625 0.5312 0.125 +0.625 0.5312 0.1562 +0.625 0.5312 0.1875 +0.625 0.5312 0.2188 +0.625 0.5312 0.25 +0.625 0.5312 0.2812 +0.625 0.5312 0.3125 +0.625 0.5312 0.3438 +0.625 0.5312 0.375 +0.625 0.5312 0.4062 +0.625 0.5312 0.4375 +0.625 0.5312 0.4688 +0.625 0.5312 0.5 +0.625 0.5312 0.5312 +0.625 0.5312 0.5625 +0.625 0.5312 0.5938 +0.625 0.5312 0.625 +0.625 0.5312 0.6562 +0.625 0.5312 0.6875 +0.625 0.5312 0.7188 +0.625 0.5312 0.75 +0.625 0.5312 0.7812 +0.625 0.5312 0.8125 +0.625 0.5312 0.8438 +0.625 0.5312 0.875 +0.625 0.5312 0.9062 +0.625 0.5312 0.9375 +0.625 0.5312 0.9688 +0.625 0.5312 1 +0.625 0.5625 0 +0.625 0.5625 0.03125 +0.625 0.5625 0.0625 +0.625 0.5625 0.09375 +0.625 0.5625 0.125 +0.625 0.5625 0.1562 +0.625 0.5625 0.1875 +0.625 0.5625 0.2188 +0.625 0.5625 0.25 +0.625 0.5625 0.2812 +0.625 0.5625 0.3125 +0.625 0.5625 0.3438 +0.625 0.5625 0.375 +0.625 0.5625 0.4062 +0.625 0.5625 0.4375 +0.625 0.5625 0.4688 +0.625 0.5625 0.5 +0.625 0.5625 0.5312 +0.625 0.5625 0.5625 +0.625 0.5625 0.5938 +0.625 0.5625 0.625 +0.625 0.5625 0.6562 +0.625 0.5625 0.6875 +0.625 0.5625 0.7188 +0.625 0.5625 0.75 +0.625 0.5625 0.7812 +0.625 0.5625 0.8125 +0.625 0.5625 0.8438 +0.625 0.5625 0.875 +0.625 0.5625 0.9062 +0.625 0.5625 0.9375 +0.625 0.5625 0.9688 +0.625 0.5625 1 +0.625 0.5938 0 +0.625 0.5938 0.03125 +0.625 0.5938 0.0625 +0.625 0.5938 0.09375 +0.625 0.5938 0.125 +0.625 0.5938 0.1562 +0.625 0.5938 0.1875 +0.625 0.5938 0.2188 +0.625 0.5938 0.25 +0.625 0.5938 0.2812 +0.625 0.5938 0.3125 +0.625 0.5938 0.3438 +0.625 0.5938 0.375 +0.625 0.5938 0.4062 +0.625 0.5938 0.4375 +0.625 0.5938 0.4688 +0.625 0.5938 0.5 +0.625 0.5938 0.5312 +0.625 0.5938 0.5625 +0.625 0.5938 0.5938 +0.625 0.5938 0.625 +0.625 0.5938 0.6562 +0.625 0.5938 0.6875 +0.625 0.5938 0.7188 +0.625 0.5938 0.75 +0.625 0.5938 0.7812 +0.625 0.5938 0.8125 +0.625 0.5938 0.8438 +0.625 0.5938 0.875 +0.625 0.5938 0.9062 +0.625 0.5938 0.9375 +0.625 0.5938 0.9688 +0.625 0.5938 1 +0.625 0.625 0 +0.625 0.625 0.03125 +0.625 0.625 0.0625 +0.625 0.625 0.09375 +0.625 0.625 0.125 +0.625 0.625 0.1562 +0.625 0.625 0.1875 +0.625 0.625 0.2188 +0.625 0.625 0.25 +0.625 0.625 0.2812 +0.625 0.625 0.3125 +0.625 0.625 0.3438 +0.625 0.625 0.375 +0.625 0.625 0.4062 +0.625 0.625 0.4375 +0.625 0.625 0.4688 +0.625 0.625 0.5 +0.625 0.625 0.5312 +0.625 0.625 0.5625 +0.625 0.625 0.5938 +0.625 0.625 0.625 +0.625 0.625 0.6562 +0.625 0.625 0.6875 +0.625 0.625 0.7188 +0.625 0.625 0.75 +0.625 0.625 0.7812 +0.625 0.625 0.8125 +0.625 0.625 0.8438 +0.625 0.625 0.875 +0.625 0.625 0.9062 +0.625 0.625 0.9375 +0.625 0.625 0.9688 +0.625 0.625 1 +0.625 0.6562 0 +0.625 0.6562 0.03125 +0.625 0.6562 0.0625 +0.625 0.6562 0.09375 +0.625 0.6562 0.125 +0.625 0.6562 0.1562 +0.625 0.6562 0.1875 +0.625 0.6562 0.2188 +0.625 0.6562 0.25 +0.625 0.6562 0.2812 +0.625 0.6562 0.3125 +0.625 0.6562 0.3438 +0.625 0.6562 0.375 +0.625 0.6562 0.4062 +0.625 0.6562 0.4375 +0.625 0.6562 0.4688 +0.625 0.6562 0.5 +0.625 0.6562 0.5312 +0.625 0.6562 0.5625 +0.625 0.6562 0.5938 +0.625 0.6562 0.625 +0.625 0.6562 0.6562 +0.625 0.6562 0.6875 +0.625 0.6562 0.7188 +0.625 0.6562 0.75 +0.625 0.6562 0.7812 +0.625 0.6562 0.8125 +0.625 0.6562 0.8438 +0.625 0.6562 0.875 +0.625 0.6562 0.9062 +0.625 0.6562 0.9375 +0.625 0.6562 0.9688 +0.625 0.6562 1 +0.625 0.6875 0 +0.625 0.6875 0.03125 +0.625 0.6875 0.0625 +0.625 0.6875 0.09375 +0.625 0.6875 0.125 +0.625 0.6875 0.1562 +0.625 0.6875 0.1875 +0.625 0.6875 0.2188 +0.625 0.6875 0.25 +0.625 0.6875 0.2812 +0.625 0.6875 0.3125 +0.625 0.6875 0.3438 +0.625 0.6875 0.375 +0.625 0.6875 0.4062 +0.625 0.6875 0.4375 +0.625 0.6875 0.4688 +0.625 0.6875 0.5 +0.625 0.6875 0.5312 +0.625 0.6875 0.5625 +0.625 0.6875 0.5938 +0.625 0.6875 0.625 +0.625 0.6875 0.6562 +0.625 0.6875 0.6875 +0.625 0.6875 0.7188 +0.625 0.6875 0.75 +0.625 0.6875 0.7812 +0.625 0.6875 0.8125 +0.625 0.6875 0.8438 +0.625 0.6875 0.875 +0.625 0.6875 0.9062 +0.625 0.6875 0.9375 +0.625 0.6875 0.9688 +0.625 0.6875 1 +0.625 0.7188 0 +0.625 0.7188 0.03125 +0.625 0.7188 0.0625 +0.625 0.7188 0.09375 +0.625 0.7188 0.125 +0.625 0.7188 0.1562 +0.625 0.7188 0.1875 +0.625 0.7188 0.2188 +0.625 0.7188 0.25 +0.625 0.7188 0.2812 +0.625 0.7188 0.3125 +0.625 0.7188 0.3438 +0.625 0.7188 0.375 +0.625 0.7188 0.4062 +0.625 0.7188 0.4375 +0.625 0.7188 0.4688 +0.625 0.7188 0.5 +0.625 0.7188 0.5312 +0.625 0.7188 0.5625 +0.625 0.7188 0.5938 +0.625 0.7188 0.625 +0.625 0.7188 0.6562 +0.625 0.7188 0.6875 +0.625 0.7188 0.7188 +0.625 0.7188 0.75 +0.625 0.7188 0.7812 +0.625 0.7188 0.8125 +0.625 0.7188 0.8438 +0.625 0.7188 0.875 +0.625 0.7188 0.9062 +0.625 0.7188 0.9375 +0.625 0.7188 0.9688 +0.625 0.7188 1 +0.625 0.75 0 +0.625 0.75 0.03125 +0.625 0.75 0.0625 +0.625 0.75 0.09375 +0.625 0.75 0.125 +0.625 0.75 0.1562 +0.625 0.75 0.1875 +0.625 0.75 0.2188 +0.625 0.75 0.25 +0.625 0.75 0.2812 +0.625 0.75 0.3125 +0.625 0.75 0.3438 +0.625 0.75 0.375 +0.625 0.75 0.4062 +0.625 0.75 0.4375 +0.625 0.75 0.4688 +0.625 0.75 0.5 +0.625 0.75 0.5312 +0.625 0.75 0.5625 +0.625 0.75 0.5938 +0.625 0.75 0.625 +0.625 0.75 0.6562 +0.625 0.75 0.6875 +0.625 0.75 0.7188 +0.625 0.75 0.75 +0.625 0.75 0.7812 +0.625 0.75 0.8125 +0.625 0.75 0.8438 +0.625 0.75 0.875 +0.625 0.75 0.9062 +0.625 0.75 0.9375 +0.625 0.75 0.9688 +0.625 0.75 1 +0.625 0.7812 0 +0.625 0.7812 0.03125 +0.625 0.7812 0.0625 +0.625 0.7812 0.09375 +0.625 0.7812 0.125 +0.625 0.7812 0.1562 +0.625 0.7812 0.1875 +0.625 0.7812 0.2188 +0.625 0.7812 0.25 +0.625 0.7812 0.2812 +0.625 0.7812 0.3125 +0.625 0.7812 0.3438 +0.625 0.7812 0.375 +0.625 0.7812 0.4062 +0.625 0.7812 0.4375 +0.625 0.7812 0.4688 +0.625 0.7812 0.5 +0.625 0.7812 0.5312 +0.625 0.7812 0.5625 +0.625 0.7812 0.5938 +0.625 0.7812 0.625 +0.625 0.7812 0.6562 +0.625 0.7812 0.6875 +0.625 0.7812 0.7188 +0.625 0.7812 0.75 +0.625 0.7812 0.7812 +0.625 0.7812 0.8125 +0.625 0.7812 0.8438 +0.625 0.7812 0.875 +0.625 0.7812 0.9062 +0.625 0.7812 0.9375 +0.625 0.7812 0.9688 +0.625 0.7812 1 +0.625 0.8125 0 +0.625 0.8125 0.03125 +0.625 0.8125 0.0625 +0.625 0.8125 0.09375 +0.625 0.8125 0.125 +0.625 0.8125 0.1562 +0.625 0.8125 0.1875 +0.625 0.8125 0.2188 +0.625 0.8125 0.25 +0.625 0.8125 0.2812 +0.625 0.8125 0.3125 +0.625 0.8125 0.3438 +0.625 0.8125 0.375 +0.625 0.8125 0.4062 +0.625 0.8125 0.4375 +0.625 0.8125 0.4688 +0.625 0.8125 0.5 +0.625 0.8125 0.5312 +0.625 0.8125 0.5625 +0.625 0.8125 0.5938 +0.625 0.8125 0.625 +0.625 0.8125 0.6562 +0.625 0.8125 0.6875 +0.625 0.8125 0.7188 +0.625 0.8125 0.75 +0.625 0.8125 0.7812 +0.625 0.8125 0.8125 +0.625 0.8125 0.8438 +0.625 0.8125 0.875 +0.625 0.8125 0.9062 +0.625 0.8125 0.9375 +0.625 0.8125 0.9688 +0.625 0.8125 1 +0.625 0.8438 0 +0.625 0.8438 0.03125 +0.625 0.8438 0.0625 +0.625 0.8438 0.09375 +0.625 0.8438 0.125 +0.625 0.8438 0.1562 +0.625 0.8438 0.1875 +0.625 0.8438 0.2188 +0.625 0.8438 0.25 +0.625 0.8438 0.2812 +0.625 0.8438 0.3125 +0.625 0.8438 0.3438 +0.625 0.8438 0.375 +0.625 0.8438 0.4062 +0.625 0.8438 0.4375 +0.625 0.8438 0.4688 +0.625 0.8438 0.5 +0.625 0.8438 0.5312 +0.625 0.8438 0.5625 +0.625 0.8438 0.5938 +0.625 0.8438 0.625 +0.625 0.8438 0.6562 +0.625 0.8438 0.6875 +0.625 0.8438 0.7188 +0.625 0.8438 0.75 +0.625 0.8438 0.7812 +0.625 0.8438 0.8125 +0.625 0.8438 0.8438 +0.625 0.8438 0.875 +0.625 0.8438 0.9062 +0.625 0.8438 0.9375 +0.625 0.8438 0.9688 +0.625 0.8438 1 +0.625 0.875 0 +0.625 0.875 0.03125 +0.625 0.875 0.0625 +0.625 0.875 0.09375 +0.625 0.875 0.125 +0.625 0.875 0.1562 +0.625 0.875 0.1875 +0.625 0.875 0.2188 +0.625 0.875 0.25 +0.625 0.875 0.2812 +0.625 0.875 0.3125 +0.625 0.875 0.3438 +0.625 0.875 0.375 +0.625 0.875 0.4062 +0.625 0.875 0.4375 +0.625 0.875 0.4688 +0.625 0.875 0.5 +0.625 0.875 0.5312 +0.625 0.875 0.5625 +0.625 0.875 0.5938 +0.625 0.875 0.625 +0.625 0.875 0.6562 +0.625 0.875 0.6875 +0.625 0.875 0.7188 +0.625 0.875 0.75 +0.625 0.875 0.7812 +0.625 0.875 0.8125 +0.625 0.875 0.8438 +0.625 0.875 0.875 +0.625 0.875 0.9062 +0.625 0.875 0.9375 +0.625 0.875 0.9688 +0.625 0.875 1 +0.625 0.9062 0 +0.625 0.9062 0.03125 +0.625 0.9062 0.0625 +0.625 0.9062 0.09375 +0.625 0.9062 0.125 +0.625 0.9062 0.1562 +0.625 0.9062 0.1875 +0.625 0.9062 0.2188 +0.625 0.9062 0.25 +0.625 0.9062 0.2812 +0.625 0.9062 0.3125 +0.625 0.9062 0.3438 +0.625 0.9062 0.375 +0.625 0.9062 0.4062 +0.625 0.9062 0.4375 +0.625 0.9062 0.4688 +0.625 0.9062 0.5 +0.625 0.9062 0.5312 +0.625 0.9062 0.5625 +0.625 0.9062 0.5938 +0.625 0.9062 0.625 +0.625 0.9062 0.6562 +0.625 0.9062 0.6875 +0.625 0.9062 0.7188 +0.625 0.9062 0.75 +0.625 0.9062 0.7812 +0.625 0.9062 0.8125 +0.625 0.9062 0.8438 +0.625 0.9062 0.875 +0.625 0.9062 0.9062 +0.625 0.9062 0.9375 +0.625 0.9062 0.9688 +0.625 0.9062 1 +0.625 0.9375 0 +0.625 0.9375 0.03125 +0.625 0.9375 0.0625 +0.625 0.9375 0.09375 +0.625 0.9375 0.125 +0.625 0.9375 0.1562 +0.625 0.9375 0.1875 +0.625 0.9375 0.2188 +0.625 0.9375 0.25 +0.625 0.9375 0.2812 +0.625 0.9375 0.3125 +0.625 0.9375 0.3438 +0.625 0.9375 0.375 +0.625 0.9375 0.4062 +0.625 0.9375 0.4375 +0.625 0.9375 0.4688 +0.625 0.9375 0.5 +0.625 0.9375 0.5312 +0.625 0.9375 0.5625 +0.625 0.9375 0.5938 +0.625 0.9375 0.625 +0.625 0.9375 0.6562 +0.625 0.9375 0.6875 +0.625 0.9375 0.7188 +0.625 0.9375 0.75 +0.625 0.9375 0.7812 +0.625 0.9375 0.8125 +0.625 0.9375 0.8438 +0.625 0.9375 0.875 +0.625 0.9375 0.9062 +0.625 0.9375 0.9375 +0.625 0.9375 0.9688 +0.625 0.9375 1 +0.625 0.9688 0 +0.625 0.9688 0.03125 +0.625 0.9688 0.0625 +0.625 0.9688 0.09375 +0.625 0.9688 0.125 +0.625 0.9688 0.1562 +0.625 0.9688 0.1875 +0.625 0.9688 0.2188 +0.625 0.9688 0.25 +0.625 0.9688 0.2812 +0.625 0.9688 0.3125 +0.625 0.9688 0.3438 +0.625 0.9688 0.375 +0.625 0.9688 0.4062 +0.625 0.9688 0.4375 +0.625 0.9688 0.4688 +0.625 0.9688 0.5 +0.625 0.9688 0.5312 +0.625 0.9688 0.5625 +0.625 0.9688 0.5938 +0.625 0.9688 0.625 +0.625 0.9688 0.6562 +0.625 0.9688 0.6875 +0.625 0.9688 0.7188 +0.625 0.9688 0.75 +0.625 0.9688 0.7812 +0.625 0.9688 0.8125 +0.625 0.9688 0.8438 +0.625 0.9688 0.875 +0.625 0.9688 0.9062 +0.625 0.9688 0.9375 +0.625 0.9688 0.9688 +0.625 0.9688 1 +0.625 1 0 +0.625 1 0.03125 +0.625 1 0.0625 +0.625 1 0.09375 +0.625 1 0.125 +0.625 1 0.1562 +0.625 1 0.1875 +0.625 1 0.2188 +0.625 1 0.25 +0.625 1 0.2812 +0.625 1 0.3125 +0.625 1 0.3438 +0.625 1 0.375 +0.625 1 0.4062 +0.625 1 0.4375 +0.625 1 0.4688 +0.625 1 0.5 +0.625 1 0.5312 +0.625 1 0.5625 +0.625 1 0.5938 +0.625 1 0.625 +0.625 1 0.6562 +0.625 1 0.6875 +0.625 1 0.7188 +0.625 1 0.75 +0.625 1 0.7812 +0.625 1 0.8125 +0.625 1 0.8438 +0.625 1 0.875 +0.625 1 0.9062 +0.625 1 0.9375 +0.625 1 0.9688 +0.625 1 1 +0.6562 0 0 +0.6562 0 0.03125 +0.6562 0 0.0625 +0.6562 0 0.09375 +0.6562 0 0.125 +0.6562 0 0.1562 +0.6562 0 0.1875 +0.6562 0 0.2188 +0.6562 0 0.25 +0.6562 0 0.2812 +0.6562 0 0.3125 +0.6562 0 0.3438 +0.6562 0 0.375 +0.6562 0 0.4062 +0.6562 0 0.4375 +0.6562 0 0.4688 +0.6562 0 0.5 +0.6562 0 0.5312 +0.6562 0 0.5625 +0.6562 0 0.5938 +0.6562 0 0.625 +0.6562 0 0.6562 +0.6562 0 0.6875 +0.6562 0 0.7188 +0.6562 0 0.75 +0.6562 0 0.7812 +0.6562 0 0.8125 +0.6562 0 0.8438 +0.6562 0 0.875 +0.6562 0 0.9062 +0.6562 0 0.9375 +0.6562 0 0.9688 +0.6562 0 1 +0.6562 0.03125 0 +0.6562 0.03125 0.03125 +0.6562 0.03125 0.0625 +0.6562 0.03125 0.09375 +0.6562 0.03125 0.125 +0.6562 0.03125 0.1562 +0.6562 0.03125 0.1875 +0.6562 0.03125 0.2188 +0.6562 0.03125 0.25 +0.6562 0.03125 0.2812 +0.6562 0.03125 0.3125 +0.6562 0.03125 0.3438 +0.6562 0.03125 0.375 +0.6562 0.03125 0.4062 +0.6562 0.03125 0.4375 +0.6562 0.03125 0.4688 +0.6562 0.03125 0.5 +0.6562 0.03125 0.5312 +0.6562 0.03125 0.5625 +0.6562 0.03125 0.5938 +0.6562 0.03125 0.625 +0.6562 0.03125 0.6562 +0.6562 0.03125 0.6875 +0.6562 0.03125 0.7188 +0.6562 0.03125 0.75 +0.6562 0.03125 0.7812 +0.6562 0.03125 0.8125 +0.6562 0.03125 0.8438 +0.6562 0.03125 0.875 +0.6562 0.03125 0.9062 +0.6562 0.03125 0.9375 +0.6562 0.03125 0.9688 +0.6562 0.03125 1 +0.6562 0.0625 0 +0.6562 0.0625 0.03125 +0.6562 0.0625 0.0625 +0.6562 0.0625 0.09375 +0.6562 0.0625 0.125 +0.6562 0.0625 0.1562 +0.6562 0.0625 0.1875 +0.6562 0.0625 0.2188 +0.6562 0.0625 0.25 +0.6562 0.0625 0.2812 +0.6562 0.0625 0.3125 +0.6562 0.0625 0.3438 +0.6562 0.0625 0.375 +0.6562 0.0625 0.4062 +0.6562 0.0625 0.4375 +0.6562 0.0625 0.4688 +0.6562 0.0625 0.5 +0.6562 0.0625 0.5312 +0.6562 0.0625 0.5625 +0.6562 0.0625 0.5938 +0.6562 0.0625 0.625 +0.6562 0.0625 0.6562 +0.6562 0.0625 0.6875 +0.6562 0.0625 0.7188 +0.6562 0.0625 0.75 +0.6562 0.0625 0.7812 +0.6562 0.0625 0.8125 +0.6562 0.0625 0.8438 +0.6562 0.0625 0.875 +0.6562 0.0625 0.9062 +0.6562 0.0625 0.9375 +0.6562 0.0625 0.9688 +0.6562 0.0625 1 +0.6562 0.09375 0 +0.6562 0.09375 0.03125 +0.6562 0.09375 0.0625 +0.6562 0.09375 0.09375 +0.6562 0.09375 0.125 +0.6562 0.09375 0.1562 +0.6562 0.09375 0.1875 +0.6562 0.09375 0.2188 +0.6562 0.09375 0.25 +0.6562 0.09375 0.2812 +0.6562 0.09375 0.3125 +0.6562 0.09375 0.3438 +0.6562 0.09375 0.375 +0.6562 0.09375 0.4062 +0.6562 0.09375 0.4375 +0.6562 0.09375 0.4688 +0.6562 0.09375 0.5 +0.6562 0.09375 0.5312 +0.6562 0.09375 0.5625 +0.6562 0.09375 0.5938 +0.6562 0.09375 0.625 +0.6562 0.09375 0.6562 +0.6562 0.09375 0.6875 +0.6562 0.09375 0.7188 +0.6562 0.09375 0.75 +0.6562 0.09375 0.7812 +0.6562 0.09375 0.8125 +0.6562 0.09375 0.8438 +0.6562 0.09375 0.875 +0.6562 0.09375 0.9062 +0.6562 0.09375 0.9375 +0.6562 0.09375 0.9688 +0.6562 0.09375 1 +0.6562 0.125 0 +0.6562 0.125 0.03125 +0.6562 0.125 0.0625 +0.6562 0.125 0.09375 +0.6562 0.125 0.125 +0.6562 0.125 0.1562 +0.6562 0.125 0.1875 +0.6562 0.125 0.2188 +0.6562 0.125 0.25 +0.6562 0.125 0.2812 +0.6562 0.125 0.3125 +0.6562 0.125 0.3438 +0.6562 0.125 0.375 +0.6562 0.125 0.4062 +0.6562 0.125 0.4375 +0.6562 0.125 0.4688 +0.6562 0.125 0.5 +0.6562 0.125 0.5312 +0.6562 0.125 0.5625 +0.6562 0.125 0.5938 +0.6562 0.125 0.625 +0.6562 0.125 0.6562 +0.6562 0.125 0.6875 +0.6562 0.125 0.7188 +0.6562 0.125 0.75 +0.6562 0.125 0.7812 +0.6562 0.125 0.8125 +0.6562 0.125 0.8438 +0.6562 0.125 0.875 +0.6562 0.125 0.9062 +0.6562 0.125 0.9375 +0.6562 0.125 0.9688 +0.6562 0.125 1 +0.6562 0.1562 0 +0.6562 0.1562 0.03125 +0.6562 0.1562 0.0625 +0.6562 0.1562 0.09375 +0.6562 0.1562 0.125 +0.6562 0.1562 0.1562 +0.6562 0.1562 0.1875 +0.6562 0.1562 0.2188 +0.6562 0.1562 0.25 +0.6562 0.1562 0.2812 +0.6562 0.1562 0.3125 +0.6562 0.1562 0.3438 +0.6562 0.1562 0.375 +0.6562 0.1562 0.4062 +0.6562 0.1562 0.4375 +0.6562 0.1562 0.4688 +0.6562 0.1562 0.5 +0.6562 0.1562 0.5312 +0.6562 0.1562 0.5625 +0.6562 0.1562 0.5938 +0.6562 0.1562 0.625 +0.6562 0.1562 0.6562 +0.6562 0.1562 0.6875 +0.6562 0.1562 0.7188 +0.6562 0.1562 0.75 +0.6562 0.1562 0.7812 +0.6562 0.1562 0.8125 +0.6562 0.1562 0.8438 +0.6562 0.1562 0.875 +0.6562 0.1562 0.9062 +0.6562 0.1562 0.9375 +0.6562 0.1562 0.9688 +0.6562 0.1562 1 +0.6562 0.1875 0 +0.6562 0.1875 0.03125 +0.6562 0.1875 0.0625 +0.6562 0.1875 0.09375 +0.6562 0.1875 0.125 +0.6562 0.1875 0.1562 +0.6562 0.1875 0.1875 +0.6562 0.1875 0.2188 +0.6562 0.1875 0.25 +0.6562 0.1875 0.2812 +0.6562 0.1875 0.3125 +0.6562 0.1875 0.3438 +0.6562 0.1875 0.375 +0.6562 0.1875 0.4062 +0.6562 0.1875 0.4375 +0.6562 0.1875 0.4688 +0.6562 0.1875 0.5 +0.6562 0.1875 0.5312 +0.6562 0.1875 0.5625 +0.6562 0.1875 0.5938 +0.6562 0.1875 0.625 +0.6562 0.1875 0.6562 +0.6562 0.1875 0.6875 +0.6562 0.1875 0.7188 +0.6562 0.1875 0.75 +0.6562 0.1875 0.7812 +0.6562 0.1875 0.8125 +0.6562 0.1875 0.8438 +0.6562 0.1875 0.875 +0.6562 0.1875 0.9062 +0.6562 0.1875 0.9375 +0.6562 0.1875 0.9688 +0.6562 0.1875 1 +0.6562 0.2188 0 +0.6562 0.2188 0.03125 +0.6562 0.2188 0.0625 +0.6562 0.2188 0.09375 +0.6562 0.2188 0.125 +0.6562 0.2188 0.1562 +0.6562 0.2188 0.1875 +0.6562 0.2188 0.2188 +0.6562 0.2188 0.25 +0.6562 0.2188 0.2812 +0.6562 0.2188 0.3125 +0.6562 0.2188 0.3438 +0.6562 0.2188 0.375 +0.6562 0.2188 0.4062 +0.6562 0.2188 0.4375 +0.6562 0.2188 0.4688 +0.6562 0.2188 0.5 +0.6562 0.2188 0.5312 +0.6562 0.2188 0.5625 +0.6562 0.2188 0.5938 +0.6562 0.2188 0.625 +0.6562 0.2188 0.6562 +0.6562 0.2188 0.6875 +0.6562 0.2188 0.7188 +0.6562 0.2188 0.75 +0.6562 0.2188 0.7812 +0.6562 0.2188 0.8125 +0.6562 0.2188 0.8438 +0.6562 0.2188 0.875 +0.6562 0.2188 0.9062 +0.6562 0.2188 0.9375 +0.6562 0.2188 0.9688 +0.6562 0.2188 1 +0.6562 0.25 0 +0.6562 0.25 0.03125 +0.6562 0.25 0.0625 +0.6562 0.25 0.09375 +0.6562 0.25 0.125 +0.6562 0.25 0.1562 +0.6562 0.25 0.1875 +0.6562 0.25 0.2188 +0.6562 0.25 0.25 +0.6562 0.25 0.2812 +0.6562 0.25 0.3125 +0.6562 0.25 0.3438 +0.6562 0.25 0.375 +0.6562 0.25 0.4062 +0.6562 0.25 0.4375 +0.6562 0.25 0.4688 +0.6562 0.25 0.5 +0.6562 0.25 0.5312 +0.6562 0.25 0.5625 +0.6562 0.25 0.5938 +0.6562 0.25 0.625 +0.6562 0.25 0.6562 +0.6562 0.25 0.6875 +0.6562 0.25 0.7188 +0.6562 0.25 0.75 +0.6562 0.25 0.7812 +0.6562 0.25 0.8125 +0.6562 0.25 0.8438 +0.6562 0.25 0.875 +0.6562 0.25 0.9062 +0.6562 0.25 0.9375 +0.6562 0.25 0.9688 +0.6562 0.25 1 +0.6562 0.2812 0 +0.6562 0.2812 0.03125 +0.6562 0.2812 0.0625 +0.6562 0.2812 0.09375 +0.6562 0.2812 0.125 +0.6562 0.2812 0.1562 +0.6562 0.2812 0.1875 +0.6562 0.2812 0.2188 +0.6562 0.2812 0.25 +0.6562 0.2812 0.2812 +0.6562 0.2812 0.3125 +0.6562 0.2812 0.3438 +0.6562 0.2812 0.375 +0.6562 0.2812 0.4062 +0.6562 0.2812 0.4375 +0.6562 0.2812 0.4688 +0.6562 0.2812 0.5 +0.6562 0.2812 0.5312 +0.6562 0.2812 0.5625 +0.6562 0.2812 0.5938 +0.6562 0.2812 0.625 +0.6562 0.2812 0.6562 +0.6562 0.2812 0.6875 +0.6562 0.2812 0.7188 +0.6562 0.2812 0.75 +0.6562 0.2812 0.7812 +0.6562 0.2812 0.8125 +0.6562 0.2812 0.8438 +0.6562 0.2812 0.875 +0.6562 0.2812 0.9062 +0.6562 0.2812 0.9375 +0.6562 0.2812 0.9688 +0.6562 0.2812 1 +0.6562 0.3125 0 +0.6562 0.3125 0.03125 +0.6562 0.3125 0.0625 +0.6562 0.3125 0.09375 +0.6562 0.3125 0.125 +0.6562 0.3125 0.1562 +0.6562 0.3125 0.1875 +0.6562 0.3125 0.2188 +0.6562 0.3125 0.25 +0.6562 0.3125 0.2812 +0.6562 0.3125 0.3125 +0.6562 0.3125 0.3438 +0.6562 0.3125 0.375 +0.6562 0.3125 0.4062 +0.6562 0.3125 0.4375 +0.6562 0.3125 0.4688 +0.6562 0.3125 0.5 +0.6562 0.3125 0.5312 +0.6562 0.3125 0.5625 +0.6562 0.3125 0.5938 +0.6562 0.3125 0.625 +0.6562 0.3125 0.6562 +0.6562 0.3125 0.6875 +0.6562 0.3125 0.7188 +0.6562 0.3125 0.75 +0.6562 0.3125 0.7812 +0.6562 0.3125 0.8125 +0.6562 0.3125 0.8438 +0.6562 0.3125 0.875 +0.6562 0.3125 0.9062 +0.6562 0.3125 0.9375 +0.6562 0.3125 0.9688 +0.6562 0.3125 1 +0.6562 0.3438 0 +0.6562 0.3438 0.03125 +0.6562 0.3438 0.0625 +0.6562 0.3438 0.09375 +0.6562 0.3438 0.125 +0.6562 0.3438 0.1562 +0.6562 0.3438 0.1875 +0.6562 0.3438 0.2188 +0.6562 0.3438 0.25 +0.6562 0.3438 0.2812 +0.6562 0.3438 0.3125 +0.6562 0.3438 0.3438 +0.6562 0.3438 0.375 +0.6562 0.3438 0.4062 +0.6562 0.3438 0.4375 +0.6562 0.3438 0.4688 +0.6562 0.3438 0.5 +0.6562 0.3438 0.5312 +0.6562 0.3438 0.5625 +0.6562 0.3438 0.5938 +0.6562 0.3438 0.625 +0.6562 0.3438 0.6562 +0.6562 0.3438 0.6875 +0.6562 0.3438 0.7188 +0.6562 0.3438 0.75 +0.6562 0.3438 0.7812 +0.6562 0.3438 0.8125 +0.6562 0.3438 0.8438 +0.6562 0.3438 0.875 +0.6562 0.3438 0.9062 +0.6562 0.3438 0.9375 +0.6562 0.3438 0.9688 +0.6562 0.3438 1 +0.6562 0.375 0 +0.6562 0.375 0.03125 +0.6562 0.375 0.0625 +0.6562 0.375 0.09375 +0.6562 0.375 0.125 +0.6562 0.375 0.1562 +0.6562 0.375 0.1875 +0.6562 0.375 0.2188 +0.6562 0.375 0.25 +0.6562 0.375 0.2812 +0.6562 0.375 0.3125 +0.6562 0.375 0.3438 +0.6562 0.375 0.375 +0.6562 0.375 0.4062 +0.6562 0.375 0.4375 +0.6562 0.375 0.4688 +0.6562 0.375 0.5 +0.6562 0.375 0.5312 +0.6562 0.375 0.5625 +0.6562 0.375 0.5938 +0.6562 0.375 0.625 +0.6562 0.375 0.6562 +0.6562 0.375 0.6875 +0.6562 0.375 0.7188 +0.6562 0.375 0.75 +0.6562 0.375 0.7812 +0.6562 0.375 0.8125 +0.6562 0.375 0.8438 +0.6562 0.375 0.875 +0.6562 0.375 0.9062 +0.6562 0.375 0.9375 +0.6562 0.375 0.9688 +0.6562 0.375 1 +0.6562 0.4062 0 +0.6562 0.4062 0.03125 +0.6562 0.4062 0.0625 +0.6562 0.4062 0.09375 +0.6562 0.4062 0.125 +0.6562 0.4062 0.1562 +0.6562 0.4062 0.1875 +0.6562 0.4062 0.2188 +0.6562 0.4062 0.25 +0.6562 0.4062 0.2812 +0.6562 0.4062 0.3125 +0.6562 0.4062 0.3438 +0.6562 0.4062 0.375 +0.6562 0.4062 0.4062 +0.6562 0.4062 0.4375 +0.6562 0.4062 0.4688 +0.6562 0.4062 0.5 +0.6562 0.4062 0.5312 +0.6562 0.4062 0.5625 +0.6562 0.4062 0.5938 +0.6562 0.4062 0.625 +0.6562 0.4062 0.6562 +0.6562 0.4062 0.6875 +0.6562 0.4062 0.7188 +0.6562 0.4062 0.75 +0.6562 0.4062 0.7812 +0.6562 0.4062 0.8125 +0.6562 0.4062 0.8438 +0.6562 0.4062 0.875 +0.6562 0.4062 0.9062 +0.6562 0.4062 0.9375 +0.6562 0.4062 0.9688 +0.6562 0.4062 1 +0.6562 0.4375 0 +0.6562 0.4375 0.03125 +0.6562 0.4375 0.0625 +0.6562 0.4375 0.09375 +0.6562 0.4375 0.125 +0.6562 0.4375 0.1562 +0.6562 0.4375 0.1875 +0.6562 0.4375 0.2188 +0.6562 0.4375 0.25 +0.6562 0.4375 0.2812 +0.6562 0.4375 0.3125 +0.6562 0.4375 0.3438 +0.6562 0.4375 0.375 +0.6562 0.4375 0.4062 +0.6562 0.4375 0.4375 +0.6562 0.4375 0.4688 +0.6562 0.4375 0.5 +0.6562 0.4375 0.5312 +0.6562 0.4375 0.5625 +0.6562 0.4375 0.5938 +0.6562 0.4375 0.625 +0.6562 0.4375 0.6562 +0.6562 0.4375 0.6875 +0.6562 0.4375 0.7188 +0.6562 0.4375 0.75 +0.6562 0.4375 0.7812 +0.6562 0.4375 0.8125 +0.6562 0.4375 0.8438 +0.6562 0.4375 0.875 +0.6562 0.4375 0.9062 +0.6562 0.4375 0.9375 +0.6562 0.4375 0.9688 +0.6562 0.4375 1 +0.6562 0.4688 0 +0.6562 0.4688 0.03125 +0.6562 0.4688 0.0625 +0.6562 0.4688 0.09375 +0.6562 0.4688 0.125 +0.6562 0.4688 0.1562 +0.6562 0.4688 0.1875 +0.6562 0.4688 0.2188 +0.6562 0.4688 0.25 +0.6562 0.4688 0.2812 +0.6562 0.4688 0.3125 +0.6562 0.4688 0.3438 +0.6562 0.4688 0.375 +0.6562 0.4688 0.4062 +0.6562 0.4688 0.4375 +0.6562 0.4688 0.4688 +0.6562 0.4688 0.5 +0.6562 0.4688 0.5312 +0.6562 0.4688 0.5625 +0.6562 0.4688 0.5938 +0.6562 0.4688 0.625 +0.6562 0.4688 0.6562 +0.6562 0.4688 0.6875 +0.6562 0.4688 0.7188 +0.6562 0.4688 0.75 +0.6562 0.4688 0.7812 +0.6562 0.4688 0.8125 +0.6562 0.4688 0.8438 +0.6562 0.4688 0.875 +0.6562 0.4688 0.9062 +0.6562 0.4688 0.9375 +0.6562 0.4688 0.9688 +0.6562 0.4688 1 +0.6562 0.5 0 +0.6562 0.5 0.03125 +0.6562 0.5 0.0625 +0.6562 0.5 0.09375 +0.6562 0.5 0.125 +0.6562 0.5 0.1562 +0.6562 0.5 0.1875 +0.6562 0.5 0.2188 +0.6562 0.5 0.25 +0.6562 0.5 0.2812 +0.6562 0.5 0.3125 +0.6562 0.5 0.3438 +0.6562 0.5 0.375 +0.6562 0.5 0.4062 +0.6562 0.5 0.4375 +0.6562 0.5 0.4688 +0.6562 0.5 0.5 +0.6562 0.5 0.5312 +0.6562 0.5 0.5625 +0.6562 0.5 0.5938 +0.6562 0.5 0.625 +0.6562 0.5 0.6562 +0.6562 0.5 0.6875 +0.6562 0.5 0.7188 +0.6562 0.5 0.75 +0.6562 0.5 0.7812 +0.6562 0.5 0.8125 +0.6562 0.5 0.8438 +0.6562 0.5 0.875 +0.6562 0.5 0.9062 +0.6562 0.5 0.9375 +0.6562 0.5 0.9688 +0.6562 0.5 1 +0.6562 0.5312 0 +0.6562 0.5312 0.03125 +0.6562 0.5312 0.0625 +0.6562 0.5312 0.09375 +0.6562 0.5312 0.125 +0.6562 0.5312 0.1562 +0.6562 0.5312 0.1875 +0.6562 0.5312 0.2188 +0.6562 0.5312 0.25 +0.6562 0.5312 0.2812 +0.6562 0.5312 0.3125 +0.6562 0.5312 0.3438 +0.6562 0.5312 0.375 +0.6562 0.5312 0.4062 +0.6562 0.5312 0.4375 +0.6562 0.5312 0.4688 +0.6562 0.5312 0.5 +0.6562 0.5312 0.5312 +0.6562 0.5312 0.5625 +0.6562 0.5312 0.5938 +0.6562 0.5312 0.625 +0.6562 0.5312 0.6562 +0.6562 0.5312 0.6875 +0.6562 0.5312 0.7188 +0.6562 0.5312 0.75 +0.6562 0.5312 0.7812 +0.6562 0.5312 0.8125 +0.6562 0.5312 0.8438 +0.6562 0.5312 0.875 +0.6562 0.5312 0.9062 +0.6562 0.5312 0.9375 +0.6562 0.5312 0.9688 +0.6562 0.5312 1 +0.6562 0.5625 0 +0.6562 0.5625 0.03125 +0.6562 0.5625 0.0625 +0.6562 0.5625 0.09375 +0.6562 0.5625 0.125 +0.6562 0.5625 0.1562 +0.6562 0.5625 0.1875 +0.6562 0.5625 0.2188 +0.6562 0.5625 0.25 +0.6562 0.5625 0.2812 +0.6562 0.5625 0.3125 +0.6562 0.5625 0.3438 +0.6562 0.5625 0.375 +0.6562 0.5625 0.4062 +0.6562 0.5625 0.4375 +0.6562 0.5625 0.4688 +0.6562 0.5625 0.5 +0.6562 0.5625 0.5312 +0.6562 0.5625 0.5625 +0.6562 0.5625 0.5938 +0.6562 0.5625 0.625 +0.6562 0.5625 0.6562 +0.6562 0.5625 0.6875 +0.6562 0.5625 0.7188 +0.6562 0.5625 0.75 +0.6562 0.5625 0.7812 +0.6562 0.5625 0.8125 +0.6562 0.5625 0.8438 +0.6562 0.5625 0.875 +0.6562 0.5625 0.9062 +0.6562 0.5625 0.9375 +0.6562 0.5625 0.9688 +0.6562 0.5625 1 +0.6562 0.5938 0 +0.6562 0.5938 0.03125 +0.6562 0.5938 0.0625 +0.6562 0.5938 0.09375 +0.6562 0.5938 0.125 +0.6562 0.5938 0.1562 +0.6562 0.5938 0.1875 +0.6562 0.5938 0.2188 +0.6562 0.5938 0.25 +0.6562 0.5938 0.2812 +0.6562 0.5938 0.3125 +0.6562 0.5938 0.3438 +0.6562 0.5938 0.375 +0.6562 0.5938 0.4062 +0.6562 0.5938 0.4375 +0.6562 0.5938 0.4688 +0.6562 0.5938 0.5 +0.6562 0.5938 0.5312 +0.6562 0.5938 0.5625 +0.6562 0.5938 0.5938 +0.6562 0.5938 0.625 +0.6562 0.5938 0.6562 +0.6562 0.5938 0.6875 +0.6562 0.5938 0.7188 +0.6562 0.5938 0.75 +0.6562 0.5938 0.7812 +0.6562 0.5938 0.8125 +0.6562 0.5938 0.8438 +0.6562 0.5938 0.875 +0.6562 0.5938 0.9062 +0.6562 0.5938 0.9375 +0.6562 0.5938 0.9688 +0.6562 0.5938 1 +0.6562 0.625 0 +0.6562 0.625 0.03125 +0.6562 0.625 0.0625 +0.6562 0.625 0.09375 +0.6562 0.625 0.125 +0.6562 0.625 0.1562 +0.6562 0.625 0.1875 +0.6562 0.625 0.2188 +0.6562 0.625 0.25 +0.6562 0.625 0.2812 +0.6562 0.625 0.3125 +0.6562 0.625 0.3438 +0.6562 0.625 0.375 +0.6562 0.625 0.4062 +0.6562 0.625 0.4375 +0.6562 0.625 0.4688 +0.6562 0.625 0.5 +0.6562 0.625 0.5312 +0.6562 0.625 0.5625 +0.6562 0.625 0.5938 +0.6562 0.625 0.625 +0.6562 0.625 0.6562 +0.6562 0.625 0.6875 +0.6562 0.625 0.7188 +0.6562 0.625 0.75 +0.6562 0.625 0.7812 +0.6562 0.625 0.8125 +0.6562 0.625 0.8438 +0.6562 0.625 0.875 +0.6562 0.625 0.9062 +0.6562 0.625 0.9375 +0.6562 0.625 0.9688 +0.6562 0.625 1 +0.6562 0.6562 0 +0.6562 0.6562 0.03125 +0.6562 0.6562 0.0625 +0.6562 0.6562 0.09375 +0.6562 0.6562 0.125 +0.6562 0.6562 0.1562 +0.6562 0.6562 0.1875 +0.6562 0.6562 0.2188 +0.6562 0.6562 0.25 +0.6562 0.6562 0.2812 +0.6562 0.6562 0.3125 +0.6562 0.6562 0.3438 +0.6562 0.6562 0.375 +0.6562 0.6562 0.4062 +0.6562 0.6562 0.4375 +0.6562 0.6562 0.4688 +0.6562 0.6562 0.5 +0.6562 0.6562 0.5312 +0.6562 0.6562 0.5625 +0.6562 0.6562 0.5938 +0.6562 0.6562 0.625 +0.6562 0.6562 0.6562 +0.6562 0.6562 0.6875 +0.6562 0.6562 0.7188 +0.6562 0.6562 0.75 +0.6562 0.6562 0.7812 +0.6562 0.6562 0.8125 +0.6562 0.6562 0.8438 +0.6562 0.6562 0.875 +0.6562 0.6562 0.9062 +0.6562 0.6562 0.9375 +0.6562 0.6562 0.9688 +0.6562 0.6562 1 +0.6562 0.6875 0 +0.6562 0.6875 0.03125 +0.6562 0.6875 0.0625 +0.6562 0.6875 0.09375 +0.6562 0.6875 0.125 +0.6562 0.6875 0.1562 +0.6562 0.6875 0.1875 +0.6562 0.6875 0.2188 +0.6562 0.6875 0.25 +0.6562 0.6875 0.2812 +0.6562 0.6875 0.3125 +0.6562 0.6875 0.3438 +0.6562 0.6875 0.375 +0.6562 0.6875 0.4062 +0.6562 0.6875 0.4375 +0.6562 0.6875 0.4688 +0.6562 0.6875 0.5 +0.6562 0.6875 0.5312 +0.6562 0.6875 0.5625 +0.6562 0.6875 0.5938 +0.6562 0.6875 0.625 +0.6562 0.6875 0.6562 +0.6562 0.6875 0.6875 +0.6562 0.6875 0.7188 +0.6562 0.6875 0.75 +0.6562 0.6875 0.7812 +0.6562 0.6875 0.8125 +0.6562 0.6875 0.8438 +0.6562 0.6875 0.875 +0.6562 0.6875 0.9062 +0.6562 0.6875 0.9375 +0.6562 0.6875 0.9688 +0.6562 0.6875 1 +0.6562 0.7188 0 +0.6562 0.7188 0.03125 +0.6562 0.7188 0.0625 +0.6562 0.7188 0.09375 +0.6562 0.7188 0.125 +0.6562 0.7188 0.1562 +0.6562 0.7188 0.1875 +0.6562 0.7188 0.2188 +0.6562 0.7188 0.25 +0.6562 0.7188 0.2812 +0.6562 0.7188 0.3125 +0.6562 0.7188 0.3438 +0.6562 0.7188 0.375 +0.6562 0.7188 0.4062 +0.6562 0.7188 0.4375 +0.6562 0.7188 0.4688 +0.6562 0.7188 0.5 +0.6562 0.7188 0.5312 +0.6562 0.7188 0.5625 +0.6562 0.7188 0.5938 +0.6562 0.7188 0.625 +0.6562 0.7188 0.6562 +0.6562 0.7188 0.6875 +0.6562 0.7188 0.7188 +0.6562 0.7188 0.75 +0.6562 0.7188 0.7812 +0.6562 0.7188 0.8125 +0.6562 0.7188 0.8438 +0.6562 0.7188 0.875 +0.6562 0.7188 0.9062 +0.6562 0.7188 0.9375 +0.6562 0.7188 0.9688 +0.6562 0.7188 1 +0.6562 0.75 0 +0.6562 0.75 0.03125 +0.6562 0.75 0.0625 +0.6562 0.75 0.09375 +0.6562 0.75 0.125 +0.6562 0.75 0.1562 +0.6562 0.75 0.1875 +0.6562 0.75 0.2188 +0.6562 0.75 0.25 +0.6562 0.75 0.2812 +0.6562 0.75 0.3125 +0.6562 0.75 0.3438 +0.6562 0.75 0.375 +0.6562 0.75 0.4062 +0.6562 0.75 0.4375 +0.6562 0.75 0.4688 +0.6562 0.75 0.5 +0.6562 0.75 0.5312 +0.6562 0.75 0.5625 +0.6562 0.75 0.5938 +0.6562 0.75 0.625 +0.6562 0.75 0.6562 +0.6562 0.75 0.6875 +0.6562 0.75 0.7188 +0.6562 0.75 0.75 +0.6562 0.75 0.7812 +0.6562 0.75 0.8125 +0.6562 0.75 0.8438 +0.6562 0.75 0.875 +0.6562 0.75 0.9062 +0.6562 0.75 0.9375 +0.6562 0.75 0.9688 +0.6562 0.75 1 +0.6562 0.7812 0 +0.6562 0.7812 0.03125 +0.6562 0.7812 0.0625 +0.6562 0.7812 0.09375 +0.6562 0.7812 0.125 +0.6562 0.7812 0.1562 +0.6562 0.7812 0.1875 +0.6562 0.7812 0.2188 +0.6562 0.7812 0.25 +0.6562 0.7812 0.2812 +0.6562 0.7812 0.3125 +0.6562 0.7812 0.3438 +0.6562 0.7812 0.375 +0.6562 0.7812 0.4062 +0.6562 0.7812 0.4375 +0.6562 0.7812 0.4688 +0.6562 0.7812 0.5 +0.6562 0.7812 0.5312 +0.6562 0.7812 0.5625 +0.6562 0.7812 0.5938 +0.6562 0.7812 0.625 +0.6562 0.7812 0.6562 +0.6562 0.7812 0.6875 +0.6562 0.7812 0.7188 +0.6562 0.7812 0.75 +0.6562 0.7812 0.7812 +0.6562 0.7812 0.8125 +0.6562 0.7812 0.8438 +0.6562 0.7812 0.875 +0.6562 0.7812 0.9062 +0.6562 0.7812 0.9375 +0.6562 0.7812 0.9688 +0.6562 0.7812 1 +0.6562 0.8125 0 +0.6562 0.8125 0.03125 +0.6562 0.8125 0.0625 +0.6562 0.8125 0.09375 +0.6562 0.8125 0.125 +0.6562 0.8125 0.1562 +0.6562 0.8125 0.1875 +0.6562 0.8125 0.2188 +0.6562 0.8125 0.25 +0.6562 0.8125 0.2812 +0.6562 0.8125 0.3125 +0.6562 0.8125 0.3438 +0.6562 0.8125 0.375 +0.6562 0.8125 0.4062 +0.6562 0.8125 0.4375 +0.6562 0.8125 0.4688 +0.6562 0.8125 0.5 +0.6562 0.8125 0.5312 +0.6562 0.8125 0.5625 +0.6562 0.8125 0.5938 +0.6562 0.8125 0.625 +0.6562 0.8125 0.6562 +0.6562 0.8125 0.6875 +0.6562 0.8125 0.7188 +0.6562 0.8125 0.75 +0.6562 0.8125 0.7812 +0.6562 0.8125 0.8125 +0.6562 0.8125 0.8438 +0.6562 0.8125 0.875 +0.6562 0.8125 0.9062 +0.6562 0.8125 0.9375 +0.6562 0.8125 0.9688 +0.6562 0.8125 1 +0.6562 0.8438 0 +0.6562 0.8438 0.03125 +0.6562 0.8438 0.0625 +0.6562 0.8438 0.09375 +0.6562 0.8438 0.125 +0.6562 0.8438 0.1562 +0.6562 0.8438 0.1875 +0.6562 0.8438 0.2188 +0.6562 0.8438 0.25 +0.6562 0.8438 0.2812 +0.6562 0.8438 0.3125 +0.6562 0.8438 0.3438 +0.6562 0.8438 0.375 +0.6562 0.8438 0.4062 +0.6562 0.8438 0.4375 +0.6562 0.8438 0.4688 +0.6562 0.8438 0.5 +0.6562 0.8438 0.5312 +0.6562 0.8438 0.5625 +0.6562 0.8438 0.5938 +0.6562 0.8438 0.625 +0.6562 0.8438 0.6562 +0.6562 0.8438 0.6875 +0.6562 0.8438 0.7188 +0.6562 0.8438 0.75 +0.6562 0.8438 0.7812 +0.6562 0.8438 0.8125 +0.6562 0.8438 0.8438 +0.6562 0.8438 0.875 +0.6562 0.8438 0.9062 +0.6562 0.8438 0.9375 +0.6562 0.8438 0.9688 +0.6562 0.8438 1 +0.6562 0.875 0 +0.6562 0.875 0.03125 +0.6562 0.875 0.0625 +0.6562 0.875 0.09375 +0.6562 0.875 0.125 +0.6562 0.875 0.1562 +0.6562 0.875 0.1875 +0.6562 0.875 0.2188 +0.6562 0.875 0.25 +0.6562 0.875 0.2812 +0.6562 0.875 0.3125 +0.6562 0.875 0.3438 +0.6562 0.875 0.375 +0.6562 0.875 0.4062 +0.6562 0.875 0.4375 +0.6562 0.875 0.4688 +0.6562 0.875 0.5 +0.6562 0.875 0.5312 +0.6562 0.875 0.5625 +0.6562 0.875 0.5938 +0.6562 0.875 0.625 +0.6562 0.875 0.6562 +0.6562 0.875 0.6875 +0.6562 0.875 0.7188 +0.6562 0.875 0.75 +0.6562 0.875 0.7812 +0.6562 0.875 0.8125 +0.6562 0.875 0.8438 +0.6562 0.875 0.875 +0.6562 0.875 0.9062 +0.6562 0.875 0.9375 +0.6562 0.875 0.9688 +0.6562 0.875 1 +0.6562 0.9062 0 +0.6562 0.9062 0.03125 +0.6562 0.9062 0.0625 +0.6562 0.9062 0.09375 +0.6562 0.9062 0.125 +0.6562 0.9062 0.1562 +0.6562 0.9062 0.1875 +0.6562 0.9062 0.2188 +0.6562 0.9062 0.25 +0.6562 0.9062 0.2812 +0.6562 0.9062 0.3125 +0.6562 0.9062 0.3438 +0.6562 0.9062 0.375 +0.6562 0.9062 0.4062 +0.6562 0.9062 0.4375 +0.6562 0.9062 0.4688 +0.6562 0.9062 0.5 +0.6562 0.9062 0.5312 +0.6562 0.9062 0.5625 +0.6562 0.9062 0.5938 +0.6562 0.9062 0.625 +0.6562 0.9062 0.6562 +0.6562 0.9062 0.6875 +0.6562 0.9062 0.7188 +0.6562 0.9062 0.75 +0.6562 0.9062 0.7812 +0.6562 0.9062 0.8125 +0.6562 0.9062 0.8438 +0.6562 0.9062 0.875 +0.6562 0.9062 0.9062 +0.6562 0.9062 0.9375 +0.6562 0.9062 0.9688 +0.6562 0.9062 1 +0.6562 0.9375 0 +0.6562 0.9375 0.03125 +0.6562 0.9375 0.0625 +0.6562 0.9375 0.09375 +0.6562 0.9375 0.125 +0.6562 0.9375 0.1562 +0.6562 0.9375 0.1875 +0.6562 0.9375 0.2188 +0.6562 0.9375 0.25 +0.6562 0.9375 0.2812 +0.6562 0.9375 0.3125 +0.6562 0.9375 0.3438 +0.6562 0.9375 0.375 +0.6562 0.9375 0.4062 +0.6562 0.9375 0.4375 +0.6562 0.9375 0.4688 +0.6562 0.9375 0.5 +0.6562 0.9375 0.5312 +0.6562 0.9375 0.5625 +0.6562 0.9375 0.5938 +0.6562 0.9375 0.625 +0.6562 0.9375 0.6562 +0.6562 0.9375 0.6875 +0.6562 0.9375 0.7188 +0.6562 0.9375 0.75 +0.6562 0.9375 0.7812 +0.6562 0.9375 0.8125 +0.6562 0.9375 0.8438 +0.6562 0.9375 0.875 +0.6562 0.9375 0.9062 +0.6562 0.9375 0.9375 +0.6562 0.9375 0.9688 +0.6562 0.9375 1 +0.6562 0.9688 0 +0.6562 0.9688 0.03125 +0.6562 0.9688 0.0625 +0.6562 0.9688 0.09375 +0.6562 0.9688 0.125 +0.6562 0.9688 0.1562 +0.6562 0.9688 0.1875 +0.6562 0.9688 0.2188 +0.6562 0.9688 0.25 +0.6562 0.9688 0.2812 +0.6562 0.9688 0.3125 +0.6562 0.9688 0.3438 +0.6562 0.9688 0.375 +0.6562 0.9688 0.4062 +0.6562 0.9688 0.4375 +0.6562 0.9688 0.4688 +0.6562 0.9688 0.5 +0.6562 0.9688 0.5312 +0.6562 0.9688 0.5625 +0.6562 0.9688 0.5938 +0.6562 0.9688 0.625 +0.6562 0.9688 0.6562 +0.6562 0.9688 0.6875 +0.6562 0.9688 0.7188 +0.6562 0.9688 0.75 +0.6562 0.9688 0.7812 +0.6562 0.9688 0.8125 +0.6562 0.9688 0.8438 +0.6562 0.9688 0.875 +0.6562 0.9688 0.9062 +0.6562 0.9688 0.9375 +0.6562 0.9688 0.9688 +0.6562 0.9688 1 +0.6562 1 0 +0.6562 1 0.03125 +0.6562 1 0.0625 +0.6562 1 0.09375 +0.6562 1 0.125 +0.6562 1 0.1562 +0.6562 1 0.1875 +0.6562 1 0.2188 +0.6562 1 0.25 +0.6562 1 0.2812 +0.6562 1 0.3125 +0.6562 1 0.3438 +0.6562 1 0.375 +0.6562 1 0.4062 +0.6562 1 0.4375 +0.6562 1 0.4688 +0.6562 1 0.5 +0.6562 1 0.5312 +0.6562 1 0.5625 +0.6562 1 0.5938 +0.6562 1 0.625 +0.6562 1 0.6562 +0.6562 1 0.6875 +0.6562 1 0.7188 +0.6562 1 0.75 +0.6562 1 0.7812 +0.6562 1 0.8125 +0.6562 1 0.8438 +0.6562 1 0.875 +0.6562 1 0.9062 +0.6562 1 0.9375 +0.6562 1 0.9688 +0.6562 1 1 +0.6875 0 0 +0.6875 0 0.03125 +0.6875 0 0.0625 +0.6875 0 0.09375 +0.6875 0 0.125 +0.6875 0 0.1562 +0.6875 0 0.1875 +0.6875 0 0.2188 +0.6875 0 0.25 +0.6875 0 0.2812 +0.6875 0 0.3125 +0.6875 0 0.3438 +0.6875 0 0.375 +0.6875 0 0.4062 +0.6875 0 0.4375 +0.6875 0 0.4688 +0.6875 0 0.5 +0.6875 0 0.5312 +0.6875 0 0.5625 +0.6875 0 0.5938 +0.6875 0 0.625 +0.6875 0 0.6562 +0.6875 0 0.6875 +0.6875 0 0.7188 +0.6875 0 0.75 +0.6875 0 0.7812 +0.6875 0 0.8125 +0.6875 0 0.8438 +0.6875 0 0.875 +0.6875 0 0.9062 +0.6875 0 0.9375 +0.6875 0 0.9688 +0.6875 0 1 +0.6875 0.03125 0 +0.6875 0.03125 0.03125 +0.6875 0.03125 0.0625 +0.6875 0.03125 0.09375 +0.6875 0.03125 0.125 +0.6875 0.03125 0.1562 +0.6875 0.03125 0.1875 +0.6875 0.03125 0.2188 +0.6875 0.03125 0.25 +0.6875 0.03125 0.2812 +0.6875 0.03125 0.3125 +0.6875 0.03125 0.3438 +0.6875 0.03125 0.375 +0.6875 0.03125 0.4062 +0.6875 0.03125 0.4375 +0.6875 0.03125 0.4688 +0.6875 0.03125 0.5 +0.6875 0.03125 0.5312 +0.6875 0.03125 0.5625 +0.6875 0.03125 0.5938 +0.6875 0.03125 0.625 +0.6875 0.03125 0.6562 +0.6875 0.03125 0.6875 +0.6875 0.03125 0.7188 +0.6875 0.03125 0.75 +0.6875 0.03125 0.7812 +0.6875 0.03125 0.8125 +0.6875 0.03125 0.8438 +0.6875 0.03125 0.875 +0.6875 0.03125 0.9062 +0.6875 0.03125 0.9375 +0.6875 0.03125 0.9688 +0.6875 0.03125 1 +0.6875 0.0625 0 +0.6875 0.0625 0.03125 +0.6875 0.0625 0.0625 +0.6875 0.0625 0.09375 +0.6875 0.0625 0.125 +0.6875 0.0625 0.1562 +0.6875 0.0625 0.1875 +0.6875 0.0625 0.2188 +0.6875 0.0625 0.25 +0.6875 0.0625 0.2812 +0.6875 0.0625 0.3125 +0.6875 0.0625 0.3438 +0.6875 0.0625 0.375 +0.6875 0.0625 0.4062 +0.6875 0.0625 0.4375 +0.6875 0.0625 0.4688 +0.6875 0.0625 0.5 +0.6875 0.0625 0.5312 +0.6875 0.0625 0.5625 +0.6875 0.0625 0.5938 +0.6875 0.0625 0.625 +0.6875 0.0625 0.6562 +0.6875 0.0625 0.6875 +0.6875 0.0625 0.7188 +0.6875 0.0625 0.75 +0.6875 0.0625 0.7812 +0.6875 0.0625 0.8125 +0.6875 0.0625 0.8438 +0.6875 0.0625 0.875 +0.6875 0.0625 0.9062 +0.6875 0.0625 0.9375 +0.6875 0.0625 0.9688 +0.6875 0.0625 1 +0.6875 0.09375 0 +0.6875 0.09375 0.03125 +0.6875 0.09375 0.0625 +0.6875 0.09375 0.09375 +0.6875 0.09375 0.125 +0.6875 0.09375 0.1562 +0.6875 0.09375 0.1875 +0.6875 0.09375 0.2188 +0.6875 0.09375 0.25 +0.6875 0.09375 0.2812 +0.6875 0.09375 0.3125 +0.6875 0.09375 0.3438 +0.6875 0.09375 0.375 +0.6875 0.09375 0.4062 +0.6875 0.09375 0.4375 +0.6875 0.09375 0.4688 +0.6875 0.09375 0.5 +0.6875 0.09375 0.5312 +0.6875 0.09375 0.5625 +0.6875 0.09375 0.5938 +0.6875 0.09375 0.625 +0.6875 0.09375 0.6562 +0.6875 0.09375 0.6875 +0.6875 0.09375 0.7188 +0.6875 0.09375 0.75 +0.6875 0.09375 0.7812 +0.6875 0.09375 0.8125 +0.6875 0.09375 0.8438 +0.6875 0.09375 0.875 +0.6875 0.09375 0.9062 +0.6875 0.09375 0.9375 +0.6875 0.09375 0.9688 +0.6875 0.09375 1 +0.6875 0.125 0 +0.6875 0.125 0.03125 +0.6875 0.125 0.0625 +0.6875 0.125 0.09375 +0.6875 0.125 0.125 +0.6875 0.125 0.1562 +0.6875 0.125 0.1875 +0.6875 0.125 0.2188 +0.6875 0.125 0.25 +0.6875 0.125 0.2812 +0.6875 0.125 0.3125 +0.6875 0.125 0.3438 +0.6875 0.125 0.375 +0.6875 0.125 0.4062 +0.6875 0.125 0.4375 +0.6875 0.125 0.4688 +0.6875 0.125 0.5 +0.6875 0.125 0.5312 +0.6875 0.125 0.5625 +0.6875 0.125 0.5938 +0.6875 0.125 0.625 +0.6875 0.125 0.6562 +0.6875 0.125 0.6875 +0.6875 0.125 0.7188 +0.6875 0.125 0.75 +0.6875 0.125 0.7812 +0.6875 0.125 0.8125 +0.6875 0.125 0.8438 +0.6875 0.125 0.875 +0.6875 0.125 0.9062 +0.6875 0.125 0.9375 +0.6875 0.125 0.9688 +0.6875 0.125 1 +0.6875 0.1562 0 +0.6875 0.1562 0.03125 +0.6875 0.1562 0.0625 +0.6875 0.1562 0.09375 +0.6875 0.1562 0.125 +0.6875 0.1562 0.1562 +0.6875 0.1562 0.1875 +0.6875 0.1562 0.2188 +0.6875 0.1562 0.25 +0.6875 0.1562 0.2812 +0.6875 0.1562 0.3125 +0.6875 0.1562 0.3438 +0.6875 0.1562 0.375 +0.6875 0.1562 0.4062 +0.6875 0.1562 0.4375 +0.6875 0.1562 0.4688 +0.6875 0.1562 0.5 +0.6875 0.1562 0.5312 +0.6875 0.1562 0.5625 +0.6875 0.1562 0.5938 +0.6875 0.1562 0.625 +0.6875 0.1562 0.6562 +0.6875 0.1562 0.6875 +0.6875 0.1562 0.7188 +0.6875 0.1562 0.75 +0.6875 0.1562 0.7812 +0.6875 0.1562 0.8125 +0.6875 0.1562 0.8438 +0.6875 0.1562 0.875 +0.6875 0.1562 0.9062 +0.6875 0.1562 0.9375 +0.6875 0.1562 0.9688 +0.6875 0.1562 1 +0.6875 0.1875 0 +0.6875 0.1875 0.03125 +0.6875 0.1875 0.0625 +0.6875 0.1875 0.09375 +0.6875 0.1875 0.125 +0.6875 0.1875 0.1562 +0.6875 0.1875 0.1875 +0.6875 0.1875 0.2188 +0.6875 0.1875 0.25 +0.6875 0.1875 0.2812 +0.6875 0.1875 0.3125 +0.6875 0.1875 0.3438 +0.6875 0.1875 0.375 +0.6875 0.1875 0.4062 +0.6875 0.1875 0.4375 +0.6875 0.1875 0.4688 +0.6875 0.1875 0.5 +0.6875 0.1875 0.5312 +0.6875 0.1875 0.5625 +0.6875 0.1875 0.5938 +0.6875 0.1875 0.625 +0.6875 0.1875 0.6562 +0.6875 0.1875 0.6875 +0.6875 0.1875 0.7188 +0.6875 0.1875 0.75 +0.6875 0.1875 0.7812 +0.6875 0.1875 0.8125 +0.6875 0.1875 0.8438 +0.6875 0.1875 0.875 +0.6875 0.1875 0.9062 +0.6875 0.1875 0.9375 +0.6875 0.1875 0.9688 +0.6875 0.1875 1 +0.6875 0.2188 0 +0.6875 0.2188 0.03125 +0.6875 0.2188 0.0625 +0.6875 0.2188 0.09375 +0.6875 0.2188 0.125 +0.6875 0.2188 0.1562 +0.6875 0.2188 0.1875 +0.6875 0.2188 0.2188 +0.6875 0.2188 0.25 +0.6875 0.2188 0.2812 +0.6875 0.2188 0.3125 +0.6875 0.2188 0.3438 +0.6875 0.2188 0.375 +0.6875 0.2188 0.4062 +0.6875 0.2188 0.4375 +0.6875 0.2188 0.4688 +0.6875 0.2188 0.5 +0.6875 0.2188 0.5312 +0.6875 0.2188 0.5625 +0.6875 0.2188 0.5938 +0.6875 0.2188 0.625 +0.6875 0.2188 0.6562 +0.6875 0.2188 0.6875 +0.6875 0.2188 0.7188 +0.6875 0.2188 0.75 +0.6875 0.2188 0.7812 +0.6875 0.2188 0.8125 +0.6875 0.2188 0.8438 +0.6875 0.2188 0.875 +0.6875 0.2188 0.9062 +0.6875 0.2188 0.9375 +0.6875 0.2188 0.9688 +0.6875 0.2188 1 +0.6875 0.25 0 +0.6875 0.25 0.03125 +0.6875 0.25 0.0625 +0.6875 0.25 0.09375 +0.6875 0.25 0.125 +0.6875 0.25 0.1562 +0.6875 0.25 0.1875 +0.6875 0.25 0.2188 +0.6875 0.25 0.25 +0.6875 0.25 0.2812 +0.6875 0.25 0.3125 +0.6875 0.25 0.3438 +0.6875 0.25 0.375 +0.6875 0.25 0.4062 +0.6875 0.25 0.4375 +0.6875 0.25 0.4688 +0.6875 0.25 0.5 +0.6875 0.25 0.5312 +0.6875 0.25 0.5625 +0.6875 0.25 0.5938 +0.6875 0.25 0.625 +0.6875 0.25 0.6562 +0.6875 0.25 0.6875 +0.6875 0.25 0.7188 +0.6875 0.25 0.75 +0.6875 0.25 0.7812 +0.6875 0.25 0.8125 +0.6875 0.25 0.8438 +0.6875 0.25 0.875 +0.6875 0.25 0.9062 +0.6875 0.25 0.9375 +0.6875 0.25 0.9688 +0.6875 0.25 1 +0.6875 0.2812 0 +0.6875 0.2812 0.03125 +0.6875 0.2812 0.0625 +0.6875 0.2812 0.09375 +0.6875 0.2812 0.125 +0.6875 0.2812 0.1562 +0.6875 0.2812 0.1875 +0.6875 0.2812 0.2188 +0.6875 0.2812 0.25 +0.6875 0.2812 0.2812 +0.6875 0.2812 0.3125 +0.6875 0.2812 0.3438 +0.6875 0.2812 0.375 +0.6875 0.2812 0.4062 +0.6875 0.2812 0.4375 +0.6875 0.2812 0.4688 +0.6875 0.2812 0.5 +0.6875 0.2812 0.5312 +0.6875 0.2812 0.5625 +0.6875 0.2812 0.5938 +0.6875 0.2812 0.625 +0.6875 0.2812 0.6562 +0.6875 0.2812 0.6875 +0.6875 0.2812 0.7188 +0.6875 0.2812 0.75 +0.6875 0.2812 0.7812 +0.6875 0.2812 0.8125 +0.6875 0.2812 0.8438 +0.6875 0.2812 0.875 +0.6875 0.2812 0.9062 +0.6875 0.2812 0.9375 +0.6875 0.2812 0.9688 +0.6875 0.2812 1 +0.6875 0.3125 0 +0.6875 0.3125 0.03125 +0.6875 0.3125 0.0625 +0.6875 0.3125 0.09375 +0.6875 0.3125 0.125 +0.6875 0.3125 0.1562 +0.6875 0.3125 0.1875 +0.6875 0.3125 0.2188 +0.6875 0.3125 0.25 +0.6875 0.3125 0.2812 +0.6875 0.3125 0.3125 +0.6875 0.3125 0.3438 +0.6875 0.3125 0.375 +0.6875 0.3125 0.4062 +0.6875 0.3125 0.4375 +0.6875 0.3125 0.4688 +0.6875 0.3125 0.5 +0.6875 0.3125 0.5312 +0.6875 0.3125 0.5625 +0.6875 0.3125 0.5938 +0.6875 0.3125 0.625 +0.6875 0.3125 0.6562 +0.6875 0.3125 0.6875 +0.6875 0.3125 0.7188 +0.6875 0.3125 0.75 +0.6875 0.3125 0.7812 +0.6875 0.3125 0.8125 +0.6875 0.3125 0.8438 +0.6875 0.3125 0.875 +0.6875 0.3125 0.9062 +0.6875 0.3125 0.9375 +0.6875 0.3125 0.9688 +0.6875 0.3125 1 +0.6875 0.3438 0 +0.6875 0.3438 0.03125 +0.6875 0.3438 0.0625 +0.6875 0.3438 0.09375 +0.6875 0.3438 0.125 +0.6875 0.3438 0.1562 +0.6875 0.3438 0.1875 +0.6875 0.3438 0.2188 +0.6875 0.3438 0.25 +0.6875 0.3438 0.2812 +0.6875 0.3438 0.3125 +0.6875 0.3438 0.3438 +0.6875 0.3438 0.375 +0.6875 0.3438 0.4062 +0.6875 0.3438 0.4375 +0.6875 0.3438 0.4688 +0.6875 0.3438 0.5 +0.6875 0.3438 0.5312 +0.6875 0.3438 0.5625 +0.6875 0.3438 0.5938 +0.6875 0.3438 0.625 +0.6875 0.3438 0.6562 +0.6875 0.3438 0.6875 +0.6875 0.3438 0.7188 +0.6875 0.3438 0.75 +0.6875 0.3438 0.7812 +0.6875 0.3438 0.8125 +0.6875 0.3438 0.8438 +0.6875 0.3438 0.875 +0.6875 0.3438 0.9062 +0.6875 0.3438 0.9375 +0.6875 0.3438 0.9688 +0.6875 0.3438 1 +0.6875 0.375 0 +0.6875 0.375 0.03125 +0.6875 0.375 0.0625 +0.6875 0.375 0.09375 +0.6875 0.375 0.125 +0.6875 0.375 0.1562 +0.6875 0.375 0.1875 +0.6875 0.375 0.2188 +0.6875 0.375 0.25 +0.6875 0.375 0.2812 +0.6875 0.375 0.3125 +0.6875 0.375 0.3438 +0.6875 0.375 0.375 +0.6875 0.375 0.4062 +0.6875 0.375 0.4375 +0.6875 0.375 0.4688 +0.6875 0.375 0.5 +0.6875 0.375 0.5312 +0.6875 0.375 0.5625 +0.6875 0.375 0.5938 +0.6875 0.375 0.625 +0.6875 0.375 0.6562 +0.6875 0.375 0.6875 +0.6875 0.375 0.7188 +0.6875 0.375 0.75 +0.6875 0.375 0.7812 +0.6875 0.375 0.8125 +0.6875 0.375 0.8438 +0.6875 0.375 0.875 +0.6875 0.375 0.9062 +0.6875 0.375 0.9375 +0.6875 0.375 0.9688 +0.6875 0.375 1 +0.6875 0.4062 0 +0.6875 0.4062 0.03125 +0.6875 0.4062 0.0625 +0.6875 0.4062 0.09375 +0.6875 0.4062 0.125 +0.6875 0.4062 0.1562 +0.6875 0.4062 0.1875 +0.6875 0.4062 0.2188 +0.6875 0.4062 0.25 +0.6875 0.4062 0.2812 +0.6875 0.4062 0.3125 +0.6875 0.4062 0.3438 +0.6875 0.4062 0.375 +0.6875 0.4062 0.4062 +0.6875 0.4062 0.4375 +0.6875 0.4062 0.4688 +0.6875 0.4062 0.5 +0.6875 0.4062 0.5312 +0.6875 0.4062 0.5625 +0.6875 0.4062 0.5938 +0.6875 0.4062 0.625 +0.6875 0.4062 0.6562 +0.6875 0.4062 0.6875 +0.6875 0.4062 0.7188 +0.6875 0.4062 0.75 +0.6875 0.4062 0.7812 +0.6875 0.4062 0.8125 +0.6875 0.4062 0.8438 +0.6875 0.4062 0.875 +0.6875 0.4062 0.9062 +0.6875 0.4062 0.9375 +0.6875 0.4062 0.9688 +0.6875 0.4062 1 +0.6875 0.4375 0 +0.6875 0.4375 0.03125 +0.6875 0.4375 0.0625 +0.6875 0.4375 0.09375 +0.6875 0.4375 0.125 +0.6875 0.4375 0.1562 +0.6875 0.4375 0.1875 +0.6875 0.4375 0.2188 +0.6875 0.4375 0.25 +0.6875 0.4375 0.2812 +0.6875 0.4375 0.3125 +0.6875 0.4375 0.3438 +0.6875 0.4375 0.375 +0.6875 0.4375 0.4062 +0.6875 0.4375 0.4375 +0.6875 0.4375 0.4688 +0.6875 0.4375 0.5 +0.6875 0.4375 0.5312 +0.6875 0.4375 0.5625 +0.6875 0.4375 0.5938 +0.6875 0.4375 0.625 +0.6875 0.4375 0.6562 +0.6875 0.4375 0.6875 +0.6875 0.4375 0.7188 +0.6875 0.4375 0.75 +0.6875 0.4375 0.7812 +0.6875 0.4375 0.8125 +0.6875 0.4375 0.8438 +0.6875 0.4375 0.875 +0.6875 0.4375 0.9062 +0.6875 0.4375 0.9375 +0.6875 0.4375 0.9688 +0.6875 0.4375 1 +0.6875 0.4688 0 +0.6875 0.4688 0.03125 +0.6875 0.4688 0.0625 +0.6875 0.4688 0.09375 +0.6875 0.4688 0.125 +0.6875 0.4688 0.1562 +0.6875 0.4688 0.1875 +0.6875 0.4688 0.2188 +0.6875 0.4688 0.25 +0.6875 0.4688 0.2812 +0.6875 0.4688 0.3125 +0.6875 0.4688 0.3438 +0.6875 0.4688 0.375 +0.6875 0.4688 0.4062 +0.6875 0.4688 0.4375 +0.6875 0.4688 0.4688 +0.6875 0.4688 0.5 +0.6875 0.4688 0.5312 +0.6875 0.4688 0.5625 +0.6875 0.4688 0.5938 +0.6875 0.4688 0.625 +0.6875 0.4688 0.6562 +0.6875 0.4688 0.6875 +0.6875 0.4688 0.7188 +0.6875 0.4688 0.75 +0.6875 0.4688 0.7812 +0.6875 0.4688 0.8125 +0.6875 0.4688 0.8438 +0.6875 0.4688 0.875 +0.6875 0.4688 0.9062 +0.6875 0.4688 0.9375 +0.6875 0.4688 0.9688 +0.6875 0.4688 1 +0.6875 0.5 0 +0.6875 0.5 0.03125 +0.6875 0.5 0.0625 +0.6875 0.5 0.09375 +0.6875 0.5 0.125 +0.6875 0.5 0.1562 +0.6875 0.5 0.1875 +0.6875 0.5 0.2188 +0.6875 0.5 0.25 +0.6875 0.5 0.2812 +0.6875 0.5 0.3125 +0.6875 0.5 0.3438 +0.6875 0.5 0.375 +0.6875 0.5 0.4062 +0.6875 0.5 0.4375 +0.6875 0.5 0.4688 +0.6875 0.5 0.5 +0.6875 0.5 0.5312 +0.6875 0.5 0.5625 +0.6875 0.5 0.5938 +0.6875 0.5 0.625 +0.6875 0.5 0.6562 +0.6875 0.5 0.6875 +0.6875 0.5 0.7188 +0.6875 0.5 0.75 +0.6875 0.5 0.7812 +0.6875 0.5 0.8125 +0.6875 0.5 0.8438 +0.6875 0.5 0.875 +0.6875 0.5 0.9062 +0.6875 0.5 0.9375 +0.6875 0.5 0.9688 +0.6875 0.5 1 +0.6875 0.5312 0 +0.6875 0.5312 0.03125 +0.6875 0.5312 0.0625 +0.6875 0.5312 0.09375 +0.6875 0.5312 0.125 +0.6875 0.5312 0.1562 +0.6875 0.5312 0.1875 +0.6875 0.5312 0.2188 +0.6875 0.5312 0.25 +0.6875 0.5312 0.2812 +0.6875 0.5312 0.3125 +0.6875 0.5312 0.3438 +0.6875 0.5312 0.375 +0.6875 0.5312 0.4062 +0.6875 0.5312 0.4375 +0.6875 0.5312 0.4688 +0.6875 0.5312 0.5 +0.6875 0.5312 0.5312 +0.6875 0.5312 0.5625 +0.6875 0.5312 0.5938 +0.6875 0.5312 0.625 +0.6875 0.5312 0.6562 +0.6875 0.5312 0.6875 +0.6875 0.5312 0.7188 +0.6875 0.5312 0.75 +0.6875 0.5312 0.7812 +0.6875 0.5312 0.8125 +0.6875 0.5312 0.8438 +0.6875 0.5312 0.875 +0.6875 0.5312 0.9062 +0.6875 0.5312 0.9375 +0.6875 0.5312 0.9688 +0.6875 0.5312 1 +0.6875 0.5625 0 +0.6875 0.5625 0.03125 +0.6875 0.5625 0.0625 +0.6875 0.5625 0.09375 +0.6875 0.5625 0.125 +0.6875 0.5625 0.1562 +0.6875 0.5625 0.1875 +0.6875 0.5625 0.2188 +0.6875 0.5625 0.25 +0.6875 0.5625 0.2812 +0.6875 0.5625 0.3125 +0.6875 0.5625 0.3438 +0.6875 0.5625 0.375 +0.6875 0.5625 0.4062 +0.6875 0.5625 0.4375 +0.6875 0.5625 0.4688 +0.6875 0.5625 0.5 +0.6875 0.5625 0.5312 +0.6875 0.5625 0.5625 +0.6875 0.5625 0.5938 +0.6875 0.5625 0.625 +0.6875 0.5625 0.6562 +0.6875 0.5625 0.6875 +0.6875 0.5625 0.7188 +0.6875 0.5625 0.75 +0.6875 0.5625 0.7812 +0.6875 0.5625 0.8125 +0.6875 0.5625 0.8438 +0.6875 0.5625 0.875 +0.6875 0.5625 0.9062 +0.6875 0.5625 0.9375 +0.6875 0.5625 0.9688 +0.6875 0.5625 1 +0.6875 0.5938 0 +0.6875 0.5938 0.03125 +0.6875 0.5938 0.0625 +0.6875 0.5938 0.09375 +0.6875 0.5938 0.125 +0.6875 0.5938 0.1562 +0.6875 0.5938 0.1875 +0.6875 0.5938 0.2188 +0.6875 0.5938 0.25 +0.6875 0.5938 0.2812 +0.6875 0.5938 0.3125 +0.6875 0.5938 0.3438 +0.6875 0.5938 0.375 +0.6875 0.5938 0.4062 +0.6875 0.5938 0.4375 +0.6875 0.5938 0.4688 +0.6875 0.5938 0.5 +0.6875 0.5938 0.5312 +0.6875 0.5938 0.5625 +0.6875 0.5938 0.5938 +0.6875 0.5938 0.625 +0.6875 0.5938 0.6562 +0.6875 0.5938 0.6875 +0.6875 0.5938 0.7188 +0.6875 0.5938 0.75 +0.6875 0.5938 0.7812 +0.6875 0.5938 0.8125 +0.6875 0.5938 0.8438 +0.6875 0.5938 0.875 +0.6875 0.5938 0.9062 +0.6875 0.5938 0.9375 +0.6875 0.5938 0.9688 +0.6875 0.5938 1 +0.6875 0.625 0 +0.6875 0.625 0.03125 +0.6875 0.625 0.0625 +0.6875 0.625 0.09375 +0.6875 0.625 0.125 +0.6875 0.625 0.1562 +0.6875 0.625 0.1875 +0.6875 0.625 0.2188 +0.6875 0.625 0.25 +0.6875 0.625 0.2812 +0.6875 0.625 0.3125 +0.6875 0.625 0.3438 +0.6875 0.625 0.375 +0.6875 0.625 0.4062 +0.6875 0.625 0.4375 +0.6875 0.625 0.4688 +0.6875 0.625 0.5 +0.6875 0.625 0.5312 +0.6875 0.625 0.5625 +0.6875 0.625 0.5938 +0.6875 0.625 0.625 +0.6875 0.625 0.6562 +0.6875 0.625 0.6875 +0.6875 0.625 0.7188 +0.6875 0.625 0.75 +0.6875 0.625 0.7812 +0.6875 0.625 0.8125 +0.6875 0.625 0.8438 +0.6875 0.625 0.875 +0.6875 0.625 0.9062 +0.6875 0.625 0.9375 +0.6875 0.625 0.9688 +0.6875 0.625 1 +0.6875 0.6562 0 +0.6875 0.6562 0.03125 +0.6875 0.6562 0.0625 +0.6875 0.6562 0.09375 +0.6875 0.6562 0.125 +0.6875 0.6562 0.1562 +0.6875 0.6562 0.1875 +0.6875 0.6562 0.2188 +0.6875 0.6562 0.25 +0.6875 0.6562 0.2812 +0.6875 0.6562 0.3125 +0.6875 0.6562 0.3438 +0.6875 0.6562 0.375 +0.6875 0.6562 0.4062 +0.6875 0.6562 0.4375 +0.6875 0.6562 0.4688 +0.6875 0.6562 0.5 +0.6875 0.6562 0.5312 +0.6875 0.6562 0.5625 +0.6875 0.6562 0.5938 +0.6875 0.6562 0.625 +0.6875 0.6562 0.6562 +0.6875 0.6562 0.6875 +0.6875 0.6562 0.7188 +0.6875 0.6562 0.75 +0.6875 0.6562 0.7812 +0.6875 0.6562 0.8125 +0.6875 0.6562 0.8438 +0.6875 0.6562 0.875 +0.6875 0.6562 0.9062 +0.6875 0.6562 0.9375 +0.6875 0.6562 0.9688 +0.6875 0.6562 1 +0.6875 0.6875 0 +0.6875 0.6875 0.03125 +0.6875 0.6875 0.0625 +0.6875 0.6875 0.09375 +0.6875 0.6875 0.125 +0.6875 0.6875 0.1562 +0.6875 0.6875 0.1875 +0.6875 0.6875 0.2188 +0.6875 0.6875 0.25 +0.6875 0.6875 0.2812 +0.6875 0.6875 0.3125 +0.6875 0.6875 0.3438 +0.6875 0.6875 0.375 +0.6875 0.6875 0.4062 +0.6875 0.6875 0.4375 +0.6875 0.6875 0.4688 +0.6875 0.6875 0.5 +0.6875 0.6875 0.5312 +0.6875 0.6875 0.5625 +0.6875 0.6875 0.5938 +0.6875 0.6875 0.625 +0.6875 0.6875 0.6562 +0.6875 0.6875 0.6875 +0.6875 0.6875 0.7188 +0.6875 0.6875 0.75 +0.6875 0.6875 0.7812 +0.6875 0.6875 0.8125 +0.6875 0.6875 0.8438 +0.6875 0.6875 0.875 +0.6875 0.6875 0.9062 +0.6875 0.6875 0.9375 +0.6875 0.6875 0.9688 +0.6875 0.6875 1 +0.6875 0.7188 0 +0.6875 0.7188 0.03125 +0.6875 0.7188 0.0625 +0.6875 0.7188 0.09375 +0.6875 0.7188 0.125 +0.6875 0.7188 0.1562 +0.6875 0.7188 0.1875 +0.6875 0.7188 0.2188 +0.6875 0.7188 0.25 +0.6875 0.7188 0.2812 +0.6875 0.7188 0.3125 +0.6875 0.7188 0.3438 +0.6875 0.7188 0.375 +0.6875 0.7188 0.4062 +0.6875 0.7188 0.4375 +0.6875 0.7188 0.4688 +0.6875 0.7188 0.5 +0.6875 0.7188 0.5312 +0.6875 0.7188 0.5625 +0.6875 0.7188 0.5938 +0.6875 0.7188 0.625 +0.6875 0.7188 0.6562 +0.6875 0.7188 0.6875 +0.6875 0.7188 0.7188 +0.6875 0.7188 0.75 +0.6875 0.7188 0.7812 +0.6875 0.7188 0.8125 +0.6875 0.7188 0.8438 +0.6875 0.7188 0.875 +0.6875 0.7188 0.9062 +0.6875 0.7188 0.9375 +0.6875 0.7188 0.9688 +0.6875 0.7188 1 +0.6875 0.75 0 +0.6875 0.75 0.03125 +0.6875 0.75 0.0625 +0.6875 0.75 0.09375 +0.6875 0.75 0.125 +0.6875 0.75 0.1562 +0.6875 0.75 0.1875 +0.6875 0.75 0.2188 +0.6875 0.75 0.25 +0.6875 0.75 0.2812 +0.6875 0.75 0.3125 +0.6875 0.75 0.3438 +0.6875 0.75 0.375 +0.6875 0.75 0.4062 +0.6875 0.75 0.4375 +0.6875 0.75 0.4688 +0.6875 0.75 0.5 +0.6875 0.75 0.5312 +0.6875 0.75 0.5625 +0.6875 0.75 0.5938 +0.6875 0.75 0.625 +0.6875 0.75 0.6562 +0.6875 0.75 0.6875 +0.6875 0.75 0.7188 +0.6875 0.75 0.75 +0.6875 0.75 0.7812 +0.6875 0.75 0.8125 +0.6875 0.75 0.8438 +0.6875 0.75 0.875 +0.6875 0.75 0.9062 +0.6875 0.75 0.9375 +0.6875 0.75 0.9688 +0.6875 0.75 1 +0.6875 0.7812 0 +0.6875 0.7812 0.03125 +0.6875 0.7812 0.0625 +0.6875 0.7812 0.09375 +0.6875 0.7812 0.125 +0.6875 0.7812 0.1562 +0.6875 0.7812 0.1875 +0.6875 0.7812 0.2188 +0.6875 0.7812 0.25 +0.6875 0.7812 0.2812 +0.6875 0.7812 0.3125 +0.6875 0.7812 0.3438 +0.6875 0.7812 0.375 +0.6875 0.7812 0.4062 +0.6875 0.7812 0.4375 +0.6875 0.7812 0.4688 +0.6875 0.7812 0.5 +0.6875 0.7812 0.5312 +0.6875 0.7812 0.5625 +0.6875 0.7812 0.5938 +0.6875 0.7812 0.625 +0.6875 0.7812 0.6562 +0.6875 0.7812 0.6875 +0.6875 0.7812 0.7188 +0.6875 0.7812 0.75 +0.6875 0.7812 0.7812 +0.6875 0.7812 0.8125 +0.6875 0.7812 0.8438 +0.6875 0.7812 0.875 +0.6875 0.7812 0.9062 +0.6875 0.7812 0.9375 +0.6875 0.7812 0.9688 +0.6875 0.7812 1 +0.6875 0.8125 0 +0.6875 0.8125 0.03125 +0.6875 0.8125 0.0625 +0.6875 0.8125 0.09375 +0.6875 0.8125 0.125 +0.6875 0.8125 0.1562 +0.6875 0.8125 0.1875 +0.6875 0.8125 0.2188 +0.6875 0.8125 0.25 +0.6875 0.8125 0.2812 +0.6875 0.8125 0.3125 +0.6875 0.8125 0.3438 +0.6875 0.8125 0.375 +0.6875 0.8125 0.4062 +0.6875 0.8125 0.4375 +0.6875 0.8125 0.4688 +0.6875 0.8125 0.5 +0.6875 0.8125 0.5312 +0.6875 0.8125 0.5625 +0.6875 0.8125 0.5938 +0.6875 0.8125 0.625 +0.6875 0.8125 0.6562 +0.6875 0.8125 0.6875 +0.6875 0.8125 0.7188 +0.6875 0.8125 0.75 +0.6875 0.8125 0.7812 +0.6875 0.8125 0.8125 +0.6875 0.8125 0.8438 +0.6875 0.8125 0.875 +0.6875 0.8125 0.9062 +0.6875 0.8125 0.9375 +0.6875 0.8125 0.9688 +0.6875 0.8125 1 +0.6875 0.8438 0 +0.6875 0.8438 0.03125 +0.6875 0.8438 0.0625 +0.6875 0.8438 0.09375 +0.6875 0.8438 0.125 +0.6875 0.8438 0.1562 +0.6875 0.8438 0.1875 +0.6875 0.8438 0.2188 +0.6875 0.8438 0.25 +0.6875 0.8438 0.2812 +0.6875 0.8438 0.3125 +0.6875 0.8438 0.3438 +0.6875 0.8438 0.375 +0.6875 0.8438 0.4062 +0.6875 0.8438 0.4375 +0.6875 0.8438 0.4688 +0.6875 0.8438 0.5 +0.6875 0.8438 0.5312 +0.6875 0.8438 0.5625 +0.6875 0.8438 0.5938 +0.6875 0.8438 0.625 +0.6875 0.8438 0.6562 +0.6875 0.8438 0.6875 +0.6875 0.8438 0.7188 +0.6875 0.8438 0.75 +0.6875 0.8438 0.7812 +0.6875 0.8438 0.8125 +0.6875 0.8438 0.8438 +0.6875 0.8438 0.875 +0.6875 0.8438 0.9062 +0.6875 0.8438 0.9375 +0.6875 0.8438 0.9688 +0.6875 0.8438 1 +0.6875 0.875 0 +0.6875 0.875 0.03125 +0.6875 0.875 0.0625 +0.6875 0.875 0.09375 +0.6875 0.875 0.125 +0.6875 0.875 0.1562 +0.6875 0.875 0.1875 +0.6875 0.875 0.2188 +0.6875 0.875 0.25 +0.6875 0.875 0.2812 +0.6875 0.875 0.3125 +0.6875 0.875 0.3438 +0.6875 0.875 0.375 +0.6875 0.875 0.4062 +0.6875 0.875 0.4375 +0.6875 0.875 0.4688 +0.6875 0.875 0.5 +0.6875 0.875 0.5312 +0.6875 0.875 0.5625 +0.6875 0.875 0.5938 +0.6875 0.875 0.625 +0.6875 0.875 0.6562 +0.6875 0.875 0.6875 +0.6875 0.875 0.7188 +0.6875 0.875 0.75 +0.6875 0.875 0.7812 +0.6875 0.875 0.8125 +0.6875 0.875 0.8438 +0.6875 0.875 0.875 +0.6875 0.875 0.9062 +0.6875 0.875 0.9375 +0.6875 0.875 0.9688 +0.6875 0.875 1 +0.6875 0.9062 0 +0.6875 0.9062 0.03125 +0.6875 0.9062 0.0625 +0.6875 0.9062 0.09375 +0.6875 0.9062 0.125 +0.6875 0.9062 0.1562 +0.6875 0.9062 0.1875 +0.6875 0.9062 0.2188 +0.6875 0.9062 0.25 +0.6875 0.9062 0.2812 +0.6875 0.9062 0.3125 +0.6875 0.9062 0.3438 +0.6875 0.9062 0.375 +0.6875 0.9062 0.4062 +0.6875 0.9062 0.4375 +0.6875 0.9062 0.4688 +0.6875 0.9062 0.5 +0.6875 0.9062 0.5312 +0.6875 0.9062 0.5625 +0.6875 0.9062 0.5938 +0.6875 0.9062 0.625 +0.6875 0.9062 0.6562 +0.6875 0.9062 0.6875 +0.6875 0.9062 0.7188 +0.6875 0.9062 0.75 +0.6875 0.9062 0.7812 +0.6875 0.9062 0.8125 +0.6875 0.9062 0.8438 +0.6875 0.9062 0.875 +0.6875 0.9062 0.9062 +0.6875 0.9062 0.9375 +0.6875 0.9062 0.9688 +0.6875 0.9062 1 +0.6875 0.9375 0 +0.6875 0.9375 0.03125 +0.6875 0.9375 0.0625 +0.6875 0.9375 0.09375 +0.6875 0.9375 0.125 +0.6875 0.9375 0.1562 +0.6875 0.9375 0.1875 +0.6875 0.9375 0.2188 +0.6875 0.9375 0.25 +0.6875 0.9375 0.2812 +0.6875 0.9375 0.3125 +0.6875 0.9375 0.3438 +0.6875 0.9375 0.375 +0.6875 0.9375 0.4062 +0.6875 0.9375 0.4375 +0.6875 0.9375 0.4688 +0.6875 0.9375 0.5 +0.6875 0.9375 0.5312 +0.6875 0.9375 0.5625 +0.6875 0.9375 0.5938 +0.6875 0.9375 0.625 +0.6875 0.9375 0.6562 +0.6875 0.9375 0.6875 +0.6875 0.9375 0.7188 +0.6875 0.9375 0.75 +0.6875 0.9375 0.7812 +0.6875 0.9375 0.8125 +0.6875 0.9375 0.8438 +0.6875 0.9375 0.875 +0.6875 0.9375 0.9062 +0.6875 0.9375 0.9375 +0.6875 0.9375 0.9688 +0.6875 0.9375 1 +0.6875 0.9688 0 +0.6875 0.9688 0.03125 +0.6875 0.9688 0.0625 +0.6875 0.9688 0.09375 +0.6875 0.9688 0.125 +0.6875 0.9688 0.1562 +0.6875 0.9688 0.1875 +0.6875 0.9688 0.2188 +0.6875 0.9688 0.25 +0.6875 0.9688 0.2812 +0.6875 0.9688 0.3125 +0.6875 0.9688 0.3438 +0.6875 0.9688 0.375 +0.6875 0.9688 0.4062 +0.6875 0.9688 0.4375 +0.6875 0.9688 0.4688 +0.6875 0.9688 0.5 +0.6875 0.9688 0.5312 +0.6875 0.9688 0.5625 +0.6875 0.9688 0.5938 +0.6875 0.9688 0.625 +0.6875 0.9688 0.6562 +0.6875 0.9688 0.6875 +0.6875 0.9688 0.7188 +0.6875 0.9688 0.75 +0.6875 0.9688 0.7812 +0.6875 0.9688 0.8125 +0.6875 0.9688 0.8438 +0.6875 0.9688 0.875 +0.6875 0.9688 0.9062 +0.6875 0.9688 0.9375 +0.6875 0.9688 0.9688 +0.6875 0.9688 1 +0.6875 1 0 +0.6875 1 0.03125 +0.6875 1 0.0625 +0.6875 1 0.09375 +0.6875 1 0.125 +0.6875 1 0.1562 +0.6875 1 0.1875 +0.6875 1 0.2188 +0.6875 1 0.25 +0.6875 1 0.2812 +0.6875 1 0.3125 +0.6875 1 0.3438 +0.6875 1 0.375 +0.6875 1 0.4062 +0.6875 1 0.4375 +0.6875 1 0.4688 +0.6875 1 0.5 +0.6875 1 0.5312 +0.6875 1 0.5625 +0.6875 1 0.5938 +0.6875 1 0.625 +0.6875 1 0.6562 +0.6875 1 0.6875 +0.6875 1 0.7188 +0.6875 1 0.75 +0.6875 1 0.7812 +0.6875 1 0.8125 +0.6875 1 0.8438 +0.6875 1 0.875 +0.6875 1 0.9062 +0.6875 1 0.9375 +0.6875 1 0.9688 +0.6875 1 1 +0.7188 0 0 +0.7188 0 0.03125 +0.7188 0 0.0625 +0.7188 0 0.09375 +0.7188 0 0.125 +0.7188 0 0.1562 +0.7188 0 0.1875 +0.7188 0 0.2188 +0.7188 0 0.25 +0.7188 0 0.2812 +0.7188 0 0.3125 +0.7188 0 0.3438 +0.7188 0 0.375 +0.7188 0 0.4062 +0.7188 0 0.4375 +0.7188 0 0.4688 +0.7188 0 0.5 +0.7188 0 0.5312 +0.7188 0 0.5625 +0.7188 0 0.5938 +0.7188 0 0.625 +0.7188 0 0.6562 +0.7188 0 0.6875 +0.7188 0 0.7188 +0.7188 0 0.75 +0.7188 0 0.7812 +0.7188 0 0.8125 +0.7188 0 0.8438 +0.7188 0 0.875 +0.7188 0 0.9062 +0.7188 0 0.9375 +0.7188 0 0.9688 +0.7188 0 1 +0.7188 0.03125 0 +0.7188 0.03125 0.03125 +0.7188 0.03125 0.0625 +0.7188 0.03125 0.09375 +0.7188 0.03125 0.125 +0.7188 0.03125 0.1562 +0.7188 0.03125 0.1875 +0.7188 0.03125 0.2188 +0.7188 0.03125 0.25 +0.7188 0.03125 0.2812 +0.7188 0.03125 0.3125 +0.7188 0.03125 0.3438 +0.7188 0.03125 0.375 +0.7188 0.03125 0.4062 +0.7188 0.03125 0.4375 +0.7188 0.03125 0.4688 +0.7188 0.03125 0.5 +0.7188 0.03125 0.5312 +0.7188 0.03125 0.5625 +0.7188 0.03125 0.5938 +0.7188 0.03125 0.625 +0.7188 0.03125 0.6562 +0.7188 0.03125 0.6875 +0.7188 0.03125 0.7188 +0.7188 0.03125 0.75 +0.7188 0.03125 0.7812 +0.7188 0.03125 0.8125 +0.7188 0.03125 0.8438 +0.7188 0.03125 0.875 +0.7188 0.03125 0.9062 +0.7188 0.03125 0.9375 +0.7188 0.03125 0.9688 +0.7188 0.03125 1 +0.7188 0.0625 0 +0.7188 0.0625 0.03125 +0.7188 0.0625 0.0625 +0.7188 0.0625 0.09375 +0.7188 0.0625 0.125 +0.7188 0.0625 0.1562 +0.7188 0.0625 0.1875 +0.7188 0.0625 0.2188 +0.7188 0.0625 0.25 +0.7188 0.0625 0.2812 +0.7188 0.0625 0.3125 +0.7188 0.0625 0.3438 +0.7188 0.0625 0.375 +0.7188 0.0625 0.4062 +0.7188 0.0625 0.4375 +0.7188 0.0625 0.4688 +0.7188 0.0625 0.5 +0.7188 0.0625 0.5312 +0.7188 0.0625 0.5625 +0.7188 0.0625 0.5938 +0.7188 0.0625 0.625 +0.7188 0.0625 0.6562 +0.7188 0.0625 0.6875 +0.7188 0.0625 0.7188 +0.7188 0.0625 0.75 +0.7188 0.0625 0.7812 +0.7188 0.0625 0.8125 +0.7188 0.0625 0.8438 +0.7188 0.0625 0.875 +0.7188 0.0625 0.9062 +0.7188 0.0625 0.9375 +0.7188 0.0625 0.9688 +0.7188 0.0625 1 +0.7188 0.09375 0 +0.7188 0.09375 0.03125 +0.7188 0.09375 0.0625 +0.7188 0.09375 0.09375 +0.7188 0.09375 0.125 +0.7188 0.09375 0.1562 +0.7188 0.09375 0.1875 +0.7188 0.09375 0.2188 +0.7188 0.09375 0.25 +0.7188 0.09375 0.2812 +0.7188 0.09375 0.3125 +0.7188 0.09375 0.3438 +0.7188 0.09375 0.375 +0.7188 0.09375 0.4062 +0.7188 0.09375 0.4375 +0.7188 0.09375 0.4688 +0.7188 0.09375 0.5 +0.7188 0.09375 0.5312 +0.7188 0.09375 0.5625 +0.7188 0.09375 0.5938 +0.7188 0.09375 0.625 +0.7188 0.09375 0.6562 +0.7188 0.09375 0.6875 +0.7188 0.09375 0.7188 +0.7188 0.09375 0.75 +0.7188 0.09375 0.7812 +0.7188 0.09375 0.8125 +0.7188 0.09375 0.8438 +0.7188 0.09375 0.875 +0.7188 0.09375 0.9062 +0.7188 0.09375 0.9375 +0.7188 0.09375 0.9688 +0.7188 0.09375 1 +0.7188 0.125 0 +0.7188 0.125 0.03125 +0.7188 0.125 0.0625 +0.7188 0.125 0.09375 +0.7188 0.125 0.125 +0.7188 0.125 0.1562 +0.7188 0.125 0.1875 +0.7188 0.125 0.2188 +0.7188 0.125 0.25 +0.7188 0.125 0.2812 +0.7188 0.125 0.3125 +0.7188 0.125 0.3438 +0.7188 0.125 0.375 +0.7188 0.125 0.4062 +0.7188 0.125 0.4375 +0.7188 0.125 0.4688 +0.7188 0.125 0.5 +0.7188 0.125 0.5312 +0.7188 0.125 0.5625 +0.7188 0.125 0.5938 +0.7188 0.125 0.625 +0.7188 0.125 0.6562 +0.7188 0.125 0.6875 +0.7188 0.125 0.7188 +0.7188 0.125 0.75 +0.7188 0.125 0.7812 +0.7188 0.125 0.8125 +0.7188 0.125 0.8438 +0.7188 0.125 0.875 +0.7188 0.125 0.9062 +0.7188 0.125 0.9375 +0.7188 0.125 0.9688 +0.7188 0.125 1 +0.7188 0.1562 0 +0.7188 0.1562 0.03125 +0.7188 0.1562 0.0625 +0.7188 0.1562 0.09375 +0.7188 0.1562 0.125 +0.7188 0.1562 0.1562 +0.7188 0.1562 0.1875 +0.7188 0.1562 0.2188 +0.7188 0.1562 0.25 +0.7188 0.1562 0.2812 +0.7188 0.1562 0.3125 +0.7188 0.1562 0.3438 +0.7188 0.1562 0.375 +0.7188 0.1562 0.4062 +0.7188 0.1562 0.4375 +0.7188 0.1562 0.4688 +0.7188 0.1562 0.5 +0.7188 0.1562 0.5312 +0.7188 0.1562 0.5625 +0.7188 0.1562 0.5938 +0.7188 0.1562 0.625 +0.7188 0.1562 0.6562 +0.7188 0.1562 0.6875 +0.7188 0.1562 0.7188 +0.7188 0.1562 0.75 +0.7188 0.1562 0.7812 +0.7188 0.1562 0.8125 +0.7188 0.1562 0.8438 +0.7188 0.1562 0.875 +0.7188 0.1562 0.9062 +0.7188 0.1562 0.9375 +0.7188 0.1562 0.9688 +0.7188 0.1562 1 +0.7188 0.1875 0 +0.7188 0.1875 0.03125 +0.7188 0.1875 0.0625 +0.7188 0.1875 0.09375 +0.7188 0.1875 0.125 +0.7188 0.1875 0.1562 +0.7188 0.1875 0.1875 +0.7188 0.1875 0.2188 +0.7188 0.1875 0.25 +0.7188 0.1875 0.2812 +0.7188 0.1875 0.3125 +0.7188 0.1875 0.3438 +0.7188 0.1875 0.375 +0.7188 0.1875 0.4062 +0.7188 0.1875 0.4375 +0.7188 0.1875 0.4688 +0.7188 0.1875 0.5 +0.7188 0.1875 0.5312 +0.7188 0.1875 0.5625 +0.7188 0.1875 0.5938 +0.7188 0.1875 0.625 +0.7188 0.1875 0.6562 +0.7188 0.1875 0.6875 +0.7188 0.1875 0.7188 +0.7188 0.1875 0.75 +0.7188 0.1875 0.7812 +0.7188 0.1875 0.8125 +0.7188 0.1875 0.8438 +0.7188 0.1875 0.875 +0.7188 0.1875 0.9062 +0.7188 0.1875 0.9375 +0.7188 0.1875 0.9688 +0.7188 0.1875 1 +0.7188 0.2188 0 +0.7188 0.2188 0.03125 +0.7188 0.2188 0.0625 +0.7188 0.2188 0.09375 +0.7188 0.2188 0.125 +0.7188 0.2188 0.1562 +0.7188 0.2188 0.1875 +0.7188 0.2188 0.2188 +0.7188 0.2188 0.25 +0.7188 0.2188 0.2812 +0.7188 0.2188 0.3125 +0.7188 0.2188 0.3438 +0.7188 0.2188 0.375 +0.7188 0.2188 0.4062 +0.7188 0.2188 0.4375 +0.7188 0.2188 0.4688 +0.7188 0.2188 0.5 +0.7188 0.2188 0.5312 +0.7188 0.2188 0.5625 +0.7188 0.2188 0.5938 +0.7188 0.2188 0.625 +0.7188 0.2188 0.6562 +0.7188 0.2188 0.6875 +0.7188 0.2188 0.7188 +0.7188 0.2188 0.75 +0.7188 0.2188 0.7812 +0.7188 0.2188 0.8125 +0.7188 0.2188 0.8438 +0.7188 0.2188 0.875 +0.7188 0.2188 0.9062 +0.7188 0.2188 0.9375 +0.7188 0.2188 0.9688 +0.7188 0.2188 1 +0.7188 0.25 0 +0.7188 0.25 0.03125 +0.7188 0.25 0.0625 +0.7188 0.25 0.09375 +0.7188 0.25 0.125 +0.7188 0.25 0.1562 +0.7188 0.25 0.1875 +0.7188 0.25 0.2188 +0.7188 0.25 0.25 +0.7188 0.25 0.2812 +0.7188 0.25 0.3125 +0.7188 0.25 0.3438 +0.7188 0.25 0.375 +0.7188 0.25 0.4062 +0.7188 0.25 0.4375 +0.7188 0.25 0.4688 +0.7188 0.25 0.5 +0.7188 0.25 0.5312 +0.7188 0.25 0.5625 +0.7188 0.25 0.5938 +0.7188 0.25 0.625 +0.7188 0.25 0.6562 +0.7188 0.25 0.6875 +0.7188 0.25 0.7188 +0.7188 0.25 0.75 +0.7188 0.25 0.7812 +0.7188 0.25 0.8125 +0.7188 0.25 0.8438 +0.7188 0.25 0.875 +0.7188 0.25 0.9062 +0.7188 0.25 0.9375 +0.7188 0.25 0.9688 +0.7188 0.25 1 +0.7188 0.2812 0 +0.7188 0.2812 0.03125 +0.7188 0.2812 0.0625 +0.7188 0.2812 0.09375 +0.7188 0.2812 0.125 +0.7188 0.2812 0.1562 +0.7188 0.2812 0.1875 +0.7188 0.2812 0.2188 +0.7188 0.2812 0.25 +0.7188 0.2812 0.2812 +0.7188 0.2812 0.3125 +0.7188 0.2812 0.3438 +0.7188 0.2812 0.375 +0.7188 0.2812 0.4062 +0.7188 0.2812 0.4375 +0.7188 0.2812 0.4688 +0.7188 0.2812 0.5 +0.7188 0.2812 0.5312 +0.7188 0.2812 0.5625 +0.7188 0.2812 0.5938 +0.7188 0.2812 0.625 +0.7188 0.2812 0.6562 +0.7188 0.2812 0.6875 +0.7188 0.2812 0.7188 +0.7188 0.2812 0.75 +0.7188 0.2812 0.7812 +0.7188 0.2812 0.8125 +0.7188 0.2812 0.8438 +0.7188 0.2812 0.875 +0.7188 0.2812 0.9062 +0.7188 0.2812 0.9375 +0.7188 0.2812 0.9688 +0.7188 0.2812 1 +0.7188 0.3125 0 +0.7188 0.3125 0.03125 +0.7188 0.3125 0.0625 +0.7188 0.3125 0.09375 +0.7188 0.3125 0.125 +0.7188 0.3125 0.1562 +0.7188 0.3125 0.1875 +0.7188 0.3125 0.2188 +0.7188 0.3125 0.25 +0.7188 0.3125 0.2812 +0.7188 0.3125 0.3125 +0.7188 0.3125 0.3438 +0.7188 0.3125 0.375 +0.7188 0.3125 0.4062 +0.7188 0.3125 0.4375 +0.7188 0.3125 0.4688 +0.7188 0.3125 0.5 +0.7188 0.3125 0.5312 +0.7188 0.3125 0.5625 +0.7188 0.3125 0.5938 +0.7188 0.3125 0.625 +0.7188 0.3125 0.6562 +0.7188 0.3125 0.6875 +0.7188 0.3125 0.7188 +0.7188 0.3125 0.75 +0.7188 0.3125 0.7812 +0.7188 0.3125 0.8125 +0.7188 0.3125 0.8438 +0.7188 0.3125 0.875 +0.7188 0.3125 0.9062 +0.7188 0.3125 0.9375 +0.7188 0.3125 0.9688 +0.7188 0.3125 1 +0.7188 0.3438 0 +0.7188 0.3438 0.03125 +0.7188 0.3438 0.0625 +0.7188 0.3438 0.09375 +0.7188 0.3438 0.125 +0.7188 0.3438 0.1562 +0.7188 0.3438 0.1875 +0.7188 0.3438 0.2188 +0.7188 0.3438 0.25 +0.7188 0.3438 0.2812 +0.7188 0.3438 0.3125 +0.7188 0.3438 0.3438 +0.7188 0.3438 0.375 +0.7188 0.3438 0.4062 +0.7188 0.3438 0.4375 +0.7188 0.3438 0.4688 +0.7188 0.3438 0.5 +0.7188 0.3438 0.5312 +0.7188 0.3438 0.5625 +0.7188 0.3438 0.5938 +0.7188 0.3438 0.625 +0.7188 0.3438 0.6562 +0.7188 0.3438 0.6875 +0.7188 0.3438 0.7188 +0.7188 0.3438 0.75 +0.7188 0.3438 0.7812 +0.7188 0.3438 0.8125 +0.7188 0.3438 0.8438 +0.7188 0.3438 0.875 +0.7188 0.3438 0.9062 +0.7188 0.3438 0.9375 +0.7188 0.3438 0.9688 +0.7188 0.3438 1 +0.7188 0.375 0 +0.7188 0.375 0.03125 +0.7188 0.375 0.0625 +0.7188 0.375 0.09375 +0.7188 0.375 0.125 +0.7188 0.375 0.1562 +0.7188 0.375 0.1875 +0.7188 0.375 0.2188 +0.7188 0.375 0.25 +0.7188 0.375 0.2812 +0.7188 0.375 0.3125 +0.7188 0.375 0.3438 +0.7188 0.375 0.375 +0.7188 0.375 0.4062 +0.7188 0.375 0.4375 +0.7188 0.375 0.4688 +0.7188 0.375 0.5 +0.7188 0.375 0.5312 +0.7188 0.375 0.5625 +0.7188 0.375 0.5938 +0.7188 0.375 0.625 +0.7188 0.375 0.6562 +0.7188 0.375 0.6875 +0.7188 0.375 0.7188 +0.7188 0.375 0.75 +0.7188 0.375 0.7812 +0.7188 0.375 0.8125 +0.7188 0.375 0.8438 +0.7188 0.375 0.875 +0.7188 0.375 0.9062 +0.7188 0.375 0.9375 +0.7188 0.375 0.9688 +0.7188 0.375 1 +0.7188 0.4062 0 +0.7188 0.4062 0.03125 +0.7188 0.4062 0.0625 +0.7188 0.4062 0.09375 +0.7188 0.4062 0.125 +0.7188 0.4062 0.1562 +0.7188 0.4062 0.1875 +0.7188 0.4062 0.2188 +0.7188 0.4062 0.25 +0.7188 0.4062 0.2812 +0.7188 0.4062 0.3125 +0.7188 0.4062 0.3438 +0.7188 0.4062 0.375 +0.7188 0.4062 0.4062 +0.7188 0.4062 0.4375 +0.7188 0.4062 0.4688 +0.7188 0.4062 0.5 +0.7188 0.4062 0.5312 +0.7188 0.4062 0.5625 +0.7188 0.4062 0.5938 +0.7188 0.4062 0.625 +0.7188 0.4062 0.6562 +0.7188 0.4062 0.6875 +0.7188 0.4062 0.7188 +0.7188 0.4062 0.75 +0.7188 0.4062 0.7812 +0.7188 0.4062 0.8125 +0.7188 0.4062 0.8438 +0.7188 0.4062 0.875 +0.7188 0.4062 0.9062 +0.7188 0.4062 0.9375 +0.7188 0.4062 0.9688 +0.7188 0.4062 1 +0.7188 0.4375 0 +0.7188 0.4375 0.03125 +0.7188 0.4375 0.0625 +0.7188 0.4375 0.09375 +0.7188 0.4375 0.125 +0.7188 0.4375 0.1562 +0.7188 0.4375 0.1875 +0.7188 0.4375 0.2188 +0.7188 0.4375 0.25 +0.7188 0.4375 0.2812 +0.7188 0.4375 0.3125 +0.7188 0.4375 0.3438 +0.7188 0.4375 0.375 +0.7188 0.4375 0.4062 +0.7188 0.4375 0.4375 +0.7188 0.4375 0.4688 +0.7188 0.4375 0.5 +0.7188 0.4375 0.5312 +0.7188 0.4375 0.5625 +0.7188 0.4375 0.5938 +0.7188 0.4375 0.625 +0.7188 0.4375 0.6562 +0.7188 0.4375 0.6875 +0.7188 0.4375 0.7188 +0.7188 0.4375 0.75 +0.7188 0.4375 0.7812 +0.7188 0.4375 0.8125 +0.7188 0.4375 0.8438 +0.7188 0.4375 0.875 +0.7188 0.4375 0.9062 +0.7188 0.4375 0.9375 +0.7188 0.4375 0.9688 +0.7188 0.4375 1 +0.7188 0.4688 0 +0.7188 0.4688 0.03125 +0.7188 0.4688 0.0625 +0.7188 0.4688 0.09375 +0.7188 0.4688 0.125 +0.7188 0.4688 0.1562 +0.7188 0.4688 0.1875 +0.7188 0.4688 0.2188 +0.7188 0.4688 0.25 +0.7188 0.4688 0.2812 +0.7188 0.4688 0.3125 +0.7188 0.4688 0.3438 +0.7188 0.4688 0.375 +0.7188 0.4688 0.4062 +0.7188 0.4688 0.4375 +0.7188 0.4688 0.4688 +0.7188 0.4688 0.5 +0.7188 0.4688 0.5312 +0.7188 0.4688 0.5625 +0.7188 0.4688 0.5938 +0.7188 0.4688 0.625 +0.7188 0.4688 0.6562 +0.7188 0.4688 0.6875 +0.7188 0.4688 0.7188 +0.7188 0.4688 0.75 +0.7188 0.4688 0.7812 +0.7188 0.4688 0.8125 +0.7188 0.4688 0.8438 +0.7188 0.4688 0.875 +0.7188 0.4688 0.9062 +0.7188 0.4688 0.9375 +0.7188 0.4688 0.9688 +0.7188 0.4688 1 +0.7188 0.5 0 +0.7188 0.5 0.03125 +0.7188 0.5 0.0625 +0.7188 0.5 0.09375 +0.7188 0.5 0.125 +0.7188 0.5 0.1562 +0.7188 0.5 0.1875 +0.7188 0.5 0.2188 +0.7188 0.5 0.25 +0.7188 0.5 0.2812 +0.7188 0.5 0.3125 +0.7188 0.5 0.3438 +0.7188 0.5 0.375 +0.7188 0.5 0.4062 +0.7188 0.5 0.4375 +0.7188 0.5 0.4688 +0.7188 0.5 0.5 +0.7188 0.5 0.5312 +0.7188 0.5 0.5625 +0.7188 0.5 0.5938 +0.7188 0.5 0.625 +0.7188 0.5 0.6562 +0.7188 0.5 0.6875 +0.7188 0.5 0.7188 +0.7188 0.5 0.75 +0.7188 0.5 0.7812 +0.7188 0.5 0.8125 +0.7188 0.5 0.8438 +0.7188 0.5 0.875 +0.7188 0.5 0.9062 +0.7188 0.5 0.9375 +0.7188 0.5 0.9688 +0.7188 0.5 1 +0.7188 0.5312 0 +0.7188 0.5312 0.03125 +0.7188 0.5312 0.0625 +0.7188 0.5312 0.09375 +0.7188 0.5312 0.125 +0.7188 0.5312 0.1562 +0.7188 0.5312 0.1875 +0.7188 0.5312 0.2188 +0.7188 0.5312 0.25 +0.7188 0.5312 0.2812 +0.7188 0.5312 0.3125 +0.7188 0.5312 0.3438 +0.7188 0.5312 0.375 +0.7188 0.5312 0.4062 +0.7188 0.5312 0.4375 +0.7188 0.5312 0.4688 +0.7188 0.5312 0.5 +0.7188 0.5312 0.5312 +0.7188 0.5312 0.5625 +0.7188 0.5312 0.5938 +0.7188 0.5312 0.625 +0.7188 0.5312 0.6562 +0.7188 0.5312 0.6875 +0.7188 0.5312 0.7188 +0.7188 0.5312 0.75 +0.7188 0.5312 0.7812 +0.7188 0.5312 0.8125 +0.7188 0.5312 0.8438 +0.7188 0.5312 0.875 +0.7188 0.5312 0.9062 +0.7188 0.5312 0.9375 +0.7188 0.5312 0.9688 +0.7188 0.5312 1 +0.7188 0.5625 0 +0.7188 0.5625 0.03125 +0.7188 0.5625 0.0625 +0.7188 0.5625 0.09375 +0.7188 0.5625 0.125 +0.7188 0.5625 0.1562 +0.7188 0.5625 0.1875 +0.7188 0.5625 0.2188 +0.7188 0.5625 0.25 +0.7188 0.5625 0.2812 +0.7188 0.5625 0.3125 +0.7188 0.5625 0.3438 +0.7188 0.5625 0.375 +0.7188 0.5625 0.4062 +0.7188 0.5625 0.4375 +0.7188 0.5625 0.4688 +0.7188 0.5625 0.5 +0.7188 0.5625 0.5312 +0.7188 0.5625 0.5625 +0.7188 0.5625 0.5938 +0.7188 0.5625 0.625 +0.7188 0.5625 0.6562 +0.7188 0.5625 0.6875 +0.7188 0.5625 0.7188 +0.7188 0.5625 0.75 +0.7188 0.5625 0.7812 +0.7188 0.5625 0.8125 +0.7188 0.5625 0.8438 +0.7188 0.5625 0.875 +0.7188 0.5625 0.9062 +0.7188 0.5625 0.9375 +0.7188 0.5625 0.9688 +0.7188 0.5625 1 +0.7188 0.5938 0 +0.7188 0.5938 0.03125 +0.7188 0.5938 0.0625 +0.7188 0.5938 0.09375 +0.7188 0.5938 0.125 +0.7188 0.5938 0.1562 +0.7188 0.5938 0.1875 +0.7188 0.5938 0.2188 +0.7188 0.5938 0.25 +0.7188 0.5938 0.2812 +0.7188 0.5938 0.3125 +0.7188 0.5938 0.3438 +0.7188 0.5938 0.375 +0.7188 0.5938 0.4062 +0.7188 0.5938 0.4375 +0.7188 0.5938 0.4688 +0.7188 0.5938 0.5 +0.7188 0.5938 0.5312 +0.7188 0.5938 0.5625 +0.7188 0.5938 0.5938 +0.7188 0.5938 0.625 +0.7188 0.5938 0.6562 +0.7188 0.5938 0.6875 +0.7188 0.5938 0.7188 +0.7188 0.5938 0.75 +0.7188 0.5938 0.7812 +0.7188 0.5938 0.8125 +0.7188 0.5938 0.8438 +0.7188 0.5938 0.875 +0.7188 0.5938 0.9062 +0.7188 0.5938 0.9375 +0.7188 0.5938 0.9688 +0.7188 0.5938 1 +0.7188 0.625 0 +0.7188 0.625 0.03125 +0.7188 0.625 0.0625 +0.7188 0.625 0.09375 +0.7188 0.625 0.125 +0.7188 0.625 0.1562 +0.7188 0.625 0.1875 +0.7188 0.625 0.2188 +0.7188 0.625 0.25 +0.7188 0.625 0.2812 +0.7188 0.625 0.3125 +0.7188 0.625 0.3438 +0.7188 0.625 0.375 +0.7188 0.625 0.4062 +0.7188 0.625 0.4375 +0.7188 0.625 0.4688 +0.7188 0.625 0.5 +0.7188 0.625 0.5312 +0.7188 0.625 0.5625 +0.7188 0.625 0.5938 +0.7188 0.625 0.625 +0.7188 0.625 0.6562 +0.7188 0.625 0.6875 +0.7188 0.625 0.7188 +0.7188 0.625 0.75 +0.7188 0.625 0.7812 +0.7188 0.625 0.8125 +0.7188 0.625 0.8438 +0.7188 0.625 0.875 +0.7188 0.625 0.9062 +0.7188 0.625 0.9375 +0.7188 0.625 0.9688 +0.7188 0.625 1 +0.7188 0.6562 0 +0.7188 0.6562 0.03125 +0.7188 0.6562 0.0625 +0.7188 0.6562 0.09375 +0.7188 0.6562 0.125 +0.7188 0.6562 0.1562 +0.7188 0.6562 0.1875 +0.7188 0.6562 0.2188 +0.7188 0.6562 0.25 +0.7188 0.6562 0.2812 +0.7188 0.6562 0.3125 +0.7188 0.6562 0.3438 +0.7188 0.6562 0.375 +0.7188 0.6562 0.4062 +0.7188 0.6562 0.4375 +0.7188 0.6562 0.4688 +0.7188 0.6562 0.5 +0.7188 0.6562 0.5312 +0.7188 0.6562 0.5625 +0.7188 0.6562 0.5938 +0.7188 0.6562 0.625 +0.7188 0.6562 0.6562 +0.7188 0.6562 0.6875 +0.7188 0.6562 0.7188 +0.7188 0.6562 0.75 +0.7188 0.6562 0.7812 +0.7188 0.6562 0.8125 +0.7188 0.6562 0.8438 +0.7188 0.6562 0.875 +0.7188 0.6562 0.9062 +0.7188 0.6562 0.9375 +0.7188 0.6562 0.9688 +0.7188 0.6562 1 +0.7188 0.6875 0 +0.7188 0.6875 0.03125 +0.7188 0.6875 0.0625 +0.7188 0.6875 0.09375 +0.7188 0.6875 0.125 +0.7188 0.6875 0.1562 +0.7188 0.6875 0.1875 +0.7188 0.6875 0.2188 +0.7188 0.6875 0.25 +0.7188 0.6875 0.2812 +0.7188 0.6875 0.3125 +0.7188 0.6875 0.3438 +0.7188 0.6875 0.375 +0.7188 0.6875 0.4062 +0.7188 0.6875 0.4375 +0.7188 0.6875 0.4688 +0.7188 0.6875 0.5 +0.7188 0.6875 0.5312 +0.7188 0.6875 0.5625 +0.7188 0.6875 0.5938 +0.7188 0.6875 0.625 +0.7188 0.6875 0.6562 +0.7188 0.6875 0.6875 +0.7188 0.6875 0.7188 +0.7188 0.6875 0.75 +0.7188 0.6875 0.7812 +0.7188 0.6875 0.8125 +0.7188 0.6875 0.8438 +0.7188 0.6875 0.875 +0.7188 0.6875 0.9062 +0.7188 0.6875 0.9375 +0.7188 0.6875 0.9688 +0.7188 0.6875 1 +0.7188 0.7188 0 +0.7188 0.7188 0.03125 +0.7188 0.7188 0.0625 +0.7188 0.7188 0.09375 +0.7188 0.7188 0.125 +0.7188 0.7188 0.1562 +0.7188 0.7188 0.1875 +0.7188 0.7188 0.2188 +0.7188 0.7188 0.25 +0.7188 0.7188 0.2812 +0.7188 0.7188 0.3125 +0.7188 0.7188 0.3438 +0.7188 0.7188 0.375 +0.7188 0.7188 0.4062 +0.7188 0.7188 0.4375 +0.7188 0.7188 0.4688 +0.7188 0.7188 0.5 +0.7188 0.7188 0.5312 +0.7188 0.7188 0.5625 +0.7188 0.7188 0.5938 +0.7188 0.7188 0.625 +0.7188 0.7188 0.6562 +0.7188 0.7188 0.6875 +0.7188 0.7188 0.7188 +0.7188 0.7188 0.75 +0.7188 0.7188 0.7812 +0.7188 0.7188 0.8125 +0.7188 0.7188 0.8438 +0.7188 0.7188 0.875 +0.7188 0.7188 0.9062 +0.7188 0.7188 0.9375 +0.7188 0.7188 0.9688 +0.7188 0.7188 1 +0.7188 0.75 0 +0.7188 0.75 0.03125 +0.7188 0.75 0.0625 +0.7188 0.75 0.09375 +0.7188 0.75 0.125 +0.7188 0.75 0.1562 +0.7188 0.75 0.1875 +0.7188 0.75 0.2188 +0.7188 0.75 0.25 +0.7188 0.75 0.2812 +0.7188 0.75 0.3125 +0.7188 0.75 0.3438 +0.7188 0.75 0.375 +0.7188 0.75 0.4062 +0.7188 0.75 0.4375 +0.7188 0.75 0.4688 +0.7188 0.75 0.5 +0.7188 0.75 0.5312 +0.7188 0.75 0.5625 +0.7188 0.75 0.5938 +0.7188 0.75 0.625 +0.7188 0.75 0.6562 +0.7188 0.75 0.6875 +0.7188 0.75 0.7188 +0.7188 0.75 0.75 +0.7188 0.75 0.7812 +0.7188 0.75 0.8125 +0.7188 0.75 0.8438 +0.7188 0.75 0.875 +0.7188 0.75 0.9062 +0.7188 0.75 0.9375 +0.7188 0.75 0.9688 +0.7188 0.75 1 +0.7188 0.7812 0 +0.7188 0.7812 0.03125 +0.7188 0.7812 0.0625 +0.7188 0.7812 0.09375 +0.7188 0.7812 0.125 +0.7188 0.7812 0.1562 +0.7188 0.7812 0.1875 +0.7188 0.7812 0.2188 +0.7188 0.7812 0.25 +0.7188 0.7812 0.2812 +0.7188 0.7812 0.3125 +0.7188 0.7812 0.3438 +0.7188 0.7812 0.375 +0.7188 0.7812 0.4062 +0.7188 0.7812 0.4375 +0.7188 0.7812 0.4688 +0.7188 0.7812 0.5 +0.7188 0.7812 0.5312 +0.7188 0.7812 0.5625 +0.7188 0.7812 0.5938 +0.7188 0.7812 0.625 +0.7188 0.7812 0.6562 +0.7188 0.7812 0.6875 +0.7188 0.7812 0.7188 +0.7188 0.7812 0.75 +0.7188 0.7812 0.7812 +0.7188 0.7812 0.8125 +0.7188 0.7812 0.8438 +0.7188 0.7812 0.875 +0.7188 0.7812 0.9062 +0.7188 0.7812 0.9375 +0.7188 0.7812 0.9688 +0.7188 0.7812 1 +0.7188 0.8125 0 +0.7188 0.8125 0.03125 +0.7188 0.8125 0.0625 +0.7188 0.8125 0.09375 +0.7188 0.8125 0.125 +0.7188 0.8125 0.1562 +0.7188 0.8125 0.1875 +0.7188 0.8125 0.2188 +0.7188 0.8125 0.25 +0.7188 0.8125 0.2812 +0.7188 0.8125 0.3125 +0.7188 0.8125 0.3438 +0.7188 0.8125 0.375 +0.7188 0.8125 0.4062 +0.7188 0.8125 0.4375 +0.7188 0.8125 0.4688 +0.7188 0.8125 0.5 +0.7188 0.8125 0.5312 +0.7188 0.8125 0.5625 +0.7188 0.8125 0.5938 +0.7188 0.8125 0.625 +0.7188 0.8125 0.6562 +0.7188 0.8125 0.6875 +0.7188 0.8125 0.7188 +0.7188 0.8125 0.75 +0.7188 0.8125 0.7812 +0.7188 0.8125 0.8125 +0.7188 0.8125 0.8438 +0.7188 0.8125 0.875 +0.7188 0.8125 0.9062 +0.7188 0.8125 0.9375 +0.7188 0.8125 0.9688 +0.7188 0.8125 1 +0.7188 0.8438 0 +0.7188 0.8438 0.03125 +0.7188 0.8438 0.0625 +0.7188 0.8438 0.09375 +0.7188 0.8438 0.125 +0.7188 0.8438 0.1562 +0.7188 0.8438 0.1875 +0.7188 0.8438 0.2188 +0.7188 0.8438 0.25 +0.7188 0.8438 0.2812 +0.7188 0.8438 0.3125 +0.7188 0.8438 0.3438 +0.7188 0.8438 0.375 +0.7188 0.8438 0.4062 +0.7188 0.8438 0.4375 +0.7188 0.8438 0.4688 +0.7188 0.8438 0.5 +0.7188 0.8438 0.5312 +0.7188 0.8438 0.5625 +0.7188 0.8438 0.5938 +0.7188 0.8438 0.625 +0.7188 0.8438 0.6562 +0.7188 0.8438 0.6875 +0.7188 0.8438 0.7188 +0.7188 0.8438 0.75 +0.7188 0.8438 0.7812 +0.7188 0.8438 0.8125 +0.7188 0.8438 0.8438 +0.7188 0.8438 0.875 +0.7188 0.8438 0.9062 +0.7188 0.8438 0.9375 +0.7188 0.8438 0.9688 +0.7188 0.8438 1 +0.7188 0.875 0 +0.7188 0.875 0.03125 +0.7188 0.875 0.0625 +0.7188 0.875 0.09375 +0.7188 0.875 0.125 +0.7188 0.875 0.1562 +0.7188 0.875 0.1875 +0.7188 0.875 0.2188 +0.7188 0.875 0.25 +0.7188 0.875 0.2812 +0.7188 0.875 0.3125 +0.7188 0.875 0.3438 +0.7188 0.875 0.375 +0.7188 0.875 0.4062 +0.7188 0.875 0.4375 +0.7188 0.875 0.4688 +0.7188 0.875 0.5 +0.7188 0.875 0.5312 +0.7188 0.875 0.5625 +0.7188 0.875 0.5938 +0.7188 0.875 0.625 +0.7188 0.875 0.6562 +0.7188 0.875 0.6875 +0.7188 0.875 0.7188 +0.7188 0.875 0.75 +0.7188 0.875 0.7812 +0.7188 0.875 0.8125 +0.7188 0.875 0.8438 +0.7188 0.875 0.875 +0.7188 0.875 0.9062 +0.7188 0.875 0.9375 +0.7188 0.875 0.9688 +0.7188 0.875 1 +0.7188 0.9062 0 +0.7188 0.9062 0.03125 +0.7188 0.9062 0.0625 +0.7188 0.9062 0.09375 +0.7188 0.9062 0.125 +0.7188 0.9062 0.1562 +0.7188 0.9062 0.1875 +0.7188 0.9062 0.2188 +0.7188 0.9062 0.25 +0.7188 0.9062 0.2812 +0.7188 0.9062 0.3125 +0.7188 0.9062 0.3438 +0.7188 0.9062 0.375 +0.7188 0.9062 0.4062 +0.7188 0.9062 0.4375 +0.7188 0.9062 0.4688 +0.7188 0.9062 0.5 +0.7188 0.9062 0.5312 +0.7188 0.9062 0.5625 +0.7188 0.9062 0.5938 +0.7188 0.9062 0.625 +0.7188 0.9062 0.6562 +0.7188 0.9062 0.6875 +0.7188 0.9062 0.7188 +0.7188 0.9062 0.75 +0.7188 0.9062 0.7812 +0.7188 0.9062 0.8125 +0.7188 0.9062 0.8438 +0.7188 0.9062 0.875 +0.7188 0.9062 0.9062 +0.7188 0.9062 0.9375 +0.7188 0.9062 0.9688 +0.7188 0.9062 1 +0.7188 0.9375 0 +0.7188 0.9375 0.03125 +0.7188 0.9375 0.0625 +0.7188 0.9375 0.09375 +0.7188 0.9375 0.125 +0.7188 0.9375 0.1562 +0.7188 0.9375 0.1875 +0.7188 0.9375 0.2188 +0.7188 0.9375 0.25 +0.7188 0.9375 0.2812 +0.7188 0.9375 0.3125 +0.7188 0.9375 0.3438 +0.7188 0.9375 0.375 +0.7188 0.9375 0.4062 +0.7188 0.9375 0.4375 +0.7188 0.9375 0.4688 +0.7188 0.9375 0.5 +0.7188 0.9375 0.5312 +0.7188 0.9375 0.5625 +0.7188 0.9375 0.5938 +0.7188 0.9375 0.625 +0.7188 0.9375 0.6562 +0.7188 0.9375 0.6875 +0.7188 0.9375 0.7188 +0.7188 0.9375 0.75 +0.7188 0.9375 0.7812 +0.7188 0.9375 0.8125 +0.7188 0.9375 0.8438 +0.7188 0.9375 0.875 +0.7188 0.9375 0.9062 +0.7188 0.9375 0.9375 +0.7188 0.9375 0.9688 +0.7188 0.9375 1 +0.7188 0.9688 0 +0.7188 0.9688 0.03125 +0.7188 0.9688 0.0625 +0.7188 0.9688 0.09375 +0.7188 0.9688 0.125 +0.7188 0.9688 0.1562 +0.7188 0.9688 0.1875 +0.7188 0.9688 0.2188 +0.7188 0.9688 0.25 +0.7188 0.9688 0.2812 +0.7188 0.9688 0.3125 +0.7188 0.9688 0.3438 +0.7188 0.9688 0.375 +0.7188 0.9688 0.4062 +0.7188 0.9688 0.4375 +0.7188 0.9688 0.4688 +0.7188 0.9688 0.5 +0.7188 0.9688 0.5312 +0.7188 0.9688 0.5625 +0.7188 0.9688 0.5938 +0.7188 0.9688 0.625 +0.7188 0.9688 0.6562 +0.7188 0.9688 0.6875 +0.7188 0.9688 0.7188 +0.7188 0.9688 0.75 +0.7188 0.9688 0.7812 +0.7188 0.9688 0.8125 +0.7188 0.9688 0.8438 +0.7188 0.9688 0.875 +0.7188 0.9688 0.9062 +0.7188 0.9688 0.9375 +0.7188 0.9688 0.9688 +0.7188 0.9688 1 +0.7188 1 0 +0.7188 1 0.03125 +0.7188 1 0.0625 +0.7188 1 0.09375 +0.7188 1 0.125 +0.7188 1 0.1562 +0.7188 1 0.1875 +0.7188 1 0.2188 +0.7188 1 0.25 +0.7188 1 0.2812 +0.7188 1 0.3125 +0.7188 1 0.3438 +0.7188 1 0.375 +0.7188 1 0.4062 +0.7188 1 0.4375 +0.7188 1 0.4688 +0.7188 1 0.5 +0.7188 1 0.5312 +0.7188 1 0.5625 +0.7188 1 0.5938 +0.7188 1 0.625 +0.7188 1 0.6562 +0.7188 1 0.6875 +0.7188 1 0.7188 +0.7188 1 0.75 +0.7188 1 0.7812 +0.7188 1 0.8125 +0.7188 1 0.8438 +0.7188 1 0.875 +0.7188 1 0.9062 +0.7188 1 0.9375 +0.7188 1 0.9688 +0.7188 1 1 +0.75 0 0 +0.75 0 0.03125 +0.75 0 0.0625 +0.75 0 0.09375 +0.75 0 0.125 +0.75 0 0.1562 +0.75 0 0.1875 +0.75 0 0.2188 +0.75 0 0.25 +0.75 0 0.2812 +0.75 0 0.3125 +0.75 0 0.3438 +0.75 0 0.375 +0.75 0 0.4062 +0.75 0 0.4375 +0.75 0 0.4688 +0.75 0 0.5 +0.75 0 0.5312 +0.75 0 0.5625 +0.75 0 0.5938 +0.75 0 0.625 +0.75 0 0.6562 +0.75 0 0.6875 +0.75 0 0.7188 +0.75 0 0.75 +0.75 0 0.7812 +0.75 0 0.8125 +0.75 0 0.8438 +0.75 0 0.875 +0.75 0 0.9062 +0.75 0 0.9375 +0.75 0 0.9688 +0.75 0 1 +0.75 0.03125 0 +0.75 0.03125 0.03125 +0.75 0.03125 0.0625 +0.75 0.03125 0.09375 +0.75 0.03125 0.125 +0.75 0.03125 0.1562 +0.75 0.03125 0.1875 +0.75 0.03125 0.2188 +0.75 0.03125 0.25 +0.75 0.03125 0.2812 +0.75 0.03125 0.3125 +0.75 0.03125 0.3438 +0.75 0.03125 0.375 +0.75 0.03125 0.4062 +0.75 0.03125 0.4375 +0.75 0.03125 0.4688 +0.75 0.03125 0.5 +0.75 0.03125 0.5312 +0.75 0.03125 0.5625 +0.75 0.03125 0.5938 +0.75 0.03125 0.625 +0.75 0.03125 0.6562 +0.75 0.03125 0.6875 +0.75 0.03125 0.7188 +0.75 0.03125 0.75 +0.75 0.03125 0.7812 +0.75 0.03125 0.8125 +0.75 0.03125 0.8438 +0.75 0.03125 0.875 +0.75 0.03125 0.9062 +0.75 0.03125 0.9375 +0.75 0.03125 0.9688 +0.75 0.03125 1 +0.75 0.0625 0 +0.75 0.0625 0.03125 +0.75 0.0625 0.0625 +0.75 0.0625 0.09375 +0.75 0.0625 0.125 +0.75 0.0625 0.1562 +0.75 0.0625 0.1875 +0.75 0.0625 0.2188 +0.75 0.0625 0.25 +0.75 0.0625 0.2812 +0.75 0.0625 0.3125 +0.75 0.0625 0.3438 +0.75 0.0625 0.375 +0.75 0.0625 0.4062 +0.75 0.0625 0.4375 +0.75 0.0625 0.4688 +0.75 0.0625 0.5 +0.75 0.0625 0.5312 +0.75 0.0625 0.5625 +0.75 0.0625 0.5938 +0.75 0.0625 0.625 +0.75 0.0625 0.6562 +0.75 0.0625 0.6875 +0.75 0.0625 0.7188 +0.75 0.0625 0.75 +0.75 0.0625 0.7812 +0.75 0.0625 0.8125 +0.75 0.0625 0.8438 +0.75 0.0625 0.875 +0.75 0.0625 0.9062 +0.75 0.0625 0.9375 +0.75 0.0625 0.9688 +0.75 0.0625 1 +0.75 0.09375 0 +0.75 0.09375 0.03125 +0.75 0.09375 0.0625 +0.75 0.09375 0.09375 +0.75 0.09375 0.125 +0.75 0.09375 0.1562 +0.75 0.09375 0.1875 +0.75 0.09375 0.2188 +0.75 0.09375 0.25 +0.75 0.09375 0.2812 +0.75 0.09375 0.3125 +0.75 0.09375 0.3438 +0.75 0.09375 0.375 +0.75 0.09375 0.4062 +0.75 0.09375 0.4375 +0.75 0.09375 0.4688 +0.75 0.09375 0.5 +0.75 0.09375 0.5312 +0.75 0.09375 0.5625 +0.75 0.09375 0.5938 +0.75 0.09375 0.625 +0.75 0.09375 0.6562 +0.75 0.09375 0.6875 +0.75 0.09375 0.7188 +0.75 0.09375 0.75 +0.75 0.09375 0.7812 +0.75 0.09375 0.8125 +0.75 0.09375 0.8438 +0.75 0.09375 0.875 +0.75 0.09375 0.9062 +0.75 0.09375 0.9375 +0.75 0.09375 0.9688 +0.75 0.09375 1 +0.75 0.125 0 +0.75 0.125 0.03125 +0.75 0.125 0.0625 +0.75 0.125 0.09375 +0.75 0.125 0.125 +0.75 0.125 0.1562 +0.75 0.125 0.1875 +0.75 0.125 0.2188 +0.75 0.125 0.25 +0.75 0.125 0.2812 +0.75 0.125 0.3125 +0.75 0.125 0.3438 +0.75 0.125 0.375 +0.75 0.125 0.4062 +0.75 0.125 0.4375 +0.75 0.125 0.4688 +0.75 0.125 0.5 +0.75 0.125 0.5312 +0.75 0.125 0.5625 +0.75 0.125 0.5938 +0.75 0.125 0.625 +0.75 0.125 0.6562 +0.75 0.125 0.6875 +0.75 0.125 0.7188 +0.75 0.125 0.75 +0.75 0.125 0.7812 +0.75 0.125 0.8125 +0.75 0.125 0.8438 +0.75 0.125 0.875 +0.75 0.125 0.9062 +0.75 0.125 0.9375 +0.75 0.125 0.9688 +0.75 0.125 1 +0.75 0.1562 0 +0.75 0.1562 0.03125 +0.75 0.1562 0.0625 +0.75 0.1562 0.09375 +0.75 0.1562 0.125 +0.75 0.1562 0.1562 +0.75 0.1562 0.1875 +0.75 0.1562 0.2188 +0.75 0.1562 0.25 +0.75 0.1562 0.2812 +0.75 0.1562 0.3125 +0.75 0.1562 0.3438 +0.75 0.1562 0.375 +0.75 0.1562 0.4062 +0.75 0.1562 0.4375 +0.75 0.1562 0.4688 +0.75 0.1562 0.5 +0.75 0.1562 0.5312 +0.75 0.1562 0.5625 +0.75 0.1562 0.5938 +0.75 0.1562 0.625 +0.75 0.1562 0.6562 +0.75 0.1562 0.6875 +0.75 0.1562 0.7188 +0.75 0.1562 0.75 +0.75 0.1562 0.7812 +0.75 0.1562 0.8125 +0.75 0.1562 0.8438 +0.75 0.1562 0.875 +0.75 0.1562 0.9062 +0.75 0.1562 0.9375 +0.75 0.1562 0.9688 +0.75 0.1562 1 +0.75 0.1875 0 +0.75 0.1875 0.03125 +0.75 0.1875 0.0625 +0.75 0.1875 0.09375 +0.75 0.1875 0.125 +0.75 0.1875 0.1562 +0.75 0.1875 0.1875 +0.75 0.1875 0.2188 +0.75 0.1875 0.25 +0.75 0.1875 0.2812 +0.75 0.1875 0.3125 +0.75 0.1875 0.3438 +0.75 0.1875 0.375 +0.75 0.1875 0.4062 +0.75 0.1875 0.4375 +0.75 0.1875 0.4688 +0.75 0.1875 0.5 +0.75 0.1875 0.5312 +0.75 0.1875 0.5625 +0.75 0.1875 0.5938 +0.75 0.1875 0.625 +0.75 0.1875 0.6562 +0.75 0.1875 0.6875 +0.75 0.1875 0.7188 +0.75 0.1875 0.75 +0.75 0.1875 0.7812 +0.75 0.1875 0.8125 +0.75 0.1875 0.8438 +0.75 0.1875 0.875 +0.75 0.1875 0.9062 +0.75 0.1875 0.9375 +0.75 0.1875 0.9688 +0.75 0.1875 1 +0.75 0.2188 0 +0.75 0.2188 0.03125 +0.75 0.2188 0.0625 +0.75 0.2188 0.09375 +0.75 0.2188 0.125 +0.75 0.2188 0.1562 +0.75 0.2188 0.1875 +0.75 0.2188 0.2188 +0.75 0.2188 0.25 +0.75 0.2188 0.2812 +0.75 0.2188 0.3125 +0.75 0.2188 0.3438 +0.75 0.2188 0.375 +0.75 0.2188 0.4062 +0.75 0.2188 0.4375 +0.75 0.2188 0.4688 +0.75 0.2188 0.5 +0.75 0.2188 0.5312 +0.75 0.2188 0.5625 +0.75 0.2188 0.5938 +0.75 0.2188 0.625 +0.75 0.2188 0.6562 +0.75 0.2188 0.6875 +0.75 0.2188 0.7188 +0.75 0.2188 0.75 +0.75 0.2188 0.7812 +0.75 0.2188 0.8125 +0.75 0.2188 0.8438 +0.75 0.2188 0.875 +0.75 0.2188 0.9062 +0.75 0.2188 0.9375 +0.75 0.2188 0.9688 +0.75 0.2188 1 +0.75 0.25 0 +0.75 0.25 0.03125 +0.75 0.25 0.0625 +0.75 0.25 0.09375 +0.75 0.25 0.125 +0.75 0.25 0.1562 +0.75 0.25 0.1875 +0.75 0.25 0.2188 +0.75 0.25 0.25 +0.75 0.25 0.2812 +0.75 0.25 0.3125 +0.75 0.25 0.3438 +0.75 0.25 0.375 +0.75 0.25 0.4062 +0.75 0.25 0.4375 +0.75 0.25 0.4688 +0.75 0.25 0.5 +0.75 0.25 0.5312 +0.75 0.25 0.5625 +0.75 0.25 0.5938 +0.75 0.25 0.625 +0.75 0.25 0.6562 +0.75 0.25 0.6875 +0.75 0.25 0.7188 +0.75 0.25 0.75 +0.75 0.25 0.7812 +0.75 0.25 0.8125 +0.75 0.25 0.8438 +0.75 0.25 0.875 +0.75 0.25 0.9062 +0.75 0.25 0.9375 +0.75 0.25 0.9688 +0.75 0.25 1 +0.75 0.2812 0 +0.75 0.2812 0.03125 +0.75 0.2812 0.0625 +0.75 0.2812 0.09375 +0.75 0.2812 0.125 +0.75 0.2812 0.1562 +0.75 0.2812 0.1875 +0.75 0.2812 0.2188 +0.75 0.2812 0.25 +0.75 0.2812 0.2812 +0.75 0.2812 0.3125 +0.75 0.2812 0.3438 +0.75 0.2812 0.375 +0.75 0.2812 0.4062 +0.75 0.2812 0.4375 +0.75 0.2812 0.4688 +0.75 0.2812 0.5 +0.75 0.2812 0.5312 +0.75 0.2812 0.5625 +0.75 0.2812 0.5938 +0.75 0.2812 0.625 +0.75 0.2812 0.6562 +0.75 0.2812 0.6875 +0.75 0.2812 0.7188 +0.75 0.2812 0.75 +0.75 0.2812 0.7812 +0.75 0.2812 0.8125 +0.75 0.2812 0.8438 +0.75 0.2812 0.875 +0.75 0.2812 0.9062 +0.75 0.2812 0.9375 +0.75 0.2812 0.9688 +0.75 0.2812 1 +0.75 0.3125 0 +0.75 0.3125 0.03125 +0.75 0.3125 0.0625 +0.75 0.3125 0.09375 +0.75 0.3125 0.125 +0.75 0.3125 0.1562 +0.75 0.3125 0.1875 +0.75 0.3125 0.2188 +0.75 0.3125 0.25 +0.75 0.3125 0.2812 +0.75 0.3125 0.3125 +0.75 0.3125 0.3438 +0.75 0.3125 0.375 +0.75 0.3125 0.4062 +0.75 0.3125 0.4375 +0.75 0.3125 0.4688 +0.75 0.3125 0.5 +0.75 0.3125 0.5312 +0.75 0.3125 0.5625 +0.75 0.3125 0.5938 +0.75 0.3125 0.625 +0.75 0.3125 0.6562 +0.75 0.3125 0.6875 +0.75 0.3125 0.7188 +0.75 0.3125 0.75 +0.75 0.3125 0.7812 +0.75 0.3125 0.8125 +0.75 0.3125 0.8438 +0.75 0.3125 0.875 +0.75 0.3125 0.9062 +0.75 0.3125 0.9375 +0.75 0.3125 0.9688 +0.75 0.3125 1 +0.75 0.3438 0 +0.75 0.3438 0.03125 +0.75 0.3438 0.0625 +0.75 0.3438 0.09375 +0.75 0.3438 0.125 +0.75 0.3438 0.1562 +0.75 0.3438 0.1875 +0.75 0.3438 0.2188 +0.75 0.3438 0.25 +0.75 0.3438 0.2812 +0.75 0.3438 0.3125 +0.75 0.3438 0.3438 +0.75 0.3438 0.375 +0.75 0.3438 0.4062 +0.75 0.3438 0.4375 +0.75 0.3438 0.4688 +0.75 0.3438 0.5 +0.75 0.3438 0.5312 +0.75 0.3438 0.5625 +0.75 0.3438 0.5938 +0.75 0.3438 0.625 +0.75 0.3438 0.6562 +0.75 0.3438 0.6875 +0.75 0.3438 0.7188 +0.75 0.3438 0.75 +0.75 0.3438 0.7812 +0.75 0.3438 0.8125 +0.75 0.3438 0.8438 +0.75 0.3438 0.875 +0.75 0.3438 0.9062 +0.75 0.3438 0.9375 +0.75 0.3438 0.9688 +0.75 0.3438 1 +0.75 0.375 0 +0.75 0.375 0.03125 +0.75 0.375 0.0625 +0.75 0.375 0.09375 +0.75 0.375 0.125 +0.75 0.375 0.1562 +0.75 0.375 0.1875 +0.75 0.375 0.2188 +0.75 0.375 0.25 +0.75 0.375 0.2812 +0.75 0.375 0.3125 +0.75 0.375 0.3438 +0.75 0.375 0.375 +0.75 0.375 0.4062 +0.75 0.375 0.4375 +0.75 0.375 0.4688 +0.75 0.375 0.5 +0.75 0.375 0.5312 +0.75 0.375 0.5625 +0.75 0.375 0.5938 +0.75 0.375 0.625 +0.75 0.375 0.6562 +0.75 0.375 0.6875 +0.75 0.375 0.7188 +0.75 0.375 0.75 +0.75 0.375 0.7812 +0.75 0.375 0.8125 +0.75 0.375 0.8438 +0.75 0.375 0.875 +0.75 0.375 0.9062 +0.75 0.375 0.9375 +0.75 0.375 0.9688 +0.75 0.375 1 +0.75 0.4062 0 +0.75 0.4062 0.03125 +0.75 0.4062 0.0625 +0.75 0.4062 0.09375 +0.75 0.4062 0.125 +0.75 0.4062 0.1562 +0.75 0.4062 0.1875 +0.75 0.4062 0.2188 +0.75 0.4062 0.25 +0.75 0.4062 0.2812 +0.75 0.4062 0.3125 +0.75 0.4062 0.3438 +0.75 0.4062 0.375 +0.75 0.4062 0.4062 +0.75 0.4062 0.4375 +0.75 0.4062 0.4688 +0.75 0.4062 0.5 +0.75 0.4062 0.5312 +0.75 0.4062 0.5625 +0.75 0.4062 0.5938 +0.75 0.4062 0.625 +0.75 0.4062 0.6562 +0.75 0.4062 0.6875 +0.75 0.4062 0.7188 +0.75 0.4062 0.75 +0.75 0.4062 0.7812 +0.75 0.4062 0.8125 +0.75 0.4062 0.8438 +0.75 0.4062 0.875 +0.75 0.4062 0.9062 +0.75 0.4062 0.9375 +0.75 0.4062 0.9688 +0.75 0.4062 1 +0.75 0.4375 0 +0.75 0.4375 0.03125 +0.75 0.4375 0.0625 +0.75 0.4375 0.09375 +0.75 0.4375 0.125 +0.75 0.4375 0.1562 +0.75 0.4375 0.1875 +0.75 0.4375 0.2188 +0.75 0.4375 0.25 +0.75 0.4375 0.2812 +0.75 0.4375 0.3125 +0.75 0.4375 0.3438 +0.75 0.4375 0.375 +0.75 0.4375 0.4062 +0.75 0.4375 0.4375 +0.75 0.4375 0.4688 +0.75 0.4375 0.5 +0.75 0.4375 0.5312 +0.75 0.4375 0.5625 +0.75 0.4375 0.5938 +0.75 0.4375 0.625 +0.75 0.4375 0.6562 +0.75 0.4375 0.6875 +0.75 0.4375 0.7188 +0.75 0.4375 0.75 +0.75 0.4375 0.7812 +0.75 0.4375 0.8125 +0.75 0.4375 0.8438 +0.75 0.4375 0.875 +0.75 0.4375 0.9062 +0.75 0.4375 0.9375 +0.75 0.4375 0.9688 +0.75 0.4375 1 +0.75 0.4688 0 +0.75 0.4688 0.03125 +0.75 0.4688 0.0625 +0.75 0.4688 0.09375 +0.75 0.4688 0.125 +0.75 0.4688 0.1562 +0.75 0.4688 0.1875 +0.75 0.4688 0.2188 +0.75 0.4688 0.25 +0.75 0.4688 0.2812 +0.75 0.4688 0.3125 +0.75 0.4688 0.3438 +0.75 0.4688 0.375 +0.75 0.4688 0.4062 +0.75 0.4688 0.4375 +0.75 0.4688 0.4688 +0.75 0.4688 0.5 +0.75 0.4688 0.5312 +0.75 0.4688 0.5625 +0.75 0.4688 0.5938 +0.75 0.4688 0.625 +0.75 0.4688 0.6562 +0.75 0.4688 0.6875 +0.75 0.4688 0.7188 +0.75 0.4688 0.75 +0.75 0.4688 0.7812 +0.75 0.4688 0.8125 +0.75 0.4688 0.8438 +0.75 0.4688 0.875 +0.75 0.4688 0.9062 +0.75 0.4688 0.9375 +0.75 0.4688 0.9688 +0.75 0.4688 1 +0.75 0.5 0 +0.75 0.5 0.03125 +0.75 0.5 0.0625 +0.75 0.5 0.09375 +0.75 0.5 0.125 +0.75 0.5 0.1562 +0.75 0.5 0.1875 +0.75 0.5 0.2188 +0.75 0.5 0.25 +0.75 0.5 0.2812 +0.75 0.5 0.3125 +0.75 0.5 0.3438 +0.75 0.5 0.375 +0.75 0.5 0.4062 +0.75 0.5 0.4375 +0.75 0.5 0.4688 +0.75 0.5 0.5 +0.75 0.5 0.5312 +0.75 0.5 0.5625 +0.75 0.5 0.5938 +0.75 0.5 0.625 +0.75 0.5 0.6562 +0.75 0.5 0.6875 +0.75 0.5 0.7188 +0.75 0.5 0.75 +0.75 0.5 0.7812 +0.75 0.5 0.8125 +0.75 0.5 0.8438 +0.75 0.5 0.875 +0.75 0.5 0.9062 +0.75 0.5 0.9375 +0.75 0.5 0.9688 +0.75 0.5 1 +0.75 0.5312 0 +0.75 0.5312 0.03125 +0.75 0.5312 0.0625 +0.75 0.5312 0.09375 +0.75 0.5312 0.125 +0.75 0.5312 0.1562 +0.75 0.5312 0.1875 +0.75 0.5312 0.2188 +0.75 0.5312 0.25 +0.75 0.5312 0.2812 +0.75 0.5312 0.3125 +0.75 0.5312 0.3438 +0.75 0.5312 0.375 +0.75 0.5312 0.4062 +0.75 0.5312 0.4375 +0.75 0.5312 0.4688 +0.75 0.5312 0.5 +0.75 0.5312 0.5312 +0.75 0.5312 0.5625 +0.75 0.5312 0.5938 +0.75 0.5312 0.625 +0.75 0.5312 0.6562 +0.75 0.5312 0.6875 +0.75 0.5312 0.7188 +0.75 0.5312 0.75 +0.75 0.5312 0.7812 +0.75 0.5312 0.8125 +0.75 0.5312 0.8438 +0.75 0.5312 0.875 +0.75 0.5312 0.9062 +0.75 0.5312 0.9375 +0.75 0.5312 0.9688 +0.75 0.5312 1 +0.75 0.5625 0 +0.75 0.5625 0.03125 +0.75 0.5625 0.0625 +0.75 0.5625 0.09375 +0.75 0.5625 0.125 +0.75 0.5625 0.1562 +0.75 0.5625 0.1875 +0.75 0.5625 0.2188 +0.75 0.5625 0.25 +0.75 0.5625 0.2812 +0.75 0.5625 0.3125 +0.75 0.5625 0.3438 +0.75 0.5625 0.375 +0.75 0.5625 0.4062 +0.75 0.5625 0.4375 +0.75 0.5625 0.4688 +0.75 0.5625 0.5 +0.75 0.5625 0.5312 +0.75 0.5625 0.5625 +0.75 0.5625 0.5938 +0.75 0.5625 0.625 +0.75 0.5625 0.6562 +0.75 0.5625 0.6875 +0.75 0.5625 0.7188 +0.75 0.5625 0.75 +0.75 0.5625 0.7812 +0.75 0.5625 0.8125 +0.75 0.5625 0.8438 +0.75 0.5625 0.875 +0.75 0.5625 0.9062 +0.75 0.5625 0.9375 +0.75 0.5625 0.9688 +0.75 0.5625 1 +0.75 0.5938 0 +0.75 0.5938 0.03125 +0.75 0.5938 0.0625 +0.75 0.5938 0.09375 +0.75 0.5938 0.125 +0.75 0.5938 0.1562 +0.75 0.5938 0.1875 +0.75 0.5938 0.2188 +0.75 0.5938 0.25 +0.75 0.5938 0.2812 +0.75 0.5938 0.3125 +0.75 0.5938 0.3438 +0.75 0.5938 0.375 +0.75 0.5938 0.4062 +0.75 0.5938 0.4375 +0.75 0.5938 0.4688 +0.75 0.5938 0.5 +0.75 0.5938 0.5312 +0.75 0.5938 0.5625 +0.75 0.5938 0.5938 +0.75 0.5938 0.625 +0.75 0.5938 0.6562 +0.75 0.5938 0.6875 +0.75 0.5938 0.7188 +0.75 0.5938 0.75 +0.75 0.5938 0.7812 +0.75 0.5938 0.8125 +0.75 0.5938 0.8438 +0.75 0.5938 0.875 +0.75 0.5938 0.9062 +0.75 0.5938 0.9375 +0.75 0.5938 0.9688 +0.75 0.5938 1 +0.75 0.625 0 +0.75 0.625 0.03125 +0.75 0.625 0.0625 +0.75 0.625 0.09375 +0.75 0.625 0.125 +0.75 0.625 0.1562 +0.75 0.625 0.1875 +0.75 0.625 0.2188 +0.75 0.625 0.25 +0.75 0.625 0.2812 +0.75 0.625 0.3125 +0.75 0.625 0.3438 +0.75 0.625 0.375 +0.75 0.625 0.4062 +0.75 0.625 0.4375 +0.75 0.625 0.4688 +0.75 0.625 0.5 +0.75 0.625 0.5312 +0.75 0.625 0.5625 +0.75 0.625 0.5938 +0.75 0.625 0.625 +0.75 0.625 0.6562 +0.75 0.625 0.6875 +0.75 0.625 0.7188 +0.75 0.625 0.75 +0.75 0.625 0.7812 +0.75 0.625 0.8125 +0.75 0.625 0.8438 +0.75 0.625 0.875 +0.75 0.625 0.9062 +0.75 0.625 0.9375 +0.75 0.625 0.9688 +0.75 0.625 1 +0.75 0.6562 0 +0.75 0.6562 0.03125 +0.75 0.6562 0.0625 +0.75 0.6562 0.09375 +0.75 0.6562 0.125 +0.75 0.6562 0.1562 +0.75 0.6562 0.1875 +0.75 0.6562 0.2188 +0.75 0.6562 0.25 +0.75 0.6562 0.2812 +0.75 0.6562 0.3125 +0.75 0.6562 0.3438 +0.75 0.6562 0.375 +0.75 0.6562 0.4062 +0.75 0.6562 0.4375 +0.75 0.6562 0.4688 +0.75 0.6562 0.5 +0.75 0.6562 0.5312 +0.75 0.6562 0.5625 +0.75 0.6562 0.5938 +0.75 0.6562 0.625 +0.75 0.6562 0.6562 +0.75 0.6562 0.6875 +0.75 0.6562 0.7188 +0.75 0.6562 0.75 +0.75 0.6562 0.7812 +0.75 0.6562 0.8125 +0.75 0.6562 0.8438 +0.75 0.6562 0.875 +0.75 0.6562 0.9062 +0.75 0.6562 0.9375 +0.75 0.6562 0.9688 +0.75 0.6562 1 +0.75 0.6875 0 +0.75 0.6875 0.03125 +0.75 0.6875 0.0625 +0.75 0.6875 0.09375 +0.75 0.6875 0.125 +0.75 0.6875 0.1562 +0.75 0.6875 0.1875 +0.75 0.6875 0.2188 +0.75 0.6875 0.25 +0.75 0.6875 0.2812 +0.75 0.6875 0.3125 +0.75 0.6875 0.3438 +0.75 0.6875 0.375 +0.75 0.6875 0.4062 +0.75 0.6875 0.4375 +0.75 0.6875 0.4688 +0.75 0.6875 0.5 +0.75 0.6875 0.5312 +0.75 0.6875 0.5625 +0.75 0.6875 0.5938 +0.75 0.6875 0.625 +0.75 0.6875 0.6562 +0.75 0.6875 0.6875 +0.75 0.6875 0.7188 +0.75 0.6875 0.75 +0.75 0.6875 0.7812 +0.75 0.6875 0.8125 +0.75 0.6875 0.8438 +0.75 0.6875 0.875 +0.75 0.6875 0.9062 +0.75 0.6875 0.9375 +0.75 0.6875 0.9688 +0.75 0.6875 1 +0.75 0.7188 0 +0.75 0.7188 0.03125 +0.75 0.7188 0.0625 +0.75 0.7188 0.09375 +0.75 0.7188 0.125 +0.75 0.7188 0.1562 +0.75 0.7188 0.1875 +0.75 0.7188 0.2188 +0.75 0.7188 0.25 +0.75 0.7188 0.2812 +0.75 0.7188 0.3125 +0.75 0.7188 0.3438 +0.75 0.7188 0.375 +0.75 0.7188 0.4062 +0.75 0.7188 0.4375 +0.75 0.7188 0.4688 +0.75 0.7188 0.5 +0.75 0.7188 0.5312 +0.75 0.7188 0.5625 +0.75 0.7188 0.5938 +0.75 0.7188 0.625 +0.75 0.7188 0.6562 +0.75 0.7188 0.6875 +0.75 0.7188 0.7188 +0.75 0.7188 0.75 +0.75 0.7188 0.7812 +0.75 0.7188 0.8125 +0.75 0.7188 0.8438 +0.75 0.7188 0.875 +0.75 0.7188 0.9062 +0.75 0.7188 0.9375 +0.75 0.7188 0.9688 +0.75 0.7188 1 +0.75 0.75 0 +0.75 0.75 0.03125 +0.75 0.75 0.0625 +0.75 0.75 0.09375 +0.75 0.75 0.125 +0.75 0.75 0.1562 +0.75 0.75 0.1875 +0.75 0.75 0.2188 +0.75 0.75 0.25 +0.75 0.75 0.2812 +0.75 0.75 0.3125 +0.75 0.75 0.3438 +0.75 0.75 0.375 +0.75 0.75 0.4062 +0.75 0.75 0.4375 +0.75 0.75 0.4688 +0.75 0.75 0.5 +0.75 0.75 0.5312 +0.75 0.75 0.5625 +0.75 0.75 0.5938 +0.75 0.75 0.625 +0.75 0.75 0.6562 +0.75 0.75 0.6875 +0.75 0.75 0.7188 +0.75 0.75 0.75 +0.75 0.75 0.7812 +0.75 0.75 0.8125 +0.75 0.75 0.8438 +0.75 0.75 0.875 +0.75 0.75 0.9062 +0.75 0.75 0.9375 +0.75 0.75 0.9688 +0.75 0.75 1 +0.75 0.7812 0 +0.75 0.7812 0.03125 +0.75 0.7812 0.0625 +0.75 0.7812 0.09375 +0.75 0.7812 0.125 +0.75 0.7812 0.1562 +0.75 0.7812 0.1875 +0.75 0.7812 0.2188 +0.75 0.7812 0.25 +0.75 0.7812 0.2812 +0.75 0.7812 0.3125 +0.75 0.7812 0.3438 +0.75 0.7812 0.375 +0.75 0.7812 0.4062 +0.75 0.7812 0.4375 +0.75 0.7812 0.4688 +0.75 0.7812 0.5 +0.75 0.7812 0.5312 +0.75 0.7812 0.5625 +0.75 0.7812 0.5938 +0.75 0.7812 0.625 +0.75 0.7812 0.6562 +0.75 0.7812 0.6875 +0.75 0.7812 0.7188 +0.75 0.7812 0.75 +0.75 0.7812 0.7812 +0.75 0.7812 0.8125 +0.75 0.7812 0.8438 +0.75 0.7812 0.875 +0.75 0.7812 0.9062 +0.75 0.7812 0.9375 +0.75 0.7812 0.9688 +0.75 0.7812 1 +0.75 0.8125 0 +0.75 0.8125 0.03125 +0.75 0.8125 0.0625 +0.75 0.8125 0.09375 +0.75 0.8125 0.125 +0.75 0.8125 0.1562 +0.75 0.8125 0.1875 +0.75 0.8125 0.2188 +0.75 0.8125 0.25 +0.75 0.8125 0.2812 +0.75 0.8125 0.3125 +0.75 0.8125 0.3438 +0.75 0.8125 0.375 +0.75 0.8125 0.4062 +0.75 0.8125 0.4375 +0.75 0.8125 0.4688 +0.75 0.8125 0.5 +0.75 0.8125 0.5312 +0.75 0.8125 0.5625 +0.75 0.8125 0.5938 +0.75 0.8125 0.625 +0.75 0.8125 0.6562 +0.75 0.8125 0.6875 +0.75 0.8125 0.7188 +0.75 0.8125 0.75 +0.75 0.8125 0.7812 +0.75 0.8125 0.8125 +0.75 0.8125 0.8438 +0.75 0.8125 0.875 +0.75 0.8125 0.9062 +0.75 0.8125 0.9375 +0.75 0.8125 0.9688 +0.75 0.8125 1 +0.75 0.8438 0 +0.75 0.8438 0.03125 +0.75 0.8438 0.0625 +0.75 0.8438 0.09375 +0.75 0.8438 0.125 +0.75 0.8438 0.1562 +0.75 0.8438 0.1875 +0.75 0.8438 0.2188 +0.75 0.8438 0.25 +0.75 0.8438 0.2812 +0.75 0.8438 0.3125 +0.75 0.8438 0.3438 +0.75 0.8438 0.375 +0.75 0.8438 0.4062 +0.75 0.8438 0.4375 +0.75 0.8438 0.4688 +0.75 0.8438 0.5 +0.75 0.8438 0.5312 +0.75 0.8438 0.5625 +0.75 0.8438 0.5938 +0.75 0.8438 0.625 +0.75 0.8438 0.6562 +0.75 0.8438 0.6875 +0.75 0.8438 0.7188 +0.75 0.8438 0.75 +0.75 0.8438 0.7812 +0.75 0.8438 0.8125 +0.75 0.8438 0.8438 +0.75 0.8438 0.875 +0.75 0.8438 0.9062 +0.75 0.8438 0.9375 +0.75 0.8438 0.9688 +0.75 0.8438 1 +0.75 0.875 0 +0.75 0.875 0.03125 +0.75 0.875 0.0625 +0.75 0.875 0.09375 +0.75 0.875 0.125 +0.75 0.875 0.1562 +0.75 0.875 0.1875 +0.75 0.875 0.2188 +0.75 0.875 0.25 +0.75 0.875 0.2812 +0.75 0.875 0.3125 +0.75 0.875 0.3438 +0.75 0.875 0.375 +0.75 0.875 0.4062 +0.75 0.875 0.4375 +0.75 0.875 0.4688 +0.75 0.875 0.5 +0.75 0.875 0.5312 +0.75 0.875 0.5625 +0.75 0.875 0.5938 +0.75 0.875 0.625 +0.75 0.875 0.6562 +0.75 0.875 0.6875 +0.75 0.875 0.7188 +0.75 0.875 0.75 +0.75 0.875 0.7812 +0.75 0.875 0.8125 +0.75 0.875 0.8438 +0.75 0.875 0.875 +0.75 0.875 0.9062 +0.75 0.875 0.9375 +0.75 0.875 0.9688 +0.75 0.875 1 +0.75 0.9062 0 +0.75 0.9062 0.03125 +0.75 0.9062 0.0625 +0.75 0.9062 0.09375 +0.75 0.9062 0.125 +0.75 0.9062 0.1562 +0.75 0.9062 0.1875 +0.75 0.9062 0.2188 +0.75 0.9062 0.25 +0.75 0.9062 0.2812 +0.75 0.9062 0.3125 +0.75 0.9062 0.3438 +0.75 0.9062 0.375 +0.75 0.9062 0.4062 +0.75 0.9062 0.4375 +0.75 0.9062 0.4688 +0.75 0.9062 0.5 +0.75 0.9062 0.5312 +0.75 0.9062 0.5625 +0.75 0.9062 0.5938 +0.75 0.9062 0.625 +0.75 0.9062 0.6562 +0.75 0.9062 0.6875 +0.75 0.9062 0.7188 +0.75 0.9062 0.75 +0.75 0.9062 0.7812 +0.75 0.9062 0.8125 +0.75 0.9062 0.8438 +0.75 0.9062 0.875 +0.75 0.9062 0.9062 +0.75 0.9062 0.9375 +0.75 0.9062 0.9688 +0.75 0.9062 1 +0.75 0.9375 0 +0.75 0.9375 0.03125 +0.75 0.9375 0.0625 +0.75 0.9375 0.09375 +0.75 0.9375 0.125 +0.75 0.9375 0.1562 +0.75 0.9375 0.1875 +0.75 0.9375 0.2188 +0.75 0.9375 0.25 +0.75 0.9375 0.2812 +0.75 0.9375 0.3125 +0.75 0.9375 0.3438 +0.75 0.9375 0.375 +0.75 0.9375 0.4062 +0.75 0.9375 0.4375 +0.75 0.9375 0.4688 +0.75 0.9375 0.5 +0.75 0.9375 0.5312 +0.75 0.9375 0.5625 +0.75 0.9375 0.5938 +0.75 0.9375 0.625 +0.75 0.9375 0.6562 +0.75 0.9375 0.6875 +0.75 0.9375 0.7188 +0.75 0.9375 0.75 +0.75 0.9375 0.7812 +0.75 0.9375 0.8125 +0.75 0.9375 0.8438 +0.75 0.9375 0.875 +0.75 0.9375 0.9062 +0.75 0.9375 0.9375 +0.75 0.9375 0.9688 +0.75 0.9375 1 +0.75 0.9688 0 +0.75 0.9688 0.03125 +0.75 0.9688 0.0625 +0.75 0.9688 0.09375 +0.75 0.9688 0.125 +0.75 0.9688 0.1562 +0.75 0.9688 0.1875 +0.75 0.9688 0.2188 +0.75 0.9688 0.25 +0.75 0.9688 0.2812 +0.75 0.9688 0.3125 +0.75 0.9688 0.3438 +0.75 0.9688 0.375 +0.75 0.9688 0.4062 +0.75 0.9688 0.4375 +0.75 0.9688 0.4688 +0.75 0.9688 0.5 +0.75 0.9688 0.5312 +0.75 0.9688 0.5625 +0.75 0.9688 0.5938 +0.75 0.9688 0.625 +0.75 0.9688 0.6562 +0.75 0.9688 0.6875 +0.75 0.9688 0.7188 +0.75 0.9688 0.75 +0.75 0.9688 0.7812 +0.75 0.9688 0.8125 +0.75 0.9688 0.8438 +0.75 0.9688 0.875 +0.75 0.9688 0.9062 +0.75 0.9688 0.9375 +0.75 0.9688 0.9688 +0.75 0.9688 1 +0.75 1 0 +0.75 1 0.03125 +0.75 1 0.0625 +0.75 1 0.09375 +0.75 1 0.125 +0.75 1 0.1562 +0.75 1 0.1875 +0.75 1 0.2188 +0.75 1 0.25 +0.75 1 0.2812 +0.75 1 0.3125 +0.75 1 0.3438 +0.75 1 0.375 +0.75 1 0.4062 +0.75 1 0.4375 +0.75 1 0.4688 +0.75 1 0.5 +0.75 1 0.5312 +0.75 1 0.5625 +0.75 1 0.5938 +0.75 1 0.625 +0.75 1 0.6562 +0.75 1 0.6875 +0.75 1 0.7188 +0.75 1 0.75 +0.75 1 0.7812 +0.75 1 0.8125 +0.75 1 0.8438 +0.75 1 0.875 +0.75 1 0.9062 +0.75 1 0.9375 +0.75 1 0.9688 +0.75 1 1 +0.7812 0 0 +0.7812 0 0.03125 +0.7812 0 0.0625 +0.7812 0 0.09375 +0.7812 0 0.125 +0.7812 0 0.1562 +0.7812 0 0.1875 +0.7812 0 0.2188 +0.7812 0 0.25 +0.7812 0 0.2812 +0.7812 0 0.3125 +0.7812 0 0.3438 +0.7812 0 0.375 +0.7812 0 0.4062 +0.7812 0 0.4375 +0.7812 0 0.4688 +0.7812 0 0.5 +0.7812 0 0.5312 +0.7812 0 0.5625 +0.7812 0 0.5938 +0.7812 0 0.625 +0.7812 0 0.6562 +0.7812 0 0.6875 +0.7812 0 0.7188 +0.7812 0 0.75 +0.7812 0 0.7812 +0.7812 0 0.8125 +0.7812 0 0.8438 +0.7812 0 0.875 +0.7812 0 0.9062 +0.7812 0 0.9375 +0.7812 0 0.9688 +0.7812 0 1 +0.7812 0.03125 0 +0.7812 0.03125 0.03125 +0.7812 0.03125 0.0625 +0.7812 0.03125 0.09375 +0.7812 0.03125 0.125 +0.7812 0.03125 0.1562 +0.7812 0.03125 0.1875 +0.7812 0.03125 0.2188 +0.7812 0.03125 0.25 +0.7812 0.03125 0.2812 +0.7812 0.03125 0.3125 +0.7812 0.03125 0.3438 +0.7812 0.03125 0.375 +0.7812 0.03125 0.4062 +0.7812 0.03125 0.4375 +0.7812 0.03125 0.4688 +0.7812 0.03125 0.5 +0.7812 0.03125 0.5312 +0.7812 0.03125 0.5625 +0.7812 0.03125 0.5938 +0.7812 0.03125 0.625 +0.7812 0.03125 0.6562 +0.7812 0.03125 0.6875 +0.7812 0.03125 0.7188 +0.7812 0.03125 0.75 +0.7812 0.03125 0.7812 +0.7812 0.03125 0.8125 +0.7812 0.03125 0.8438 +0.7812 0.03125 0.875 +0.7812 0.03125 0.9062 +0.7812 0.03125 0.9375 +0.7812 0.03125 0.9688 +0.7812 0.03125 1 +0.7812 0.0625 0 +0.7812 0.0625 0.03125 +0.7812 0.0625 0.0625 +0.7812 0.0625 0.09375 +0.7812 0.0625 0.125 +0.7812 0.0625 0.1562 +0.7812 0.0625 0.1875 +0.7812 0.0625 0.2188 +0.7812 0.0625 0.25 +0.7812 0.0625 0.2812 +0.7812 0.0625 0.3125 +0.7812 0.0625 0.3438 +0.7812 0.0625 0.375 +0.7812 0.0625 0.4062 +0.7812 0.0625 0.4375 +0.7812 0.0625 0.4688 +0.7812 0.0625 0.5 +0.7812 0.0625 0.5312 +0.7812 0.0625 0.5625 +0.7812 0.0625 0.5938 +0.7812 0.0625 0.625 +0.7812 0.0625 0.6562 +0.7812 0.0625 0.6875 +0.7812 0.0625 0.7188 +0.7812 0.0625 0.75 +0.7812 0.0625 0.7812 +0.7812 0.0625 0.8125 +0.7812 0.0625 0.8438 +0.7812 0.0625 0.875 +0.7812 0.0625 0.9062 +0.7812 0.0625 0.9375 +0.7812 0.0625 0.9688 +0.7812 0.0625 1 +0.7812 0.09375 0 +0.7812 0.09375 0.03125 +0.7812 0.09375 0.0625 +0.7812 0.09375 0.09375 +0.7812 0.09375 0.125 +0.7812 0.09375 0.1562 +0.7812 0.09375 0.1875 +0.7812 0.09375 0.2188 +0.7812 0.09375 0.25 +0.7812 0.09375 0.2812 +0.7812 0.09375 0.3125 +0.7812 0.09375 0.3438 +0.7812 0.09375 0.375 +0.7812 0.09375 0.4062 +0.7812 0.09375 0.4375 +0.7812 0.09375 0.4688 +0.7812 0.09375 0.5 +0.7812 0.09375 0.5312 +0.7812 0.09375 0.5625 +0.7812 0.09375 0.5938 +0.7812 0.09375 0.625 +0.7812 0.09375 0.6562 +0.7812 0.09375 0.6875 +0.7812 0.09375 0.7188 +0.7812 0.09375 0.75 +0.7812 0.09375 0.7812 +0.7812 0.09375 0.8125 +0.7812 0.09375 0.8438 +0.7812 0.09375 0.875 +0.7812 0.09375 0.9062 +0.7812 0.09375 0.9375 +0.7812 0.09375 0.9688 +0.7812 0.09375 1 +0.7812 0.125 0 +0.7812 0.125 0.03125 +0.7812 0.125 0.0625 +0.7812 0.125 0.09375 +0.7812 0.125 0.125 +0.7812 0.125 0.1562 +0.7812 0.125 0.1875 +0.7812 0.125 0.2188 +0.7812 0.125 0.25 +0.7812 0.125 0.2812 +0.7812 0.125 0.3125 +0.7812 0.125 0.3438 +0.7812 0.125 0.375 +0.7812 0.125 0.4062 +0.7812 0.125 0.4375 +0.7812 0.125 0.4688 +0.7812 0.125 0.5 +0.7812 0.125 0.5312 +0.7812 0.125 0.5625 +0.7812 0.125 0.5938 +0.7812 0.125 0.625 +0.7812 0.125 0.6562 +0.7812 0.125 0.6875 +0.7812 0.125 0.7188 +0.7812 0.125 0.75 +0.7812 0.125 0.7812 +0.7812 0.125 0.8125 +0.7812 0.125 0.8438 +0.7812 0.125 0.875 +0.7812 0.125 0.9062 +0.7812 0.125 0.9375 +0.7812 0.125 0.9688 +0.7812 0.125 1 +0.7812 0.1562 0 +0.7812 0.1562 0.03125 +0.7812 0.1562 0.0625 +0.7812 0.1562 0.09375 +0.7812 0.1562 0.125 +0.7812 0.1562 0.1562 +0.7812 0.1562 0.1875 +0.7812 0.1562 0.2188 +0.7812 0.1562 0.25 +0.7812 0.1562 0.2812 +0.7812 0.1562 0.3125 +0.7812 0.1562 0.3438 +0.7812 0.1562 0.375 +0.7812 0.1562 0.4062 +0.7812 0.1562 0.4375 +0.7812 0.1562 0.4688 +0.7812 0.1562 0.5 +0.7812 0.1562 0.5312 +0.7812 0.1562 0.5625 +0.7812 0.1562 0.5938 +0.7812 0.1562 0.625 +0.7812 0.1562 0.6562 +0.7812 0.1562 0.6875 +0.7812 0.1562 0.7188 +0.7812 0.1562 0.75 +0.7812 0.1562 0.7812 +0.7812 0.1562 0.8125 +0.7812 0.1562 0.8438 +0.7812 0.1562 0.875 +0.7812 0.1562 0.9062 +0.7812 0.1562 0.9375 +0.7812 0.1562 0.9688 +0.7812 0.1562 1 +0.7812 0.1875 0 +0.7812 0.1875 0.03125 +0.7812 0.1875 0.0625 +0.7812 0.1875 0.09375 +0.7812 0.1875 0.125 +0.7812 0.1875 0.1562 +0.7812 0.1875 0.1875 +0.7812 0.1875 0.2188 +0.7812 0.1875 0.25 +0.7812 0.1875 0.2812 +0.7812 0.1875 0.3125 +0.7812 0.1875 0.3438 +0.7812 0.1875 0.375 +0.7812 0.1875 0.4062 +0.7812 0.1875 0.4375 +0.7812 0.1875 0.4688 +0.7812 0.1875 0.5 +0.7812 0.1875 0.5312 +0.7812 0.1875 0.5625 +0.7812 0.1875 0.5938 +0.7812 0.1875 0.625 +0.7812 0.1875 0.6562 +0.7812 0.1875 0.6875 +0.7812 0.1875 0.7188 +0.7812 0.1875 0.75 +0.7812 0.1875 0.7812 +0.7812 0.1875 0.8125 +0.7812 0.1875 0.8438 +0.7812 0.1875 0.875 +0.7812 0.1875 0.9062 +0.7812 0.1875 0.9375 +0.7812 0.1875 0.9688 +0.7812 0.1875 1 +0.7812 0.2188 0 +0.7812 0.2188 0.03125 +0.7812 0.2188 0.0625 +0.7812 0.2188 0.09375 +0.7812 0.2188 0.125 +0.7812 0.2188 0.1562 +0.7812 0.2188 0.1875 +0.7812 0.2188 0.2188 +0.7812 0.2188 0.25 +0.7812 0.2188 0.2812 +0.7812 0.2188 0.3125 +0.7812 0.2188 0.3438 +0.7812 0.2188 0.375 +0.7812 0.2188 0.4062 +0.7812 0.2188 0.4375 +0.7812 0.2188 0.4688 +0.7812 0.2188 0.5 +0.7812 0.2188 0.5312 +0.7812 0.2188 0.5625 +0.7812 0.2188 0.5938 +0.7812 0.2188 0.625 +0.7812 0.2188 0.6562 +0.7812 0.2188 0.6875 +0.7812 0.2188 0.7188 +0.7812 0.2188 0.75 +0.7812 0.2188 0.7812 +0.7812 0.2188 0.8125 +0.7812 0.2188 0.8438 +0.7812 0.2188 0.875 +0.7812 0.2188 0.9062 +0.7812 0.2188 0.9375 +0.7812 0.2188 0.9688 +0.7812 0.2188 1 +0.7812 0.25 0 +0.7812 0.25 0.03125 +0.7812 0.25 0.0625 +0.7812 0.25 0.09375 +0.7812 0.25 0.125 +0.7812 0.25 0.1562 +0.7812 0.25 0.1875 +0.7812 0.25 0.2188 +0.7812 0.25 0.25 +0.7812 0.25 0.2812 +0.7812 0.25 0.3125 +0.7812 0.25 0.3438 +0.7812 0.25 0.375 +0.7812 0.25 0.4062 +0.7812 0.25 0.4375 +0.7812 0.25 0.4688 +0.7812 0.25 0.5 +0.7812 0.25 0.5312 +0.7812 0.25 0.5625 +0.7812 0.25 0.5938 +0.7812 0.25 0.625 +0.7812 0.25 0.6562 +0.7812 0.25 0.6875 +0.7812 0.25 0.7188 +0.7812 0.25 0.75 +0.7812 0.25 0.7812 +0.7812 0.25 0.8125 +0.7812 0.25 0.8438 +0.7812 0.25 0.875 +0.7812 0.25 0.9062 +0.7812 0.25 0.9375 +0.7812 0.25 0.9688 +0.7812 0.25 1 +0.7812 0.2812 0 +0.7812 0.2812 0.03125 +0.7812 0.2812 0.0625 +0.7812 0.2812 0.09375 +0.7812 0.2812 0.125 +0.7812 0.2812 0.1562 +0.7812 0.2812 0.1875 +0.7812 0.2812 0.2188 +0.7812 0.2812 0.25 +0.7812 0.2812 0.2812 +0.7812 0.2812 0.3125 +0.7812 0.2812 0.3438 +0.7812 0.2812 0.375 +0.7812 0.2812 0.4062 +0.7812 0.2812 0.4375 +0.7812 0.2812 0.4688 +0.7812 0.2812 0.5 +0.7812 0.2812 0.5312 +0.7812 0.2812 0.5625 +0.7812 0.2812 0.5938 +0.7812 0.2812 0.625 +0.7812 0.2812 0.6562 +0.7812 0.2812 0.6875 +0.7812 0.2812 0.7188 +0.7812 0.2812 0.75 +0.7812 0.2812 0.7812 +0.7812 0.2812 0.8125 +0.7812 0.2812 0.8438 +0.7812 0.2812 0.875 +0.7812 0.2812 0.9062 +0.7812 0.2812 0.9375 +0.7812 0.2812 0.9688 +0.7812 0.2812 1 +0.7812 0.3125 0 +0.7812 0.3125 0.03125 +0.7812 0.3125 0.0625 +0.7812 0.3125 0.09375 +0.7812 0.3125 0.125 +0.7812 0.3125 0.1562 +0.7812 0.3125 0.1875 +0.7812 0.3125 0.2188 +0.7812 0.3125 0.25 +0.7812 0.3125 0.2812 +0.7812 0.3125 0.3125 +0.7812 0.3125 0.3438 +0.7812 0.3125 0.375 +0.7812 0.3125 0.4062 +0.7812 0.3125 0.4375 +0.7812 0.3125 0.4688 +0.7812 0.3125 0.5 +0.7812 0.3125 0.5312 +0.7812 0.3125 0.5625 +0.7812 0.3125 0.5938 +0.7812 0.3125 0.625 +0.7812 0.3125 0.6562 +0.7812 0.3125 0.6875 +0.7812 0.3125 0.7188 +0.7812 0.3125 0.75 +0.7812 0.3125 0.7812 +0.7812 0.3125 0.8125 +0.7812 0.3125 0.8438 +0.7812 0.3125 0.875 +0.7812 0.3125 0.9062 +0.7812 0.3125 0.9375 +0.7812 0.3125 0.9688 +0.7812 0.3125 1 +0.7812 0.3438 0 +0.7812 0.3438 0.03125 +0.7812 0.3438 0.0625 +0.7812 0.3438 0.09375 +0.7812 0.3438 0.125 +0.7812 0.3438 0.1562 +0.7812 0.3438 0.1875 +0.7812 0.3438 0.2188 +0.7812 0.3438 0.25 +0.7812 0.3438 0.2812 +0.7812 0.3438 0.3125 +0.7812 0.3438 0.3438 +0.7812 0.3438 0.375 +0.7812 0.3438 0.4062 +0.7812 0.3438 0.4375 +0.7812 0.3438 0.4688 +0.7812 0.3438 0.5 +0.7812 0.3438 0.5312 +0.7812 0.3438 0.5625 +0.7812 0.3438 0.5938 +0.7812 0.3438 0.625 +0.7812 0.3438 0.6562 +0.7812 0.3438 0.6875 +0.7812 0.3438 0.7188 +0.7812 0.3438 0.75 +0.7812 0.3438 0.7812 +0.7812 0.3438 0.8125 +0.7812 0.3438 0.8438 +0.7812 0.3438 0.875 +0.7812 0.3438 0.9062 +0.7812 0.3438 0.9375 +0.7812 0.3438 0.9688 +0.7812 0.3438 1 +0.7812 0.375 0 +0.7812 0.375 0.03125 +0.7812 0.375 0.0625 +0.7812 0.375 0.09375 +0.7812 0.375 0.125 +0.7812 0.375 0.1562 +0.7812 0.375 0.1875 +0.7812 0.375 0.2188 +0.7812 0.375 0.25 +0.7812 0.375 0.2812 +0.7812 0.375 0.3125 +0.7812 0.375 0.3438 +0.7812 0.375 0.375 +0.7812 0.375 0.4062 +0.7812 0.375 0.4375 +0.7812 0.375 0.4688 +0.7812 0.375 0.5 +0.7812 0.375 0.5312 +0.7812 0.375 0.5625 +0.7812 0.375 0.5938 +0.7812 0.375 0.625 +0.7812 0.375 0.6562 +0.7812 0.375 0.6875 +0.7812 0.375 0.7188 +0.7812 0.375 0.75 +0.7812 0.375 0.7812 +0.7812 0.375 0.8125 +0.7812 0.375 0.8438 +0.7812 0.375 0.875 +0.7812 0.375 0.9062 +0.7812 0.375 0.9375 +0.7812 0.375 0.9688 +0.7812 0.375 1 +0.7812 0.4062 0 +0.7812 0.4062 0.03125 +0.7812 0.4062 0.0625 +0.7812 0.4062 0.09375 +0.7812 0.4062 0.125 +0.7812 0.4062 0.1562 +0.7812 0.4062 0.1875 +0.7812 0.4062 0.2188 +0.7812 0.4062 0.25 +0.7812 0.4062 0.2812 +0.7812 0.4062 0.3125 +0.7812 0.4062 0.3438 +0.7812 0.4062 0.375 +0.7812 0.4062 0.4062 +0.7812 0.4062 0.4375 +0.7812 0.4062 0.4688 +0.7812 0.4062 0.5 +0.7812 0.4062 0.5312 +0.7812 0.4062 0.5625 +0.7812 0.4062 0.5938 +0.7812 0.4062 0.625 +0.7812 0.4062 0.6562 +0.7812 0.4062 0.6875 +0.7812 0.4062 0.7188 +0.7812 0.4062 0.75 +0.7812 0.4062 0.7812 +0.7812 0.4062 0.8125 +0.7812 0.4062 0.8438 +0.7812 0.4062 0.875 +0.7812 0.4062 0.9062 +0.7812 0.4062 0.9375 +0.7812 0.4062 0.9688 +0.7812 0.4062 1 +0.7812 0.4375 0 +0.7812 0.4375 0.03125 +0.7812 0.4375 0.0625 +0.7812 0.4375 0.09375 +0.7812 0.4375 0.125 +0.7812 0.4375 0.1562 +0.7812 0.4375 0.1875 +0.7812 0.4375 0.2188 +0.7812 0.4375 0.25 +0.7812 0.4375 0.2812 +0.7812 0.4375 0.3125 +0.7812 0.4375 0.3438 +0.7812 0.4375 0.375 +0.7812 0.4375 0.4062 +0.7812 0.4375 0.4375 +0.7812 0.4375 0.4688 +0.7812 0.4375 0.5 +0.7812 0.4375 0.5312 +0.7812 0.4375 0.5625 +0.7812 0.4375 0.5938 +0.7812 0.4375 0.625 +0.7812 0.4375 0.6562 +0.7812 0.4375 0.6875 +0.7812 0.4375 0.7188 +0.7812 0.4375 0.75 +0.7812 0.4375 0.7812 +0.7812 0.4375 0.8125 +0.7812 0.4375 0.8438 +0.7812 0.4375 0.875 +0.7812 0.4375 0.9062 +0.7812 0.4375 0.9375 +0.7812 0.4375 0.9688 +0.7812 0.4375 1 +0.7812 0.4688 0 +0.7812 0.4688 0.03125 +0.7812 0.4688 0.0625 +0.7812 0.4688 0.09375 +0.7812 0.4688 0.125 +0.7812 0.4688 0.1562 +0.7812 0.4688 0.1875 +0.7812 0.4688 0.2188 +0.7812 0.4688 0.25 +0.7812 0.4688 0.2812 +0.7812 0.4688 0.3125 +0.7812 0.4688 0.3438 +0.7812 0.4688 0.375 +0.7812 0.4688 0.4062 +0.7812 0.4688 0.4375 +0.7812 0.4688 0.4688 +0.7812 0.4688 0.5 +0.7812 0.4688 0.5312 +0.7812 0.4688 0.5625 +0.7812 0.4688 0.5938 +0.7812 0.4688 0.625 +0.7812 0.4688 0.6562 +0.7812 0.4688 0.6875 +0.7812 0.4688 0.7188 +0.7812 0.4688 0.75 +0.7812 0.4688 0.7812 +0.7812 0.4688 0.8125 +0.7812 0.4688 0.8438 +0.7812 0.4688 0.875 +0.7812 0.4688 0.9062 +0.7812 0.4688 0.9375 +0.7812 0.4688 0.9688 +0.7812 0.4688 1 +0.7812 0.5 0 +0.7812 0.5 0.03125 +0.7812 0.5 0.0625 +0.7812 0.5 0.09375 +0.7812 0.5 0.125 +0.7812 0.5 0.1562 +0.7812 0.5 0.1875 +0.7812 0.5 0.2188 +0.7812 0.5 0.25 +0.7812 0.5 0.2812 +0.7812 0.5 0.3125 +0.7812 0.5 0.3438 +0.7812 0.5 0.375 +0.7812 0.5 0.4062 +0.7812 0.5 0.4375 +0.7812 0.5 0.4688 +0.7812 0.5 0.5 +0.7812 0.5 0.5312 +0.7812 0.5 0.5625 +0.7812 0.5 0.5938 +0.7812 0.5 0.625 +0.7812 0.5 0.6562 +0.7812 0.5 0.6875 +0.7812 0.5 0.7188 +0.7812 0.5 0.75 +0.7812 0.5 0.7812 +0.7812 0.5 0.8125 +0.7812 0.5 0.8438 +0.7812 0.5 0.875 +0.7812 0.5 0.9062 +0.7812 0.5 0.9375 +0.7812 0.5 0.9688 +0.7812 0.5 1 +0.7812 0.5312 0 +0.7812 0.5312 0.03125 +0.7812 0.5312 0.0625 +0.7812 0.5312 0.09375 +0.7812 0.5312 0.125 +0.7812 0.5312 0.1562 +0.7812 0.5312 0.1875 +0.7812 0.5312 0.2188 +0.7812 0.5312 0.25 +0.7812 0.5312 0.2812 +0.7812 0.5312 0.3125 +0.7812 0.5312 0.3438 +0.7812 0.5312 0.375 +0.7812 0.5312 0.4062 +0.7812 0.5312 0.4375 +0.7812 0.5312 0.4688 +0.7812 0.5312 0.5 +0.7812 0.5312 0.5312 +0.7812 0.5312 0.5625 +0.7812 0.5312 0.5938 +0.7812 0.5312 0.625 +0.7812 0.5312 0.6562 +0.7812 0.5312 0.6875 +0.7812 0.5312 0.7188 +0.7812 0.5312 0.75 +0.7812 0.5312 0.7812 +0.7812 0.5312 0.8125 +0.7812 0.5312 0.8438 +0.7812 0.5312 0.875 +0.7812 0.5312 0.9062 +0.7812 0.5312 0.9375 +0.7812 0.5312 0.9688 +0.7812 0.5312 1 +0.7812 0.5625 0 +0.7812 0.5625 0.03125 +0.7812 0.5625 0.0625 +0.7812 0.5625 0.09375 +0.7812 0.5625 0.125 +0.7812 0.5625 0.1562 +0.7812 0.5625 0.1875 +0.7812 0.5625 0.2188 +0.7812 0.5625 0.25 +0.7812 0.5625 0.2812 +0.7812 0.5625 0.3125 +0.7812 0.5625 0.3438 +0.7812 0.5625 0.375 +0.7812 0.5625 0.4062 +0.7812 0.5625 0.4375 +0.7812 0.5625 0.4688 +0.7812 0.5625 0.5 +0.7812 0.5625 0.5312 +0.7812 0.5625 0.5625 +0.7812 0.5625 0.5938 +0.7812 0.5625 0.625 +0.7812 0.5625 0.6562 +0.7812 0.5625 0.6875 +0.7812 0.5625 0.7188 +0.7812 0.5625 0.75 +0.7812 0.5625 0.7812 +0.7812 0.5625 0.8125 +0.7812 0.5625 0.8438 +0.7812 0.5625 0.875 +0.7812 0.5625 0.9062 +0.7812 0.5625 0.9375 +0.7812 0.5625 0.9688 +0.7812 0.5625 1 +0.7812 0.5938 0 +0.7812 0.5938 0.03125 +0.7812 0.5938 0.0625 +0.7812 0.5938 0.09375 +0.7812 0.5938 0.125 +0.7812 0.5938 0.1562 +0.7812 0.5938 0.1875 +0.7812 0.5938 0.2188 +0.7812 0.5938 0.25 +0.7812 0.5938 0.2812 +0.7812 0.5938 0.3125 +0.7812 0.5938 0.3438 +0.7812 0.5938 0.375 +0.7812 0.5938 0.4062 +0.7812 0.5938 0.4375 +0.7812 0.5938 0.4688 +0.7812 0.5938 0.5 +0.7812 0.5938 0.5312 +0.7812 0.5938 0.5625 +0.7812 0.5938 0.5938 +0.7812 0.5938 0.625 +0.7812 0.5938 0.6562 +0.7812 0.5938 0.6875 +0.7812 0.5938 0.7188 +0.7812 0.5938 0.75 +0.7812 0.5938 0.7812 +0.7812 0.5938 0.8125 +0.7812 0.5938 0.8438 +0.7812 0.5938 0.875 +0.7812 0.5938 0.9062 +0.7812 0.5938 0.9375 +0.7812 0.5938 0.9688 +0.7812 0.5938 1 +0.7812 0.625 0 +0.7812 0.625 0.03125 +0.7812 0.625 0.0625 +0.7812 0.625 0.09375 +0.7812 0.625 0.125 +0.7812 0.625 0.1562 +0.7812 0.625 0.1875 +0.7812 0.625 0.2188 +0.7812 0.625 0.25 +0.7812 0.625 0.2812 +0.7812 0.625 0.3125 +0.7812 0.625 0.3438 +0.7812 0.625 0.375 +0.7812 0.625 0.4062 +0.7812 0.625 0.4375 +0.7812 0.625 0.4688 +0.7812 0.625 0.5 +0.7812 0.625 0.5312 +0.7812 0.625 0.5625 +0.7812 0.625 0.5938 +0.7812 0.625 0.625 +0.7812 0.625 0.6562 +0.7812 0.625 0.6875 +0.7812 0.625 0.7188 +0.7812 0.625 0.75 +0.7812 0.625 0.7812 +0.7812 0.625 0.8125 +0.7812 0.625 0.8438 +0.7812 0.625 0.875 +0.7812 0.625 0.9062 +0.7812 0.625 0.9375 +0.7812 0.625 0.9688 +0.7812 0.625 1 +0.7812 0.6562 0 +0.7812 0.6562 0.03125 +0.7812 0.6562 0.0625 +0.7812 0.6562 0.09375 +0.7812 0.6562 0.125 +0.7812 0.6562 0.1562 +0.7812 0.6562 0.1875 +0.7812 0.6562 0.2188 +0.7812 0.6562 0.25 +0.7812 0.6562 0.2812 +0.7812 0.6562 0.3125 +0.7812 0.6562 0.3438 +0.7812 0.6562 0.375 +0.7812 0.6562 0.4062 +0.7812 0.6562 0.4375 +0.7812 0.6562 0.4688 +0.7812 0.6562 0.5 +0.7812 0.6562 0.5312 +0.7812 0.6562 0.5625 +0.7812 0.6562 0.5938 +0.7812 0.6562 0.625 +0.7812 0.6562 0.6562 +0.7812 0.6562 0.6875 +0.7812 0.6562 0.7188 +0.7812 0.6562 0.75 +0.7812 0.6562 0.7812 +0.7812 0.6562 0.8125 +0.7812 0.6562 0.8438 +0.7812 0.6562 0.875 +0.7812 0.6562 0.9062 +0.7812 0.6562 0.9375 +0.7812 0.6562 0.9688 +0.7812 0.6562 1 +0.7812 0.6875 0 +0.7812 0.6875 0.03125 +0.7812 0.6875 0.0625 +0.7812 0.6875 0.09375 +0.7812 0.6875 0.125 +0.7812 0.6875 0.1562 +0.7812 0.6875 0.1875 +0.7812 0.6875 0.2188 +0.7812 0.6875 0.25 +0.7812 0.6875 0.2812 +0.7812 0.6875 0.3125 +0.7812 0.6875 0.3438 +0.7812 0.6875 0.375 +0.7812 0.6875 0.4062 +0.7812 0.6875 0.4375 +0.7812 0.6875 0.4688 +0.7812 0.6875 0.5 +0.7812 0.6875 0.5312 +0.7812 0.6875 0.5625 +0.7812 0.6875 0.5938 +0.7812 0.6875 0.625 +0.7812 0.6875 0.6562 +0.7812 0.6875 0.6875 +0.7812 0.6875 0.7188 +0.7812 0.6875 0.75 +0.7812 0.6875 0.7812 +0.7812 0.6875 0.8125 +0.7812 0.6875 0.8438 +0.7812 0.6875 0.875 +0.7812 0.6875 0.9062 +0.7812 0.6875 0.9375 +0.7812 0.6875 0.9688 +0.7812 0.6875 1 +0.7812 0.7188 0 +0.7812 0.7188 0.03125 +0.7812 0.7188 0.0625 +0.7812 0.7188 0.09375 +0.7812 0.7188 0.125 +0.7812 0.7188 0.1562 +0.7812 0.7188 0.1875 +0.7812 0.7188 0.2188 +0.7812 0.7188 0.25 +0.7812 0.7188 0.2812 +0.7812 0.7188 0.3125 +0.7812 0.7188 0.3438 +0.7812 0.7188 0.375 +0.7812 0.7188 0.4062 +0.7812 0.7188 0.4375 +0.7812 0.7188 0.4688 +0.7812 0.7188 0.5 +0.7812 0.7188 0.5312 +0.7812 0.7188 0.5625 +0.7812 0.7188 0.5938 +0.7812 0.7188 0.625 +0.7812 0.7188 0.6562 +0.7812 0.7188 0.6875 +0.7812 0.7188 0.7188 +0.7812 0.7188 0.75 +0.7812 0.7188 0.7812 +0.7812 0.7188 0.8125 +0.7812 0.7188 0.8438 +0.7812 0.7188 0.875 +0.7812 0.7188 0.9062 +0.7812 0.7188 0.9375 +0.7812 0.7188 0.9688 +0.7812 0.7188 1 +0.7812 0.75 0 +0.7812 0.75 0.03125 +0.7812 0.75 0.0625 +0.7812 0.75 0.09375 +0.7812 0.75 0.125 +0.7812 0.75 0.1562 +0.7812 0.75 0.1875 +0.7812 0.75 0.2188 +0.7812 0.75 0.25 +0.7812 0.75 0.2812 +0.7812 0.75 0.3125 +0.7812 0.75 0.3438 +0.7812 0.75 0.375 +0.7812 0.75 0.4062 +0.7812 0.75 0.4375 +0.7812 0.75 0.4688 +0.7812 0.75 0.5 +0.7812 0.75 0.5312 +0.7812 0.75 0.5625 +0.7812 0.75 0.5938 +0.7812 0.75 0.625 +0.7812 0.75 0.6562 +0.7812 0.75 0.6875 +0.7812 0.75 0.7188 +0.7812 0.75 0.75 +0.7812 0.75 0.7812 +0.7812 0.75 0.8125 +0.7812 0.75 0.8438 +0.7812 0.75 0.875 +0.7812 0.75 0.9062 +0.7812 0.75 0.9375 +0.7812 0.75 0.9688 +0.7812 0.75 1 +0.7812 0.7812 0 +0.7812 0.7812 0.03125 +0.7812 0.7812 0.0625 +0.7812 0.7812 0.09375 +0.7812 0.7812 0.125 +0.7812 0.7812 0.1562 +0.7812 0.7812 0.1875 +0.7812 0.7812 0.2188 +0.7812 0.7812 0.25 +0.7812 0.7812 0.2812 +0.7812 0.7812 0.3125 +0.7812 0.7812 0.3438 +0.7812 0.7812 0.375 +0.7812 0.7812 0.4062 +0.7812 0.7812 0.4375 +0.7812 0.7812 0.4688 +0.7812 0.7812 0.5 +0.7812 0.7812 0.5312 +0.7812 0.7812 0.5625 +0.7812 0.7812 0.5938 +0.7812 0.7812 0.625 +0.7812 0.7812 0.6562 +0.7812 0.7812 0.6875 +0.7812 0.7812 0.7188 +0.7812 0.7812 0.75 +0.7812 0.7812 0.7812 +0.7812 0.7812 0.8125 +0.7812 0.7812 0.8438 +0.7812 0.7812 0.875 +0.7812 0.7812 0.9062 +0.7812 0.7812 0.9375 +0.7812 0.7812 0.9688 +0.7812 0.7812 1 +0.7812 0.8125 0 +0.7812 0.8125 0.03125 +0.7812 0.8125 0.0625 +0.7812 0.8125 0.09375 +0.7812 0.8125 0.125 +0.7812 0.8125 0.1562 +0.7812 0.8125 0.1875 +0.7812 0.8125 0.2188 +0.7812 0.8125 0.25 +0.7812 0.8125 0.2812 +0.7812 0.8125 0.3125 +0.7812 0.8125 0.3438 +0.7812 0.8125 0.375 +0.7812 0.8125 0.4062 +0.7812 0.8125 0.4375 +0.7812 0.8125 0.4688 +0.7812 0.8125 0.5 +0.7812 0.8125 0.5312 +0.7812 0.8125 0.5625 +0.7812 0.8125 0.5938 +0.7812 0.8125 0.625 +0.7812 0.8125 0.6562 +0.7812 0.8125 0.6875 +0.7812 0.8125 0.7188 +0.7812 0.8125 0.75 +0.7812 0.8125 0.7812 +0.7812 0.8125 0.8125 +0.7812 0.8125 0.8438 +0.7812 0.8125 0.875 +0.7812 0.8125 0.9062 +0.7812 0.8125 0.9375 +0.7812 0.8125 0.9688 +0.7812 0.8125 1 +0.7812 0.8438 0 +0.7812 0.8438 0.03125 +0.7812 0.8438 0.0625 +0.7812 0.8438 0.09375 +0.7812 0.8438 0.125 +0.7812 0.8438 0.1562 +0.7812 0.8438 0.1875 +0.7812 0.8438 0.2188 +0.7812 0.8438 0.25 +0.7812 0.8438 0.2812 +0.7812 0.8438 0.3125 +0.7812 0.8438 0.3438 +0.7812 0.8438 0.375 +0.7812 0.8438 0.4062 +0.7812 0.8438 0.4375 +0.7812 0.8438 0.4688 +0.7812 0.8438 0.5 +0.7812 0.8438 0.5312 +0.7812 0.8438 0.5625 +0.7812 0.8438 0.5938 +0.7812 0.8438 0.625 +0.7812 0.8438 0.6562 +0.7812 0.8438 0.6875 +0.7812 0.8438 0.7188 +0.7812 0.8438 0.75 +0.7812 0.8438 0.7812 +0.7812 0.8438 0.8125 +0.7812 0.8438 0.8438 +0.7812 0.8438 0.875 +0.7812 0.8438 0.9062 +0.7812 0.8438 0.9375 +0.7812 0.8438 0.9688 +0.7812 0.8438 1 +0.7812 0.875 0 +0.7812 0.875 0.03125 +0.7812 0.875 0.0625 +0.7812 0.875 0.09375 +0.7812 0.875 0.125 +0.7812 0.875 0.1562 +0.7812 0.875 0.1875 +0.7812 0.875 0.2188 +0.7812 0.875 0.25 +0.7812 0.875 0.2812 +0.7812 0.875 0.3125 +0.7812 0.875 0.3438 +0.7812 0.875 0.375 +0.7812 0.875 0.4062 +0.7812 0.875 0.4375 +0.7812 0.875 0.4688 +0.7812 0.875 0.5 +0.7812 0.875 0.5312 +0.7812 0.875 0.5625 +0.7812 0.875 0.5938 +0.7812 0.875 0.625 +0.7812 0.875 0.6562 +0.7812 0.875 0.6875 +0.7812 0.875 0.7188 +0.7812 0.875 0.75 +0.7812 0.875 0.7812 +0.7812 0.875 0.8125 +0.7812 0.875 0.8438 +0.7812 0.875 0.875 +0.7812 0.875 0.9062 +0.7812 0.875 0.9375 +0.7812 0.875 0.9688 +0.7812 0.875 1 +0.7812 0.9062 0 +0.7812 0.9062 0.03125 +0.7812 0.9062 0.0625 +0.7812 0.9062 0.09375 +0.7812 0.9062 0.125 +0.7812 0.9062 0.1562 +0.7812 0.9062 0.1875 +0.7812 0.9062 0.2188 +0.7812 0.9062 0.25 +0.7812 0.9062 0.2812 +0.7812 0.9062 0.3125 +0.7812 0.9062 0.3438 +0.7812 0.9062 0.375 +0.7812 0.9062 0.4062 +0.7812 0.9062 0.4375 +0.7812 0.9062 0.4688 +0.7812 0.9062 0.5 +0.7812 0.9062 0.5312 +0.7812 0.9062 0.5625 +0.7812 0.9062 0.5938 +0.7812 0.9062 0.625 +0.7812 0.9062 0.6562 +0.7812 0.9062 0.6875 +0.7812 0.9062 0.7188 +0.7812 0.9062 0.75 +0.7812 0.9062 0.7812 +0.7812 0.9062 0.8125 +0.7812 0.9062 0.8438 +0.7812 0.9062 0.875 +0.7812 0.9062 0.9062 +0.7812 0.9062 0.9375 +0.7812 0.9062 0.9688 +0.7812 0.9062 1 +0.7812 0.9375 0 +0.7812 0.9375 0.03125 +0.7812 0.9375 0.0625 +0.7812 0.9375 0.09375 +0.7812 0.9375 0.125 +0.7812 0.9375 0.1562 +0.7812 0.9375 0.1875 +0.7812 0.9375 0.2188 +0.7812 0.9375 0.25 +0.7812 0.9375 0.2812 +0.7812 0.9375 0.3125 +0.7812 0.9375 0.3438 +0.7812 0.9375 0.375 +0.7812 0.9375 0.4062 +0.7812 0.9375 0.4375 +0.7812 0.9375 0.4688 +0.7812 0.9375 0.5 +0.7812 0.9375 0.5312 +0.7812 0.9375 0.5625 +0.7812 0.9375 0.5938 +0.7812 0.9375 0.625 +0.7812 0.9375 0.6562 +0.7812 0.9375 0.6875 +0.7812 0.9375 0.7188 +0.7812 0.9375 0.75 +0.7812 0.9375 0.7812 +0.7812 0.9375 0.8125 +0.7812 0.9375 0.8438 +0.7812 0.9375 0.875 +0.7812 0.9375 0.9062 +0.7812 0.9375 0.9375 +0.7812 0.9375 0.9688 +0.7812 0.9375 1 +0.7812 0.9688 0 +0.7812 0.9688 0.03125 +0.7812 0.9688 0.0625 +0.7812 0.9688 0.09375 +0.7812 0.9688 0.125 +0.7812 0.9688 0.1562 +0.7812 0.9688 0.1875 +0.7812 0.9688 0.2188 +0.7812 0.9688 0.25 +0.7812 0.9688 0.2812 +0.7812 0.9688 0.3125 +0.7812 0.9688 0.3438 +0.7812 0.9688 0.375 +0.7812 0.9688 0.4062 +0.7812 0.9688 0.4375 +0.7812 0.9688 0.4688 +0.7812 0.9688 0.5 +0.7812 0.9688 0.5312 +0.7812 0.9688 0.5625 +0.7812 0.9688 0.5938 +0.7812 0.9688 0.625 +0.7812 0.9688 0.6562 +0.7812 0.9688 0.6875 +0.7812 0.9688 0.7188 +0.7812 0.9688 0.75 +0.7812 0.9688 0.7812 +0.7812 0.9688 0.8125 +0.7812 0.9688 0.8438 +0.7812 0.9688 0.875 +0.7812 0.9688 0.9062 +0.7812 0.9688 0.9375 +0.7812 0.9688 0.9688 +0.7812 0.9688 1 +0.7812 1 0 +0.7812 1 0.03125 +0.7812 1 0.0625 +0.7812 1 0.09375 +0.7812 1 0.125 +0.7812 1 0.1562 +0.7812 1 0.1875 +0.7812 1 0.2188 +0.7812 1 0.25 +0.7812 1 0.2812 +0.7812 1 0.3125 +0.7812 1 0.3438 +0.7812 1 0.375 +0.7812 1 0.4062 +0.7812 1 0.4375 +0.7812 1 0.4688 +0.7812 1 0.5 +0.7812 1 0.5312 +0.7812 1 0.5625 +0.7812 1 0.5938 +0.7812 1 0.625 +0.7812 1 0.6562 +0.7812 1 0.6875 +0.7812 1 0.7188 +0.7812 1 0.75 +0.7812 1 0.7812 +0.7812 1 0.8125 +0.7812 1 0.8438 +0.7812 1 0.875 +0.7812 1 0.9062 +0.7812 1 0.9375 +0.7812 1 0.9688 +0.7812 1 1 +0.8125 0 0 +0.8125 0 0.03125 +0.8125 0 0.0625 +0.8125 0 0.09375 +0.8125 0 0.125 +0.8125 0 0.1562 +0.8125 0 0.1875 +0.8125 0 0.2188 +0.8125 0 0.25 +0.8125 0 0.2812 +0.8125 0 0.3125 +0.8125 0 0.3438 +0.8125 0 0.375 +0.8125 0 0.4062 +0.8125 0 0.4375 +0.8125 0 0.4688 +0.8125 0 0.5 +0.8125 0 0.5312 +0.8125 0 0.5625 +0.8125 0 0.5938 +0.8125 0 0.625 +0.8125 0 0.6562 +0.8125 0 0.6875 +0.8125 0 0.7188 +0.8125 0 0.75 +0.8125 0 0.7812 +0.8125 0 0.8125 +0.8125 0 0.8438 +0.8125 0 0.875 +0.8125 0 0.9062 +0.8125 0 0.9375 +0.8125 0 0.9688 +0.8125 0 1 +0.8125 0.03125 0 +0.8125 0.03125 0.03125 +0.8125 0.03125 0.0625 +0.8125 0.03125 0.09375 +0.8125 0.03125 0.125 +0.8125 0.03125 0.1562 +0.8125 0.03125 0.1875 +0.8125 0.03125 0.2188 +0.8125 0.03125 0.25 +0.8125 0.03125 0.2812 +0.8125 0.03125 0.3125 +0.8125 0.03125 0.3438 +0.8125 0.03125 0.375 +0.8125 0.03125 0.4062 +0.8125 0.03125 0.4375 +0.8125 0.03125 0.4688 +0.8125 0.03125 0.5 +0.8125 0.03125 0.5312 +0.8125 0.03125 0.5625 +0.8125 0.03125 0.5938 +0.8125 0.03125 0.625 +0.8125 0.03125 0.6562 +0.8125 0.03125 0.6875 +0.8125 0.03125 0.7188 +0.8125 0.03125 0.75 +0.8125 0.03125 0.7812 +0.8125 0.03125 0.8125 +0.8125 0.03125 0.8438 +0.8125 0.03125 0.875 +0.8125 0.03125 0.9062 +0.8125 0.03125 0.9375 +0.8125 0.03125 0.9688 +0.8125 0.03125 1 +0.8125 0.0625 0 +0.8125 0.0625 0.03125 +0.8125 0.0625 0.0625 +0.8125 0.0625 0.09375 +0.8125 0.0625 0.125 +0.8125 0.0625 0.1562 +0.8125 0.0625 0.1875 +0.8125 0.0625 0.2188 +0.8125 0.0625 0.25 +0.8125 0.0625 0.2812 +0.8125 0.0625 0.3125 +0.8125 0.0625 0.3438 +0.8125 0.0625 0.375 +0.8125 0.0625 0.4062 +0.8125 0.0625 0.4375 +0.8125 0.0625 0.4688 +0.8125 0.0625 0.5 +0.8125 0.0625 0.5312 +0.8125 0.0625 0.5625 +0.8125 0.0625 0.5938 +0.8125 0.0625 0.625 +0.8125 0.0625 0.6562 +0.8125 0.0625 0.6875 +0.8125 0.0625 0.7188 +0.8125 0.0625 0.75 +0.8125 0.0625 0.7812 +0.8125 0.0625 0.8125 +0.8125 0.0625 0.8438 +0.8125 0.0625 0.875 +0.8125 0.0625 0.9062 +0.8125 0.0625 0.9375 +0.8125 0.0625 0.9688 +0.8125 0.0625 1 +0.8125 0.09375 0 +0.8125 0.09375 0.03125 +0.8125 0.09375 0.0625 +0.8125 0.09375 0.09375 +0.8125 0.09375 0.125 +0.8125 0.09375 0.1562 +0.8125 0.09375 0.1875 +0.8125 0.09375 0.2188 +0.8125 0.09375 0.25 +0.8125 0.09375 0.2812 +0.8125 0.09375 0.3125 +0.8125 0.09375 0.3438 +0.8125 0.09375 0.375 +0.8125 0.09375 0.4062 +0.8125 0.09375 0.4375 +0.8125 0.09375 0.4688 +0.8125 0.09375 0.5 +0.8125 0.09375 0.5312 +0.8125 0.09375 0.5625 +0.8125 0.09375 0.5938 +0.8125 0.09375 0.625 +0.8125 0.09375 0.6562 +0.8125 0.09375 0.6875 +0.8125 0.09375 0.7188 +0.8125 0.09375 0.75 +0.8125 0.09375 0.7812 +0.8125 0.09375 0.8125 +0.8125 0.09375 0.8438 +0.8125 0.09375 0.875 +0.8125 0.09375 0.9062 +0.8125 0.09375 0.9375 +0.8125 0.09375 0.9688 +0.8125 0.09375 1 +0.8125 0.125 0 +0.8125 0.125 0.03125 +0.8125 0.125 0.0625 +0.8125 0.125 0.09375 +0.8125 0.125 0.125 +0.8125 0.125 0.1562 +0.8125 0.125 0.1875 +0.8125 0.125 0.2188 +0.8125 0.125 0.25 +0.8125 0.125 0.2812 +0.8125 0.125 0.3125 +0.8125 0.125 0.3438 +0.8125 0.125 0.375 +0.8125 0.125 0.4062 +0.8125 0.125 0.4375 +0.8125 0.125 0.4688 +0.8125 0.125 0.5 +0.8125 0.125 0.5312 +0.8125 0.125 0.5625 +0.8125 0.125 0.5938 +0.8125 0.125 0.625 +0.8125 0.125 0.6562 +0.8125 0.125 0.6875 +0.8125 0.125 0.7188 +0.8125 0.125 0.75 +0.8125 0.125 0.7812 +0.8125 0.125 0.8125 +0.8125 0.125 0.8438 +0.8125 0.125 0.875 +0.8125 0.125 0.9062 +0.8125 0.125 0.9375 +0.8125 0.125 0.9688 +0.8125 0.125 1 +0.8125 0.1562 0 +0.8125 0.1562 0.03125 +0.8125 0.1562 0.0625 +0.8125 0.1562 0.09375 +0.8125 0.1562 0.125 +0.8125 0.1562 0.1562 +0.8125 0.1562 0.1875 +0.8125 0.1562 0.2188 +0.8125 0.1562 0.25 +0.8125 0.1562 0.2812 +0.8125 0.1562 0.3125 +0.8125 0.1562 0.3438 +0.8125 0.1562 0.375 +0.8125 0.1562 0.4062 +0.8125 0.1562 0.4375 +0.8125 0.1562 0.4688 +0.8125 0.1562 0.5 +0.8125 0.1562 0.5312 +0.8125 0.1562 0.5625 +0.8125 0.1562 0.5938 +0.8125 0.1562 0.625 +0.8125 0.1562 0.6562 +0.8125 0.1562 0.6875 +0.8125 0.1562 0.7188 +0.8125 0.1562 0.75 +0.8125 0.1562 0.7812 +0.8125 0.1562 0.8125 +0.8125 0.1562 0.8438 +0.8125 0.1562 0.875 +0.8125 0.1562 0.9062 +0.8125 0.1562 0.9375 +0.8125 0.1562 0.9688 +0.8125 0.1562 1 +0.8125 0.1875 0 +0.8125 0.1875 0.03125 +0.8125 0.1875 0.0625 +0.8125 0.1875 0.09375 +0.8125 0.1875 0.125 +0.8125 0.1875 0.1562 +0.8125 0.1875 0.1875 +0.8125 0.1875 0.2188 +0.8125 0.1875 0.25 +0.8125 0.1875 0.2812 +0.8125 0.1875 0.3125 +0.8125 0.1875 0.3438 +0.8125 0.1875 0.375 +0.8125 0.1875 0.4062 +0.8125 0.1875 0.4375 +0.8125 0.1875 0.4688 +0.8125 0.1875 0.5 +0.8125 0.1875 0.5312 +0.8125 0.1875 0.5625 +0.8125 0.1875 0.5938 +0.8125 0.1875 0.625 +0.8125 0.1875 0.6562 +0.8125 0.1875 0.6875 +0.8125 0.1875 0.7188 +0.8125 0.1875 0.75 +0.8125 0.1875 0.7812 +0.8125 0.1875 0.8125 +0.8125 0.1875 0.8438 +0.8125 0.1875 0.875 +0.8125 0.1875 0.9062 +0.8125 0.1875 0.9375 +0.8125 0.1875 0.9688 +0.8125 0.1875 1 +0.8125 0.2188 0 +0.8125 0.2188 0.03125 +0.8125 0.2188 0.0625 +0.8125 0.2188 0.09375 +0.8125 0.2188 0.125 +0.8125 0.2188 0.1562 +0.8125 0.2188 0.1875 +0.8125 0.2188 0.2188 +0.8125 0.2188 0.25 +0.8125 0.2188 0.2812 +0.8125 0.2188 0.3125 +0.8125 0.2188 0.3438 +0.8125 0.2188 0.375 +0.8125 0.2188 0.4062 +0.8125 0.2188 0.4375 +0.8125 0.2188 0.4688 +0.8125 0.2188 0.5 +0.8125 0.2188 0.5312 +0.8125 0.2188 0.5625 +0.8125 0.2188 0.5938 +0.8125 0.2188 0.625 +0.8125 0.2188 0.6562 +0.8125 0.2188 0.6875 +0.8125 0.2188 0.7188 +0.8125 0.2188 0.75 +0.8125 0.2188 0.7812 +0.8125 0.2188 0.8125 +0.8125 0.2188 0.8438 +0.8125 0.2188 0.875 +0.8125 0.2188 0.9062 +0.8125 0.2188 0.9375 +0.8125 0.2188 0.9688 +0.8125 0.2188 1 +0.8125 0.25 0 +0.8125 0.25 0.03125 +0.8125 0.25 0.0625 +0.8125 0.25 0.09375 +0.8125 0.25 0.125 +0.8125 0.25 0.1562 +0.8125 0.25 0.1875 +0.8125 0.25 0.2188 +0.8125 0.25 0.25 +0.8125 0.25 0.2812 +0.8125 0.25 0.3125 +0.8125 0.25 0.3438 +0.8125 0.25 0.375 +0.8125 0.25 0.4062 +0.8125 0.25 0.4375 +0.8125 0.25 0.4688 +0.8125 0.25 0.5 +0.8125 0.25 0.5312 +0.8125 0.25 0.5625 +0.8125 0.25 0.5938 +0.8125 0.25 0.625 +0.8125 0.25 0.6562 +0.8125 0.25 0.6875 +0.8125 0.25 0.7188 +0.8125 0.25 0.75 +0.8125 0.25 0.7812 +0.8125 0.25 0.8125 +0.8125 0.25 0.8438 +0.8125 0.25 0.875 +0.8125 0.25 0.9062 +0.8125 0.25 0.9375 +0.8125 0.25 0.9688 +0.8125 0.25 1 +0.8125 0.2812 0 +0.8125 0.2812 0.03125 +0.8125 0.2812 0.0625 +0.8125 0.2812 0.09375 +0.8125 0.2812 0.125 +0.8125 0.2812 0.1562 +0.8125 0.2812 0.1875 +0.8125 0.2812 0.2188 +0.8125 0.2812 0.25 +0.8125 0.2812 0.2812 +0.8125 0.2812 0.3125 +0.8125 0.2812 0.3438 +0.8125 0.2812 0.375 +0.8125 0.2812 0.4062 +0.8125 0.2812 0.4375 +0.8125 0.2812 0.4688 +0.8125 0.2812 0.5 +0.8125 0.2812 0.5312 +0.8125 0.2812 0.5625 +0.8125 0.2812 0.5938 +0.8125 0.2812 0.625 +0.8125 0.2812 0.6562 +0.8125 0.2812 0.6875 +0.8125 0.2812 0.7188 +0.8125 0.2812 0.75 +0.8125 0.2812 0.7812 +0.8125 0.2812 0.8125 +0.8125 0.2812 0.8438 +0.8125 0.2812 0.875 +0.8125 0.2812 0.9062 +0.8125 0.2812 0.9375 +0.8125 0.2812 0.9688 +0.8125 0.2812 1 +0.8125 0.3125 0 +0.8125 0.3125 0.03125 +0.8125 0.3125 0.0625 +0.8125 0.3125 0.09375 +0.8125 0.3125 0.125 +0.8125 0.3125 0.1562 +0.8125 0.3125 0.1875 +0.8125 0.3125 0.2188 +0.8125 0.3125 0.25 +0.8125 0.3125 0.2812 +0.8125 0.3125 0.3125 +0.8125 0.3125 0.3438 +0.8125 0.3125 0.375 +0.8125 0.3125 0.4062 +0.8125 0.3125 0.4375 +0.8125 0.3125 0.4688 +0.8125 0.3125 0.5 +0.8125 0.3125 0.5312 +0.8125 0.3125 0.5625 +0.8125 0.3125 0.5938 +0.8125 0.3125 0.625 +0.8125 0.3125 0.6562 +0.8125 0.3125 0.6875 +0.8125 0.3125 0.7188 +0.8125 0.3125 0.75 +0.8125 0.3125 0.7812 +0.8125 0.3125 0.8125 +0.8125 0.3125 0.8438 +0.8125 0.3125 0.875 +0.8125 0.3125 0.9062 +0.8125 0.3125 0.9375 +0.8125 0.3125 0.9688 +0.8125 0.3125 1 +0.8125 0.3438 0 +0.8125 0.3438 0.03125 +0.8125 0.3438 0.0625 +0.8125 0.3438 0.09375 +0.8125 0.3438 0.125 +0.8125 0.3438 0.1562 +0.8125 0.3438 0.1875 +0.8125 0.3438 0.2188 +0.8125 0.3438 0.25 +0.8125 0.3438 0.2812 +0.8125 0.3438 0.3125 +0.8125 0.3438 0.3438 +0.8125 0.3438 0.375 +0.8125 0.3438 0.4062 +0.8125 0.3438 0.4375 +0.8125 0.3438 0.4688 +0.8125 0.3438 0.5 +0.8125 0.3438 0.5312 +0.8125 0.3438 0.5625 +0.8125 0.3438 0.5938 +0.8125 0.3438 0.625 +0.8125 0.3438 0.6562 +0.8125 0.3438 0.6875 +0.8125 0.3438 0.7188 +0.8125 0.3438 0.75 +0.8125 0.3438 0.7812 +0.8125 0.3438 0.8125 +0.8125 0.3438 0.8438 +0.8125 0.3438 0.875 +0.8125 0.3438 0.9062 +0.8125 0.3438 0.9375 +0.8125 0.3438 0.9688 +0.8125 0.3438 1 +0.8125 0.375 0 +0.8125 0.375 0.03125 +0.8125 0.375 0.0625 +0.8125 0.375 0.09375 +0.8125 0.375 0.125 +0.8125 0.375 0.1562 +0.8125 0.375 0.1875 +0.8125 0.375 0.2188 +0.8125 0.375 0.25 +0.8125 0.375 0.2812 +0.8125 0.375 0.3125 +0.8125 0.375 0.3438 +0.8125 0.375 0.375 +0.8125 0.375 0.4062 +0.8125 0.375 0.4375 +0.8125 0.375 0.4688 +0.8125 0.375 0.5 +0.8125 0.375 0.5312 +0.8125 0.375 0.5625 +0.8125 0.375 0.5938 +0.8125 0.375 0.625 +0.8125 0.375 0.6562 +0.8125 0.375 0.6875 +0.8125 0.375 0.7188 +0.8125 0.375 0.75 +0.8125 0.375 0.7812 +0.8125 0.375 0.8125 +0.8125 0.375 0.8438 +0.8125 0.375 0.875 +0.8125 0.375 0.9062 +0.8125 0.375 0.9375 +0.8125 0.375 0.9688 +0.8125 0.375 1 +0.8125 0.4062 0 +0.8125 0.4062 0.03125 +0.8125 0.4062 0.0625 +0.8125 0.4062 0.09375 +0.8125 0.4062 0.125 +0.8125 0.4062 0.1562 +0.8125 0.4062 0.1875 +0.8125 0.4062 0.2188 +0.8125 0.4062 0.25 +0.8125 0.4062 0.2812 +0.8125 0.4062 0.3125 +0.8125 0.4062 0.3438 +0.8125 0.4062 0.375 +0.8125 0.4062 0.4062 +0.8125 0.4062 0.4375 +0.8125 0.4062 0.4688 +0.8125 0.4062 0.5 +0.8125 0.4062 0.5312 +0.8125 0.4062 0.5625 +0.8125 0.4062 0.5938 +0.8125 0.4062 0.625 +0.8125 0.4062 0.6562 +0.8125 0.4062 0.6875 +0.8125 0.4062 0.7188 +0.8125 0.4062 0.75 +0.8125 0.4062 0.7812 +0.8125 0.4062 0.8125 +0.8125 0.4062 0.8438 +0.8125 0.4062 0.875 +0.8125 0.4062 0.9062 +0.8125 0.4062 0.9375 +0.8125 0.4062 0.9688 +0.8125 0.4062 1 +0.8125 0.4375 0 +0.8125 0.4375 0.03125 +0.8125 0.4375 0.0625 +0.8125 0.4375 0.09375 +0.8125 0.4375 0.125 +0.8125 0.4375 0.1562 +0.8125 0.4375 0.1875 +0.8125 0.4375 0.2188 +0.8125 0.4375 0.25 +0.8125 0.4375 0.2812 +0.8125 0.4375 0.3125 +0.8125 0.4375 0.3438 +0.8125 0.4375 0.375 +0.8125 0.4375 0.4062 +0.8125 0.4375 0.4375 +0.8125 0.4375 0.4688 +0.8125 0.4375 0.5 +0.8125 0.4375 0.5312 +0.8125 0.4375 0.5625 +0.8125 0.4375 0.5938 +0.8125 0.4375 0.625 +0.8125 0.4375 0.6562 +0.8125 0.4375 0.6875 +0.8125 0.4375 0.7188 +0.8125 0.4375 0.75 +0.8125 0.4375 0.7812 +0.8125 0.4375 0.8125 +0.8125 0.4375 0.8438 +0.8125 0.4375 0.875 +0.8125 0.4375 0.9062 +0.8125 0.4375 0.9375 +0.8125 0.4375 0.9688 +0.8125 0.4375 1 +0.8125 0.4688 0 +0.8125 0.4688 0.03125 +0.8125 0.4688 0.0625 +0.8125 0.4688 0.09375 +0.8125 0.4688 0.125 +0.8125 0.4688 0.1562 +0.8125 0.4688 0.1875 +0.8125 0.4688 0.2188 +0.8125 0.4688 0.25 +0.8125 0.4688 0.2812 +0.8125 0.4688 0.3125 +0.8125 0.4688 0.3438 +0.8125 0.4688 0.375 +0.8125 0.4688 0.4062 +0.8125 0.4688 0.4375 +0.8125 0.4688 0.4688 +0.8125 0.4688 0.5 +0.8125 0.4688 0.5312 +0.8125 0.4688 0.5625 +0.8125 0.4688 0.5938 +0.8125 0.4688 0.625 +0.8125 0.4688 0.6562 +0.8125 0.4688 0.6875 +0.8125 0.4688 0.7188 +0.8125 0.4688 0.75 +0.8125 0.4688 0.7812 +0.8125 0.4688 0.8125 +0.8125 0.4688 0.8438 +0.8125 0.4688 0.875 +0.8125 0.4688 0.9062 +0.8125 0.4688 0.9375 +0.8125 0.4688 0.9688 +0.8125 0.4688 1 +0.8125 0.5 0 +0.8125 0.5 0.03125 +0.8125 0.5 0.0625 +0.8125 0.5 0.09375 +0.8125 0.5 0.125 +0.8125 0.5 0.1562 +0.8125 0.5 0.1875 +0.8125 0.5 0.2188 +0.8125 0.5 0.25 +0.8125 0.5 0.2812 +0.8125 0.5 0.3125 +0.8125 0.5 0.3438 +0.8125 0.5 0.375 +0.8125 0.5 0.4062 +0.8125 0.5 0.4375 +0.8125 0.5 0.4688 +0.8125 0.5 0.5 +0.8125 0.5 0.5312 +0.8125 0.5 0.5625 +0.8125 0.5 0.5938 +0.8125 0.5 0.625 +0.8125 0.5 0.6562 +0.8125 0.5 0.6875 +0.8125 0.5 0.7188 +0.8125 0.5 0.75 +0.8125 0.5 0.7812 +0.8125 0.5 0.8125 +0.8125 0.5 0.8438 +0.8125 0.5 0.875 +0.8125 0.5 0.9062 +0.8125 0.5 0.9375 +0.8125 0.5 0.9688 +0.8125 0.5 1 +0.8125 0.5312 0 +0.8125 0.5312 0.03125 +0.8125 0.5312 0.0625 +0.8125 0.5312 0.09375 +0.8125 0.5312 0.125 +0.8125 0.5312 0.1562 +0.8125 0.5312 0.1875 +0.8125 0.5312 0.2188 +0.8125 0.5312 0.25 +0.8125 0.5312 0.2812 +0.8125 0.5312 0.3125 +0.8125 0.5312 0.3438 +0.8125 0.5312 0.375 +0.8125 0.5312 0.4062 +0.8125 0.5312 0.4375 +0.8125 0.5312 0.4688 +0.8125 0.5312 0.5 +0.8125 0.5312 0.5312 +0.8125 0.5312 0.5625 +0.8125 0.5312 0.5938 +0.8125 0.5312 0.625 +0.8125 0.5312 0.6562 +0.8125 0.5312 0.6875 +0.8125 0.5312 0.7188 +0.8125 0.5312 0.75 +0.8125 0.5312 0.7812 +0.8125 0.5312 0.8125 +0.8125 0.5312 0.8438 +0.8125 0.5312 0.875 +0.8125 0.5312 0.9062 +0.8125 0.5312 0.9375 +0.8125 0.5312 0.9688 +0.8125 0.5312 1 +0.8125 0.5625 0 +0.8125 0.5625 0.03125 +0.8125 0.5625 0.0625 +0.8125 0.5625 0.09375 +0.8125 0.5625 0.125 +0.8125 0.5625 0.1562 +0.8125 0.5625 0.1875 +0.8125 0.5625 0.2188 +0.8125 0.5625 0.25 +0.8125 0.5625 0.2812 +0.8125 0.5625 0.3125 +0.8125 0.5625 0.3438 +0.8125 0.5625 0.375 +0.8125 0.5625 0.4062 +0.8125 0.5625 0.4375 +0.8125 0.5625 0.4688 +0.8125 0.5625 0.5 +0.8125 0.5625 0.5312 +0.8125 0.5625 0.5625 +0.8125 0.5625 0.5938 +0.8125 0.5625 0.625 +0.8125 0.5625 0.6562 +0.8125 0.5625 0.6875 +0.8125 0.5625 0.7188 +0.8125 0.5625 0.75 +0.8125 0.5625 0.7812 +0.8125 0.5625 0.8125 +0.8125 0.5625 0.8438 +0.8125 0.5625 0.875 +0.8125 0.5625 0.9062 +0.8125 0.5625 0.9375 +0.8125 0.5625 0.9688 +0.8125 0.5625 1 +0.8125 0.5938 0 +0.8125 0.5938 0.03125 +0.8125 0.5938 0.0625 +0.8125 0.5938 0.09375 +0.8125 0.5938 0.125 +0.8125 0.5938 0.1562 +0.8125 0.5938 0.1875 +0.8125 0.5938 0.2188 +0.8125 0.5938 0.25 +0.8125 0.5938 0.2812 +0.8125 0.5938 0.3125 +0.8125 0.5938 0.3438 +0.8125 0.5938 0.375 +0.8125 0.5938 0.4062 +0.8125 0.5938 0.4375 +0.8125 0.5938 0.4688 +0.8125 0.5938 0.5 +0.8125 0.5938 0.5312 +0.8125 0.5938 0.5625 +0.8125 0.5938 0.5938 +0.8125 0.5938 0.625 +0.8125 0.5938 0.6562 +0.8125 0.5938 0.6875 +0.8125 0.5938 0.7188 +0.8125 0.5938 0.75 +0.8125 0.5938 0.7812 +0.8125 0.5938 0.8125 +0.8125 0.5938 0.8438 +0.8125 0.5938 0.875 +0.8125 0.5938 0.9062 +0.8125 0.5938 0.9375 +0.8125 0.5938 0.9688 +0.8125 0.5938 1 +0.8125 0.625 0 +0.8125 0.625 0.03125 +0.8125 0.625 0.0625 +0.8125 0.625 0.09375 +0.8125 0.625 0.125 +0.8125 0.625 0.1562 +0.8125 0.625 0.1875 +0.8125 0.625 0.2188 +0.8125 0.625 0.25 +0.8125 0.625 0.2812 +0.8125 0.625 0.3125 +0.8125 0.625 0.3438 +0.8125 0.625 0.375 +0.8125 0.625 0.4062 +0.8125 0.625 0.4375 +0.8125 0.625 0.4688 +0.8125 0.625 0.5 +0.8125 0.625 0.5312 +0.8125 0.625 0.5625 +0.8125 0.625 0.5938 +0.8125 0.625 0.625 +0.8125 0.625 0.6562 +0.8125 0.625 0.6875 +0.8125 0.625 0.7188 +0.8125 0.625 0.75 +0.8125 0.625 0.7812 +0.8125 0.625 0.8125 +0.8125 0.625 0.8438 +0.8125 0.625 0.875 +0.8125 0.625 0.9062 +0.8125 0.625 0.9375 +0.8125 0.625 0.9688 +0.8125 0.625 1 +0.8125 0.6562 0 +0.8125 0.6562 0.03125 +0.8125 0.6562 0.0625 +0.8125 0.6562 0.09375 +0.8125 0.6562 0.125 +0.8125 0.6562 0.1562 +0.8125 0.6562 0.1875 +0.8125 0.6562 0.2188 +0.8125 0.6562 0.25 +0.8125 0.6562 0.2812 +0.8125 0.6562 0.3125 +0.8125 0.6562 0.3438 +0.8125 0.6562 0.375 +0.8125 0.6562 0.4062 +0.8125 0.6562 0.4375 +0.8125 0.6562 0.4688 +0.8125 0.6562 0.5 +0.8125 0.6562 0.5312 +0.8125 0.6562 0.5625 +0.8125 0.6562 0.5938 +0.8125 0.6562 0.625 +0.8125 0.6562 0.6562 +0.8125 0.6562 0.6875 +0.8125 0.6562 0.7188 +0.8125 0.6562 0.75 +0.8125 0.6562 0.7812 +0.8125 0.6562 0.8125 +0.8125 0.6562 0.8438 +0.8125 0.6562 0.875 +0.8125 0.6562 0.9062 +0.8125 0.6562 0.9375 +0.8125 0.6562 0.9688 +0.8125 0.6562 1 +0.8125 0.6875 0 +0.8125 0.6875 0.03125 +0.8125 0.6875 0.0625 +0.8125 0.6875 0.09375 +0.8125 0.6875 0.125 +0.8125 0.6875 0.1562 +0.8125 0.6875 0.1875 +0.8125 0.6875 0.2188 +0.8125 0.6875 0.25 +0.8125 0.6875 0.2812 +0.8125 0.6875 0.3125 +0.8125 0.6875 0.3438 +0.8125 0.6875 0.375 +0.8125 0.6875 0.4062 +0.8125 0.6875 0.4375 +0.8125 0.6875 0.4688 +0.8125 0.6875 0.5 +0.8125 0.6875 0.5312 +0.8125 0.6875 0.5625 +0.8125 0.6875 0.5938 +0.8125 0.6875 0.625 +0.8125 0.6875 0.6562 +0.8125 0.6875 0.6875 +0.8125 0.6875 0.7188 +0.8125 0.6875 0.75 +0.8125 0.6875 0.7812 +0.8125 0.6875 0.8125 +0.8125 0.6875 0.8438 +0.8125 0.6875 0.875 +0.8125 0.6875 0.9062 +0.8125 0.6875 0.9375 +0.8125 0.6875 0.9688 +0.8125 0.6875 1 +0.8125 0.7188 0 +0.8125 0.7188 0.03125 +0.8125 0.7188 0.0625 +0.8125 0.7188 0.09375 +0.8125 0.7188 0.125 +0.8125 0.7188 0.1562 +0.8125 0.7188 0.1875 +0.8125 0.7188 0.2188 +0.8125 0.7188 0.25 +0.8125 0.7188 0.2812 +0.8125 0.7188 0.3125 +0.8125 0.7188 0.3438 +0.8125 0.7188 0.375 +0.8125 0.7188 0.4062 +0.8125 0.7188 0.4375 +0.8125 0.7188 0.4688 +0.8125 0.7188 0.5 +0.8125 0.7188 0.5312 +0.8125 0.7188 0.5625 +0.8125 0.7188 0.5938 +0.8125 0.7188 0.625 +0.8125 0.7188 0.6562 +0.8125 0.7188 0.6875 +0.8125 0.7188 0.7188 +0.8125 0.7188 0.75 +0.8125 0.7188 0.7812 +0.8125 0.7188 0.8125 +0.8125 0.7188 0.8438 +0.8125 0.7188 0.875 +0.8125 0.7188 0.9062 +0.8125 0.7188 0.9375 +0.8125 0.7188 0.9688 +0.8125 0.7188 1 +0.8125 0.75 0 +0.8125 0.75 0.03125 +0.8125 0.75 0.0625 +0.8125 0.75 0.09375 +0.8125 0.75 0.125 +0.8125 0.75 0.1562 +0.8125 0.75 0.1875 +0.8125 0.75 0.2188 +0.8125 0.75 0.25 +0.8125 0.75 0.2812 +0.8125 0.75 0.3125 +0.8125 0.75 0.3438 +0.8125 0.75 0.375 +0.8125 0.75 0.4062 +0.8125 0.75 0.4375 +0.8125 0.75 0.4688 +0.8125 0.75 0.5 +0.8125 0.75 0.5312 +0.8125 0.75 0.5625 +0.8125 0.75 0.5938 +0.8125 0.75 0.625 +0.8125 0.75 0.6562 +0.8125 0.75 0.6875 +0.8125 0.75 0.7188 +0.8125 0.75 0.75 +0.8125 0.75 0.7812 +0.8125 0.75 0.8125 +0.8125 0.75 0.8438 +0.8125 0.75 0.875 +0.8125 0.75 0.9062 +0.8125 0.75 0.9375 +0.8125 0.75 0.9688 +0.8125 0.75 1 +0.8125 0.7812 0 +0.8125 0.7812 0.03125 +0.8125 0.7812 0.0625 +0.8125 0.7812 0.09375 +0.8125 0.7812 0.125 +0.8125 0.7812 0.1562 +0.8125 0.7812 0.1875 +0.8125 0.7812 0.2188 +0.8125 0.7812 0.25 +0.8125 0.7812 0.2812 +0.8125 0.7812 0.3125 +0.8125 0.7812 0.3438 +0.8125 0.7812 0.375 +0.8125 0.7812 0.4062 +0.8125 0.7812 0.4375 +0.8125 0.7812 0.4688 +0.8125 0.7812 0.5 +0.8125 0.7812 0.5312 +0.8125 0.7812 0.5625 +0.8125 0.7812 0.5938 +0.8125 0.7812 0.625 +0.8125 0.7812 0.6562 +0.8125 0.7812 0.6875 +0.8125 0.7812 0.7188 +0.8125 0.7812 0.75 +0.8125 0.7812 0.7812 +0.8125 0.7812 0.8125 +0.8125 0.7812 0.8438 +0.8125 0.7812 0.875 +0.8125 0.7812 0.9062 +0.8125 0.7812 0.9375 +0.8125 0.7812 0.9688 +0.8125 0.7812 1 +0.8125 0.8125 0 +0.8125 0.8125 0.03125 +0.8125 0.8125 0.0625 +0.8125 0.8125 0.09375 +0.8125 0.8125 0.125 +0.8125 0.8125 0.1562 +0.8125 0.8125 0.1875 +0.8125 0.8125 0.2188 +0.8125 0.8125 0.25 +0.8125 0.8125 0.2812 +0.8125 0.8125 0.3125 +0.8125 0.8125 0.3438 +0.8125 0.8125 0.375 +0.8125 0.8125 0.4062 +0.8125 0.8125 0.4375 +0.8125 0.8125 0.4688 +0.8125 0.8125 0.5 +0.8125 0.8125 0.5312 +0.8125 0.8125 0.5625 +0.8125 0.8125 0.5938 +0.8125 0.8125 0.625 +0.8125 0.8125 0.6562 +0.8125 0.8125 0.6875 +0.8125 0.8125 0.7188 +0.8125 0.8125 0.75 +0.8125 0.8125 0.7812 +0.8125 0.8125 0.8125 +0.8125 0.8125 0.8438 +0.8125 0.8125 0.875 +0.8125 0.8125 0.9062 +0.8125 0.8125 0.9375 +0.8125 0.8125 0.9688 +0.8125 0.8125 1 +0.8125 0.8438 0 +0.8125 0.8438 0.03125 +0.8125 0.8438 0.0625 +0.8125 0.8438 0.09375 +0.8125 0.8438 0.125 +0.8125 0.8438 0.1562 +0.8125 0.8438 0.1875 +0.8125 0.8438 0.2188 +0.8125 0.8438 0.25 +0.8125 0.8438 0.2812 +0.8125 0.8438 0.3125 +0.8125 0.8438 0.3438 +0.8125 0.8438 0.375 +0.8125 0.8438 0.4062 +0.8125 0.8438 0.4375 +0.8125 0.8438 0.4688 +0.8125 0.8438 0.5 +0.8125 0.8438 0.5312 +0.8125 0.8438 0.5625 +0.8125 0.8438 0.5938 +0.8125 0.8438 0.625 +0.8125 0.8438 0.6562 +0.8125 0.8438 0.6875 +0.8125 0.8438 0.7188 +0.8125 0.8438 0.75 +0.8125 0.8438 0.7812 +0.8125 0.8438 0.8125 +0.8125 0.8438 0.8438 +0.8125 0.8438 0.875 +0.8125 0.8438 0.9062 +0.8125 0.8438 0.9375 +0.8125 0.8438 0.9688 +0.8125 0.8438 1 +0.8125 0.875 0 +0.8125 0.875 0.03125 +0.8125 0.875 0.0625 +0.8125 0.875 0.09375 +0.8125 0.875 0.125 +0.8125 0.875 0.1562 +0.8125 0.875 0.1875 +0.8125 0.875 0.2188 +0.8125 0.875 0.25 +0.8125 0.875 0.2812 +0.8125 0.875 0.3125 +0.8125 0.875 0.3438 +0.8125 0.875 0.375 +0.8125 0.875 0.4062 +0.8125 0.875 0.4375 +0.8125 0.875 0.4688 +0.8125 0.875 0.5 +0.8125 0.875 0.5312 +0.8125 0.875 0.5625 +0.8125 0.875 0.5938 +0.8125 0.875 0.625 +0.8125 0.875 0.6562 +0.8125 0.875 0.6875 +0.8125 0.875 0.7188 +0.8125 0.875 0.75 +0.8125 0.875 0.7812 +0.8125 0.875 0.8125 +0.8125 0.875 0.8438 +0.8125 0.875 0.875 +0.8125 0.875 0.9062 +0.8125 0.875 0.9375 +0.8125 0.875 0.9688 +0.8125 0.875 1 +0.8125 0.9062 0 +0.8125 0.9062 0.03125 +0.8125 0.9062 0.0625 +0.8125 0.9062 0.09375 +0.8125 0.9062 0.125 +0.8125 0.9062 0.1562 +0.8125 0.9062 0.1875 +0.8125 0.9062 0.2188 +0.8125 0.9062 0.25 +0.8125 0.9062 0.2812 +0.8125 0.9062 0.3125 +0.8125 0.9062 0.3438 +0.8125 0.9062 0.375 +0.8125 0.9062 0.4062 +0.8125 0.9062 0.4375 +0.8125 0.9062 0.4688 +0.8125 0.9062 0.5 +0.8125 0.9062 0.5312 +0.8125 0.9062 0.5625 +0.8125 0.9062 0.5938 +0.8125 0.9062 0.625 +0.8125 0.9062 0.6562 +0.8125 0.9062 0.6875 +0.8125 0.9062 0.7188 +0.8125 0.9062 0.75 +0.8125 0.9062 0.7812 +0.8125 0.9062 0.8125 +0.8125 0.9062 0.8438 +0.8125 0.9062 0.875 +0.8125 0.9062 0.9062 +0.8125 0.9062 0.9375 +0.8125 0.9062 0.9688 +0.8125 0.9062 1 +0.8125 0.9375 0 +0.8125 0.9375 0.03125 +0.8125 0.9375 0.0625 +0.8125 0.9375 0.09375 +0.8125 0.9375 0.125 +0.8125 0.9375 0.1562 +0.8125 0.9375 0.1875 +0.8125 0.9375 0.2188 +0.8125 0.9375 0.25 +0.8125 0.9375 0.2812 +0.8125 0.9375 0.3125 +0.8125 0.9375 0.3438 +0.8125 0.9375 0.375 +0.8125 0.9375 0.4062 +0.8125 0.9375 0.4375 +0.8125 0.9375 0.4688 +0.8125 0.9375 0.5 +0.8125 0.9375 0.5312 +0.8125 0.9375 0.5625 +0.8125 0.9375 0.5938 +0.8125 0.9375 0.625 +0.8125 0.9375 0.6562 +0.8125 0.9375 0.6875 +0.8125 0.9375 0.7188 +0.8125 0.9375 0.75 +0.8125 0.9375 0.7812 +0.8125 0.9375 0.8125 +0.8125 0.9375 0.8438 +0.8125 0.9375 0.875 +0.8125 0.9375 0.9062 +0.8125 0.9375 0.9375 +0.8125 0.9375 0.9688 +0.8125 0.9375 1 +0.8125 0.9688 0 +0.8125 0.9688 0.03125 +0.8125 0.9688 0.0625 +0.8125 0.9688 0.09375 +0.8125 0.9688 0.125 +0.8125 0.9688 0.1562 +0.8125 0.9688 0.1875 +0.8125 0.9688 0.2188 +0.8125 0.9688 0.25 +0.8125 0.9688 0.2812 +0.8125 0.9688 0.3125 +0.8125 0.9688 0.3438 +0.8125 0.9688 0.375 +0.8125 0.9688 0.4062 +0.8125 0.9688 0.4375 +0.8125 0.9688 0.4688 +0.8125 0.9688 0.5 +0.8125 0.9688 0.5312 +0.8125 0.9688 0.5625 +0.8125 0.9688 0.5938 +0.8125 0.9688 0.625 +0.8125 0.9688 0.6562 +0.8125 0.9688 0.6875 +0.8125 0.9688 0.7188 +0.8125 0.9688 0.75 +0.8125 0.9688 0.7812 +0.8125 0.9688 0.8125 +0.8125 0.9688 0.8438 +0.8125 0.9688 0.875 +0.8125 0.9688 0.9062 +0.8125 0.9688 0.9375 +0.8125 0.9688 0.9688 +0.8125 0.9688 1 +0.8125 1 0 +0.8125 1 0.03125 +0.8125 1 0.0625 +0.8125 1 0.09375 +0.8125 1 0.125 +0.8125 1 0.1562 +0.8125 1 0.1875 +0.8125 1 0.2188 +0.8125 1 0.25 +0.8125 1 0.2812 +0.8125 1 0.3125 +0.8125 1 0.3438 +0.8125 1 0.375 +0.8125 1 0.4062 +0.8125 1 0.4375 +0.8125 1 0.4688 +0.8125 1 0.5 +0.8125 1 0.5312 +0.8125 1 0.5625 +0.8125 1 0.5938 +0.8125 1 0.625 +0.8125 1 0.6562 +0.8125 1 0.6875 +0.8125 1 0.7188 +0.8125 1 0.75 +0.8125 1 0.7812 +0.8125 1 0.8125 +0.8125 1 0.8438 +0.8125 1 0.875 +0.8125 1 0.9062 +0.8125 1 0.9375 +0.8125 1 0.9688 +0.8125 1 1 +0.8438 0 0 +0.8438 0 0.03125 +0.8438 0 0.0625 +0.8438 0 0.09375 +0.8438 0 0.125 +0.8438 0 0.1562 +0.8438 0 0.1875 +0.8438 0 0.2188 +0.8438 0 0.25 +0.8438 0 0.2812 +0.8438 0 0.3125 +0.8438 0 0.3438 +0.8438 0 0.375 +0.8438 0 0.4062 +0.8438 0 0.4375 +0.8438 0 0.4688 +0.8438 0 0.5 +0.8438 0 0.5312 +0.8438 0 0.5625 +0.8438 0 0.5938 +0.8438 0 0.625 +0.8438 0 0.6562 +0.8438 0 0.6875 +0.8438 0 0.7188 +0.8438 0 0.75 +0.8438 0 0.7812 +0.8438 0 0.8125 +0.8438 0 0.8438 +0.8438 0 0.875 +0.8438 0 0.9062 +0.8438 0 0.9375 +0.8438 0 0.9688 +0.8438 0 1 +0.8438 0.03125 0 +0.8438 0.03125 0.03125 +0.8438 0.03125 0.0625 +0.8438 0.03125 0.09375 +0.8438 0.03125 0.125 +0.8438 0.03125 0.1562 +0.8438 0.03125 0.1875 +0.8438 0.03125 0.2188 +0.8438 0.03125 0.25 +0.8438 0.03125 0.2812 +0.8438 0.03125 0.3125 +0.8438 0.03125 0.3438 +0.8438 0.03125 0.375 +0.8438 0.03125 0.4062 +0.8438 0.03125 0.4375 +0.8438 0.03125 0.4688 +0.8438 0.03125 0.5 +0.8438 0.03125 0.5312 +0.8438 0.03125 0.5625 +0.8438 0.03125 0.5938 +0.8438 0.03125 0.625 +0.8438 0.03125 0.6562 +0.8438 0.03125 0.6875 +0.8438 0.03125 0.7188 +0.8438 0.03125 0.75 +0.8438 0.03125 0.7812 +0.8438 0.03125 0.8125 +0.8438 0.03125 0.8438 +0.8438 0.03125 0.875 +0.8438 0.03125 0.9062 +0.8438 0.03125 0.9375 +0.8438 0.03125 0.9688 +0.8438 0.03125 1 +0.8438 0.0625 0 +0.8438 0.0625 0.03125 +0.8438 0.0625 0.0625 +0.8438 0.0625 0.09375 +0.8438 0.0625 0.125 +0.8438 0.0625 0.1562 +0.8438 0.0625 0.1875 +0.8438 0.0625 0.2188 +0.8438 0.0625 0.25 +0.8438 0.0625 0.2812 +0.8438 0.0625 0.3125 +0.8438 0.0625 0.3438 +0.8438 0.0625 0.375 +0.8438 0.0625 0.4062 +0.8438 0.0625 0.4375 +0.8438 0.0625 0.4688 +0.8438 0.0625 0.5 +0.8438 0.0625 0.5312 +0.8438 0.0625 0.5625 +0.8438 0.0625 0.5938 +0.8438 0.0625 0.625 +0.8438 0.0625 0.6562 +0.8438 0.0625 0.6875 +0.8438 0.0625 0.7188 +0.8438 0.0625 0.75 +0.8438 0.0625 0.7812 +0.8438 0.0625 0.8125 +0.8438 0.0625 0.8438 +0.8438 0.0625 0.875 +0.8438 0.0625 0.9062 +0.8438 0.0625 0.9375 +0.8438 0.0625 0.9688 +0.8438 0.0625 1 +0.8438 0.09375 0 +0.8438 0.09375 0.03125 +0.8438 0.09375 0.0625 +0.8438 0.09375 0.09375 +0.8438 0.09375 0.125 +0.8438 0.09375 0.1562 +0.8438 0.09375 0.1875 +0.8438 0.09375 0.2188 +0.8438 0.09375 0.25 +0.8438 0.09375 0.2812 +0.8438 0.09375 0.3125 +0.8438 0.09375 0.3438 +0.8438 0.09375 0.375 +0.8438 0.09375 0.4062 +0.8438 0.09375 0.4375 +0.8438 0.09375 0.4688 +0.8438 0.09375 0.5 +0.8438 0.09375 0.5312 +0.8438 0.09375 0.5625 +0.8438 0.09375 0.5938 +0.8438 0.09375 0.625 +0.8438 0.09375 0.6562 +0.8438 0.09375 0.6875 +0.8438 0.09375 0.7188 +0.8438 0.09375 0.75 +0.8438 0.09375 0.7812 +0.8438 0.09375 0.8125 +0.8438 0.09375 0.8438 +0.8438 0.09375 0.875 +0.8438 0.09375 0.9062 +0.8438 0.09375 0.9375 +0.8438 0.09375 0.9688 +0.8438 0.09375 1 +0.8438 0.125 0 +0.8438 0.125 0.03125 +0.8438 0.125 0.0625 +0.8438 0.125 0.09375 +0.8438 0.125 0.125 +0.8438 0.125 0.1562 +0.8438 0.125 0.1875 +0.8438 0.125 0.2188 +0.8438 0.125 0.25 +0.8438 0.125 0.2812 +0.8438 0.125 0.3125 +0.8438 0.125 0.3438 +0.8438 0.125 0.375 +0.8438 0.125 0.4062 +0.8438 0.125 0.4375 +0.8438 0.125 0.4688 +0.8438 0.125 0.5 +0.8438 0.125 0.5312 +0.8438 0.125 0.5625 +0.8438 0.125 0.5938 +0.8438 0.125 0.625 +0.8438 0.125 0.6562 +0.8438 0.125 0.6875 +0.8438 0.125 0.7188 +0.8438 0.125 0.75 +0.8438 0.125 0.7812 +0.8438 0.125 0.8125 +0.8438 0.125 0.8438 +0.8438 0.125 0.875 +0.8438 0.125 0.9062 +0.8438 0.125 0.9375 +0.8438 0.125 0.9688 +0.8438 0.125 1 +0.8438 0.1562 0 +0.8438 0.1562 0.03125 +0.8438 0.1562 0.0625 +0.8438 0.1562 0.09375 +0.8438 0.1562 0.125 +0.8438 0.1562 0.1562 +0.8438 0.1562 0.1875 +0.8438 0.1562 0.2188 +0.8438 0.1562 0.25 +0.8438 0.1562 0.2812 +0.8438 0.1562 0.3125 +0.8438 0.1562 0.3438 +0.8438 0.1562 0.375 +0.8438 0.1562 0.4062 +0.8438 0.1562 0.4375 +0.8438 0.1562 0.4688 +0.8438 0.1562 0.5 +0.8438 0.1562 0.5312 +0.8438 0.1562 0.5625 +0.8438 0.1562 0.5938 +0.8438 0.1562 0.625 +0.8438 0.1562 0.6562 +0.8438 0.1562 0.6875 +0.8438 0.1562 0.7188 +0.8438 0.1562 0.75 +0.8438 0.1562 0.7812 +0.8438 0.1562 0.8125 +0.8438 0.1562 0.8438 +0.8438 0.1562 0.875 +0.8438 0.1562 0.9062 +0.8438 0.1562 0.9375 +0.8438 0.1562 0.9688 +0.8438 0.1562 1 +0.8438 0.1875 0 +0.8438 0.1875 0.03125 +0.8438 0.1875 0.0625 +0.8438 0.1875 0.09375 +0.8438 0.1875 0.125 +0.8438 0.1875 0.1562 +0.8438 0.1875 0.1875 +0.8438 0.1875 0.2188 +0.8438 0.1875 0.25 +0.8438 0.1875 0.2812 +0.8438 0.1875 0.3125 +0.8438 0.1875 0.3438 +0.8438 0.1875 0.375 +0.8438 0.1875 0.4062 +0.8438 0.1875 0.4375 +0.8438 0.1875 0.4688 +0.8438 0.1875 0.5 +0.8438 0.1875 0.5312 +0.8438 0.1875 0.5625 +0.8438 0.1875 0.5938 +0.8438 0.1875 0.625 +0.8438 0.1875 0.6562 +0.8438 0.1875 0.6875 +0.8438 0.1875 0.7188 +0.8438 0.1875 0.75 +0.8438 0.1875 0.7812 +0.8438 0.1875 0.8125 +0.8438 0.1875 0.8438 +0.8438 0.1875 0.875 +0.8438 0.1875 0.9062 +0.8438 0.1875 0.9375 +0.8438 0.1875 0.9688 +0.8438 0.1875 1 +0.8438 0.2188 0 +0.8438 0.2188 0.03125 +0.8438 0.2188 0.0625 +0.8438 0.2188 0.09375 +0.8438 0.2188 0.125 +0.8438 0.2188 0.1562 +0.8438 0.2188 0.1875 +0.8438 0.2188 0.2188 +0.8438 0.2188 0.25 +0.8438 0.2188 0.2812 +0.8438 0.2188 0.3125 +0.8438 0.2188 0.3438 +0.8438 0.2188 0.375 +0.8438 0.2188 0.4062 +0.8438 0.2188 0.4375 +0.8438 0.2188 0.4688 +0.8438 0.2188 0.5 +0.8438 0.2188 0.5312 +0.8438 0.2188 0.5625 +0.8438 0.2188 0.5938 +0.8438 0.2188 0.625 +0.8438 0.2188 0.6562 +0.8438 0.2188 0.6875 +0.8438 0.2188 0.7188 +0.8438 0.2188 0.75 +0.8438 0.2188 0.7812 +0.8438 0.2188 0.8125 +0.8438 0.2188 0.8438 +0.8438 0.2188 0.875 +0.8438 0.2188 0.9062 +0.8438 0.2188 0.9375 +0.8438 0.2188 0.9688 +0.8438 0.2188 1 +0.8438 0.25 0 +0.8438 0.25 0.03125 +0.8438 0.25 0.0625 +0.8438 0.25 0.09375 +0.8438 0.25 0.125 +0.8438 0.25 0.1562 +0.8438 0.25 0.1875 +0.8438 0.25 0.2188 +0.8438 0.25 0.25 +0.8438 0.25 0.2812 +0.8438 0.25 0.3125 +0.8438 0.25 0.3438 +0.8438 0.25 0.375 +0.8438 0.25 0.4062 +0.8438 0.25 0.4375 +0.8438 0.25 0.4688 +0.8438 0.25 0.5 +0.8438 0.25 0.5312 +0.8438 0.25 0.5625 +0.8438 0.25 0.5938 +0.8438 0.25 0.625 +0.8438 0.25 0.6562 +0.8438 0.25 0.6875 +0.8438 0.25 0.7188 +0.8438 0.25 0.75 +0.8438 0.25 0.7812 +0.8438 0.25 0.8125 +0.8438 0.25 0.8438 +0.8438 0.25 0.875 +0.8438 0.25 0.9062 +0.8438 0.25 0.9375 +0.8438 0.25 0.9688 +0.8438 0.25 1 +0.8438 0.2812 0 +0.8438 0.2812 0.03125 +0.8438 0.2812 0.0625 +0.8438 0.2812 0.09375 +0.8438 0.2812 0.125 +0.8438 0.2812 0.1562 +0.8438 0.2812 0.1875 +0.8438 0.2812 0.2188 +0.8438 0.2812 0.25 +0.8438 0.2812 0.2812 +0.8438 0.2812 0.3125 +0.8438 0.2812 0.3438 +0.8438 0.2812 0.375 +0.8438 0.2812 0.4062 +0.8438 0.2812 0.4375 +0.8438 0.2812 0.4688 +0.8438 0.2812 0.5 +0.8438 0.2812 0.5312 +0.8438 0.2812 0.5625 +0.8438 0.2812 0.5938 +0.8438 0.2812 0.625 +0.8438 0.2812 0.6562 +0.8438 0.2812 0.6875 +0.8438 0.2812 0.7188 +0.8438 0.2812 0.75 +0.8438 0.2812 0.7812 +0.8438 0.2812 0.8125 +0.8438 0.2812 0.8438 +0.8438 0.2812 0.875 +0.8438 0.2812 0.9062 +0.8438 0.2812 0.9375 +0.8438 0.2812 0.9688 +0.8438 0.2812 1 +0.8438 0.3125 0 +0.8438 0.3125 0.03125 +0.8438 0.3125 0.0625 +0.8438 0.3125 0.09375 +0.8438 0.3125 0.125 +0.8438 0.3125 0.1562 +0.8438 0.3125 0.1875 +0.8438 0.3125 0.2188 +0.8438 0.3125 0.25 +0.8438 0.3125 0.2812 +0.8438 0.3125 0.3125 +0.8438 0.3125 0.3438 +0.8438 0.3125 0.375 +0.8438 0.3125 0.4062 +0.8438 0.3125 0.4375 +0.8438 0.3125 0.4688 +0.8438 0.3125 0.5 +0.8438 0.3125 0.5312 +0.8438 0.3125 0.5625 +0.8438 0.3125 0.5938 +0.8438 0.3125 0.625 +0.8438 0.3125 0.6562 +0.8438 0.3125 0.6875 +0.8438 0.3125 0.7188 +0.8438 0.3125 0.75 +0.8438 0.3125 0.7812 +0.8438 0.3125 0.8125 +0.8438 0.3125 0.8438 +0.8438 0.3125 0.875 +0.8438 0.3125 0.9062 +0.8438 0.3125 0.9375 +0.8438 0.3125 0.9688 +0.8438 0.3125 1 +0.8438 0.3438 0 +0.8438 0.3438 0.03125 +0.8438 0.3438 0.0625 +0.8438 0.3438 0.09375 +0.8438 0.3438 0.125 +0.8438 0.3438 0.1562 +0.8438 0.3438 0.1875 +0.8438 0.3438 0.2188 +0.8438 0.3438 0.25 +0.8438 0.3438 0.2812 +0.8438 0.3438 0.3125 +0.8438 0.3438 0.3438 +0.8438 0.3438 0.375 +0.8438 0.3438 0.4062 +0.8438 0.3438 0.4375 +0.8438 0.3438 0.4688 +0.8438 0.3438 0.5 +0.8438 0.3438 0.5312 +0.8438 0.3438 0.5625 +0.8438 0.3438 0.5938 +0.8438 0.3438 0.625 +0.8438 0.3438 0.6562 +0.8438 0.3438 0.6875 +0.8438 0.3438 0.7188 +0.8438 0.3438 0.75 +0.8438 0.3438 0.7812 +0.8438 0.3438 0.8125 +0.8438 0.3438 0.8438 +0.8438 0.3438 0.875 +0.8438 0.3438 0.9062 +0.8438 0.3438 0.9375 +0.8438 0.3438 0.9688 +0.8438 0.3438 1 +0.8438 0.375 0 +0.8438 0.375 0.03125 +0.8438 0.375 0.0625 +0.8438 0.375 0.09375 +0.8438 0.375 0.125 +0.8438 0.375 0.1562 +0.8438 0.375 0.1875 +0.8438 0.375 0.2188 +0.8438 0.375 0.25 +0.8438 0.375 0.2812 +0.8438 0.375 0.3125 +0.8438 0.375 0.3438 +0.8438 0.375 0.375 +0.8438 0.375 0.4062 +0.8438 0.375 0.4375 +0.8438 0.375 0.4688 +0.8438 0.375 0.5 +0.8438 0.375 0.5312 +0.8438 0.375 0.5625 +0.8438 0.375 0.5938 +0.8438 0.375 0.625 +0.8438 0.375 0.6562 +0.8438 0.375 0.6875 +0.8438 0.375 0.7188 +0.8438 0.375 0.75 +0.8438 0.375 0.7812 +0.8438 0.375 0.8125 +0.8438 0.375 0.8438 +0.8438 0.375 0.875 +0.8438 0.375 0.9062 +0.8438 0.375 0.9375 +0.8438 0.375 0.9688 +0.8438 0.375 1 +0.8438 0.4062 0 +0.8438 0.4062 0.03125 +0.8438 0.4062 0.0625 +0.8438 0.4062 0.09375 +0.8438 0.4062 0.125 +0.8438 0.4062 0.1562 +0.8438 0.4062 0.1875 +0.8438 0.4062 0.2188 +0.8438 0.4062 0.25 +0.8438 0.4062 0.2812 +0.8438 0.4062 0.3125 +0.8438 0.4062 0.3438 +0.8438 0.4062 0.375 +0.8438 0.4062 0.4062 +0.8438 0.4062 0.4375 +0.8438 0.4062 0.4688 +0.8438 0.4062 0.5 +0.8438 0.4062 0.5312 +0.8438 0.4062 0.5625 +0.8438 0.4062 0.5938 +0.8438 0.4062 0.625 +0.8438 0.4062 0.6562 +0.8438 0.4062 0.6875 +0.8438 0.4062 0.7188 +0.8438 0.4062 0.75 +0.8438 0.4062 0.7812 +0.8438 0.4062 0.8125 +0.8438 0.4062 0.8438 +0.8438 0.4062 0.875 +0.8438 0.4062 0.9062 +0.8438 0.4062 0.9375 +0.8438 0.4062 0.9688 +0.8438 0.4062 1 +0.8438 0.4375 0 +0.8438 0.4375 0.03125 +0.8438 0.4375 0.0625 +0.8438 0.4375 0.09375 +0.8438 0.4375 0.125 +0.8438 0.4375 0.1562 +0.8438 0.4375 0.1875 +0.8438 0.4375 0.2188 +0.8438 0.4375 0.25 +0.8438 0.4375 0.2812 +0.8438 0.4375 0.3125 +0.8438 0.4375 0.3438 +0.8438 0.4375 0.375 +0.8438 0.4375 0.4062 +0.8438 0.4375 0.4375 +0.8438 0.4375 0.4688 +0.8438 0.4375 0.5 +0.8438 0.4375 0.5312 +0.8438 0.4375 0.5625 +0.8438 0.4375 0.5938 +0.8438 0.4375 0.625 +0.8438 0.4375 0.6562 +0.8438 0.4375 0.6875 +0.8438 0.4375 0.7188 +0.8438 0.4375 0.75 +0.8438 0.4375 0.7812 +0.8438 0.4375 0.8125 +0.8438 0.4375 0.8438 +0.8438 0.4375 0.875 +0.8438 0.4375 0.9062 +0.8438 0.4375 0.9375 +0.8438 0.4375 0.9688 +0.8438 0.4375 1 +0.8438 0.4688 0 +0.8438 0.4688 0.03125 +0.8438 0.4688 0.0625 +0.8438 0.4688 0.09375 +0.8438 0.4688 0.125 +0.8438 0.4688 0.1562 +0.8438 0.4688 0.1875 +0.8438 0.4688 0.2188 +0.8438 0.4688 0.25 +0.8438 0.4688 0.2812 +0.8438 0.4688 0.3125 +0.8438 0.4688 0.3438 +0.8438 0.4688 0.375 +0.8438 0.4688 0.4062 +0.8438 0.4688 0.4375 +0.8438 0.4688 0.4688 +0.8438 0.4688 0.5 +0.8438 0.4688 0.5312 +0.8438 0.4688 0.5625 +0.8438 0.4688 0.5938 +0.8438 0.4688 0.625 +0.8438 0.4688 0.6562 +0.8438 0.4688 0.6875 +0.8438 0.4688 0.7188 +0.8438 0.4688 0.75 +0.8438 0.4688 0.7812 +0.8438 0.4688 0.8125 +0.8438 0.4688 0.8438 +0.8438 0.4688 0.875 +0.8438 0.4688 0.9062 +0.8438 0.4688 0.9375 +0.8438 0.4688 0.9688 +0.8438 0.4688 1 +0.8438 0.5 0 +0.8438 0.5 0.03125 +0.8438 0.5 0.0625 +0.8438 0.5 0.09375 +0.8438 0.5 0.125 +0.8438 0.5 0.1562 +0.8438 0.5 0.1875 +0.8438 0.5 0.2188 +0.8438 0.5 0.25 +0.8438 0.5 0.2812 +0.8438 0.5 0.3125 +0.8438 0.5 0.3438 +0.8438 0.5 0.375 +0.8438 0.5 0.4062 +0.8438 0.5 0.4375 +0.8438 0.5 0.4688 +0.8438 0.5 0.5 +0.8438 0.5 0.5312 +0.8438 0.5 0.5625 +0.8438 0.5 0.5938 +0.8438 0.5 0.625 +0.8438 0.5 0.6562 +0.8438 0.5 0.6875 +0.8438 0.5 0.7188 +0.8438 0.5 0.75 +0.8438 0.5 0.7812 +0.8438 0.5 0.8125 +0.8438 0.5 0.8438 +0.8438 0.5 0.875 +0.8438 0.5 0.9062 +0.8438 0.5 0.9375 +0.8438 0.5 0.9688 +0.8438 0.5 1 +0.8438 0.5312 0 +0.8438 0.5312 0.03125 +0.8438 0.5312 0.0625 +0.8438 0.5312 0.09375 +0.8438 0.5312 0.125 +0.8438 0.5312 0.1562 +0.8438 0.5312 0.1875 +0.8438 0.5312 0.2188 +0.8438 0.5312 0.25 +0.8438 0.5312 0.2812 +0.8438 0.5312 0.3125 +0.8438 0.5312 0.3438 +0.8438 0.5312 0.375 +0.8438 0.5312 0.4062 +0.8438 0.5312 0.4375 +0.8438 0.5312 0.4688 +0.8438 0.5312 0.5 +0.8438 0.5312 0.5312 +0.8438 0.5312 0.5625 +0.8438 0.5312 0.5938 +0.8438 0.5312 0.625 +0.8438 0.5312 0.6562 +0.8438 0.5312 0.6875 +0.8438 0.5312 0.7188 +0.8438 0.5312 0.75 +0.8438 0.5312 0.7812 +0.8438 0.5312 0.8125 +0.8438 0.5312 0.8438 +0.8438 0.5312 0.875 +0.8438 0.5312 0.9062 +0.8438 0.5312 0.9375 +0.8438 0.5312 0.9688 +0.8438 0.5312 1 +0.8438 0.5625 0 +0.8438 0.5625 0.03125 +0.8438 0.5625 0.0625 +0.8438 0.5625 0.09375 +0.8438 0.5625 0.125 +0.8438 0.5625 0.1562 +0.8438 0.5625 0.1875 +0.8438 0.5625 0.2188 +0.8438 0.5625 0.25 +0.8438 0.5625 0.2812 +0.8438 0.5625 0.3125 +0.8438 0.5625 0.3438 +0.8438 0.5625 0.375 +0.8438 0.5625 0.4062 +0.8438 0.5625 0.4375 +0.8438 0.5625 0.4688 +0.8438 0.5625 0.5 +0.8438 0.5625 0.5312 +0.8438 0.5625 0.5625 +0.8438 0.5625 0.5938 +0.8438 0.5625 0.625 +0.8438 0.5625 0.6562 +0.8438 0.5625 0.6875 +0.8438 0.5625 0.7188 +0.8438 0.5625 0.75 +0.8438 0.5625 0.7812 +0.8438 0.5625 0.8125 +0.8438 0.5625 0.8438 +0.8438 0.5625 0.875 +0.8438 0.5625 0.9062 +0.8438 0.5625 0.9375 +0.8438 0.5625 0.9688 +0.8438 0.5625 1 +0.8438 0.5938 0 +0.8438 0.5938 0.03125 +0.8438 0.5938 0.0625 +0.8438 0.5938 0.09375 +0.8438 0.5938 0.125 +0.8438 0.5938 0.1562 +0.8438 0.5938 0.1875 +0.8438 0.5938 0.2188 +0.8438 0.5938 0.25 +0.8438 0.5938 0.2812 +0.8438 0.5938 0.3125 +0.8438 0.5938 0.3438 +0.8438 0.5938 0.375 +0.8438 0.5938 0.4062 +0.8438 0.5938 0.4375 +0.8438 0.5938 0.4688 +0.8438 0.5938 0.5 +0.8438 0.5938 0.5312 +0.8438 0.5938 0.5625 +0.8438 0.5938 0.5938 +0.8438 0.5938 0.625 +0.8438 0.5938 0.6562 +0.8438 0.5938 0.6875 +0.8438 0.5938 0.7188 +0.8438 0.5938 0.75 +0.8438 0.5938 0.7812 +0.8438 0.5938 0.8125 +0.8438 0.5938 0.8438 +0.8438 0.5938 0.875 +0.8438 0.5938 0.9062 +0.8438 0.5938 0.9375 +0.8438 0.5938 0.9688 +0.8438 0.5938 1 +0.8438 0.625 0 +0.8438 0.625 0.03125 +0.8438 0.625 0.0625 +0.8438 0.625 0.09375 +0.8438 0.625 0.125 +0.8438 0.625 0.1562 +0.8438 0.625 0.1875 +0.8438 0.625 0.2188 +0.8438 0.625 0.25 +0.8438 0.625 0.2812 +0.8438 0.625 0.3125 +0.8438 0.625 0.3438 +0.8438 0.625 0.375 +0.8438 0.625 0.4062 +0.8438 0.625 0.4375 +0.8438 0.625 0.4688 +0.8438 0.625 0.5 +0.8438 0.625 0.5312 +0.8438 0.625 0.5625 +0.8438 0.625 0.5938 +0.8438 0.625 0.625 +0.8438 0.625 0.6562 +0.8438 0.625 0.6875 +0.8438 0.625 0.7188 +0.8438 0.625 0.75 +0.8438 0.625 0.7812 +0.8438 0.625 0.8125 +0.8438 0.625 0.8438 +0.8438 0.625 0.875 +0.8438 0.625 0.9062 +0.8438 0.625 0.9375 +0.8438 0.625 0.9688 +0.8438 0.625 1 +0.8438 0.6562 0 +0.8438 0.6562 0.03125 +0.8438 0.6562 0.0625 +0.8438 0.6562 0.09375 +0.8438 0.6562 0.125 +0.8438 0.6562 0.1562 +0.8438 0.6562 0.1875 +0.8438 0.6562 0.2188 +0.8438 0.6562 0.25 +0.8438 0.6562 0.2812 +0.8438 0.6562 0.3125 +0.8438 0.6562 0.3438 +0.8438 0.6562 0.375 +0.8438 0.6562 0.4062 +0.8438 0.6562 0.4375 +0.8438 0.6562 0.4688 +0.8438 0.6562 0.5 +0.8438 0.6562 0.5312 +0.8438 0.6562 0.5625 +0.8438 0.6562 0.5938 +0.8438 0.6562 0.625 +0.8438 0.6562 0.6562 +0.8438 0.6562 0.6875 +0.8438 0.6562 0.7188 +0.8438 0.6562 0.75 +0.8438 0.6562 0.7812 +0.8438 0.6562 0.8125 +0.8438 0.6562 0.8438 +0.8438 0.6562 0.875 +0.8438 0.6562 0.9062 +0.8438 0.6562 0.9375 +0.8438 0.6562 0.9688 +0.8438 0.6562 1 +0.8438 0.6875 0 +0.8438 0.6875 0.03125 +0.8438 0.6875 0.0625 +0.8438 0.6875 0.09375 +0.8438 0.6875 0.125 +0.8438 0.6875 0.1562 +0.8438 0.6875 0.1875 +0.8438 0.6875 0.2188 +0.8438 0.6875 0.25 +0.8438 0.6875 0.2812 +0.8438 0.6875 0.3125 +0.8438 0.6875 0.3438 +0.8438 0.6875 0.375 +0.8438 0.6875 0.4062 +0.8438 0.6875 0.4375 +0.8438 0.6875 0.4688 +0.8438 0.6875 0.5 +0.8438 0.6875 0.5312 +0.8438 0.6875 0.5625 +0.8438 0.6875 0.5938 +0.8438 0.6875 0.625 +0.8438 0.6875 0.6562 +0.8438 0.6875 0.6875 +0.8438 0.6875 0.7188 +0.8438 0.6875 0.75 +0.8438 0.6875 0.7812 +0.8438 0.6875 0.8125 +0.8438 0.6875 0.8438 +0.8438 0.6875 0.875 +0.8438 0.6875 0.9062 +0.8438 0.6875 0.9375 +0.8438 0.6875 0.9688 +0.8438 0.6875 1 +0.8438 0.7188 0 +0.8438 0.7188 0.03125 +0.8438 0.7188 0.0625 +0.8438 0.7188 0.09375 +0.8438 0.7188 0.125 +0.8438 0.7188 0.1562 +0.8438 0.7188 0.1875 +0.8438 0.7188 0.2188 +0.8438 0.7188 0.25 +0.8438 0.7188 0.2812 +0.8438 0.7188 0.3125 +0.8438 0.7188 0.3438 +0.8438 0.7188 0.375 +0.8438 0.7188 0.4062 +0.8438 0.7188 0.4375 +0.8438 0.7188 0.4688 +0.8438 0.7188 0.5 +0.8438 0.7188 0.5312 +0.8438 0.7188 0.5625 +0.8438 0.7188 0.5938 +0.8438 0.7188 0.625 +0.8438 0.7188 0.6562 +0.8438 0.7188 0.6875 +0.8438 0.7188 0.7188 +0.8438 0.7188 0.75 +0.8438 0.7188 0.7812 +0.8438 0.7188 0.8125 +0.8438 0.7188 0.8438 +0.8438 0.7188 0.875 +0.8438 0.7188 0.9062 +0.8438 0.7188 0.9375 +0.8438 0.7188 0.9688 +0.8438 0.7188 1 +0.8438 0.75 0 +0.8438 0.75 0.03125 +0.8438 0.75 0.0625 +0.8438 0.75 0.09375 +0.8438 0.75 0.125 +0.8438 0.75 0.1562 +0.8438 0.75 0.1875 +0.8438 0.75 0.2188 +0.8438 0.75 0.25 +0.8438 0.75 0.2812 +0.8438 0.75 0.3125 +0.8438 0.75 0.3438 +0.8438 0.75 0.375 +0.8438 0.75 0.4062 +0.8438 0.75 0.4375 +0.8438 0.75 0.4688 +0.8438 0.75 0.5 +0.8438 0.75 0.5312 +0.8438 0.75 0.5625 +0.8438 0.75 0.5938 +0.8438 0.75 0.625 +0.8438 0.75 0.6562 +0.8438 0.75 0.6875 +0.8438 0.75 0.7188 +0.8438 0.75 0.75 +0.8438 0.75 0.7812 +0.8438 0.75 0.8125 +0.8438 0.75 0.8438 +0.8438 0.75 0.875 +0.8438 0.75 0.9062 +0.8438 0.75 0.9375 +0.8438 0.75 0.9688 +0.8438 0.75 1 +0.8438 0.7812 0 +0.8438 0.7812 0.03125 +0.8438 0.7812 0.0625 +0.8438 0.7812 0.09375 +0.8438 0.7812 0.125 +0.8438 0.7812 0.1562 +0.8438 0.7812 0.1875 +0.8438 0.7812 0.2188 +0.8438 0.7812 0.25 +0.8438 0.7812 0.2812 +0.8438 0.7812 0.3125 +0.8438 0.7812 0.3438 +0.8438 0.7812 0.375 +0.8438 0.7812 0.4062 +0.8438 0.7812 0.4375 +0.8438 0.7812 0.4688 +0.8438 0.7812 0.5 +0.8438 0.7812 0.5312 +0.8438 0.7812 0.5625 +0.8438 0.7812 0.5938 +0.8438 0.7812 0.625 +0.8438 0.7812 0.6562 +0.8438 0.7812 0.6875 +0.8438 0.7812 0.7188 +0.8438 0.7812 0.75 +0.8438 0.7812 0.7812 +0.8438 0.7812 0.8125 +0.8438 0.7812 0.8438 +0.8438 0.7812 0.875 +0.8438 0.7812 0.9062 +0.8438 0.7812 0.9375 +0.8438 0.7812 0.9688 +0.8438 0.7812 1 +0.8438 0.8125 0 +0.8438 0.8125 0.03125 +0.8438 0.8125 0.0625 +0.8438 0.8125 0.09375 +0.8438 0.8125 0.125 +0.8438 0.8125 0.1562 +0.8438 0.8125 0.1875 +0.8438 0.8125 0.2188 +0.8438 0.8125 0.25 +0.8438 0.8125 0.2812 +0.8438 0.8125 0.3125 +0.8438 0.8125 0.3438 +0.8438 0.8125 0.375 +0.8438 0.8125 0.4062 +0.8438 0.8125 0.4375 +0.8438 0.8125 0.4688 +0.8438 0.8125 0.5 +0.8438 0.8125 0.5312 +0.8438 0.8125 0.5625 +0.8438 0.8125 0.5938 +0.8438 0.8125 0.625 +0.8438 0.8125 0.6562 +0.8438 0.8125 0.6875 +0.8438 0.8125 0.7188 +0.8438 0.8125 0.75 +0.8438 0.8125 0.7812 +0.8438 0.8125 0.8125 +0.8438 0.8125 0.8438 +0.8438 0.8125 0.875 +0.8438 0.8125 0.9062 +0.8438 0.8125 0.9375 +0.8438 0.8125 0.9688 +0.8438 0.8125 1 +0.8438 0.8438 0 +0.8438 0.8438 0.03125 +0.8438 0.8438 0.0625 +0.8438 0.8438 0.09375 +0.8438 0.8438 0.125 +0.8438 0.8438 0.1562 +0.8438 0.8438 0.1875 +0.8438 0.8438 0.2188 +0.8438 0.8438 0.25 +0.8438 0.8438 0.2812 +0.8438 0.8438 0.3125 +0.8438 0.8438 0.3438 +0.8438 0.8438 0.375 +0.8438 0.8438 0.4062 +0.8438 0.8438 0.4375 +0.8438 0.8438 0.4688 +0.8438 0.8438 0.5 +0.8438 0.8438 0.5312 +0.8438 0.8438 0.5625 +0.8438 0.8438 0.5938 +0.8438 0.8438 0.625 +0.8438 0.8438 0.6562 +0.8438 0.8438 0.6875 +0.8438 0.8438 0.7188 +0.8438 0.8438 0.75 +0.8438 0.8438 0.7812 +0.8438 0.8438 0.8125 +0.8438 0.8438 0.8438 +0.8438 0.8438 0.875 +0.8438 0.8438 0.9062 +0.8438 0.8438 0.9375 +0.8438 0.8438 0.9688 +0.8438 0.8438 1 +0.8438 0.875 0 +0.8438 0.875 0.03125 +0.8438 0.875 0.0625 +0.8438 0.875 0.09375 +0.8438 0.875 0.125 +0.8438 0.875 0.1562 +0.8438 0.875 0.1875 +0.8438 0.875 0.2188 +0.8438 0.875 0.25 +0.8438 0.875 0.2812 +0.8438 0.875 0.3125 +0.8438 0.875 0.3438 +0.8438 0.875 0.375 +0.8438 0.875 0.4062 +0.8438 0.875 0.4375 +0.8438 0.875 0.4688 +0.8438 0.875 0.5 +0.8438 0.875 0.5312 +0.8438 0.875 0.5625 +0.8438 0.875 0.5938 +0.8438 0.875 0.625 +0.8438 0.875 0.6562 +0.8438 0.875 0.6875 +0.8438 0.875 0.7188 +0.8438 0.875 0.75 +0.8438 0.875 0.7812 +0.8438 0.875 0.8125 +0.8438 0.875 0.8438 +0.8438 0.875 0.875 +0.8438 0.875 0.9062 +0.8438 0.875 0.9375 +0.8438 0.875 0.9688 +0.8438 0.875 1 +0.8438 0.9062 0 +0.8438 0.9062 0.03125 +0.8438 0.9062 0.0625 +0.8438 0.9062 0.09375 +0.8438 0.9062 0.125 +0.8438 0.9062 0.1562 +0.8438 0.9062 0.1875 +0.8438 0.9062 0.2188 +0.8438 0.9062 0.25 +0.8438 0.9062 0.2812 +0.8438 0.9062 0.3125 +0.8438 0.9062 0.3438 +0.8438 0.9062 0.375 +0.8438 0.9062 0.4062 +0.8438 0.9062 0.4375 +0.8438 0.9062 0.4688 +0.8438 0.9062 0.5 +0.8438 0.9062 0.5312 +0.8438 0.9062 0.5625 +0.8438 0.9062 0.5938 +0.8438 0.9062 0.625 +0.8438 0.9062 0.6562 +0.8438 0.9062 0.6875 +0.8438 0.9062 0.7188 +0.8438 0.9062 0.75 +0.8438 0.9062 0.7812 +0.8438 0.9062 0.8125 +0.8438 0.9062 0.8438 +0.8438 0.9062 0.875 +0.8438 0.9062 0.9062 +0.8438 0.9062 0.9375 +0.8438 0.9062 0.9688 +0.8438 0.9062 1 +0.8438 0.9375 0 +0.8438 0.9375 0.03125 +0.8438 0.9375 0.0625 +0.8438 0.9375 0.09375 +0.8438 0.9375 0.125 +0.8438 0.9375 0.1562 +0.8438 0.9375 0.1875 +0.8438 0.9375 0.2188 +0.8438 0.9375 0.25 +0.8438 0.9375 0.2812 +0.8438 0.9375 0.3125 +0.8438 0.9375 0.3438 +0.8438 0.9375 0.375 +0.8438 0.9375 0.4062 +0.8438 0.9375 0.4375 +0.8438 0.9375 0.4688 +0.8438 0.9375 0.5 +0.8438 0.9375 0.5312 +0.8438 0.9375 0.5625 +0.8438 0.9375 0.5938 +0.8438 0.9375 0.625 +0.8438 0.9375 0.6562 +0.8438 0.9375 0.6875 +0.8438 0.9375 0.7188 +0.8438 0.9375 0.75 +0.8438 0.9375 0.7812 +0.8438 0.9375 0.8125 +0.8438 0.9375 0.8438 +0.8438 0.9375 0.875 +0.8438 0.9375 0.9062 +0.8438 0.9375 0.9375 +0.8438 0.9375 0.9688 +0.8438 0.9375 1 +0.8438 0.9688 0 +0.8438 0.9688 0.03125 +0.8438 0.9688 0.0625 +0.8438 0.9688 0.09375 +0.8438 0.9688 0.125 +0.8438 0.9688 0.1562 +0.8438 0.9688 0.1875 +0.8438 0.9688 0.2188 +0.8438 0.9688 0.25 +0.8438 0.9688 0.2812 +0.8438 0.9688 0.3125 +0.8438 0.9688 0.3438 +0.8438 0.9688 0.375 +0.8438 0.9688 0.4062 +0.8438 0.9688 0.4375 +0.8438 0.9688 0.4688 +0.8438 0.9688 0.5 +0.8438 0.9688 0.5312 +0.8438 0.9688 0.5625 +0.8438 0.9688 0.5938 +0.8438 0.9688 0.625 +0.8438 0.9688 0.6562 +0.8438 0.9688 0.6875 +0.8438 0.9688 0.7188 +0.8438 0.9688 0.75 +0.8438 0.9688 0.7812 +0.8438 0.9688 0.8125 +0.8438 0.9688 0.8438 +0.8438 0.9688 0.875 +0.8438 0.9688 0.9062 +0.8438 0.9688 0.9375 +0.8438 0.9688 0.9688 +0.8438 0.9688 1 +0.8438 1 0 +0.8438 1 0.03125 +0.8438 1 0.0625 +0.8438 1 0.09375 +0.8438 1 0.125 +0.8438 1 0.1562 +0.8438 1 0.1875 +0.8438 1 0.2188 +0.8438 1 0.25 +0.8438 1 0.2812 +0.8438 1 0.3125 +0.8438 1 0.3438 +0.8438 1 0.375 +0.8438 1 0.4062 +0.8438 1 0.4375 +0.8438 1 0.4688 +0.8438 1 0.5 +0.8438 1 0.5312 +0.8438 1 0.5625 +0.8438 1 0.5938 +0.8438 1 0.625 +0.8438 1 0.6562 +0.8438 1 0.6875 +0.8438 1 0.7188 +0.8438 1 0.75 +0.8438 1 0.7812 +0.8438 1 0.8125 +0.8438 1 0.8438 +0.8438 1 0.875 +0.8438 1 0.9062 +0.8438 1 0.9375 +0.8438 1 0.9688 +0.8438 1 1 +0.875 0 0 +0.875 0 0.03125 +0.875 0 0.0625 +0.875 0 0.09375 +0.875 0 0.125 +0.875 0 0.1562 +0.875 0 0.1875 +0.875 0 0.2188 +0.875 0 0.25 +0.875 0 0.2812 +0.875 0 0.3125 +0.875 0 0.3438 +0.875 0 0.375 +0.875 0 0.4062 +0.875 0 0.4375 +0.875 0 0.4688 +0.875 0 0.5 +0.875 0 0.5312 +0.875 0 0.5625 +0.875 0 0.5938 +0.875 0 0.625 +0.875 0 0.6562 +0.875 0 0.6875 +0.875 0 0.7188 +0.875 0 0.75 +0.875 0 0.7812 +0.875 0 0.8125 +0.875 0 0.8438 +0.875 0 0.875 +0.875 0 0.9062 +0.875 0 0.9375 +0.875 0 0.9688 +0.875 0 1 +0.875 0.03125 0 +0.875 0.03125 0.03125 +0.875 0.03125 0.0625 +0.875 0.03125 0.09375 +0.875 0.03125 0.125 +0.875 0.03125 0.1562 +0.875 0.03125 0.1875 +0.875 0.03125 0.2188 +0.875 0.03125 0.25 +0.875 0.03125 0.2812 +0.875 0.03125 0.3125 +0.875 0.03125 0.3438 +0.875 0.03125 0.375 +0.875 0.03125 0.4062 +0.875 0.03125 0.4375 +0.875 0.03125 0.4688 +0.875 0.03125 0.5 +0.875 0.03125 0.5312 +0.875 0.03125 0.5625 +0.875 0.03125 0.5938 +0.875 0.03125 0.625 +0.875 0.03125 0.6562 +0.875 0.03125 0.6875 +0.875 0.03125 0.7188 +0.875 0.03125 0.75 +0.875 0.03125 0.7812 +0.875 0.03125 0.8125 +0.875 0.03125 0.8438 +0.875 0.03125 0.875 +0.875 0.03125 0.9062 +0.875 0.03125 0.9375 +0.875 0.03125 0.9688 +0.875 0.03125 1 +0.875 0.0625 0 +0.875 0.0625 0.03125 +0.875 0.0625 0.0625 +0.875 0.0625 0.09375 +0.875 0.0625 0.125 +0.875 0.0625 0.1562 +0.875 0.0625 0.1875 +0.875 0.0625 0.2188 +0.875 0.0625 0.25 +0.875 0.0625 0.2812 +0.875 0.0625 0.3125 +0.875 0.0625 0.3438 +0.875 0.0625 0.375 +0.875 0.0625 0.4062 +0.875 0.0625 0.4375 +0.875 0.0625 0.4688 +0.875 0.0625 0.5 +0.875 0.0625 0.5312 +0.875 0.0625 0.5625 +0.875 0.0625 0.5938 +0.875 0.0625 0.625 +0.875 0.0625 0.6562 +0.875 0.0625 0.6875 +0.875 0.0625 0.7188 +0.875 0.0625 0.75 +0.875 0.0625 0.7812 +0.875 0.0625 0.8125 +0.875 0.0625 0.8438 +0.875 0.0625 0.875 +0.875 0.0625 0.9062 +0.875 0.0625 0.9375 +0.875 0.0625 0.9688 +0.875 0.0625 1 +0.875 0.09375 0 +0.875 0.09375 0.03125 +0.875 0.09375 0.0625 +0.875 0.09375 0.09375 +0.875 0.09375 0.125 +0.875 0.09375 0.1562 +0.875 0.09375 0.1875 +0.875 0.09375 0.2188 +0.875 0.09375 0.25 +0.875 0.09375 0.2812 +0.875 0.09375 0.3125 +0.875 0.09375 0.3438 +0.875 0.09375 0.375 +0.875 0.09375 0.4062 +0.875 0.09375 0.4375 +0.875 0.09375 0.4688 +0.875 0.09375 0.5 +0.875 0.09375 0.5312 +0.875 0.09375 0.5625 +0.875 0.09375 0.5938 +0.875 0.09375 0.625 +0.875 0.09375 0.6562 +0.875 0.09375 0.6875 +0.875 0.09375 0.7188 +0.875 0.09375 0.75 +0.875 0.09375 0.7812 +0.875 0.09375 0.8125 +0.875 0.09375 0.8438 +0.875 0.09375 0.875 +0.875 0.09375 0.9062 +0.875 0.09375 0.9375 +0.875 0.09375 0.9688 +0.875 0.09375 1 +0.875 0.125 0 +0.875 0.125 0.03125 +0.875 0.125 0.0625 +0.875 0.125 0.09375 +0.875 0.125 0.125 +0.875 0.125 0.1562 +0.875 0.125 0.1875 +0.875 0.125 0.2188 +0.875 0.125 0.25 +0.875 0.125 0.2812 +0.875 0.125 0.3125 +0.875 0.125 0.3438 +0.875 0.125 0.375 +0.875 0.125 0.4062 +0.875 0.125 0.4375 +0.875 0.125 0.4688 +0.875 0.125 0.5 +0.875 0.125 0.5312 +0.875 0.125 0.5625 +0.875 0.125 0.5938 +0.875 0.125 0.625 +0.875 0.125 0.6562 +0.875 0.125 0.6875 +0.875 0.125 0.7188 +0.875 0.125 0.75 +0.875 0.125 0.7812 +0.875 0.125 0.8125 +0.875 0.125 0.8438 +0.875 0.125 0.875 +0.875 0.125 0.9062 +0.875 0.125 0.9375 +0.875 0.125 0.9688 +0.875 0.125 1 +0.875 0.1562 0 +0.875 0.1562 0.03125 +0.875 0.1562 0.0625 +0.875 0.1562 0.09375 +0.875 0.1562 0.125 +0.875 0.1562 0.1562 +0.875 0.1562 0.1875 +0.875 0.1562 0.2188 +0.875 0.1562 0.25 +0.875 0.1562 0.2812 +0.875 0.1562 0.3125 +0.875 0.1562 0.3438 +0.875 0.1562 0.375 +0.875 0.1562 0.4062 +0.875 0.1562 0.4375 +0.875 0.1562 0.4688 +0.875 0.1562 0.5 +0.875 0.1562 0.5312 +0.875 0.1562 0.5625 +0.875 0.1562 0.5938 +0.875 0.1562 0.625 +0.875 0.1562 0.6562 +0.875 0.1562 0.6875 +0.875 0.1562 0.7188 +0.875 0.1562 0.75 +0.875 0.1562 0.7812 +0.875 0.1562 0.8125 +0.875 0.1562 0.8438 +0.875 0.1562 0.875 +0.875 0.1562 0.9062 +0.875 0.1562 0.9375 +0.875 0.1562 0.9688 +0.875 0.1562 1 +0.875 0.1875 0 +0.875 0.1875 0.03125 +0.875 0.1875 0.0625 +0.875 0.1875 0.09375 +0.875 0.1875 0.125 +0.875 0.1875 0.1562 +0.875 0.1875 0.1875 +0.875 0.1875 0.2188 +0.875 0.1875 0.25 +0.875 0.1875 0.2812 +0.875 0.1875 0.3125 +0.875 0.1875 0.3438 +0.875 0.1875 0.375 +0.875 0.1875 0.4062 +0.875 0.1875 0.4375 +0.875 0.1875 0.4688 +0.875 0.1875 0.5 +0.875 0.1875 0.5312 +0.875 0.1875 0.5625 +0.875 0.1875 0.5938 +0.875 0.1875 0.625 +0.875 0.1875 0.6562 +0.875 0.1875 0.6875 +0.875 0.1875 0.7188 +0.875 0.1875 0.75 +0.875 0.1875 0.7812 +0.875 0.1875 0.8125 +0.875 0.1875 0.8438 +0.875 0.1875 0.875 +0.875 0.1875 0.9062 +0.875 0.1875 0.9375 +0.875 0.1875 0.9688 +0.875 0.1875 1 +0.875 0.2188 0 +0.875 0.2188 0.03125 +0.875 0.2188 0.0625 +0.875 0.2188 0.09375 +0.875 0.2188 0.125 +0.875 0.2188 0.1562 +0.875 0.2188 0.1875 +0.875 0.2188 0.2188 +0.875 0.2188 0.25 +0.875 0.2188 0.2812 +0.875 0.2188 0.3125 +0.875 0.2188 0.3438 +0.875 0.2188 0.375 +0.875 0.2188 0.4062 +0.875 0.2188 0.4375 +0.875 0.2188 0.4688 +0.875 0.2188 0.5 +0.875 0.2188 0.5312 +0.875 0.2188 0.5625 +0.875 0.2188 0.5938 +0.875 0.2188 0.625 +0.875 0.2188 0.6562 +0.875 0.2188 0.6875 +0.875 0.2188 0.7188 +0.875 0.2188 0.75 +0.875 0.2188 0.7812 +0.875 0.2188 0.8125 +0.875 0.2188 0.8438 +0.875 0.2188 0.875 +0.875 0.2188 0.9062 +0.875 0.2188 0.9375 +0.875 0.2188 0.9688 +0.875 0.2188 1 +0.875 0.25 0 +0.875 0.25 0.03125 +0.875 0.25 0.0625 +0.875 0.25 0.09375 +0.875 0.25 0.125 +0.875 0.25 0.1562 +0.875 0.25 0.1875 +0.875 0.25 0.2188 +0.875 0.25 0.25 +0.875 0.25 0.2812 +0.875 0.25 0.3125 +0.875 0.25 0.3438 +0.875 0.25 0.375 +0.875 0.25 0.4062 +0.875 0.25 0.4375 +0.875 0.25 0.4688 +0.875 0.25 0.5 +0.875 0.25 0.5312 +0.875 0.25 0.5625 +0.875 0.25 0.5938 +0.875 0.25 0.625 +0.875 0.25 0.6562 +0.875 0.25 0.6875 +0.875 0.25 0.7188 +0.875 0.25 0.75 +0.875 0.25 0.7812 +0.875 0.25 0.8125 +0.875 0.25 0.8438 +0.875 0.25 0.875 +0.875 0.25 0.9062 +0.875 0.25 0.9375 +0.875 0.25 0.9688 +0.875 0.25 1 +0.875 0.2812 0 +0.875 0.2812 0.03125 +0.875 0.2812 0.0625 +0.875 0.2812 0.09375 +0.875 0.2812 0.125 +0.875 0.2812 0.1562 +0.875 0.2812 0.1875 +0.875 0.2812 0.2188 +0.875 0.2812 0.25 +0.875 0.2812 0.2812 +0.875 0.2812 0.3125 +0.875 0.2812 0.3438 +0.875 0.2812 0.375 +0.875 0.2812 0.4062 +0.875 0.2812 0.4375 +0.875 0.2812 0.4688 +0.875 0.2812 0.5 +0.875 0.2812 0.5312 +0.875 0.2812 0.5625 +0.875 0.2812 0.5938 +0.875 0.2812 0.625 +0.875 0.2812 0.6562 +0.875 0.2812 0.6875 +0.875 0.2812 0.7188 +0.875 0.2812 0.75 +0.875 0.2812 0.7812 +0.875 0.2812 0.8125 +0.875 0.2812 0.8438 +0.875 0.2812 0.875 +0.875 0.2812 0.9062 +0.875 0.2812 0.9375 +0.875 0.2812 0.9688 +0.875 0.2812 1 +0.875 0.3125 0 +0.875 0.3125 0.03125 +0.875 0.3125 0.0625 +0.875 0.3125 0.09375 +0.875 0.3125 0.125 +0.875 0.3125 0.1562 +0.875 0.3125 0.1875 +0.875 0.3125 0.2188 +0.875 0.3125 0.25 +0.875 0.3125 0.2812 +0.875 0.3125 0.3125 +0.875 0.3125 0.3438 +0.875 0.3125 0.375 +0.875 0.3125 0.4062 +0.875 0.3125 0.4375 +0.875 0.3125 0.4688 +0.875 0.3125 0.5 +0.875 0.3125 0.5312 +0.875 0.3125 0.5625 +0.875 0.3125 0.5938 +0.875 0.3125 0.625 +0.875 0.3125 0.6562 +0.875 0.3125 0.6875 +0.875 0.3125 0.7188 +0.875 0.3125 0.75 +0.875 0.3125 0.7812 +0.875 0.3125 0.8125 +0.875 0.3125 0.8438 +0.875 0.3125 0.875 +0.875 0.3125 0.9062 +0.875 0.3125 0.9375 +0.875 0.3125 0.9688 +0.875 0.3125 1 +0.875 0.3438 0 +0.875 0.3438 0.03125 +0.875 0.3438 0.0625 +0.875 0.3438 0.09375 +0.875 0.3438 0.125 +0.875 0.3438 0.1562 +0.875 0.3438 0.1875 +0.875 0.3438 0.2188 +0.875 0.3438 0.25 +0.875 0.3438 0.2812 +0.875 0.3438 0.3125 +0.875 0.3438 0.3438 +0.875 0.3438 0.375 +0.875 0.3438 0.4062 +0.875 0.3438 0.4375 +0.875 0.3438 0.4688 +0.875 0.3438 0.5 +0.875 0.3438 0.5312 +0.875 0.3438 0.5625 +0.875 0.3438 0.5938 +0.875 0.3438 0.625 +0.875 0.3438 0.6562 +0.875 0.3438 0.6875 +0.875 0.3438 0.7188 +0.875 0.3438 0.75 +0.875 0.3438 0.7812 +0.875 0.3438 0.8125 +0.875 0.3438 0.8438 +0.875 0.3438 0.875 +0.875 0.3438 0.9062 +0.875 0.3438 0.9375 +0.875 0.3438 0.9688 +0.875 0.3438 1 +0.875 0.375 0 +0.875 0.375 0.03125 +0.875 0.375 0.0625 +0.875 0.375 0.09375 +0.875 0.375 0.125 +0.875 0.375 0.1562 +0.875 0.375 0.1875 +0.875 0.375 0.2188 +0.875 0.375 0.25 +0.875 0.375 0.2812 +0.875 0.375 0.3125 +0.875 0.375 0.3438 +0.875 0.375 0.375 +0.875 0.375 0.4062 +0.875 0.375 0.4375 +0.875 0.375 0.4688 +0.875 0.375 0.5 +0.875 0.375 0.5312 +0.875 0.375 0.5625 +0.875 0.375 0.5938 +0.875 0.375 0.625 +0.875 0.375 0.6562 +0.875 0.375 0.6875 +0.875 0.375 0.7188 +0.875 0.375 0.75 +0.875 0.375 0.7812 +0.875 0.375 0.8125 +0.875 0.375 0.8438 +0.875 0.375 0.875 +0.875 0.375 0.9062 +0.875 0.375 0.9375 +0.875 0.375 0.9688 +0.875 0.375 1 +0.875 0.4062 0 +0.875 0.4062 0.03125 +0.875 0.4062 0.0625 +0.875 0.4062 0.09375 +0.875 0.4062 0.125 +0.875 0.4062 0.1562 +0.875 0.4062 0.1875 +0.875 0.4062 0.2188 +0.875 0.4062 0.25 +0.875 0.4062 0.2812 +0.875 0.4062 0.3125 +0.875 0.4062 0.3438 +0.875 0.4062 0.375 +0.875 0.4062 0.4062 +0.875 0.4062 0.4375 +0.875 0.4062 0.4688 +0.875 0.4062 0.5 +0.875 0.4062 0.5312 +0.875 0.4062 0.5625 +0.875 0.4062 0.5938 +0.875 0.4062 0.625 +0.875 0.4062 0.6562 +0.875 0.4062 0.6875 +0.875 0.4062 0.7188 +0.875 0.4062 0.75 +0.875 0.4062 0.7812 +0.875 0.4062 0.8125 +0.875 0.4062 0.8438 +0.875 0.4062 0.875 +0.875 0.4062 0.9062 +0.875 0.4062 0.9375 +0.875 0.4062 0.9688 +0.875 0.4062 1 +0.875 0.4375 0 +0.875 0.4375 0.03125 +0.875 0.4375 0.0625 +0.875 0.4375 0.09375 +0.875 0.4375 0.125 +0.875 0.4375 0.1562 +0.875 0.4375 0.1875 +0.875 0.4375 0.2188 +0.875 0.4375 0.25 +0.875 0.4375 0.2812 +0.875 0.4375 0.3125 +0.875 0.4375 0.3438 +0.875 0.4375 0.375 +0.875 0.4375 0.4062 +0.875 0.4375 0.4375 +0.875 0.4375 0.4688 +0.875 0.4375 0.5 +0.875 0.4375 0.5312 +0.875 0.4375 0.5625 +0.875 0.4375 0.5938 +0.875 0.4375 0.625 +0.875 0.4375 0.6562 +0.875 0.4375 0.6875 +0.875 0.4375 0.7188 +0.875 0.4375 0.75 +0.875 0.4375 0.7812 +0.875 0.4375 0.8125 +0.875 0.4375 0.8438 +0.875 0.4375 0.875 +0.875 0.4375 0.9062 +0.875 0.4375 0.9375 +0.875 0.4375 0.9688 +0.875 0.4375 1 +0.875 0.4688 0 +0.875 0.4688 0.03125 +0.875 0.4688 0.0625 +0.875 0.4688 0.09375 +0.875 0.4688 0.125 +0.875 0.4688 0.1562 +0.875 0.4688 0.1875 +0.875 0.4688 0.2188 +0.875 0.4688 0.25 +0.875 0.4688 0.2812 +0.875 0.4688 0.3125 +0.875 0.4688 0.3438 +0.875 0.4688 0.375 +0.875 0.4688 0.4062 +0.875 0.4688 0.4375 +0.875 0.4688 0.4688 +0.875 0.4688 0.5 +0.875 0.4688 0.5312 +0.875 0.4688 0.5625 +0.875 0.4688 0.5938 +0.875 0.4688 0.625 +0.875 0.4688 0.6562 +0.875 0.4688 0.6875 +0.875 0.4688 0.7188 +0.875 0.4688 0.75 +0.875 0.4688 0.7812 +0.875 0.4688 0.8125 +0.875 0.4688 0.8438 +0.875 0.4688 0.875 +0.875 0.4688 0.9062 +0.875 0.4688 0.9375 +0.875 0.4688 0.9688 +0.875 0.4688 1 +0.875 0.5 0 +0.875 0.5 0.03125 +0.875 0.5 0.0625 +0.875 0.5 0.09375 +0.875 0.5 0.125 +0.875 0.5 0.1562 +0.875 0.5 0.1875 +0.875 0.5 0.2188 +0.875 0.5 0.25 +0.875 0.5 0.2812 +0.875 0.5 0.3125 +0.875 0.5 0.3438 +0.875 0.5 0.375 +0.875 0.5 0.4062 +0.875 0.5 0.4375 +0.875 0.5 0.4688 +0.875 0.5 0.5 +0.875 0.5 0.5312 +0.875 0.5 0.5625 +0.875 0.5 0.5938 +0.875 0.5 0.625 +0.875 0.5 0.6562 +0.875 0.5 0.6875 +0.875 0.5 0.7188 +0.875 0.5 0.75 +0.875 0.5 0.7812 +0.875 0.5 0.8125 +0.875 0.5 0.8438 +0.875 0.5 0.875 +0.875 0.5 0.9062 +0.875 0.5 0.9375 +0.875 0.5 0.9688 +0.875 0.5 1 +0.875 0.5312 0 +0.875 0.5312 0.03125 +0.875 0.5312 0.0625 +0.875 0.5312 0.09375 +0.875 0.5312 0.125 +0.875 0.5312 0.1562 +0.875 0.5312 0.1875 +0.875 0.5312 0.2188 +0.875 0.5312 0.25 +0.875 0.5312 0.2812 +0.875 0.5312 0.3125 +0.875 0.5312 0.3438 +0.875 0.5312 0.375 +0.875 0.5312 0.4062 +0.875 0.5312 0.4375 +0.875 0.5312 0.4688 +0.875 0.5312 0.5 +0.875 0.5312 0.5312 +0.875 0.5312 0.5625 +0.875 0.5312 0.5938 +0.875 0.5312 0.625 +0.875 0.5312 0.6562 +0.875 0.5312 0.6875 +0.875 0.5312 0.7188 +0.875 0.5312 0.75 +0.875 0.5312 0.7812 +0.875 0.5312 0.8125 +0.875 0.5312 0.8438 +0.875 0.5312 0.875 +0.875 0.5312 0.9062 +0.875 0.5312 0.9375 +0.875 0.5312 0.9688 +0.875 0.5312 1 +0.875 0.5625 0 +0.875 0.5625 0.03125 +0.875 0.5625 0.0625 +0.875 0.5625 0.09375 +0.875 0.5625 0.125 +0.875 0.5625 0.1562 +0.875 0.5625 0.1875 +0.875 0.5625 0.2188 +0.875 0.5625 0.25 +0.875 0.5625 0.2812 +0.875 0.5625 0.3125 +0.875 0.5625 0.3438 +0.875 0.5625 0.375 +0.875 0.5625 0.4062 +0.875 0.5625 0.4375 +0.875 0.5625 0.4688 +0.875 0.5625 0.5 +0.875 0.5625 0.5312 +0.875 0.5625 0.5625 +0.875 0.5625 0.5938 +0.875 0.5625 0.625 +0.875 0.5625 0.6562 +0.875 0.5625 0.6875 +0.875 0.5625 0.7188 +0.875 0.5625 0.75 +0.875 0.5625 0.7812 +0.875 0.5625 0.8125 +0.875 0.5625 0.8438 +0.875 0.5625 0.875 +0.875 0.5625 0.9062 +0.875 0.5625 0.9375 +0.875 0.5625 0.9688 +0.875 0.5625 1 +0.875 0.5938 0 +0.875 0.5938 0.03125 +0.875 0.5938 0.0625 +0.875 0.5938 0.09375 +0.875 0.5938 0.125 +0.875 0.5938 0.1562 +0.875 0.5938 0.1875 +0.875 0.5938 0.2188 +0.875 0.5938 0.25 +0.875 0.5938 0.2812 +0.875 0.5938 0.3125 +0.875 0.5938 0.3438 +0.875 0.5938 0.375 +0.875 0.5938 0.4062 +0.875 0.5938 0.4375 +0.875 0.5938 0.4688 +0.875 0.5938 0.5 +0.875 0.5938 0.5312 +0.875 0.5938 0.5625 +0.875 0.5938 0.5938 +0.875 0.5938 0.625 +0.875 0.5938 0.6562 +0.875 0.5938 0.6875 +0.875 0.5938 0.7188 +0.875 0.5938 0.75 +0.875 0.5938 0.7812 +0.875 0.5938 0.8125 +0.875 0.5938 0.8438 +0.875 0.5938 0.875 +0.875 0.5938 0.9062 +0.875 0.5938 0.9375 +0.875 0.5938 0.9688 +0.875 0.5938 1 +0.875 0.625 0 +0.875 0.625 0.03125 +0.875 0.625 0.0625 +0.875 0.625 0.09375 +0.875 0.625 0.125 +0.875 0.625 0.1562 +0.875 0.625 0.1875 +0.875 0.625 0.2188 +0.875 0.625 0.25 +0.875 0.625 0.2812 +0.875 0.625 0.3125 +0.875 0.625 0.3438 +0.875 0.625 0.375 +0.875 0.625 0.4062 +0.875 0.625 0.4375 +0.875 0.625 0.4688 +0.875 0.625 0.5 +0.875 0.625 0.5312 +0.875 0.625 0.5625 +0.875 0.625 0.5938 +0.875 0.625 0.625 +0.875 0.625 0.6562 +0.875 0.625 0.6875 +0.875 0.625 0.7188 +0.875 0.625 0.75 +0.875 0.625 0.7812 +0.875 0.625 0.8125 +0.875 0.625 0.8438 +0.875 0.625 0.875 +0.875 0.625 0.9062 +0.875 0.625 0.9375 +0.875 0.625 0.9688 +0.875 0.625 1 +0.875 0.6562 0 +0.875 0.6562 0.03125 +0.875 0.6562 0.0625 +0.875 0.6562 0.09375 +0.875 0.6562 0.125 +0.875 0.6562 0.1562 +0.875 0.6562 0.1875 +0.875 0.6562 0.2188 +0.875 0.6562 0.25 +0.875 0.6562 0.2812 +0.875 0.6562 0.3125 +0.875 0.6562 0.3438 +0.875 0.6562 0.375 +0.875 0.6562 0.4062 +0.875 0.6562 0.4375 +0.875 0.6562 0.4688 +0.875 0.6562 0.5 +0.875 0.6562 0.5312 +0.875 0.6562 0.5625 +0.875 0.6562 0.5938 +0.875 0.6562 0.625 +0.875 0.6562 0.6562 +0.875 0.6562 0.6875 +0.875 0.6562 0.7188 +0.875 0.6562 0.75 +0.875 0.6562 0.7812 +0.875 0.6562 0.8125 +0.875 0.6562 0.8438 +0.875 0.6562 0.875 +0.875 0.6562 0.9062 +0.875 0.6562 0.9375 +0.875 0.6562 0.9688 +0.875 0.6562 1 +0.875 0.6875 0 +0.875 0.6875 0.03125 +0.875 0.6875 0.0625 +0.875 0.6875 0.09375 +0.875 0.6875 0.125 +0.875 0.6875 0.1562 +0.875 0.6875 0.1875 +0.875 0.6875 0.2188 +0.875 0.6875 0.25 +0.875 0.6875 0.2812 +0.875 0.6875 0.3125 +0.875 0.6875 0.3438 +0.875 0.6875 0.375 +0.875 0.6875 0.4062 +0.875 0.6875 0.4375 +0.875 0.6875 0.4688 +0.875 0.6875 0.5 +0.875 0.6875 0.5312 +0.875 0.6875 0.5625 +0.875 0.6875 0.5938 +0.875 0.6875 0.625 +0.875 0.6875 0.6562 +0.875 0.6875 0.6875 +0.875 0.6875 0.7188 +0.875 0.6875 0.75 +0.875 0.6875 0.7812 +0.875 0.6875 0.8125 +0.875 0.6875 0.8438 +0.875 0.6875 0.875 +0.875 0.6875 0.9062 +0.875 0.6875 0.9375 +0.875 0.6875 0.9688 +0.875 0.6875 1 +0.875 0.7188 0 +0.875 0.7188 0.03125 +0.875 0.7188 0.0625 +0.875 0.7188 0.09375 +0.875 0.7188 0.125 +0.875 0.7188 0.1562 +0.875 0.7188 0.1875 +0.875 0.7188 0.2188 +0.875 0.7188 0.25 +0.875 0.7188 0.2812 +0.875 0.7188 0.3125 +0.875 0.7188 0.3438 +0.875 0.7188 0.375 +0.875 0.7188 0.4062 +0.875 0.7188 0.4375 +0.875 0.7188 0.4688 +0.875 0.7188 0.5 +0.875 0.7188 0.5312 +0.875 0.7188 0.5625 +0.875 0.7188 0.5938 +0.875 0.7188 0.625 +0.875 0.7188 0.6562 +0.875 0.7188 0.6875 +0.875 0.7188 0.7188 +0.875 0.7188 0.75 +0.875 0.7188 0.7812 +0.875 0.7188 0.8125 +0.875 0.7188 0.8438 +0.875 0.7188 0.875 +0.875 0.7188 0.9062 +0.875 0.7188 0.9375 +0.875 0.7188 0.9688 +0.875 0.7188 1 +0.875 0.75 0 +0.875 0.75 0.03125 +0.875 0.75 0.0625 +0.875 0.75 0.09375 +0.875 0.75 0.125 +0.875 0.75 0.1562 +0.875 0.75 0.1875 +0.875 0.75 0.2188 +0.875 0.75 0.25 +0.875 0.75 0.2812 +0.875 0.75 0.3125 +0.875 0.75 0.3438 +0.875 0.75 0.375 +0.875 0.75 0.4062 +0.875 0.75 0.4375 +0.875 0.75 0.4688 +0.875 0.75 0.5 +0.875 0.75 0.5312 +0.875 0.75 0.5625 +0.875 0.75 0.5938 +0.875 0.75 0.625 +0.875 0.75 0.6562 +0.875 0.75 0.6875 +0.875 0.75 0.7188 +0.875 0.75 0.75 +0.875 0.75 0.7812 +0.875 0.75 0.8125 +0.875 0.75 0.8438 +0.875 0.75 0.875 +0.875 0.75 0.9062 +0.875 0.75 0.9375 +0.875 0.75 0.9688 +0.875 0.75 1 +0.875 0.7812 0 +0.875 0.7812 0.03125 +0.875 0.7812 0.0625 +0.875 0.7812 0.09375 +0.875 0.7812 0.125 +0.875 0.7812 0.1562 +0.875 0.7812 0.1875 +0.875 0.7812 0.2188 +0.875 0.7812 0.25 +0.875 0.7812 0.2812 +0.875 0.7812 0.3125 +0.875 0.7812 0.3438 +0.875 0.7812 0.375 +0.875 0.7812 0.4062 +0.875 0.7812 0.4375 +0.875 0.7812 0.4688 +0.875 0.7812 0.5 +0.875 0.7812 0.5312 +0.875 0.7812 0.5625 +0.875 0.7812 0.5938 +0.875 0.7812 0.625 +0.875 0.7812 0.6562 +0.875 0.7812 0.6875 +0.875 0.7812 0.7188 +0.875 0.7812 0.75 +0.875 0.7812 0.7812 +0.875 0.7812 0.8125 +0.875 0.7812 0.8438 +0.875 0.7812 0.875 +0.875 0.7812 0.9062 +0.875 0.7812 0.9375 +0.875 0.7812 0.9688 +0.875 0.7812 1 +0.875 0.8125 0 +0.875 0.8125 0.03125 +0.875 0.8125 0.0625 +0.875 0.8125 0.09375 +0.875 0.8125 0.125 +0.875 0.8125 0.1562 +0.875 0.8125 0.1875 +0.875 0.8125 0.2188 +0.875 0.8125 0.25 +0.875 0.8125 0.2812 +0.875 0.8125 0.3125 +0.875 0.8125 0.3438 +0.875 0.8125 0.375 +0.875 0.8125 0.4062 +0.875 0.8125 0.4375 +0.875 0.8125 0.4688 +0.875 0.8125 0.5 +0.875 0.8125 0.5312 +0.875 0.8125 0.5625 +0.875 0.8125 0.5938 +0.875 0.8125 0.625 +0.875 0.8125 0.6562 +0.875 0.8125 0.6875 +0.875 0.8125 0.7188 +0.875 0.8125 0.75 +0.875 0.8125 0.7812 +0.875 0.8125 0.8125 +0.875 0.8125 0.8438 +0.875 0.8125 0.875 +0.875 0.8125 0.9062 +0.875 0.8125 0.9375 +0.875 0.8125 0.9688 +0.875 0.8125 1 +0.875 0.8438 0 +0.875 0.8438 0.03125 +0.875 0.8438 0.0625 +0.875 0.8438 0.09375 +0.875 0.8438 0.125 +0.875 0.8438 0.1562 +0.875 0.8438 0.1875 +0.875 0.8438 0.2188 +0.875 0.8438 0.25 +0.875 0.8438 0.2812 +0.875 0.8438 0.3125 +0.875 0.8438 0.3438 +0.875 0.8438 0.375 +0.875 0.8438 0.4062 +0.875 0.8438 0.4375 +0.875 0.8438 0.4688 +0.875 0.8438 0.5 +0.875 0.8438 0.5312 +0.875 0.8438 0.5625 +0.875 0.8438 0.5938 +0.875 0.8438 0.625 +0.875 0.8438 0.6562 +0.875 0.8438 0.6875 +0.875 0.8438 0.7188 +0.875 0.8438 0.75 +0.875 0.8438 0.7812 +0.875 0.8438 0.8125 +0.875 0.8438 0.8438 +0.875 0.8438 0.875 +0.875 0.8438 0.9062 +0.875 0.8438 0.9375 +0.875 0.8438 0.9688 +0.875 0.8438 1 +0.875 0.875 0 +0.875 0.875 0.03125 +0.875 0.875 0.0625 +0.875 0.875 0.09375 +0.875 0.875 0.125 +0.875 0.875 0.1562 +0.875 0.875 0.1875 +0.875 0.875 0.2188 +0.875 0.875 0.25 +0.875 0.875 0.2812 +0.875 0.875 0.3125 +0.875 0.875 0.3438 +0.875 0.875 0.375 +0.875 0.875 0.4062 +0.875 0.875 0.4375 +0.875 0.875 0.4688 +0.875 0.875 0.5 +0.875 0.875 0.5312 +0.875 0.875 0.5625 +0.875 0.875 0.5938 +0.875 0.875 0.625 +0.875 0.875 0.6562 +0.875 0.875 0.6875 +0.875 0.875 0.7188 +0.875 0.875 0.75 +0.875 0.875 0.7812 +0.875 0.875 0.8125 +0.875 0.875 0.8438 +0.875 0.875 0.875 +0.875 0.875 0.9062 +0.875 0.875 0.9375 +0.875 0.875 0.9688 +0.875 0.875 1 +0.875 0.9062 0 +0.875 0.9062 0.03125 +0.875 0.9062 0.0625 +0.875 0.9062 0.09375 +0.875 0.9062 0.125 +0.875 0.9062 0.1562 +0.875 0.9062 0.1875 +0.875 0.9062 0.2188 +0.875 0.9062 0.25 +0.875 0.9062 0.2812 +0.875 0.9062 0.3125 +0.875 0.9062 0.3438 +0.875 0.9062 0.375 +0.875 0.9062 0.4062 +0.875 0.9062 0.4375 +0.875 0.9062 0.4688 +0.875 0.9062 0.5 +0.875 0.9062 0.5312 +0.875 0.9062 0.5625 +0.875 0.9062 0.5938 +0.875 0.9062 0.625 +0.875 0.9062 0.6562 +0.875 0.9062 0.6875 +0.875 0.9062 0.7188 +0.875 0.9062 0.75 +0.875 0.9062 0.7812 +0.875 0.9062 0.8125 +0.875 0.9062 0.8438 +0.875 0.9062 0.875 +0.875 0.9062 0.9062 +0.875 0.9062 0.9375 +0.875 0.9062 0.9688 +0.875 0.9062 1 +0.875 0.9375 0 +0.875 0.9375 0.03125 +0.875 0.9375 0.0625 +0.875 0.9375 0.09375 +0.875 0.9375 0.125 +0.875 0.9375 0.1562 +0.875 0.9375 0.1875 +0.875 0.9375 0.2188 +0.875 0.9375 0.25 +0.875 0.9375 0.2812 +0.875 0.9375 0.3125 +0.875 0.9375 0.3438 +0.875 0.9375 0.375 +0.875 0.9375 0.4062 +0.875 0.9375 0.4375 +0.875 0.9375 0.4688 +0.875 0.9375 0.5 +0.875 0.9375 0.5312 +0.875 0.9375 0.5625 +0.875 0.9375 0.5938 +0.875 0.9375 0.625 +0.875 0.9375 0.6562 +0.875 0.9375 0.6875 +0.875 0.9375 0.7188 +0.875 0.9375 0.75 +0.875 0.9375 0.7812 +0.875 0.9375 0.8125 +0.875 0.9375 0.8438 +0.875 0.9375 0.875 +0.875 0.9375 0.9062 +0.875 0.9375 0.9375 +0.875 0.9375 0.9688 +0.875 0.9375 1 +0.875 0.9688 0 +0.875 0.9688 0.03125 +0.875 0.9688 0.0625 +0.875 0.9688 0.09375 +0.875 0.9688 0.125 +0.875 0.9688 0.1562 +0.875 0.9688 0.1875 +0.875 0.9688 0.2188 +0.875 0.9688 0.25 +0.875 0.9688 0.2812 +0.875 0.9688 0.3125 +0.875 0.9688 0.3438 +0.875 0.9688 0.375 +0.875 0.9688 0.4062 +0.875 0.9688 0.4375 +0.875 0.9688 0.4688 +0.875 0.9688 0.5 +0.875 0.9688 0.5312 +0.875 0.9688 0.5625 +0.875 0.9688 0.5938 +0.875 0.9688 0.625 +0.875 0.9688 0.6562 +0.875 0.9688 0.6875 +0.875 0.9688 0.7188 +0.875 0.9688 0.75 +0.875 0.9688 0.7812 +0.875 0.9688 0.8125 +0.875 0.9688 0.8438 +0.875 0.9688 0.875 +0.875 0.9688 0.9062 +0.875 0.9688 0.9375 +0.875 0.9688 0.9688 +0.875 0.9688 1 +0.875 1 0 +0.875 1 0.03125 +0.875 1 0.0625 +0.875 1 0.09375 +0.875 1 0.125 +0.875 1 0.1562 +0.875 1 0.1875 +0.875 1 0.2188 +0.875 1 0.25 +0.875 1 0.2812 +0.875 1 0.3125 +0.875 1 0.3438 +0.875 1 0.375 +0.875 1 0.4062 +0.875 1 0.4375 +0.875 1 0.4688 +0.875 1 0.5 +0.875 1 0.5312 +0.875 1 0.5625 +0.875 1 0.5938 +0.875 1 0.625 +0.875 1 0.6562 +0.875 1 0.6875 +0.875 1 0.7188 +0.875 1 0.75 +0.875 1 0.7812 +0.875 1 0.8125 +0.875 1 0.8438 +0.875 1 0.875 +0.875 1 0.9062 +0.875 1 0.9375 +0.875 1 0.9688 +0.875 1 1 +0.9062 0 0 +0.9062 0 0.03125 +0.9062 0 0.0625 +0.9062 0 0.09375 +0.9062 0 0.125 +0.9062 0 0.1562 +0.9062 0 0.1875 +0.9062 0 0.2188 +0.9062 0 0.25 +0.9062 0 0.2812 +0.9062 0 0.3125 +0.9062 0 0.3438 +0.9062 0 0.375 +0.9062 0 0.4062 +0.9062 0 0.4375 +0.9062 0 0.4688 +0.9062 0 0.5 +0.9062 0 0.5312 +0.9062 0 0.5625 +0.9062 0 0.5938 +0.9062 0 0.625 +0.9062 0 0.6562 +0.9062 0 0.6875 +0.9062 0 0.7188 +0.9062 0 0.75 +0.9062 0 0.7812 +0.9062 0 0.8125 +0.9062 0 0.8438 +0.9062 0 0.875 +0.9062 0 0.9062 +0.9062 0 0.9375 +0.9062 0 0.9688 +0.9062 0 1 +0.9062 0.03125 0 +0.9062 0.03125 0.03125 +0.9062 0.03125 0.0625 +0.9062 0.03125 0.09375 +0.9062 0.03125 0.125 +0.9062 0.03125 0.1562 +0.9062 0.03125 0.1875 +0.9062 0.03125 0.2188 +0.9062 0.03125 0.25 +0.9062 0.03125 0.2812 +0.9062 0.03125 0.3125 +0.9062 0.03125 0.3438 +0.9062 0.03125 0.375 +0.9062 0.03125 0.4062 +0.9062 0.03125 0.4375 +0.9062 0.03125 0.4688 +0.9062 0.03125 0.5 +0.9062 0.03125 0.5312 +0.9062 0.03125 0.5625 +0.9062 0.03125 0.5938 +0.9062 0.03125 0.625 +0.9062 0.03125 0.6562 +0.9062 0.03125 0.6875 +0.9062 0.03125 0.7188 +0.9062 0.03125 0.75 +0.9062 0.03125 0.7812 +0.9062 0.03125 0.8125 +0.9062 0.03125 0.8438 +0.9062 0.03125 0.875 +0.9062 0.03125 0.9062 +0.9062 0.03125 0.9375 +0.9062 0.03125 0.9688 +0.9062 0.03125 1 +0.9062 0.0625 0 +0.9062 0.0625 0.03125 +0.9062 0.0625 0.0625 +0.9062 0.0625 0.09375 +0.9062 0.0625 0.125 +0.9062 0.0625 0.1562 +0.9062 0.0625 0.1875 +0.9062 0.0625 0.2188 +0.9062 0.0625 0.25 +0.9062 0.0625 0.2812 +0.9062 0.0625 0.3125 +0.9062 0.0625 0.3438 +0.9062 0.0625 0.375 +0.9062 0.0625 0.4062 +0.9062 0.0625 0.4375 +0.9062 0.0625 0.4688 +0.9062 0.0625 0.5 +0.9062 0.0625 0.5312 +0.9062 0.0625 0.5625 +0.9062 0.0625 0.5938 +0.9062 0.0625 0.625 +0.9062 0.0625 0.6562 +0.9062 0.0625 0.6875 +0.9062 0.0625 0.7188 +0.9062 0.0625 0.75 +0.9062 0.0625 0.7812 +0.9062 0.0625 0.8125 +0.9062 0.0625 0.8438 +0.9062 0.0625 0.875 +0.9062 0.0625 0.9062 +0.9062 0.0625 0.9375 +0.9062 0.0625 0.9688 +0.9062 0.0625 1 +0.9062 0.09375 0 +0.9062 0.09375 0.03125 +0.9062 0.09375 0.0625 +0.9062 0.09375 0.09375 +0.9062 0.09375 0.125 +0.9062 0.09375 0.1562 +0.9062 0.09375 0.1875 +0.9062 0.09375 0.2188 +0.9062 0.09375 0.25 +0.9062 0.09375 0.2812 +0.9062 0.09375 0.3125 +0.9062 0.09375 0.3438 +0.9062 0.09375 0.375 +0.9062 0.09375 0.4062 +0.9062 0.09375 0.4375 +0.9062 0.09375 0.4688 +0.9062 0.09375 0.5 +0.9062 0.09375 0.5312 +0.9062 0.09375 0.5625 +0.9062 0.09375 0.5938 +0.9062 0.09375 0.625 +0.9062 0.09375 0.6562 +0.9062 0.09375 0.6875 +0.9062 0.09375 0.7188 +0.9062 0.09375 0.75 +0.9062 0.09375 0.7812 +0.9062 0.09375 0.8125 +0.9062 0.09375 0.8438 +0.9062 0.09375 0.875 +0.9062 0.09375 0.9062 +0.9062 0.09375 0.9375 +0.9062 0.09375 0.9688 +0.9062 0.09375 1 +0.9062 0.125 0 +0.9062 0.125 0.03125 +0.9062 0.125 0.0625 +0.9062 0.125 0.09375 +0.9062 0.125 0.125 +0.9062 0.125 0.1562 +0.9062 0.125 0.1875 +0.9062 0.125 0.2188 +0.9062 0.125 0.25 +0.9062 0.125 0.2812 +0.9062 0.125 0.3125 +0.9062 0.125 0.3438 +0.9062 0.125 0.375 +0.9062 0.125 0.4062 +0.9062 0.125 0.4375 +0.9062 0.125 0.4688 +0.9062 0.125 0.5 +0.9062 0.125 0.5312 +0.9062 0.125 0.5625 +0.9062 0.125 0.5938 +0.9062 0.125 0.625 +0.9062 0.125 0.6562 +0.9062 0.125 0.6875 +0.9062 0.125 0.7188 +0.9062 0.125 0.75 +0.9062 0.125 0.7812 +0.9062 0.125 0.8125 +0.9062 0.125 0.8438 +0.9062 0.125 0.875 +0.9062 0.125 0.9062 +0.9062 0.125 0.9375 +0.9062 0.125 0.9688 +0.9062 0.125 1 +0.9062 0.1562 0 +0.9062 0.1562 0.03125 +0.9062 0.1562 0.0625 +0.9062 0.1562 0.09375 +0.9062 0.1562 0.125 +0.9062 0.1562 0.1562 +0.9062 0.1562 0.1875 +0.9062 0.1562 0.2188 +0.9062 0.1562 0.25 +0.9062 0.1562 0.2812 +0.9062 0.1562 0.3125 +0.9062 0.1562 0.3438 +0.9062 0.1562 0.375 +0.9062 0.1562 0.4062 +0.9062 0.1562 0.4375 +0.9062 0.1562 0.4688 +0.9062 0.1562 0.5 +0.9062 0.1562 0.5312 +0.9062 0.1562 0.5625 +0.9062 0.1562 0.5938 +0.9062 0.1562 0.625 +0.9062 0.1562 0.6562 +0.9062 0.1562 0.6875 +0.9062 0.1562 0.7188 +0.9062 0.1562 0.75 +0.9062 0.1562 0.7812 +0.9062 0.1562 0.8125 +0.9062 0.1562 0.8438 +0.9062 0.1562 0.875 +0.9062 0.1562 0.9062 +0.9062 0.1562 0.9375 +0.9062 0.1562 0.9688 +0.9062 0.1562 1 +0.9062 0.1875 0 +0.9062 0.1875 0.03125 +0.9062 0.1875 0.0625 +0.9062 0.1875 0.09375 +0.9062 0.1875 0.125 +0.9062 0.1875 0.1562 +0.9062 0.1875 0.1875 +0.9062 0.1875 0.2188 +0.9062 0.1875 0.25 +0.9062 0.1875 0.2812 +0.9062 0.1875 0.3125 +0.9062 0.1875 0.3438 +0.9062 0.1875 0.375 +0.9062 0.1875 0.4062 +0.9062 0.1875 0.4375 +0.9062 0.1875 0.4688 +0.9062 0.1875 0.5 +0.9062 0.1875 0.5312 +0.9062 0.1875 0.5625 +0.9062 0.1875 0.5938 +0.9062 0.1875 0.625 +0.9062 0.1875 0.6562 +0.9062 0.1875 0.6875 +0.9062 0.1875 0.7188 +0.9062 0.1875 0.75 +0.9062 0.1875 0.7812 +0.9062 0.1875 0.8125 +0.9062 0.1875 0.8438 +0.9062 0.1875 0.875 +0.9062 0.1875 0.9062 +0.9062 0.1875 0.9375 +0.9062 0.1875 0.9688 +0.9062 0.1875 1 +0.9062 0.2188 0 +0.9062 0.2188 0.03125 +0.9062 0.2188 0.0625 +0.9062 0.2188 0.09375 +0.9062 0.2188 0.125 +0.9062 0.2188 0.1562 +0.9062 0.2188 0.1875 +0.9062 0.2188 0.2188 +0.9062 0.2188 0.25 +0.9062 0.2188 0.2812 +0.9062 0.2188 0.3125 +0.9062 0.2188 0.3438 +0.9062 0.2188 0.375 +0.9062 0.2188 0.4062 +0.9062 0.2188 0.4375 +0.9062 0.2188 0.4688 +0.9062 0.2188 0.5 +0.9062 0.2188 0.5312 +0.9062 0.2188 0.5625 +0.9062 0.2188 0.5938 +0.9062 0.2188 0.625 +0.9062 0.2188 0.6562 +0.9062 0.2188 0.6875 +0.9062 0.2188 0.7188 +0.9062 0.2188 0.75 +0.9062 0.2188 0.7812 +0.9062 0.2188 0.8125 +0.9062 0.2188 0.8438 +0.9062 0.2188 0.875 +0.9062 0.2188 0.9062 +0.9062 0.2188 0.9375 +0.9062 0.2188 0.9688 +0.9062 0.2188 1 +0.9062 0.25 0 +0.9062 0.25 0.03125 +0.9062 0.25 0.0625 +0.9062 0.25 0.09375 +0.9062 0.25 0.125 +0.9062 0.25 0.1562 +0.9062 0.25 0.1875 +0.9062 0.25 0.2188 +0.9062 0.25 0.25 +0.9062 0.25 0.2812 +0.9062 0.25 0.3125 +0.9062 0.25 0.3438 +0.9062 0.25 0.375 +0.9062 0.25 0.4062 +0.9062 0.25 0.4375 +0.9062 0.25 0.4688 +0.9062 0.25 0.5 +0.9062 0.25 0.5312 +0.9062 0.25 0.5625 +0.9062 0.25 0.5938 +0.9062 0.25 0.625 +0.9062 0.25 0.6562 +0.9062 0.25 0.6875 +0.9062 0.25 0.7188 +0.9062 0.25 0.75 +0.9062 0.25 0.7812 +0.9062 0.25 0.8125 +0.9062 0.25 0.8438 +0.9062 0.25 0.875 +0.9062 0.25 0.9062 +0.9062 0.25 0.9375 +0.9062 0.25 0.9688 +0.9062 0.25 1 +0.9062 0.2812 0 +0.9062 0.2812 0.03125 +0.9062 0.2812 0.0625 +0.9062 0.2812 0.09375 +0.9062 0.2812 0.125 +0.9062 0.2812 0.1562 +0.9062 0.2812 0.1875 +0.9062 0.2812 0.2188 +0.9062 0.2812 0.25 +0.9062 0.2812 0.2812 +0.9062 0.2812 0.3125 +0.9062 0.2812 0.3438 +0.9062 0.2812 0.375 +0.9062 0.2812 0.4062 +0.9062 0.2812 0.4375 +0.9062 0.2812 0.4688 +0.9062 0.2812 0.5 +0.9062 0.2812 0.5312 +0.9062 0.2812 0.5625 +0.9062 0.2812 0.5938 +0.9062 0.2812 0.625 +0.9062 0.2812 0.6562 +0.9062 0.2812 0.6875 +0.9062 0.2812 0.7188 +0.9062 0.2812 0.75 +0.9062 0.2812 0.7812 +0.9062 0.2812 0.8125 +0.9062 0.2812 0.8438 +0.9062 0.2812 0.875 +0.9062 0.2812 0.9062 +0.9062 0.2812 0.9375 +0.9062 0.2812 0.9688 +0.9062 0.2812 1 +0.9062 0.3125 0 +0.9062 0.3125 0.03125 +0.9062 0.3125 0.0625 +0.9062 0.3125 0.09375 +0.9062 0.3125 0.125 +0.9062 0.3125 0.1562 +0.9062 0.3125 0.1875 +0.9062 0.3125 0.2188 +0.9062 0.3125 0.25 +0.9062 0.3125 0.2812 +0.9062 0.3125 0.3125 +0.9062 0.3125 0.3438 +0.9062 0.3125 0.375 +0.9062 0.3125 0.4062 +0.9062 0.3125 0.4375 +0.9062 0.3125 0.4688 +0.9062 0.3125 0.5 +0.9062 0.3125 0.5312 +0.9062 0.3125 0.5625 +0.9062 0.3125 0.5938 +0.9062 0.3125 0.625 +0.9062 0.3125 0.6562 +0.9062 0.3125 0.6875 +0.9062 0.3125 0.7188 +0.9062 0.3125 0.75 +0.9062 0.3125 0.7812 +0.9062 0.3125 0.8125 +0.9062 0.3125 0.8438 +0.9062 0.3125 0.875 +0.9062 0.3125 0.9062 +0.9062 0.3125 0.9375 +0.9062 0.3125 0.9688 +0.9062 0.3125 1 +0.9062 0.3438 0 +0.9062 0.3438 0.03125 +0.9062 0.3438 0.0625 +0.9062 0.3438 0.09375 +0.9062 0.3438 0.125 +0.9062 0.3438 0.1562 +0.9062 0.3438 0.1875 +0.9062 0.3438 0.2188 +0.9062 0.3438 0.25 +0.9062 0.3438 0.2812 +0.9062 0.3438 0.3125 +0.9062 0.3438 0.3438 +0.9062 0.3438 0.375 +0.9062 0.3438 0.4062 +0.9062 0.3438 0.4375 +0.9062 0.3438 0.4688 +0.9062 0.3438 0.5 +0.9062 0.3438 0.5312 +0.9062 0.3438 0.5625 +0.9062 0.3438 0.5938 +0.9062 0.3438 0.625 +0.9062 0.3438 0.6562 +0.9062 0.3438 0.6875 +0.9062 0.3438 0.7188 +0.9062 0.3438 0.75 +0.9062 0.3438 0.7812 +0.9062 0.3438 0.8125 +0.9062 0.3438 0.8438 +0.9062 0.3438 0.875 +0.9062 0.3438 0.9062 +0.9062 0.3438 0.9375 +0.9062 0.3438 0.9688 +0.9062 0.3438 1 +0.9062 0.375 0 +0.9062 0.375 0.03125 +0.9062 0.375 0.0625 +0.9062 0.375 0.09375 +0.9062 0.375 0.125 +0.9062 0.375 0.1562 +0.9062 0.375 0.1875 +0.9062 0.375 0.2188 +0.9062 0.375 0.25 +0.9062 0.375 0.2812 +0.9062 0.375 0.3125 +0.9062 0.375 0.3438 +0.9062 0.375 0.375 +0.9062 0.375 0.4062 +0.9062 0.375 0.4375 +0.9062 0.375 0.4688 +0.9062 0.375 0.5 +0.9062 0.375 0.5312 +0.9062 0.375 0.5625 +0.9062 0.375 0.5938 +0.9062 0.375 0.625 +0.9062 0.375 0.6562 +0.9062 0.375 0.6875 +0.9062 0.375 0.7188 +0.9062 0.375 0.75 +0.9062 0.375 0.7812 +0.9062 0.375 0.8125 +0.9062 0.375 0.8438 +0.9062 0.375 0.875 +0.9062 0.375 0.9062 +0.9062 0.375 0.9375 +0.9062 0.375 0.9688 +0.9062 0.375 1 +0.9062 0.4062 0 +0.9062 0.4062 0.03125 +0.9062 0.4062 0.0625 +0.9062 0.4062 0.09375 +0.9062 0.4062 0.125 +0.9062 0.4062 0.1562 +0.9062 0.4062 0.1875 +0.9062 0.4062 0.2188 +0.9062 0.4062 0.25 +0.9062 0.4062 0.2812 +0.9062 0.4062 0.3125 +0.9062 0.4062 0.3438 +0.9062 0.4062 0.375 +0.9062 0.4062 0.4062 +0.9062 0.4062 0.4375 +0.9062 0.4062 0.4688 +0.9062 0.4062 0.5 +0.9062 0.4062 0.5312 +0.9062 0.4062 0.5625 +0.9062 0.4062 0.5938 +0.9062 0.4062 0.625 +0.9062 0.4062 0.6562 +0.9062 0.4062 0.6875 +0.9062 0.4062 0.7188 +0.9062 0.4062 0.75 +0.9062 0.4062 0.7812 +0.9062 0.4062 0.8125 +0.9062 0.4062 0.8438 +0.9062 0.4062 0.875 +0.9062 0.4062 0.9062 +0.9062 0.4062 0.9375 +0.9062 0.4062 0.9688 +0.9062 0.4062 1 +0.9062 0.4375 0 +0.9062 0.4375 0.03125 +0.9062 0.4375 0.0625 +0.9062 0.4375 0.09375 +0.9062 0.4375 0.125 +0.9062 0.4375 0.1562 +0.9062 0.4375 0.1875 +0.9062 0.4375 0.2188 +0.9062 0.4375 0.25 +0.9062 0.4375 0.2812 +0.9062 0.4375 0.3125 +0.9062 0.4375 0.3438 +0.9062 0.4375 0.375 +0.9062 0.4375 0.4062 +0.9062 0.4375 0.4375 +0.9062 0.4375 0.4688 +0.9062 0.4375 0.5 +0.9062 0.4375 0.5312 +0.9062 0.4375 0.5625 +0.9062 0.4375 0.5938 +0.9062 0.4375 0.625 +0.9062 0.4375 0.6562 +0.9062 0.4375 0.6875 +0.9062 0.4375 0.7188 +0.9062 0.4375 0.75 +0.9062 0.4375 0.7812 +0.9062 0.4375 0.8125 +0.9062 0.4375 0.8438 +0.9062 0.4375 0.875 +0.9062 0.4375 0.9062 +0.9062 0.4375 0.9375 +0.9062 0.4375 0.9688 +0.9062 0.4375 1 +0.9062 0.4688 0 +0.9062 0.4688 0.03125 +0.9062 0.4688 0.0625 +0.9062 0.4688 0.09375 +0.9062 0.4688 0.125 +0.9062 0.4688 0.1562 +0.9062 0.4688 0.1875 +0.9062 0.4688 0.2188 +0.9062 0.4688 0.25 +0.9062 0.4688 0.2812 +0.9062 0.4688 0.3125 +0.9062 0.4688 0.3438 +0.9062 0.4688 0.375 +0.9062 0.4688 0.4062 +0.9062 0.4688 0.4375 +0.9062 0.4688 0.4688 +0.9062 0.4688 0.5 +0.9062 0.4688 0.5312 +0.9062 0.4688 0.5625 +0.9062 0.4688 0.5938 +0.9062 0.4688 0.625 +0.9062 0.4688 0.6562 +0.9062 0.4688 0.6875 +0.9062 0.4688 0.7188 +0.9062 0.4688 0.75 +0.9062 0.4688 0.7812 +0.9062 0.4688 0.8125 +0.9062 0.4688 0.8438 +0.9062 0.4688 0.875 +0.9062 0.4688 0.9062 +0.9062 0.4688 0.9375 +0.9062 0.4688 0.9688 +0.9062 0.4688 1 +0.9062 0.5 0 +0.9062 0.5 0.03125 +0.9062 0.5 0.0625 +0.9062 0.5 0.09375 +0.9062 0.5 0.125 +0.9062 0.5 0.1562 +0.9062 0.5 0.1875 +0.9062 0.5 0.2188 +0.9062 0.5 0.25 +0.9062 0.5 0.2812 +0.9062 0.5 0.3125 +0.9062 0.5 0.3438 +0.9062 0.5 0.375 +0.9062 0.5 0.4062 +0.9062 0.5 0.4375 +0.9062 0.5 0.4688 +0.9062 0.5 0.5 +0.9062 0.5 0.5312 +0.9062 0.5 0.5625 +0.9062 0.5 0.5938 +0.9062 0.5 0.625 +0.9062 0.5 0.6562 +0.9062 0.5 0.6875 +0.9062 0.5 0.7188 +0.9062 0.5 0.75 +0.9062 0.5 0.7812 +0.9062 0.5 0.8125 +0.9062 0.5 0.8438 +0.9062 0.5 0.875 +0.9062 0.5 0.9062 +0.9062 0.5 0.9375 +0.9062 0.5 0.9688 +0.9062 0.5 1 +0.9062 0.5312 0 +0.9062 0.5312 0.03125 +0.9062 0.5312 0.0625 +0.9062 0.5312 0.09375 +0.9062 0.5312 0.125 +0.9062 0.5312 0.1562 +0.9062 0.5312 0.1875 +0.9062 0.5312 0.2188 +0.9062 0.5312 0.25 +0.9062 0.5312 0.2812 +0.9062 0.5312 0.3125 +0.9062 0.5312 0.3438 +0.9062 0.5312 0.375 +0.9062 0.5312 0.4062 +0.9062 0.5312 0.4375 +0.9062 0.5312 0.4688 +0.9062 0.5312 0.5 +0.9062 0.5312 0.5312 +0.9062 0.5312 0.5625 +0.9062 0.5312 0.5938 +0.9062 0.5312 0.625 +0.9062 0.5312 0.6562 +0.9062 0.5312 0.6875 +0.9062 0.5312 0.7188 +0.9062 0.5312 0.75 +0.9062 0.5312 0.7812 +0.9062 0.5312 0.8125 +0.9062 0.5312 0.8438 +0.9062 0.5312 0.875 +0.9062 0.5312 0.9062 +0.9062 0.5312 0.9375 +0.9062 0.5312 0.9688 +0.9062 0.5312 1 +0.9062 0.5625 0 +0.9062 0.5625 0.03125 +0.9062 0.5625 0.0625 +0.9062 0.5625 0.09375 +0.9062 0.5625 0.125 +0.9062 0.5625 0.1562 +0.9062 0.5625 0.1875 +0.9062 0.5625 0.2188 +0.9062 0.5625 0.25 +0.9062 0.5625 0.2812 +0.9062 0.5625 0.3125 +0.9062 0.5625 0.3438 +0.9062 0.5625 0.375 +0.9062 0.5625 0.4062 +0.9062 0.5625 0.4375 +0.9062 0.5625 0.4688 +0.9062 0.5625 0.5 +0.9062 0.5625 0.5312 +0.9062 0.5625 0.5625 +0.9062 0.5625 0.5938 +0.9062 0.5625 0.625 +0.9062 0.5625 0.6562 +0.9062 0.5625 0.6875 +0.9062 0.5625 0.7188 +0.9062 0.5625 0.75 +0.9062 0.5625 0.7812 +0.9062 0.5625 0.8125 +0.9062 0.5625 0.8438 +0.9062 0.5625 0.875 +0.9062 0.5625 0.9062 +0.9062 0.5625 0.9375 +0.9062 0.5625 0.9688 +0.9062 0.5625 1 +0.9062 0.5938 0 +0.9062 0.5938 0.03125 +0.9062 0.5938 0.0625 +0.9062 0.5938 0.09375 +0.9062 0.5938 0.125 +0.9062 0.5938 0.1562 +0.9062 0.5938 0.1875 +0.9062 0.5938 0.2188 +0.9062 0.5938 0.25 +0.9062 0.5938 0.2812 +0.9062 0.5938 0.3125 +0.9062 0.5938 0.3438 +0.9062 0.5938 0.375 +0.9062 0.5938 0.4062 +0.9062 0.5938 0.4375 +0.9062 0.5938 0.4688 +0.9062 0.5938 0.5 +0.9062 0.5938 0.5312 +0.9062 0.5938 0.5625 +0.9062 0.5938 0.5938 +0.9062 0.5938 0.625 +0.9062 0.5938 0.6562 +0.9062 0.5938 0.6875 +0.9062 0.5938 0.7188 +0.9062 0.5938 0.75 +0.9062 0.5938 0.7812 +0.9062 0.5938 0.8125 +0.9062 0.5938 0.8438 +0.9062 0.5938 0.875 +0.9062 0.5938 0.9062 +0.9062 0.5938 0.9375 +0.9062 0.5938 0.9688 +0.9062 0.5938 1 +0.9062 0.625 0 +0.9062 0.625 0.03125 +0.9062 0.625 0.0625 +0.9062 0.625 0.09375 +0.9062 0.625 0.125 +0.9062 0.625 0.1562 +0.9062 0.625 0.1875 +0.9062 0.625 0.2188 +0.9062 0.625 0.25 +0.9062 0.625 0.2812 +0.9062 0.625 0.3125 +0.9062 0.625 0.3438 +0.9062 0.625 0.375 +0.9062 0.625 0.4062 +0.9062 0.625 0.4375 +0.9062 0.625 0.4688 +0.9062 0.625 0.5 +0.9062 0.625 0.5312 +0.9062 0.625 0.5625 +0.9062 0.625 0.5938 +0.9062 0.625 0.625 +0.9062 0.625 0.6562 +0.9062 0.625 0.6875 +0.9062 0.625 0.7188 +0.9062 0.625 0.75 +0.9062 0.625 0.7812 +0.9062 0.625 0.8125 +0.9062 0.625 0.8438 +0.9062 0.625 0.875 +0.9062 0.625 0.9062 +0.9062 0.625 0.9375 +0.9062 0.625 0.9688 +0.9062 0.625 1 +0.9062 0.6562 0 +0.9062 0.6562 0.03125 +0.9062 0.6562 0.0625 +0.9062 0.6562 0.09375 +0.9062 0.6562 0.125 +0.9062 0.6562 0.1562 +0.9062 0.6562 0.1875 +0.9062 0.6562 0.2188 +0.9062 0.6562 0.25 +0.9062 0.6562 0.2812 +0.9062 0.6562 0.3125 +0.9062 0.6562 0.3438 +0.9062 0.6562 0.375 +0.9062 0.6562 0.4062 +0.9062 0.6562 0.4375 +0.9062 0.6562 0.4688 +0.9062 0.6562 0.5 +0.9062 0.6562 0.5312 +0.9062 0.6562 0.5625 +0.9062 0.6562 0.5938 +0.9062 0.6562 0.625 +0.9062 0.6562 0.6562 +0.9062 0.6562 0.6875 +0.9062 0.6562 0.7188 +0.9062 0.6562 0.75 +0.9062 0.6562 0.7812 +0.9062 0.6562 0.8125 +0.9062 0.6562 0.8438 +0.9062 0.6562 0.875 +0.9062 0.6562 0.9062 +0.9062 0.6562 0.9375 +0.9062 0.6562 0.9688 +0.9062 0.6562 1 +0.9062 0.6875 0 +0.9062 0.6875 0.03125 +0.9062 0.6875 0.0625 +0.9062 0.6875 0.09375 +0.9062 0.6875 0.125 +0.9062 0.6875 0.1562 +0.9062 0.6875 0.1875 +0.9062 0.6875 0.2188 +0.9062 0.6875 0.25 +0.9062 0.6875 0.2812 +0.9062 0.6875 0.3125 +0.9062 0.6875 0.3438 +0.9062 0.6875 0.375 +0.9062 0.6875 0.4062 +0.9062 0.6875 0.4375 +0.9062 0.6875 0.4688 +0.9062 0.6875 0.5 +0.9062 0.6875 0.5312 +0.9062 0.6875 0.5625 +0.9062 0.6875 0.5938 +0.9062 0.6875 0.625 +0.9062 0.6875 0.6562 +0.9062 0.6875 0.6875 +0.9062 0.6875 0.7188 +0.9062 0.6875 0.75 +0.9062 0.6875 0.7812 +0.9062 0.6875 0.8125 +0.9062 0.6875 0.8438 +0.9062 0.6875 0.875 +0.9062 0.6875 0.9062 +0.9062 0.6875 0.9375 +0.9062 0.6875 0.9688 +0.9062 0.6875 1 +0.9062 0.7188 0 +0.9062 0.7188 0.03125 +0.9062 0.7188 0.0625 +0.9062 0.7188 0.09375 +0.9062 0.7188 0.125 +0.9062 0.7188 0.1562 +0.9062 0.7188 0.1875 +0.9062 0.7188 0.2188 +0.9062 0.7188 0.25 +0.9062 0.7188 0.2812 +0.9062 0.7188 0.3125 +0.9062 0.7188 0.3438 +0.9062 0.7188 0.375 +0.9062 0.7188 0.4062 +0.9062 0.7188 0.4375 +0.9062 0.7188 0.4688 +0.9062 0.7188 0.5 +0.9062 0.7188 0.5312 +0.9062 0.7188 0.5625 +0.9062 0.7188 0.5938 +0.9062 0.7188 0.625 +0.9062 0.7188 0.6562 +0.9062 0.7188 0.6875 +0.9062 0.7188 0.7188 +0.9062 0.7188 0.75 +0.9062 0.7188 0.7812 +0.9062 0.7188 0.8125 +0.9062 0.7188 0.8438 +0.9062 0.7188 0.875 +0.9062 0.7188 0.9062 +0.9062 0.7188 0.9375 +0.9062 0.7188 0.9688 +0.9062 0.7188 1 +0.9062 0.75 0 +0.9062 0.75 0.03125 +0.9062 0.75 0.0625 +0.9062 0.75 0.09375 +0.9062 0.75 0.125 +0.9062 0.75 0.1562 +0.9062 0.75 0.1875 +0.9062 0.75 0.2188 +0.9062 0.75 0.25 +0.9062 0.75 0.2812 +0.9062 0.75 0.3125 +0.9062 0.75 0.3438 +0.9062 0.75 0.375 +0.9062 0.75 0.4062 +0.9062 0.75 0.4375 +0.9062 0.75 0.4688 +0.9062 0.75 0.5 +0.9062 0.75 0.5312 +0.9062 0.75 0.5625 +0.9062 0.75 0.5938 +0.9062 0.75 0.625 +0.9062 0.75 0.6562 +0.9062 0.75 0.6875 +0.9062 0.75 0.7188 +0.9062 0.75 0.75 +0.9062 0.75 0.7812 +0.9062 0.75 0.8125 +0.9062 0.75 0.8438 +0.9062 0.75 0.875 +0.9062 0.75 0.9062 +0.9062 0.75 0.9375 +0.9062 0.75 0.9688 +0.9062 0.75 1 +0.9062 0.7812 0 +0.9062 0.7812 0.03125 +0.9062 0.7812 0.0625 +0.9062 0.7812 0.09375 +0.9062 0.7812 0.125 +0.9062 0.7812 0.1562 +0.9062 0.7812 0.1875 +0.9062 0.7812 0.2188 +0.9062 0.7812 0.25 +0.9062 0.7812 0.2812 +0.9062 0.7812 0.3125 +0.9062 0.7812 0.3438 +0.9062 0.7812 0.375 +0.9062 0.7812 0.4062 +0.9062 0.7812 0.4375 +0.9062 0.7812 0.4688 +0.9062 0.7812 0.5 +0.9062 0.7812 0.5312 +0.9062 0.7812 0.5625 +0.9062 0.7812 0.5938 +0.9062 0.7812 0.625 +0.9062 0.7812 0.6562 +0.9062 0.7812 0.6875 +0.9062 0.7812 0.7188 +0.9062 0.7812 0.75 +0.9062 0.7812 0.7812 +0.9062 0.7812 0.8125 +0.9062 0.7812 0.8438 +0.9062 0.7812 0.875 +0.9062 0.7812 0.9062 +0.9062 0.7812 0.9375 +0.9062 0.7812 0.9688 +0.9062 0.7812 1 +0.9062 0.8125 0 +0.9062 0.8125 0.03125 +0.9062 0.8125 0.0625 +0.9062 0.8125 0.09375 +0.9062 0.8125 0.125 +0.9062 0.8125 0.1562 +0.9062 0.8125 0.1875 +0.9062 0.8125 0.2188 +0.9062 0.8125 0.25 +0.9062 0.8125 0.2812 +0.9062 0.8125 0.3125 +0.9062 0.8125 0.3438 +0.9062 0.8125 0.375 +0.9062 0.8125 0.4062 +0.9062 0.8125 0.4375 +0.9062 0.8125 0.4688 +0.9062 0.8125 0.5 +0.9062 0.8125 0.5312 +0.9062 0.8125 0.5625 +0.9062 0.8125 0.5938 +0.9062 0.8125 0.625 +0.9062 0.8125 0.6562 +0.9062 0.8125 0.6875 +0.9062 0.8125 0.7188 +0.9062 0.8125 0.75 +0.9062 0.8125 0.7812 +0.9062 0.8125 0.8125 +0.9062 0.8125 0.8438 +0.9062 0.8125 0.875 +0.9062 0.8125 0.9062 +0.9062 0.8125 0.9375 +0.9062 0.8125 0.9688 +0.9062 0.8125 1 +0.9062 0.8438 0 +0.9062 0.8438 0.03125 +0.9062 0.8438 0.0625 +0.9062 0.8438 0.09375 +0.9062 0.8438 0.125 +0.9062 0.8438 0.1562 +0.9062 0.8438 0.1875 +0.9062 0.8438 0.2188 +0.9062 0.8438 0.25 +0.9062 0.8438 0.2812 +0.9062 0.8438 0.3125 +0.9062 0.8438 0.3438 +0.9062 0.8438 0.375 +0.9062 0.8438 0.4062 +0.9062 0.8438 0.4375 +0.9062 0.8438 0.4688 +0.9062 0.8438 0.5 +0.9062 0.8438 0.5312 +0.9062 0.8438 0.5625 +0.9062 0.8438 0.5938 +0.9062 0.8438 0.625 +0.9062 0.8438 0.6562 +0.9062 0.8438 0.6875 +0.9062 0.8438 0.7188 +0.9062 0.8438 0.75 +0.9062 0.8438 0.7812 +0.9062 0.8438 0.8125 +0.9062 0.8438 0.8438 +0.9062 0.8438 0.875 +0.9062 0.8438 0.9062 +0.9062 0.8438 0.9375 +0.9062 0.8438 0.9688 +0.9062 0.8438 1 +0.9062 0.875 0 +0.9062 0.875 0.03125 +0.9062 0.875 0.0625 +0.9062 0.875 0.09375 +0.9062 0.875 0.125 +0.9062 0.875 0.1562 +0.9062 0.875 0.1875 +0.9062 0.875 0.2188 +0.9062 0.875 0.25 +0.9062 0.875 0.2812 +0.9062 0.875 0.3125 +0.9062 0.875 0.3438 +0.9062 0.875 0.375 +0.9062 0.875 0.4062 +0.9062 0.875 0.4375 +0.9062 0.875 0.4688 +0.9062 0.875 0.5 +0.9062 0.875 0.5312 +0.9062 0.875 0.5625 +0.9062 0.875 0.5938 +0.9062 0.875 0.625 +0.9062 0.875 0.6562 +0.9062 0.875 0.6875 +0.9062 0.875 0.7188 +0.9062 0.875 0.75 +0.9062 0.875 0.7812 +0.9062 0.875 0.8125 +0.9062 0.875 0.8438 +0.9062 0.875 0.875 +0.9062 0.875 0.9062 +0.9062 0.875 0.9375 +0.9062 0.875 0.9688 +0.9062 0.875 1 +0.9062 0.9062 0 +0.9062 0.9062 0.03125 +0.9062 0.9062 0.0625 +0.9062 0.9062 0.09375 +0.9062 0.9062 0.125 +0.9062 0.9062 0.1562 +0.9062 0.9062 0.1875 +0.9062 0.9062 0.2188 +0.9062 0.9062 0.25 +0.9062 0.9062 0.2812 +0.9062 0.9062 0.3125 +0.9062 0.9062 0.3438 +0.9062 0.9062 0.375 +0.9062 0.9062 0.4062 +0.9062 0.9062 0.4375 +0.9062 0.9062 0.4688 +0.9062 0.9062 0.5 +0.9062 0.9062 0.5312 +0.9062 0.9062 0.5625 +0.9062 0.9062 0.5938 +0.9062 0.9062 0.625 +0.9062 0.9062 0.6562 +0.9062 0.9062 0.6875 +0.9062 0.9062 0.7188 +0.9062 0.9062 0.75 +0.9062 0.9062 0.7812 +0.9062 0.9062 0.8125 +0.9062 0.9062 0.8438 +0.9062 0.9062 0.875 +0.9062 0.9062 0.9062 +0.9062 0.9062 0.9375 +0.9062 0.9062 0.9688 +0.9062 0.9062 1 +0.9062 0.9375 0 +0.9062 0.9375 0.03125 +0.9062 0.9375 0.0625 +0.9062 0.9375 0.09375 +0.9062 0.9375 0.125 +0.9062 0.9375 0.1562 +0.9062 0.9375 0.1875 +0.9062 0.9375 0.2188 +0.9062 0.9375 0.25 +0.9062 0.9375 0.2812 +0.9062 0.9375 0.3125 +0.9062 0.9375 0.3438 +0.9062 0.9375 0.375 +0.9062 0.9375 0.4062 +0.9062 0.9375 0.4375 +0.9062 0.9375 0.4688 +0.9062 0.9375 0.5 +0.9062 0.9375 0.5312 +0.9062 0.9375 0.5625 +0.9062 0.9375 0.5938 +0.9062 0.9375 0.625 +0.9062 0.9375 0.6562 +0.9062 0.9375 0.6875 +0.9062 0.9375 0.7188 +0.9062 0.9375 0.75 +0.9062 0.9375 0.7812 +0.9062 0.9375 0.8125 +0.9062 0.9375 0.8438 +0.9062 0.9375 0.875 +0.9062 0.9375 0.9062 +0.9062 0.9375 0.9375 +0.9062 0.9375 0.9688 +0.9062 0.9375 1 +0.9062 0.9688 0 +0.9062 0.9688 0.03125 +0.9062 0.9688 0.0625 +0.9062 0.9688 0.09375 +0.9062 0.9688 0.125 +0.9062 0.9688 0.1562 +0.9062 0.9688 0.1875 +0.9062 0.9688 0.2188 +0.9062 0.9688 0.25 +0.9062 0.9688 0.2812 +0.9062 0.9688 0.3125 +0.9062 0.9688 0.3438 +0.9062 0.9688 0.375 +0.9062 0.9688 0.4062 +0.9062 0.9688 0.4375 +0.9062 0.9688 0.4688 +0.9062 0.9688 0.5 +0.9062 0.9688 0.5312 +0.9062 0.9688 0.5625 +0.9062 0.9688 0.5938 +0.9062 0.9688 0.625 +0.9062 0.9688 0.6562 +0.9062 0.9688 0.6875 +0.9062 0.9688 0.7188 +0.9062 0.9688 0.75 +0.9062 0.9688 0.7812 +0.9062 0.9688 0.8125 +0.9062 0.9688 0.8438 +0.9062 0.9688 0.875 +0.9062 0.9688 0.9062 +0.9062 0.9688 0.9375 +0.9062 0.9688 0.9688 +0.9062 0.9688 1 +0.9062 1 0 +0.9062 1 0.03125 +0.9062 1 0.0625 +0.9062 1 0.09375 +0.9062 1 0.125 +0.9062 1 0.1562 +0.9062 1 0.1875 +0.9062 1 0.2188 +0.9062 1 0.25 +0.9062 1 0.2812 +0.9062 1 0.3125 +0.9062 1 0.3438 +0.9062 1 0.375 +0.9062 1 0.4062 +0.9062 1 0.4375 +0.9062 1 0.4688 +0.9062 1 0.5 +0.9062 1 0.5312 +0.9062 1 0.5625 +0.9062 1 0.5938 +0.9062 1 0.625 +0.9062 1 0.6562 +0.9062 1 0.6875 +0.9062 1 0.7188 +0.9062 1 0.75 +0.9062 1 0.7812 +0.9062 1 0.8125 +0.9062 1 0.8438 +0.9062 1 0.875 +0.9062 1 0.9062 +0.9062 1 0.9375 +0.9062 1 0.9688 +0.9062 1 1 +0.9375 0 0 +0.9375 0 0.03125 +0.9375 0 0.0625 +0.9375 0 0.09375 +0.9375 0 0.125 +0.9375 0 0.1562 +0.9375 0 0.1875 +0.9375 0 0.2188 +0.9375 0 0.25 +0.9375 0 0.2812 +0.9375 0 0.3125 +0.9375 0 0.3438 +0.9375 0 0.375 +0.9375 0 0.4062 +0.9375 0 0.4375 +0.9375 0 0.4688 +0.9375 0 0.5 +0.9375 0 0.5312 +0.9375 0 0.5625 +0.9375 0 0.5938 +0.9375 0 0.625 +0.9375 0 0.6562 +0.9375 0 0.6875 +0.9375 0 0.7188 +0.9375 0 0.75 +0.9375 0 0.7812 +0.9375 0 0.8125 +0.9375 0 0.8438 +0.9375 0 0.875 +0.9375 0 0.9062 +0.9375 0 0.9375 +0.9375 0 0.9688 +0.9375 0 1 +0.9375 0.03125 0 +0.9375 0.03125 0.03125 +0.9375 0.03125 0.0625 +0.9375 0.03125 0.09375 +0.9375 0.03125 0.125 +0.9375 0.03125 0.1562 +0.9375 0.03125 0.1875 +0.9375 0.03125 0.2188 +0.9375 0.03125 0.25 +0.9375 0.03125 0.2812 +0.9375 0.03125 0.3125 +0.9375 0.03125 0.3438 +0.9375 0.03125 0.375 +0.9375 0.03125 0.4062 +0.9375 0.03125 0.4375 +0.9375 0.03125 0.4688 +0.9375 0.03125 0.5 +0.9375 0.03125 0.5312 +0.9375 0.03125 0.5625 +0.9375 0.03125 0.5938 +0.9375 0.03125 0.625 +0.9375 0.03125 0.6562 +0.9375 0.03125 0.6875 +0.9375 0.03125 0.7188 +0.9375 0.03125 0.75 +0.9375 0.03125 0.7812 +0.9375 0.03125 0.8125 +0.9375 0.03125 0.8438 +0.9375 0.03125 0.875 +0.9375 0.03125 0.9062 +0.9375 0.03125 0.9375 +0.9375 0.03125 0.9688 +0.9375 0.03125 1 +0.9375 0.0625 0 +0.9375 0.0625 0.03125 +0.9375 0.0625 0.0625 +0.9375 0.0625 0.09375 +0.9375 0.0625 0.125 +0.9375 0.0625 0.1562 +0.9375 0.0625 0.1875 +0.9375 0.0625 0.2188 +0.9375 0.0625 0.25 +0.9375 0.0625 0.2812 +0.9375 0.0625 0.3125 +0.9375 0.0625 0.3438 +0.9375 0.0625 0.375 +0.9375 0.0625 0.4062 +0.9375 0.0625 0.4375 +0.9375 0.0625 0.4688 +0.9375 0.0625 0.5 +0.9375 0.0625 0.5312 +0.9375 0.0625 0.5625 +0.9375 0.0625 0.5938 +0.9375 0.0625 0.625 +0.9375 0.0625 0.6562 +0.9375 0.0625 0.6875 +0.9375 0.0625 0.7188 +0.9375 0.0625 0.75 +0.9375 0.0625 0.7812 +0.9375 0.0625 0.8125 +0.9375 0.0625 0.8438 +0.9375 0.0625 0.875 +0.9375 0.0625 0.9062 +0.9375 0.0625 0.9375 +0.9375 0.0625 0.9688 +0.9375 0.0625 1 +0.9375 0.09375 0 +0.9375 0.09375 0.03125 +0.9375 0.09375 0.0625 +0.9375 0.09375 0.09375 +0.9375 0.09375 0.125 +0.9375 0.09375 0.1562 +0.9375 0.09375 0.1875 +0.9375 0.09375 0.2188 +0.9375 0.09375 0.25 +0.9375 0.09375 0.2812 +0.9375 0.09375 0.3125 +0.9375 0.09375 0.3438 +0.9375 0.09375 0.375 +0.9375 0.09375 0.4062 +0.9375 0.09375 0.4375 +0.9375 0.09375 0.4688 +0.9375 0.09375 0.5 +0.9375 0.09375 0.5312 +0.9375 0.09375 0.5625 +0.9375 0.09375 0.5938 +0.9375 0.09375 0.625 +0.9375 0.09375 0.6562 +0.9375 0.09375 0.6875 +0.9375 0.09375 0.7188 +0.9375 0.09375 0.75 +0.9375 0.09375 0.7812 +0.9375 0.09375 0.8125 +0.9375 0.09375 0.8438 +0.9375 0.09375 0.875 +0.9375 0.09375 0.9062 +0.9375 0.09375 0.9375 +0.9375 0.09375 0.9688 +0.9375 0.09375 1 +0.9375 0.125 0 +0.9375 0.125 0.03125 +0.9375 0.125 0.0625 +0.9375 0.125 0.09375 +0.9375 0.125 0.125 +0.9375 0.125 0.1562 +0.9375 0.125 0.1875 +0.9375 0.125 0.2188 +0.9375 0.125 0.25 +0.9375 0.125 0.2812 +0.9375 0.125 0.3125 +0.9375 0.125 0.3438 +0.9375 0.125 0.375 +0.9375 0.125 0.4062 +0.9375 0.125 0.4375 +0.9375 0.125 0.4688 +0.9375 0.125 0.5 +0.9375 0.125 0.5312 +0.9375 0.125 0.5625 +0.9375 0.125 0.5938 +0.9375 0.125 0.625 +0.9375 0.125 0.6562 +0.9375 0.125 0.6875 +0.9375 0.125 0.7188 +0.9375 0.125 0.75 +0.9375 0.125 0.7812 +0.9375 0.125 0.8125 +0.9375 0.125 0.8438 +0.9375 0.125 0.875 +0.9375 0.125 0.9062 +0.9375 0.125 0.9375 +0.9375 0.125 0.9688 +0.9375 0.125 1 +0.9375 0.1562 0 +0.9375 0.1562 0.03125 +0.9375 0.1562 0.0625 +0.9375 0.1562 0.09375 +0.9375 0.1562 0.125 +0.9375 0.1562 0.1562 +0.9375 0.1562 0.1875 +0.9375 0.1562 0.2188 +0.9375 0.1562 0.25 +0.9375 0.1562 0.2812 +0.9375 0.1562 0.3125 +0.9375 0.1562 0.3438 +0.9375 0.1562 0.375 +0.9375 0.1562 0.4062 +0.9375 0.1562 0.4375 +0.9375 0.1562 0.4688 +0.9375 0.1562 0.5 +0.9375 0.1562 0.5312 +0.9375 0.1562 0.5625 +0.9375 0.1562 0.5938 +0.9375 0.1562 0.625 +0.9375 0.1562 0.6562 +0.9375 0.1562 0.6875 +0.9375 0.1562 0.7188 +0.9375 0.1562 0.75 +0.9375 0.1562 0.7812 +0.9375 0.1562 0.8125 +0.9375 0.1562 0.8438 +0.9375 0.1562 0.875 +0.9375 0.1562 0.9062 +0.9375 0.1562 0.9375 +0.9375 0.1562 0.9688 +0.9375 0.1562 1 +0.9375 0.1875 0 +0.9375 0.1875 0.03125 +0.9375 0.1875 0.0625 +0.9375 0.1875 0.09375 +0.9375 0.1875 0.125 +0.9375 0.1875 0.1562 +0.9375 0.1875 0.1875 +0.9375 0.1875 0.2188 +0.9375 0.1875 0.25 +0.9375 0.1875 0.2812 +0.9375 0.1875 0.3125 +0.9375 0.1875 0.3438 +0.9375 0.1875 0.375 +0.9375 0.1875 0.4062 +0.9375 0.1875 0.4375 +0.9375 0.1875 0.4688 +0.9375 0.1875 0.5 +0.9375 0.1875 0.5312 +0.9375 0.1875 0.5625 +0.9375 0.1875 0.5938 +0.9375 0.1875 0.625 +0.9375 0.1875 0.6562 +0.9375 0.1875 0.6875 +0.9375 0.1875 0.7188 +0.9375 0.1875 0.75 +0.9375 0.1875 0.7812 +0.9375 0.1875 0.8125 +0.9375 0.1875 0.8438 +0.9375 0.1875 0.875 +0.9375 0.1875 0.9062 +0.9375 0.1875 0.9375 +0.9375 0.1875 0.9688 +0.9375 0.1875 1 +0.9375 0.2188 0 +0.9375 0.2188 0.03125 +0.9375 0.2188 0.0625 +0.9375 0.2188 0.09375 +0.9375 0.2188 0.125 +0.9375 0.2188 0.1562 +0.9375 0.2188 0.1875 +0.9375 0.2188 0.2188 +0.9375 0.2188 0.25 +0.9375 0.2188 0.2812 +0.9375 0.2188 0.3125 +0.9375 0.2188 0.3438 +0.9375 0.2188 0.375 +0.9375 0.2188 0.4062 +0.9375 0.2188 0.4375 +0.9375 0.2188 0.4688 +0.9375 0.2188 0.5 +0.9375 0.2188 0.5312 +0.9375 0.2188 0.5625 +0.9375 0.2188 0.5938 +0.9375 0.2188 0.625 +0.9375 0.2188 0.6562 +0.9375 0.2188 0.6875 +0.9375 0.2188 0.7188 +0.9375 0.2188 0.75 +0.9375 0.2188 0.7812 +0.9375 0.2188 0.8125 +0.9375 0.2188 0.8438 +0.9375 0.2188 0.875 +0.9375 0.2188 0.9062 +0.9375 0.2188 0.9375 +0.9375 0.2188 0.9688 +0.9375 0.2188 1 +0.9375 0.25 0 +0.9375 0.25 0.03125 +0.9375 0.25 0.0625 +0.9375 0.25 0.09375 +0.9375 0.25 0.125 +0.9375 0.25 0.1562 +0.9375 0.25 0.1875 +0.9375 0.25 0.2188 +0.9375 0.25 0.25 +0.9375 0.25 0.2812 +0.9375 0.25 0.3125 +0.9375 0.25 0.3438 +0.9375 0.25 0.375 +0.9375 0.25 0.4062 +0.9375 0.25 0.4375 +0.9375 0.25 0.4688 +0.9375 0.25 0.5 +0.9375 0.25 0.5312 +0.9375 0.25 0.5625 +0.9375 0.25 0.5938 +0.9375 0.25 0.625 +0.9375 0.25 0.6562 +0.9375 0.25 0.6875 +0.9375 0.25 0.7188 +0.9375 0.25 0.75 +0.9375 0.25 0.7812 +0.9375 0.25 0.8125 +0.9375 0.25 0.8438 +0.9375 0.25 0.875 +0.9375 0.25 0.9062 +0.9375 0.25 0.9375 +0.9375 0.25 0.9688 +0.9375 0.25 1 +0.9375 0.2812 0 +0.9375 0.2812 0.03125 +0.9375 0.2812 0.0625 +0.9375 0.2812 0.09375 +0.9375 0.2812 0.125 +0.9375 0.2812 0.1562 +0.9375 0.2812 0.1875 +0.9375 0.2812 0.2188 +0.9375 0.2812 0.25 +0.9375 0.2812 0.2812 +0.9375 0.2812 0.3125 +0.9375 0.2812 0.3438 +0.9375 0.2812 0.375 +0.9375 0.2812 0.4062 +0.9375 0.2812 0.4375 +0.9375 0.2812 0.4688 +0.9375 0.2812 0.5 +0.9375 0.2812 0.5312 +0.9375 0.2812 0.5625 +0.9375 0.2812 0.5938 +0.9375 0.2812 0.625 +0.9375 0.2812 0.6562 +0.9375 0.2812 0.6875 +0.9375 0.2812 0.7188 +0.9375 0.2812 0.75 +0.9375 0.2812 0.7812 +0.9375 0.2812 0.8125 +0.9375 0.2812 0.8438 +0.9375 0.2812 0.875 +0.9375 0.2812 0.9062 +0.9375 0.2812 0.9375 +0.9375 0.2812 0.9688 +0.9375 0.2812 1 +0.9375 0.3125 0 +0.9375 0.3125 0.03125 +0.9375 0.3125 0.0625 +0.9375 0.3125 0.09375 +0.9375 0.3125 0.125 +0.9375 0.3125 0.1562 +0.9375 0.3125 0.1875 +0.9375 0.3125 0.2188 +0.9375 0.3125 0.25 +0.9375 0.3125 0.2812 +0.9375 0.3125 0.3125 +0.9375 0.3125 0.3438 +0.9375 0.3125 0.375 +0.9375 0.3125 0.4062 +0.9375 0.3125 0.4375 +0.9375 0.3125 0.4688 +0.9375 0.3125 0.5 +0.9375 0.3125 0.5312 +0.9375 0.3125 0.5625 +0.9375 0.3125 0.5938 +0.9375 0.3125 0.625 +0.9375 0.3125 0.6562 +0.9375 0.3125 0.6875 +0.9375 0.3125 0.7188 +0.9375 0.3125 0.75 +0.9375 0.3125 0.7812 +0.9375 0.3125 0.8125 +0.9375 0.3125 0.8438 +0.9375 0.3125 0.875 +0.9375 0.3125 0.9062 +0.9375 0.3125 0.9375 +0.9375 0.3125 0.9688 +0.9375 0.3125 1 +0.9375 0.3438 0 +0.9375 0.3438 0.03125 +0.9375 0.3438 0.0625 +0.9375 0.3438 0.09375 +0.9375 0.3438 0.125 +0.9375 0.3438 0.1562 +0.9375 0.3438 0.1875 +0.9375 0.3438 0.2188 +0.9375 0.3438 0.25 +0.9375 0.3438 0.2812 +0.9375 0.3438 0.3125 +0.9375 0.3438 0.3438 +0.9375 0.3438 0.375 +0.9375 0.3438 0.4062 +0.9375 0.3438 0.4375 +0.9375 0.3438 0.4688 +0.9375 0.3438 0.5 +0.9375 0.3438 0.5312 +0.9375 0.3438 0.5625 +0.9375 0.3438 0.5938 +0.9375 0.3438 0.625 +0.9375 0.3438 0.6562 +0.9375 0.3438 0.6875 +0.9375 0.3438 0.7188 +0.9375 0.3438 0.75 +0.9375 0.3438 0.7812 +0.9375 0.3438 0.8125 +0.9375 0.3438 0.8438 +0.9375 0.3438 0.875 +0.9375 0.3438 0.9062 +0.9375 0.3438 0.9375 +0.9375 0.3438 0.9688 +0.9375 0.3438 1 +0.9375 0.375 0 +0.9375 0.375 0.03125 +0.9375 0.375 0.0625 +0.9375 0.375 0.09375 +0.9375 0.375 0.125 +0.9375 0.375 0.1562 +0.9375 0.375 0.1875 +0.9375 0.375 0.2188 +0.9375 0.375 0.25 +0.9375 0.375 0.2812 +0.9375 0.375 0.3125 +0.9375 0.375 0.3438 +0.9375 0.375 0.375 +0.9375 0.375 0.4062 +0.9375 0.375 0.4375 +0.9375 0.375 0.4688 +0.9375 0.375 0.5 +0.9375 0.375 0.5312 +0.9375 0.375 0.5625 +0.9375 0.375 0.5938 +0.9375 0.375 0.625 +0.9375 0.375 0.6562 +0.9375 0.375 0.6875 +0.9375 0.375 0.7188 +0.9375 0.375 0.75 +0.9375 0.375 0.7812 +0.9375 0.375 0.8125 +0.9375 0.375 0.8438 +0.9375 0.375 0.875 +0.9375 0.375 0.9062 +0.9375 0.375 0.9375 +0.9375 0.375 0.9688 +0.9375 0.375 1 +0.9375 0.4062 0 +0.9375 0.4062 0.03125 +0.9375 0.4062 0.0625 +0.9375 0.4062 0.09375 +0.9375 0.4062 0.125 +0.9375 0.4062 0.1562 +0.9375 0.4062 0.1875 +0.9375 0.4062 0.2188 +0.9375 0.4062 0.25 +0.9375 0.4062 0.2812 +0.9375 0.4062 0.3125 +0.9375 0.4062 0.3438 +0.9375 0.4062 0.375 +0.9375 0.4062 0.4062 +0.9375 0.4062 0.4375 +0.9375 0.4062 0.4688 +0.9375 0.4062 0.5 +0.9375 0.4062 0.5312 +0.9375 0.4062 0.5625 +0.9375 0.4062 0.5938 +0.9375 0.4062 0.625 +0.9375 0.4062 0.6562 +0.9375 0.4062 0.6875 +0.9375 0.4062 0.7188 +0.9375 0.4062 0.75 +0.9375 0.4062 0.7812 +0.9375 0.4062 0.8125 +0.9375 0.4062 0.8438 +0.9375 0.4062 0.875 +0.9375 0.4062 0.9062 +0.9375 0.4062 0.9375 +0.9375 0.4062 0.9688 +0.9375 0.4062 1 +0.9375 0.4375 0 +0.9375 0.4375 0.03125 +0.9375 0.4375 0.0625 +0.9375 0.4375 0.09375 +0.9375 0.4375 0.125 +0.9375 0.4375 0.1562 +0.9375 0.4375 0.1875 +0.9375 0.4375 0.2188 +0.9375 0.4375 0.25 +0.9375 0.4375 0.2812 +0.9375 0.4375 0.3125 +0.9375 0.4375 0.3438 +0.9375 0.4375 0.375 +0.9375 0.4375 0.4062 +0.9375 0.4375 0.4375 +0.9375 0.4375 0.4688 +0.9375 0.4375 0.5 +0.9375 0.4375 0.5312 +0.9375 0.4375 0.5625 +0.9375 0.4375 0.5938 +0.9375 0.4375 0.625 +0.9375 0.4375 0.6562 +0.9375 0.4375 0.6875 +0.9375 0.4375 0.7188 +0.9375 0.4375 0.75 +0.9375 0.4375 0.7812 +0.9375 0.4375 0.8125 +0.9375 0.4375 0.8438 +0.9375 0.4375 0.875 +0.9375 0.4375 0.9062 +0.9375 0.4375 0.9375 +0.9375 0.4375 0.9688 +0.9375 0.4375 1 +0.9375 0.4688 0 +0.9375 0.4688 0.03125 +0.9375 0.4688 0.0625 +0.9375 0.4688 0.09375 +0.9375 0.4688 0.125 +0.9375 0.4688 0.1562 +0.9375 0.4688 0.1875 +0.9375 0.4688 0.2188 +0.9375 0.4688 0.25 +0.9375 0.4688 0.2812 +0.9375 0.4688 0.3125 +0.9375 0.4688 0.3438 +0.9375 0.4688 0.375 +0.9375 0.4688 0.4062 +0.9375 0.4688 0.4375 +0.9375 0.4688 0.4688 +0.9375 0.4688 0.5 +0.9375 0.4688 0.5312 +0.9375 0.4688 0.5625 +0.9375 0.4688 0.5938 +0.9375 0.4688 0.625 +0.9375 0.4688 0.6562 +0.9375 0.4688 0.6875 +0.9375 0.4688 0.7188 +0.9375 0.4688 0.75 +0.9375 0.4688 0.7812 +0.9375 0.4688 0.8125 +0.9375 0.4688 0.8438 +0.9375 0.4688 0.875 +0.9375 0.4688 0.9062 +0.9375 0.4688 0.9375 +0.9375 0.4688 0.9688 +0.9375 0.4688 1 +0.9375 0.5 0 +0.9375 0.5 0.03125 +0.9375 0.5 0.0625 +0.9375 0.5 0.09375 +0.9375 0.5 0.125 +0.9375 0.5 0.1562 +0.9375 0.5 0.1875 +0.9375 0.5 0.2188 +0.9375 0.5 0.25 +0.9375 0.5 0.2812 +0.9375 0.5 0.3125 +0.9375 0.5 0.3438 +0.9375 0.5 0.375 +0.9375 0.5 0.4062 +0.9375 0.5 0.4375 +0.9375 0.5 0.4688 +0.9375 0.5 0.5 +0.9375 0.5 0.5312 +0.9375 0.5 0.5625 +0.9375 0.5 0.5938 +0.9375 0.5 0.625 +0.9375 0.5 0.6562 +0.9375 0.5 0.6875 +0.9375 0.5 0.7188 +0.9375 0.5 0.75 +0.9375 0.5 0.7812 +0.9375 0.5 0.8125 +0.9375 0.5 0.8438 +0.9375 0.5 0.875 +0.9375 0.5 0.9062 +0.9375 0.5 0.9375 +0.9375 0.5 0.9688 +0.9375 0.5 1 +0.9375 0.5312 0 +0.9375 0.5312 0.03125 +0.9375 0.5312 0.0625 +0.9375 0.5312 0.09375 +0.9375 0.5312 0.125 +0.9375 0.5312 0.1562 +0.9375 0.5312 0.1875 +0.9375 0.5312 0.2188 +0.9375 0.5312 0.25 +0.9375 0.5312 0.2812 +0.9375 0.5312 0.3125 +0.9375 0.5312 0.3438 +0.9375 0.5312 0.375 +0.9375 0.5312 0.4062 +0.9375 0.5312 0.4375 +0.9375 0.5312 0.4688 +0.9375 0.5312 0.5 +0.9375 0.5312 0.5312 +0.9375 0.5312 0.5625 +0.9375 0.5312 0.5938 +0.9375 0.5312 0.625 +0.9375 0.5312 0.6562 +0.9375 0.5312 0.6875 +0.9375 0.5312 0.7188 +0.9375 0.5312 0.75 +0.9375 0.5312 0.7812 +0.9375 0.5312 0.8125 +0.9375 0.5312 0.8438 +0.9375 0.5312 0.875 +0.9375 0.5312 0.9062 +0.9375 0.5312 0.9375 +0.9375 0.5312 0.9688 +0.9375 0.5312 1 +0.9375 0.5625 0 +0.9375 0.5625 0.03125 +0.9375 0.5625 0.0625 +0.9375 0.5625 0.09375 +0.9375 0.5625 0.125 +0.9375 0.5625 0.1562 +0.9375 0.5625 0.1875 +0.9375 0.5625 0.2188 +0.9375 0.5625 0.25 +0.9375 0.5625 0.2812 +0.9375 0.5625 0.3125 +0.9375 0.5625 0.3438 +0.9375 0.5625 0.375 +0.9375 0.5625 0.4062 +0.9375 0.5625 0.4375 +0.9375 0.5625 0.4688 +0.9375 0.5625 0.5 +0.9375 0.5625 0.5312 +0.9375 0.5625 0.5625 +0.9375 0.5625 0.5938 +0.9375 0.5625 0.625 +0.9375 0.5625 0.6562 +0.9375 0.5625 0.6875 +0.9375 0.5625 0.7188 +0.9375 0.5625 0.75 +0.9375 0.5625 0.7812 +0.9375 0.5625 0.8125 +0.9375 0.5625 0.8438 +0.9375 0.5625 0.875 +0.9375 0.5625 0.9062 +0.9375 0.5625 0.9375 +0.9375 0.5625 0.9688 +0.9375 0.5625 1 +0.9375 0.5938 0 +0.9375 0.5938 0.03125 +0.9375 0.5938 0.0625 +0.9375 0.5938 0.09375 +0.9375 0.5938 0.125 +0.9375 0.5938 0.1562 +0.9375 0.5938 0.1875 +0.9375 0.5938 0.2188 +0.9375 0.5938 0.25 +0.9375 0.5938 0.2812 +0.9375 0.5938 0.3125 +0.9375 0.5938 0.3438 +0.9375 0.5938 0.375 +0.9375 0.5938 0.4062 +0.9375 0.5938 0.4375 +0.9375 0.5938 0.4688 +0.9375 0.5938 0.5 +0.9375 0.5938 0.5312 +0.9375 0.5938 0.5625 +0.9375 0.5938 0.5938 +0.9375 0.5938 0.625 +0.9375 0.5938 0.6562 +0.9375 0.5938 0.6875 +0.9375 0.5938 0.7188 +0.9375 0.5938 0.75 +0.9375 0.5938 0.7812 +0.9375 0.5938 0.8125 +0.9375 0.5938 0.8438 +0.9375 0.5938 0.875 +0.9375 0.5938 0.9062 +0.9375 0.5938 0.9375 +0.9375 0.5938 0.9688 +0.9375 0.5938 1 +0.9375 0.625 0 +0.9375 0.625 0.03125 +0.9375 0.625 0.0625 +0.9375 0.625 0.09375 +0.9375 0.625 0.125 +0.9375 0.625 0.1562 +0.9375 0.625 0.1875 +0.9375 0.625 0.2188 +0.9375 0.625 0.25 +0.9375 0.625 0.2812 +0.9375 0.625 0.3125 +0.9375 0.625 0.3438 +0.9375 0.625 0.375 +0.9375 0.625 0.4062 +0.9375 0.625 0.4375 +0.9375 0.625 0.4688 +0.9375 0.625 0.5 +0.9375 0.625 0.5312 +0.9375 0.625 0.5625 +0.9375 0.625 0.5938 +0.9375 0.625 0.625 +0.9375 0.625 0.6562 +0.9375 0.625 0.6875 +0.9375 0.625 0.7188 +0.9375 0.625 0.75 +0.9375 0.625 0.7812 +0.9375 0.625 0.8125 +0.9375 0.625 0.8438 +0.9375 0.625 0.875 +0.9375 0.625 0.9062 +0.9375 0.625 0.9375 +0.9375 0.625 0.9688 +0.9375 0.625 1 +0.9375 0.6562 0 +0.9375 0.6562 0.03125 +0.9375 0.6562 0.0625 +0.9375 0.6562 0.09375 +0.9375 0.6562 0.125 +0.9375 0.6562 0.1562 +0.9375 0.6562 0.1875 +0.9375 0.6562 0.2188 +0.9375 0.6562 0.25 +0.9375 0.6562 0.2812 +0.9375 0.6562 0.3125 +0.9375 0.6562 0.3438 +0.9375 0.6562 0.375 +0.9375 0.6562 0.4062 +0.9375 0.6562 0.4375 +0.9375 0.6562 0.4688 +0.9375 0.6562 0.5 +0.9375 0.6562 0.5312 +0.9375 0.6562 0.5625 +0.9375 0.6562 0.5938 +0.9375 0.6562 0.625 +0.9375 0.6562 0.6562 +0.9375 0.6562 0.6875 +0.9375 0.6562 0.7188 +0.9375 0.6562 0.75 +0.9375 0.6562 0.7812 +0.9375 0.6562 0.8125 +0.9375 0.6562 0.8438 +0.9375 0.6562 0.875 +0.9375 0.6562 0.9062 +0.9375 0.6562 0.9375 +0.9375 0.6562 0.9688 +0.9375 0.6562 1 +0.9375 0.6875 0 +0.9375 0.6875 0.03125 +0.9375 0.6875 0.0625 +0.9375 0.6875 0.09375 +0.9375 0.6875 0.125 +0.9375 0.6875 0.1562 +0.9375 0.6875 0.1875 +0.9375 0.6875 0.2188 +0.9375 0.6875 0.25 +0.9375 0.6875 0.2812 +0.9375 0.6875 0.3125 +0.9375 0.6875 0.3438 +0.9375 0.6875 0.375 +0.9375 0.6875 0.4062 +0.9375 0.6875 0.4375 +0.9375 0.6875 0.4688 +0.9375 0.6875 0.5 +0.9375 0.6875 0.5312 +0.9375 0.6875 0.5625 +0.9375 0.6875 0.5938 +0.9375 0.6875 0.625 +0.9375 0.6875 0.6562 +0.9375 0.6875 0.6875 +0.9375 0.6875 0.7188 +0.9375 0.6875 0.75 +0.9375 0.6875 0.7812 +0.9375 0.6875 0.8125 +0.9375 0.6875 0.8438 +0.9375 0.6875 0.875 +0.9375 0.6875 0.9062 +0.9375 0.6875 0.9375 +0.9375 0.6875 0.9688 +0.9375 0.6875 1 +0.9375 0.7188 0 +0.9375 0.7188 0.03125 +0.9375 0.7188 0.0625 +0.9375 0.7188 0.09375 +0.9375 0.7188 0.125 +0.9375 0.7188 0.1562 +0.9375 0.7188 0.1875 +0.9375 0.7188 0.2188 +0.9375 0.7188 0.25 +0.9375 0.7188 0.2812 +0.9375 0.7188 0.3125 +0.9375 0.7188 0.3438 +0.9375 0.7188 0.375 +0.9375 0.7188 0.4062 +0.9375 0.7188 0.4375 +0.9375 0.7188 0.4688 +0.9375 0.7188 0.5 +0.9375 0.7188 0.5312 +0.9375 0.7188 0.5625 +0.9375 0.7188 0.5938 +0.9375 0.7188 0.625 +0.9375 0.7188 0.6562 +0.9375 0.7188 0.6875 +0.9375 0.7188 0.7188 +0.9375 0.7188 0.75 +0.9375 0.7188 0.7812 +0.9375 0.7188 0.8125 +0.9375 0.7188 0.8438 +0.9375 0.7188 0.875 +0.9375 0.7188 0.9062 +0.9375 0.7188 0.9375 +0.9375 0.7188 0.9688 +0.9375 0.7188 1 +0.9375 0.75 0 +0.9375 0.75 0.03125 +0.9375 0.75 0.0625 +0.9375 0.75 0.09375 +0.9375 0.75 0.125 +0.9375 0.75 0.1562 +0.9375 0.75 0.1875 +0.9375 0.75 0.2188 +0.9375 0.75 0.25 +0.9375 0.75 0.2812 +0.9375 0.75 0.3125 +0.9375 0.75 0.3438 +0.9375 0.75 0.375 +0.9375 0.75 0.4062 +0.9375 0.75 0.4375 +0.9375 0.75 0.4688 +0.9375 0.75 0.5 +0.9375 0.75 0.5312 +0.9375 0.75 0.5625 +0.9375 0.75 0.5938 +0.9375 0.75 0.625 +0.9375 0.75 0.6562 +0.9375 0.75 0.6875 +0.9375 0.75 0.7188 +0.9375 0.75 0.75 +0.9375 0.75 0.7812 +0.9375 0.75 0.8125 +0.9375 0.75 0.8438 +0.9375 0.75 0.875 +0.9375 0.75 0.9062 +0.9375 0.75 0.9375 +0.9375 0.75 0.9688 +0.9375 0.75 1 +0.9375 0.7812 0 +0.9375 0.7812 0.03125 +0.9375 0.7812 0.0625 +0.9375 0.7812 0.09375 +0.9375 0.7812 0.125 +0.9375 0.7812 0.1562 +0.9375 0.7812 0.1875 +0.9375 0.7812 0.2188 +0.9375 0.7812 0.25 +0.9375 0.7812 0.2812 +0.9375 0.7812 0.3125 +0.9375 0.7812 0.3438 +0.9375 0.7812 0.375 +0.9375 0.7812 0.4062 +0.9375 0.7812 0.4375 +0.9375 0.7812 0.4688 +0.9375 0.7812 0.5 +0.9375 0.7812 0.5312 +0.9375 0.7812 0.5625 +0.9375 0.7812 0.5938 +0.9375 0.7812 0.625 +0.9375 0.7812 0.6562 +0.9375 0.7812 0.6875 +0.9375 0.7812 0.7188 +0.9375 0.7812 0.75 +0.9375 0.7812 0.7812 +0.9375 0.7812 0.8125 +0.9375 0.7812 0.8438 +0.9375 0.7812 0.875 +0.9375 0.7812 0.9062 +0.9375 0.7812 0.9375 +0.9375 0.7812 0.9688 +0.9375 0.7812 1 +0.9375 0.8125 0 +0.9375 0.8125 0.03125 +0.9375 0.8125 0.0625 +0.9375 0.8125 0.09375 +0.9375 0.8125 0.125 +0.9375 0.8125 0.1562 +0.9375 0.8125 0.1875 +0.9375 0.8125 0.2188 +0.9375 0.8125 0.25 +0.9375 0.8125 0.2812 +0.9375 0.8125 0.3125 +0.9375 0.8125 0.3438 +0.9375 0.8125 0.375 +0.9375 0.8125 0.4062 +0.9375 0.8125 0.4375 +0.9375 0.8125 0.4688 +0.9375 0.8125 0.5 +0.9375 0.8125 0.5312 +0.9375 0.8125 0.5625 +0.9375 0.8125 0.5938 +0.9375 0.8125 0.625 +0.9375 0.8125 0.6562 +0.9375 0.8125 0.6875 +0.9375 0.8125 0.7188 +0.9375 0.8125 0.75 +0.9375 0.8125 0.7812 +0.9375 0.8125 0.8125 +0.9375 0.8125 0.8438 +0.9375 0.8125 0.875 +0.9375 0.8125 0.9062 +0.9375 0.8125 0.9375 +0.9375 0.8125 0.9688 +0.9375 0.8125 1 +0.9375 0.8438 0 +0.9375 0.8438 0.03125 +0.9375 0.8438 0.0625 +0.9375 0.8438 0.09375 +0.9375 0.8438 0.125 +0.9375 0.8438 0.1562 +0.9375 0.8438 0.1875 +0.9375 0.8438 0.2188 +0.9375 0.8438 0.25 +0.9375 0.8438 0.2812 +0.9375 0.8438 0.3125 +0.9375 0.8438 0.3438 +0.9375 0.8438 0.375 +0.9375 0.8438 0.4062 +0.9375 0.8438 0.4375 +0.9375 0.8438 0.4688 +0.9375 0.8438 0.5 +0.9375 0.8438 0.5312 +0.9375 0.8438 0.5625 +0.9375 0.8438 0.5938 +0.9375 0.8438 0.625 +0.9375 0.8438 0.6562 +0.9375 0.8438 0.6875 +0.9375 0.8438 0.7188 +0.9375 0.8438 0.75 +0.9375 0.8438 0.7812 +0.9375 0.8438 0.8125 +0.9375 0.8438 0.8438 +0.9375 0.8438 0.875 +0.9375 0.8438 0.9062 +0.9375 0.8438 0.9375 +0.9375 0.8438 0.9688 +0.9375 0.8438 1 +0.9375 0.875 0 +0.9375 0.875 0.03125 +0.9375 0.875 0.0625 +0.9375 0.875 0.09375 +0.9375 0.875 0.125 +0.9375 0.875 0.1562 +0.9375 0.875 0.1875 +0.9375 0.875 0.2188 +0.9375 0.875 0.25 +0.9375 0.875 0.2812 +0.9375 0.875 0.3125 +0.9375 0.875 0.3438 +0.9375 0.875 0.375 +0.9375 0.875 0.4062 +0.9375 0.875 0.4375 +0.9375 0.875 0.4688 +0.9375 0.875 0.5 +0.9375 0.875 0.5312 +0.9375 0.875 0.5625 +0.9375 0.875 0.5938 +0.9375 0.875 0.625 +0.9375 0.875 0.6562 +0.9375 0.875 0.6875 +0.9375 0.875 0.7188 +0.9375 0.875 0.75 +0.9375 0.875 0.7812 +0.9375 0.875 0.8125 +0.9375 0.875 0.8438 +0.9375 0.875 0.875 +0.9375 0.875 0.9062 +0.9375 0.875 0.9375 +0.9375 0.875 0.9688 +0.9375 0.875 1 +0.9375 0.9062 0 +0.9375 0.9062 0.03125 +0.9375 0.9062 0.0625 +0.9375 0.9062 0.09375 +0.9375 0.9062 0.125 +0.9375 0.9062 0.1562 +0.9375 0.9062 0.1875 +0.9375 0.9062 0.2188 +0.9375 0.9062 0.25 +0.9375 0.9062 0.2812 +0.9375 0.9062 0.3125 +0.9375 0.9062 0.3438 +0.9375 0.9062 0.375 +0.9375 0.9062 0.4062 +0.9375 0.9062 0.4375 +0.9375 0.9062 0.4688 +0.9375 0.9062 0.5 +0.9375 0.9062 0.5312 +0.9375 0.9062 0.5625 +0.9375 0.9062 0.5938 +0.9375 0.9062 0.625 +0.9375 0.9062 0.6562 +0.9375 0.9062 0.6875 +0.9375 0.9062 0.7188 +0.9375 0.9062 0.75 +0.9375 0.9062 0.7812 +0.9375 0.9062 0.8125 +0.9375 0.9062 0.8438 +0.9375 0.9062 0.875 +0.9375 0.9062 0.9062 +0.9375 0.9062 0.9375 +0.9375 0.9062 0.9688 +0.9375 0.9062 1 +0.9375 0.9375 0 +0.9375 0.9375 0.03125 +0.9375 0.9375 0.0625 +0.9375 0.9375 0.09375 +0.9375 0.9375 0.125 +0.9375 0.9375 0.1562 +0.9375 0.9375 0.1875 +0.9375 0.9375 0.2188 +0.9375 0.9375 0.25 +0.9375 0.9375 0.2812 +0.9375 0.9375 0.3125 +0.9375 0.9375 0.3438 +0.9375 0.9375 0.375 +0.9375 0.9375 0.4062 +0.9375 0.9375 0.4375 +0.9375 0.9375 0.4688 +0.9375 0.9375 0.5 +0.9375 0.9375 0.5312 +0.9375 0.9375 0.5625 +0.9375 0.9375 0.5938 +0.9375 0.9375 0.625 +0.9375 0.9375 0.6562 +0.9375 0.9375 0.6875 +0.9375 0.9375 0.7188 +0.9375 0.9375 0.75 +0.9375 0.9375 0.7812 +0.9375 0.9375 0.8125 +0.9375 0.9375 0.8438 +0.9375 0.9375 0.875 +0.9375 0.9375 0.9062 +0.9375 0.9375 0.9375 +0.9375 0.9375 0.9688 +0.9375 0.9375 1 +0.9375 0.9688 0 +0.9375 0.9688 0.03125 +0.9375 0.9688 0.0625 +0.9375 0.9688 0.09375 +0.9375 0.9688 0.125 +0.9375 0.9688 0.1562 +0.9375 0.9688 0.1875 +0.9375 0.9688 0.2188 +0.9375 0.9688 0.25 +0.9375 0.9688 0.2812 +0.9375 0.9688 0.3125 +0.9375 0.9688 0.3438 +0.9375 0.9688 0.375 +0.9375 0.9688 0.4062 +0.9375 0.9688 0.4375 +0.9375 0.9688 0.4688 +0.9375 0.9688 0.5 +0.9375 0.9688 0.5312 +0.9375 0.9688 0.5625 +0.9375 0.9688 0.5938 +0.9375 0.9688 0.625 +0.9375 0.9688 0.6562 +0.9375 0.9688 0.6875 +0.9375 0.9688 0.7188 +0.9375 0.9688 0.75 +0.9375 0.9688 0.7812 +0.9375 0.9688 0.8125 +0.9375 0.9688 0.8438 +0.9375 0.9688 0.875 +0.9375 0.9688 0.9062 +0.9375 0.9688 0.9375 +0.9375 0.9688 0.9688 +0.9375 0.9688 1 +0.9375 1 0 +0.9375 1 0.03125 +0.9375 1 0.0625 +0.9375 1 0.09375 +0.9375 1 0.125 +0.9375 1 0.1562 +0.9375 1 0.1875 +0.9375 1 0.2188 +0.9375 1 0.25 +0.9375 1 0.2812 +0.9375 1 0.3125 +0.9375 1 0.3438 +0.9375 1 0.375 +0.9375 1 0.4062 +0.9375 1 0.4375 +0.9375 1 0.4688 +0.9375 1 0.5 +0.9375 1 0.5312 +0.9375 1 0.5625 +0.9375 1 0.5938 +0.9375 1 0.625 +0.9375 1 0.6562 +0.9375 1 0.6875 +0.9375 1 0.7188 +0.9375 1 0.75 +0.9375 1 0.7812 +0.9375 1 0.8125 +0.9375 1 0.8438 +0.9375 1 0.875 +0.9375 1 0.9062 +0.9375 1 0.9375 +0.9375 1 0.9688 +0.9375 1 1 +0.9688 0 0 +0.9688 0 0.03125 +0.9688 0 0.0625 +0.9688 0 0.09375 +0.9688 0 0.125 +0.9688 0 0.1562 +0.9688 0 0.1875 +0.9688 0 0.2188 +0.9688 0 0.25 +0.9688 0 0.2812 +0.9688 0 0.3125 +0.9688 0 0.3438 +0.9688 0 0.375 +0.9688 0 0.4062 +0.9688 0 0.4375 +0.9688 0 0.4688 +0.9688 0 0.5 +0.9688 0 0.5312 +0.9688 0 0.5625 +0.9688 0 0.5938 +0.9688 0 0.625 +0.9688 0 0.6562 +0.9688 0 0.6875 +0.9688 0 0.7188 +0.9688 0 0.75 +0.9688 0 0.7812 +0.9688 0 0.8125 +0.9688 0 0.8438 +0.9688 0 0.875 +0.9688 0 0.9062 +0.9688 0 0.9375 +0.9688 0 0.9688 +0.9688 0 1 +0.9688 0.03125 0 +0.9688 0.03125 0.03125 +0.9688 0.03125 0.0625 +0.9688 0.03125 0.09375 +0.9688 0.03125 0.125 +0.9688 0.03125 0.1562 +0.9688 0.03125 0.1875 +0.9688 0.03125 0.2188 +0.9688 0.03125 0.25 +0.9688 0.03125 0.2812 +0.9688 0.03125 0.3125 +0.9688 0.03125 0.3438 +0.9688 0.03125 0.375 +0.9688 0.03125 0.4062 +0.9688 0.03125 0.4375 +0.9688 0.03125 0.4688 +0.9688 0.03125 0.5 +0.9688 0.03125 0.5312 +0.9688 0.03125 0.5625 +0.9688 0.03125 0.5938 +0.9688 0.03125 0.625 +0.9688 0.03125 0.6562 +0.9688 0.03125 0.6875 +0.9688 0.03125 0.7188 +0.9688 0.03125 0.75 +0.9688 0.03125 0.7812 +0.9688 0.03125 0.8125 +0.9688 0.03125 0.8438 +0.9688 0.03125 0.875 +0.9688 0.03125 0.9062 +0.9688 0.03125 0.9375 +0.9688 0.03125 0.9688 +0.9688 0.03125 1 +0.9688 0.0625 0 +0.9688 0.0625 0.03125 +0.9688 0.0625 0.0625 +0.9688 0.0625 0.09375 +0.9688 0.0625 0.125 +0.9688 0.0625 0.1562 +0.9688 0.0625 0.1875 +0.9688 0.0625 0.2188 +0.9688 0.0625 0.25 +0.9688 0.0625 0.2812 +0.9688 0.0625 0.3125 +0.9688 0.0625 0.3438 +0.9688 0.0625 0.375 +0.9688 0.0625 0.4062 +0.9688 0.0625 0.4375 +0.9688 0.0625 0.4688 +0.9688 0.0625 0.5 +0.9688 0.0625 0.5312 +0.9688 0.0625 0.5625 +0.9688 0.0625 0.5938 +0.9688 0.0625 0.625 +0.9688 0.0625 0.6562 +0.9688 0.0625 0.6875 +0.9688 0.0625 0.7188 +0.9688 0.0625 0.75 +0.9688 0.0625 0.7812 +0.9688 0.0625 0.8125 +0.9688 0.0625 0.8438 +0.9688 0.0625 0.875 +0.9688 0.0625 0.9062 +0.9688 0.0625 0.9375 +0.9688 0.0625 0.9688 +0.9688 0.0625 1 +0.9688 0.09375 0 +0.9688 0.09375 0.03125 +0.9688 0.09375 0.0625 +0.9688 0.09375 0.09375 +0.9688 0.09375 0.125 +0.9688 0.09375 0.1562 +0.9688 0.09375 0.1875 +0.9688 0.09375 0.2188 +0.9688 0.09375 0.25 +0.9688 0.09375 0.2812 +0.9688 0.09375 0.3125 +0.9688 0.09375 0.3438 +0.9688 0.09375 0.375 +0.9688 0.09375 0.4062 +0.9688 0.09375 0.4375 +0.9688 0.09375 0.4688 +0.9688 0.09375 0.5 +0.9688 0.09375 0.5312 +0.9688 0.09375 0.5625 +0.9688 0.09375 0.5938 +0.9688 0.09375 0.625 +0.9688 0.09375 0.6562 +0.9688 0.09375 0.6875 +0.9688 0.09375 0.7188 +0.9688 0.09375 0.75 +0.9688 0.09375 0.7812 +0.9688 0.09375 0.8125 +0.9688 0.09375 0.8438 +0.9688 0.09375 0.875 +0.9688 0.09375 0.9062 +0.9688 0.09375 0.9375 +0.9688 0.09375 0.9688 +0.9688 0.09375 1 +0.9688 0.125 0 +0.9688 0.125 0.03125 +0.9688 0.125 0.0625 +0.9688 0.125 0.09375 +0.9688 0.125 0.125 +0.9688 0.125 0.1562 +0.9688 0.125 0.1875 +0.9688 0.125 0.2188 +0.9688 0.125 0.25 +0.9688 0.125 0.2812 +0.9688 0.125 0.3125 +0.9688 0.125 0.3438 +0.9688 0.125 0.375 +0.9688 0.125 0.4062 +0.9688 0.125 0.4375 +0.9688 0.125 0.4688 +0.9688 0.125 0.5 +0.9688 0.125 0.5312 +0.9688 0.125 0.5625 +0.9688 0.125 0.5938 +0.9688 0.125 0.625 +0.9688 0.125 0.6562 +0.9688 0.125 0.6875 +0.9688 0.125 0.7188 +0.9688 0.125 0.75 +0.9688 0.125 0.7812 +0.9688 0.125 0.8125 +0.9688 0.125 0.8438 +0.9688 0.125 0.875 +0.9688 0.125 0.9062 +0.9688 0.125 0.9375 +0.9688 0.125 0.9688 +0.9688 0.125 1 +0.9688 0.1562 0 +0.9688 0.1562 0.03125 +0.9688 0.1562 0.0625 +0.9688 0.1562 0.09375 +0.9688 0.1562 0.125 +0.9688 0.1562 0.1562 +0.9688 0.1562 0.1875 +0.9688 0.1562 0.2188 +0.9688 0.1562 0.25 +0.9688 0.1562 0.2812 +0.9688 0.1562 0.3125 +0.9688 0.1562 0.3438 +0.9688 0.1562 0.375 +0.9688 0.1562 0.4062 +0.9688 0.1562 0.4375 +0.9688 0.1562 0.4688 +0.9688 0.1562 0.5 +0.9688 0.1562 0.5312 +0.9688 0.1562 0.5625 +0.9688 0.1562 0.5938 +0.9688 0.1562 0.625 +0.9688 0.1562 0.6562 +0.9688 0.1562 0.6875 +0.9688 0.1562 0.7188 +0.9688 0.1562 0.75 +0.9688 0.1562 0.7812 +0.9688 0.1562 0.8125 +0.9688 0.1562 0.8438 +0.9688 0.1562 0.875 +0.9688 0.1562 0.9062 +0.9688 0.1562 0.9375 +0.9688 0.1562 0.9688 +0.9688 0.1562 1 +0.9688 0.1875 0 +0.9688 0.1875 0.03125 +0.9688 0.1875 0.0625 +0.9688 0.1875 0.09375 +0.9688 0.1875 0.125 +0.9688 0.1875 0.1562 +0.9688 0.1875 0.1875 +0.9688 0.1875 0.2188 +0.9688 0.1875 0.25 +0.9688 0.1875 0.2812 +0.9688 0.1875 0.3125 +0.9688 0.1875 0.3438 +0.9688 0.1875 0.375 +0.9688 0.1875 0.4062 +0.9688 0.1875 0.4375 +0.9688 0.1875 0.4688 +0.9688 0.1875 0.5 +0.9688 0.1875 0.5312 +0.9688 0.1875 0.5625 +0.9688 0.1875 0.5938 +0.9688 0.1875 0.625 +0.9688 0.1875 0.6562 +0.9688 0.1875 0.6875 +0.9688 0.1875 0.7188 +0.9688 0.1875 0.75 +0.9688 0.1875 0.7812 +0.9688 0.1875 0.8125 +0.9688 0.1875 0.8438 +0.9688 0.1875 0.875 +0.9688 0.1875 0.9062 +0.9688 0.1875 0.9375 +0.9688 0.1875 0.9688 +0.9688 0.1875 1 +0.9688 0.2188 0 +0.9688 0.2188 0.03125 +0.9688 0.2188 0.0625 +0.9688 0.2188 0.09375 +0.9688 0.2188 0.125 +0.9688 0.2188 0.1562 +0.9688 0.2188 0.1875 +0.9688 0.2188 0.2188 +0.9688 0.2188 0.25 +0.9688 0.2188 0.2812 +0.9688 0.2188 0.3125 +0.9688 0.2188 0.3438 +0.9688 0.2188 0.375 +0.9688 0.2188 0.4062 +0.9688 0.2188 0.4375 +0.9688 0.2188 0.4688 +0.9688 0.2188 0.5 +0.9688 0.2188 0.5312 +0.9688 0.2188 0.5625 +0.9688 0.2188 0.5938 +0.9688 0.2188 0.625 +0.9688 0.2188 0.6562 +0.9688 0.2188 0.6875 +0.9688 0.2188 0.7188 +0.9688 0.2188 0.75 +0.9688 0.2188 0.7812 +0.9688 0.2188 0.8125 +0.9688 0.2188 0.8438 +0.9688 0.2188 0.875 +0.9688 0.2188 0.9062 +0.9688 0.2188 0.9375 +0.9688 0.2188 0.9688 +0.9688 0.2188 1 +0.9688 0.25 0 +0.9688 0.25 0.03125 +0.9688 0.25 0.0625 +0.9688 0.25 0.09375 +0.9688 0.25 0.125 +0.9688 0.25 0.1562 +0.9688 0.25 0.1875 +0.9688 0.25 0.2188 +0.9688 0.25 0.25 +0.9688 0.25 0.2812 +0.9688 0.25 0.3125 +0.9688 0.25 0.3438 +0.9688 0.25 0.375 +0.9688 0.25 0.4062 +0.9688 0.25 0.4375 +0.9688 0.25 0.4688 +0.9688 0.25 0.5 +0.9688 0.25 0.5312 +0.9688 0.25 0.5625 +0.9688 0.25 0.5938 +0.9688 0.25 0.625 +0.9688 0.25 0.6562 +0.9688 0.25 0.6875 +0.9688 0.25 0.7188 +0.9688 0.25 0.75 +0.9688 0.25 0.7812 +0.9688 0.25 0.8125 +0.9688 0.25 0.8438 +0.9688 0.25 0.875 +0.9688 0.25 0.9062 +0.9688 0.25 0.9375 +0.9688 0.25 0.9688 +0.9688 0.25 1 +0.9688 0.2812 0 +0.9688 0.2812 0.03125 +0.9688 0.2812 0.0625 +0.9688 0.2812 0.09375 +0.9688 0.2812 0.125 +0.9688 0.2812 0.1562 +0.9688 0.2812 0.1875 +0.9688 0.2812 0.2188 +0.9688 0.2812 0.25 +0.9688 0.2812 0.2812 +0.9688 0.2812 0.3125 +0.9688 0.2812 0.3438 +0.9688 0.2812 0.375 +0.9688 0.2812 0.4062 +0.9688 0.2812 0.4375 +0.9688 0.2812 0.4688 +0.9688 0.2812 0.5 +0.9688 0.2812 0.5312 +0.9688 0.2812 0.5625 +0.9688 0.2812 0.5938 +0.9688 0.2812 0.625 +0.9688 0.2812 0.6562 +0.9688 0.2812 0.6875 +0.9688 0.2812 0.7188 +0.9688 0.2812 0.75 +0.9688 0.2812 0.7812 +0.9688 0.2812 0.8125 +0.9688 0.2812 0.8438 +0.9688 0.2812 0.875 +0.9688 0.2812 0.9062 +0.9688 0.2812 0.9375 +0.9688 0.2812 0.9688 +0.9688 0.2812 1 +0.9688 0.3125 0 +0.9688 0.3125 0.03125 +0.9688 0.3125 0.0625 +0.9688 0.3125 0.09375 +0.9688 0.3125 0.125 +0.9688 0.3125 0.1562 +0.9688 0.3125 0.1875 +0.9688 0.3125 0.2188 +0.9688 0.3125 0.25 +0.9688 0.3125 0.2812 +0.9688 0.3125 0.3125 +0.9688 0.3125 0.3438 +0.9688 0.3125 0.375 +0.9688 0.3125 0.4062 +0.9688 0.3125 0.4375 +0.9688 0.3125 0.4688 +0.9688 0.3125 0.5 +0.9688 0.3125 0.5312 +0.9688 0.3125 0.5625 +0.9688 0.3125 0.5938 +0.9688 0.3125 0.625 +0.9688 0.3125 0.6562 +0.9688 0.3125 0.6875 +0.9688 0.3125 0.7188 +0.9688 0.3125 0.75 +0.9688 0.3125 0.7812 +0.9688 0.3125 0.8125 +0.9688 0.3125 0.8438 +0.9688 0.3125 0.875 +0.9688 0.3125 0.9062 +0.9688 0.3125 0.9375 +0.9688 0.3125 0.9688 +0.9688 0.3125 1 +0.9688 0.3438 0 +0.9688 0.3438 0.03125 +0.9688 0.3438 0.0625 +0.9688 0.3438 0.09375 +0.9688 0.3438 0.125 +0.9688 0.3438 0.1562 +0.9688 0.3438 0.1875 +0.9688 0.3438 0.2188 +0.9688 0.3438 0.25 +0.9688 0.3438 0.2812 +0.9688 0.3438 0.3125 +0.9688 0.3438 0.3438 +0.9688 0.3438 0.375 +0.9688 0.3438 0.4062 +0.9688 0.3438 0.4375 +0.9688 0.3438 0.4688 +0.9688 0.3438 0.5 +0.9688 0.3438 0.5312 +0.9688 0.3438 0.5625 +0.9688 0.3438 0.5938 +0.9688 0.3438 0.625 +0.9688 0.3438 0.6562 +0.9688 0.3438 0.6875 +0.9688 0.3438 0.7188 +0.9688 0.3438 0.75 +0.9688 0.3438 0.7812 +0.9688 0.3438 0.8125 +0.9688 0.3438 0.8438 +0.9688 0.3438 0.875 +0.9688 0.3438 0.9062 +0.9688 0.3438 0.9375 +0.9688 0.3438 0.9688 +0.9688 0.3438 1 +0.9688 0.375 0 +0.9688 0.375 0.03125 +0.9688 0.375 0.0625 +0.9688 0.375 0.09375 +0.9688 0.375 0.125 +0.9688 0.375 0.1562 +0.9688 0.375 0.1875 +0.9688 0.375 0.2188 +0.9688 0.375 0.25 +0.9688 0.375 0.2812 +0.9688 0.375 0.3125 +0.9688 0.375 0.3438 +0.9688 0.375 0.375 +0.9688 0.375 0.4062 +0.9688 0.375 0.4375 +0.9688 0.375 0.4688 +0.9688 0.375 0.5 +0.9688 0.375 0.5312 +0.9688 0.375 0.5625 +0.9688 0.375 0.5938 +0.9688 0.375 0.625 +0.9688 0.375 0.6562 +0.9688 0.375 0.6875 +0.9688 0.375 0.7188 +0.9688 0.375 0.75 +0.9688 0.375 0.7812 +0.9688 0.375 0.8125 +0.9688 0.375 0.8438 +0.9688 0.375 0.875 +0.9688 0.375 0.9062 +0.9688 0.375 0.9375 +0.9688 0.375 0.9688 +0.9688 0.375 1 +0.9688 0.4062 0 +0.9688 0.4062 0.03125 +0.9688 0.4062 0.0625 +0.9688 0.4062 0.09375 +0.9688 0.4062 0.125 +0.9688 0.4062 0.1562 +0.9688 0.4062 0.1875 +0.9688 0.4062 0.2188 +0.9688 0.4062 0.25 +0.9688 0.4062 0.2812 +0.9688 0.4062 0.3125 +0.9688 0.4062 0.3438 +0.9688 0.4062 0.375 +0.9688 0.4062 0.4062 +0.9688 0.4062 0.4375 +0.9688 0.4062 0.4688 +0.9688 0.4062 0.5 +0.9688 0.4062 0.5312 +0.9688 0.4062 0.5625 +0.9688 0.4062 0.5938 +0.9688 0.4062 0.625 +0.9688 0.4062 0.6562 +0.9688 0.4062 0.6875 +0.9688 0.4062 0.7188 +0.9688 0.4062 0.75 +0.9688 0.4062 0.7812 +0.9688 0.4062 0.8125 +0.9688 0.4062 0.8438 +0.9688 0.4062 0.875 +0.9688 0.4062 0.9062 +0.9688 0.4062 0.9375 +0.9688 0.4062 0.9688 +0.9688 0.4062 1 +0.9688 0.4375 0 +0.9688 0.4375 0.03125 +0.9688 0.4375 0.0625 +0.9688 0.4375 0.09375 +0.9688 0.4375 0.125 +0.9688 0.4375 0.1562 +0.9688 0.4375 0.1875 +0.9688 0.4375 0.2188 +0.9688 0.4375 0.25 +0.9688 0.4375 0.2812 +0.9688 0.4375 0.3125 +0.9688 0.4375 0.3438 +0.9688 0.4375 0.375 +0.9688 0.4375 0.4062 +0.9688 0.4375 0.4375 +0.9688 0.4375 0.4688 +0.9688 0.4375 0.5 +0.9688 0.4375 0.5312 +0.9688 0.4375 0.5625 +0.9688 0.4375 0.5938 +0.9688 0.4375 0.625 +0.9688 0.4375 0.6562 +0.9688 0.4375 0.6875 +0.9688 0.4375 0.7188 +0.9688 0.4375 0.75 +0.9688 0.4375 0.7812 +0.9688 0.4375 0.8125 +0.9688 0.4375 0.8438 +0.9688 0.4375 0.875 +0.9688 0.4375 0.9062 +0.9688 0.4375 0.9375 +0.9688 0.4375 0.9688 +0.9688 0.4375 1 +0.9688 0.4688 0 +0.9688 0.4688 0.03125 +0.9688 0.4688 0.0625 +0.9688 0.4688 0.09375 +0.9688 0.4688 0.125 +0.9688 0.4688 0.1562 +0.9688 0.4688 0.1875 +0.9688 0.4688 0.2188 +0.9688 0.4688 0.25 +0.9688 0.4688 0.2812 +0.9688 0.4688 0.3125 +0.9688 0.4688 0.3438 +0.9688 0.4688 0.375 +0.9688 0.4688 0.4062 +0.9688 0.4688 0.4375 +0.9688 0.4688 0.4688 +0.9688 0.4688 0.5 +0.9688 0.4688 0.5312 +0.9688 0.4688 0.5625 +0.9688 0.4688 0.5938 +0.9688 0.4688 0.625 +0.9688 0.4688 0.6562 +0.9688 0.4688 0.6875 +0.9688 0.4688 0.7188 +0.9688 0.4688 0.75 +0.9688 0.4688 0.7812 +0.9688 0.4688 0.8125 +0.9688 0.4688 0.8438 +0.9688 0.4688 0.875 +0.9688 0.4688 0.9062 +0.9688 0.4688 0.9375 +0.9688 0.4688 0.9688 +0.9688 0.4688 1 +0.9688 0.5 0 +0.9688 0.5 0.03125 +0.9688 0.5 0.0625 +0.9688 0.5 0.09375 +0.9688 0.5 0.125 +0.9688 0.5 0.1562 +0.9688 0.5 0.1875 +0.9688 0.5 0.2188 +0.9688 0.5 0.25 +0.9688 0.5 0.2812 +0.9688 0.5 0.3125 +0.9688 0.5 0.3438 +0.9688 0.5 0.375 +0.9688 0.5 0.4062 +0.9688 0.5 0.4375 +0.9688 0.5 0.4688 +0.9688 0.5 0.5 +0.9688 0.5 0.5312 +0.9688 0.5 0.5625 +0.9688 0.5 0.5938 +0.9688 0.5 0.625 +0.9688 0.5 0.6562 +0.9688 0.5 0.6875 +0.9688 0.5 0.7188 +0.9688 0.5 0.75 +0.9688 0.5 0.7812 +0.9688 0.5 0.8125 +0.9688 0.5 0.8438 +0.9688 0.5 0.875 +0.9688 0.5 0.9062 +0.9688 0.5 0.9375 +0.9688 0.5 0.9688 +0.9688 0.5 1 +0.9688 0.5312 0 +0.9688 0.5312 0.03125 +0.9688 0.5312 0.0625 +0.9688 0.5312 0.09375 +0.9688 0.5312 0.125 +0.9688 0.5312 0.1562 +0.9688 0.5312 0.1875 +0.9688 0.5312 0.2188 +0.9688 0.5312 0.25 +0.9688 0.5312 0.2812 +0.9688 0.5312 0.3125 +0.9688 0.5312 0.3438 +0.9688 0.5312 0.375 +0.9688 0.5312 0.4062 +0.9688 0.5312 0.4375 +0.9688 0.5312 0.4688 +0.9688 0.5312 0.5 +0.9688 0.5312 0.5312 +0.9688 0.5312 0.5625 +0.9688 0.5312 0.5938 +0.9688 0.5312 0.625 +0.9688 0.5312 0.6562 +0.9688 0.5312 0.6875 +0.9688 0.5312 0.7188 +0.9688 0.5312 0.75 +0.9688 0.5312 0.7812 +0.9688 0.5312 0.8125 +0.9688 0.5312 0.8438 +0.9688 0.5312 0.875 +0.9688 0.5312 0.9062 +0.9688 0.5312 0.9375 +0.9688 0.5312 0.9688 +0.9688 0.5312 1 +0.9688 0.5625 0 +0.9688 0.5625 0.03125 +0.9688 0.5625 0.0625 +0.9688 0.5625 0.09375 +0.9688 0.5625 0.125 +0.9688 0.5625 0.1562 +0.9688 0.5625 0.1875 +0.9688 0.5625 0.2188 +0.9688 0.5625 0.25 +0.9688 0.5625 0.2812 +0.9688 0.5625 0.3125 +0.9688 0.5625 0.3438 +0.9688 0.5625 0.375 +0.9688 0.5625 0.4062 +0.9688 0.5625 0.4375 +0.9688 0.5625 0.4688 +0.9688 0.5625 0.5 +0.9688 0.5625 0.5312 +0.9688 0.5625 0.5625 +0.9688 0.5625 0.5938 +0.9688 0.5625 0.625 +0.9688 0.5625 0.6562 +0.9688 0.5625 0.6875 +0.9688 0.5625 0.7188 +0.9688 0.5625 0.75 +0.9688 0.5625 0.7812 +0.9688 0.5625 0.8125 +0.9688 0.5625 0.8438 +0.9688 0.5625 0.875 +0.9688 0.5625 0.9062 +0.9688 0.5625 0.9375 +0.9688 0.5625 0.9688 +0.9688 0.5625 1 +0.9688 0.5938 0 +0.9688 0.5938 0.03125 +0.9688 0.5938 0.0625 +0.9688 0.5938 0.09375 +0.9688 0.5938 0.125 +0.9688 0.5938 0.1562 +0.9688 0.5938 0.1875 +0.9688 0.5938 0.2188 +0.9688 0.5938 0.25 +0.9688 0.5938 0.2812 +0.9688 0.5938 0.3125 +0.9688 0.5938 0.3438 +0.9688 0.5938 0.375 +0.9688 0.5938 0.4062 +0.9688 0.5938 0.4375 +0.9688 0.5938 0.4688 +0.9688 0.5938 0.5 +0.9688 0.5938 0.5312 +0.9688 0.5938 0.5625 +0.9688 0.5938 0.5938 +0.9688 0.5938 0.625 +0.9688 0.5938 0.6562 +0.9688 0.5938 0.6875 +0.9688 0.5938 0.7188 +0.9688 0.5938 0.75 +0.9688 0.5938 0.7812 +0.9688 0.5938 0.8125 +0.9688 0.5938 0.8438 +0.9688 0.5938 0.875 +0.9688 0.5938 0.9062 +0.9688 0.5938 0.9375 +0.9688 0.5938 0.9688 +0.9688 0.5938 1 +0.9688 0.625 0 +0.9688 0.625 0.03125 +0.9688 0.625 0.0625 +0.9688 0.625 0.09375 +0.9688 0.625 0.125 +0.9688 0.625 0.1562 +0.9688 0.625 0.1875 +0.9688 0.625 0.2188 +0.9688 0.625 0.25 +0.9688 0.625 0.2812 +0.9688 0.625 0.3125 +0.9688 0.625 0.3438 +0.9688 0.625 0.375 +0.9688 0.625 0.4062 +0.9688 0.625 0.4375 +0.9688 0.625 0.4688 +0.9688 0.625 0.5 +0.9688 0.625 0.5312 +0.9688 0.625 0.5625 +0.9688 0.625 0.5938 +0.9688 0.625 0.625 +0.9688 0.625 0.6562 +0.9688 0.625 0.6875 +0.9688 0.625 0.7188 +0.9688 0.625 0.75 +0.9688 0.625 0.7812 +0.9688 0.625 0.8125 +0.9688 0.625 0.8438 +0.9688 0.625 0.875 +0.9688 0.625 0.9062 +0.9688 0.625 0.9375 +0.9688 0.625 0.9688 +0.9688 0.625 1 +0.9688 0.6562 0 +0.9688 0.6562 0.03125 +0.9688 0.6562 0.0625 +0.9688 0.6562 0.09375 +0.9688 0.6562 0.125 +0.9688 0.6562 0.1562 +0.9688 0.6562 0.1875 +0.9688 0.6562 0.2188 +0.9688 0.6562 0.25 +0.9688 0.6562 0.2812 +0.9688 0.6562 0.3125 +0.9688 0.6562 0.3438 +0.9688 0.6562 0.375 +0.9688 0.6562 0.4062 +0.9688 0.6562 0.4375 +0.9688 0.6562 0.4688 +0.9688 0.6562 0.5 +0.9688 0.6562 0.5312 +0.9688 0.6562 0.5625 +0.9688 0.6562 0.5938 +0.9688 0.6562 0.625 +0.9688 0.6562 0.6562 +0.9688 0.6562 0.6875 +0.9688 0.6562 0.7188 +0.9688 0.6562 0.75 +0.9688 0.6562 0.7812 +0.9688 0.6562 0.8125 +0.9688 0.6562 0.8438 +0.9688 0.6562 0.875 +0.9688 0.6562 0.9062 +0.9688 0.6562 0.9375 +0.9688 0.6562 0.9688 +0.9688 0.6562 1 +0.9688 0.6875 0 +0.9688 0.6875 0.03125 +0.9688 0.6875 0.0625 +0.9688 0.6875 0.09375 +0.9688 0.6875 0.125 +0.9688 0.6875 0.1562 +0.9688 0.6875 0.1875 +0.9688 0.6875 0.2188 +0.9688 0.6875 0.25 +0.9688 0.6875 0.2812 +0.9688 0.6875 0.3125 +0.9688 0.6875 0.3438 +0.9688 0.6875 0.375 +0.9688 0.6875 0.4062 +0.9688 0.6875 0.4375 +0.9688 0.6875 0.4688 +0.9688 0.6875 0.5 +0.9688 0.6875 0.5312 +0.9688 0.6875 0.5625 +0.9688 0.6875 0.5938 +0.9688 0.6875 0.625 +0.9688 0.6875 0.6562 +0.9688 0.6875 0.6875 +0.9688 0.6875 0.7188 +0.9688 0.6875 0.75 +0.9688 0.6875 0.7812 +0.9688 0.6875 0.8125 +0.9688 0.6875 0.8438 +0.9688 0.6875 0.875 +0.9688 0.6875 0.9062 +0.9688 0.6875 0.9375 +0.9688 0.6875 0.9688 +0.9688 0.6875 1 +0.9688 0.7188 0 +0.9688 0.7188 0.03125 +0.9688 0.7188 0.0625 +0.9688 0.7188 0.09375 +0.9688 0.7188 0.125 +0.9688 0.7188 0.1562 +0.9688 0.7188 0.1875 +0.9688 0.7188 0.2188 +0.9688 0.7188 0.25 +0.9688 0.7188 0.2812 +0.9688 0.7188 0.3125 +0.9688 0.7188 0.3438 +0.9688 0.7188 0.375 +0.9688 0.7188 0.4062 +0.9688 0.7188 0.4375 +0.9688 0.7188 0.4688 +0.9688 0.7188 0.5 +0.9688 0.7188 0.5312 +0.9688 0.7188 0.5625 +0.9688 0.7188 0.5938 +0.9688 0.7188 0.625 +0.9688 0.7188 0.6562 +0.9688 0.7188 0.6875 +0.9688 0.7188 0.7188 +0.9688 0.7188 0.75 +0.9688 0.7188 0.7812 +0.9688 0.7188 0.8125 +0.9688 0.7188 0.8438 +0.9688 0.7188 0.875 +0.9688 0.7188 0.9062 +0.9688 0.7188 0.9375 +0.9688 0.7188 0.9688 +0.9688 0.7188 1 +0.9688 0.75 0 +0.9688 0.75 0.03125 +0.9688 0.75 0.0625 +0.9688 0.75 0.09375 +0.9688 0.75 0.125 +0.9688 0.75 0.1562 +0.9688 0.75 0.1875 +0.9688 0.75 0.2188 +0.9688 0.75 0.25 +0.9688 0.75 0.2812 +0.9688 0.75 0.3125 +0.9688 0.75 0.3438 +0.9688 0.75 0.375 +0.9688 0.75 0.4062 +0.9688 0.75 0.4375 +0.9688 0.75 0.4688 +0.9688 0.75 0.5 +0.9688 0.75 0.5312 +0.9688 0.75 0.5625 +0.9688 0.75 0.5938 +0.9688 0.75 0.625 +0.9688 0.75 0.6562 +0.9688 0.75 0.6875 +0.9688 0.75 0.7188 +0.9688 0.75 0.75 +0.9688 0.75 0.7812 +0.9688 0.75 0.8125 +0.9688 0.75 0.8438 +0.9688 0.75 0.875 +0.9688 0.75 0.9062 +0.9688 0.75 0.9375 +0.9688 0.75 0.9688 +0.9688 0.75 1 +0.9688 0.7812 0 +0.9688 0.7812 0.03125 +0.9688 0.7812 0.0625 +0.9688 0.7812 0.09375 +0.9688 0.7812 0.125 +0.9688 0.7812 0.1562 +0.9688 0.7812 0.1875 +0.9688 0.7812 0.2188 +0.9688 0.7812 0.25 +0.9688 0.7812 0.2812 +0.9688 0.7812 0.3125 +0.9688 0.7812 0.3438 +0.9688 0.7812 0.375 +0.9688 0.7812 0.4062 +0.9688 0.7812 0.4375 +0.9688 0.7812 0.4688 +0.9688 0.7812 0.5 +0.9688 0.7812 0.5312 +0.9688 0.7812 0.5625 +0.9688 0.7812 0.5938 +0.9688 0.7812 0.625 +0.9688 0.7812 0.6562 +0.9688 0.7812 0.6875 +0.9688 0.7812 0.7188 +0.9688 0.7812 0.75 +0.9688 0.7812 0.7812 +0.9688 0.7812 0.8125 +0.9688 0.7812 0.8438 +0.9688 0.7812 0.875 +0.9688 0.7812 0.9062 +0.9688 0.7812 0.9375 +0.9688 0.7812 0.9688 +0.9688 0.7812 1 +0.9688 0.8125 0 +0.9688 0.8125 0.03125 +0.9688 0.8125 0.0625 +0.9688 0.8125 0.09375 +0.9688 0.8125 0.125 +0.9688 0.8125 0.1562 +0.9688 0.8125 0.1875 +0.9688 0.8125 0.2188 +0.9688 0.8125 0.25 +0.9688 0.8125 0.2812 +0.9688 0.8125 0.3125 +0.9688 0.8125 0.3438 +0.9688 0.8125 0.375 +0.9688 0.8125 0.4062 +0.9688 0.8125 0.4375 +0.9688 0.8125 0.4688 +0.9688 0.8125 0.5 +0.9688 0.8125 0.5312 +0.9688 0.8125 0.5625 +0.9688 0.8125 0.5938 +0.9688 0.8125 0.625 +0.9688 0.8125 0.6562 +0.9688 0.8125 0.6875 +0.9688 0.8125 0.7188 +0.9688 0.8125 0.75 +0.9688 0.8125 0.7812 +0.9688 0.8125 0.8125 +0.9688 0.8125 0.8438 +0.9688 0.8125 0.875 +0.9688 0.8125 0.9062 +0.9688 0.8125 0.9375 +0.9688 0.8125 0.9688 +0.9688 0.8125 1 +0.9688 0.8438 0 +0.9688 0.8438 0.03125 +0.9688 0.8438 0.0625 +0.9688 0.8438 0.09375 +0.9688 0.8438 0.125 +0.9688 0.8438 0.1562 +0.9688 0.8438 0.1875 +0.9688 0.8438 0.2188 +0.9688 0.8438 0.25 +0.9688 0.8438 0.2812 +0.9688 0.8438 0.3125 +0.9688 0.8438 0.3438 +0.9688 0.8438 0.375 +0.9688 0.8438 0.4062 +0.9688 0.8438 0.4375 +0.9688 0.8438 0.4688 +0.9688 0.8438 0.5 +0.9688 0.8438 0.5312 +0.9688 0.8438 0.5625 +0.9688 0.8438 0.5938 +0.9688 0.8438 0.625 +0.9688 0.8438 0.6562 +0.9688 0.8438 0.6875 +0.9688 0.8438 0.7188 +0.9688 0.8438 0.75 +0.9688 0.8438 0.7812 +0.9688 0.8438 0.8125 +0.9688 0.8438 0.8438 +0.9688 0.8438 0.875 +0.9688 0.8438 0.9062 +0.9688 0.8438 0.9375 +0.9688 0.8438 0.9688 +0.9688 0.8438 1 +0.9688 0.875 0 +0.9688 0.875 0.03125 +0.9688 0.875 0.0625 +0.9688 0.875 0.09375 +0.9688 0.875 0.125 +0.9688 0.875 0.1562 +0.9688 0.875 0.1875 +0.9688 0.875 0.2188 +0.9688 0.875 0.25 +0.9688 0.875 0.2812 +0.9688 0.875 0.3125 +0.9688 0.875 0.3438 +0.9688 0.875 0.375 +0.9688 0.875 0.4062 +0.9688 0.875 0.4375 +0.9688 0.875 0.4688 +0.9688 0.875 0.5 +0.9688 0.875 0.5312 +0.9688 0.875 0.5625 +0.9688 0.875 0.5938 +0.9688 0.875 0.625 +0.9688 0.875 0.6562 +0.9688 0.875 0.6875 +0.9688 0.875 0.7188 +0.9688 0.875 0.75 +0.9688 0.875 0.7812 +0.9688 0.875 0.8125 +0.9688 0.875 0.8438 +0.9688 0.875 0.875 +0.9688 0.875 0.9062 +0.9688 0.875 0.9375 +0.9688 0.875 0.9688 +0.9688 0.875 1 +0.9688 0.9062 0 +0.9688 0.9062 0.03125 +0.9688 0.9062 0.0625 +0.9688 0.9062 0.09375 +0.9688 0.9062 0.125 +0.9688 0.9062 0.1562 +0.9688 0.9062 0.1875 +0.9688 0.9062 0.2188 +0.9688 0.9062 0.25 +0.9688 0.9062 0.2812 +0.9688 0.9062 0.3125 +0.9688 0.9062 0.3438 +0.9688 0.9062 0.375 +0.9688 0.9062 0.4062 +0.9688 0.9062 0.4375 +0.9688 0.9062 0.4688 +0.9688 0.9062 0.5 +0.9688 0.9062 0.5312 +0.9688 0.9062 0.5625 +0.9688 0.9062 0.5938 +0.9688 0.9062 0.625 +0.9688 0.9062 0.6562 +0.9688 0.9062 0.6875 +0.9688 0.9062 0.7188 +0.9688 0.9062 0.75 +0.9688 0.9062 0.7812 +0.9688 0.9062 0.8125 +0.9688 0.9062 0.8438 +0.9688 0.9062 0.875 +0.9688 0.9062 0.9062 +0.9688 0.9062 0.9375 +0.9688 0.9062 0.9688 +0.9688 0.9062 1 +0.9688 0.9375 0 +0.9688 0.9375 0.03125 +0.9688 0.9375 0.0625 +0.9688 0.9375 0.09375 +0.9688 0.9375 0.125 +0.9688 0.9375 0.1562 +0.9688 0.9375 0.1875 +0.9688 0.9375 0.2188 +0.9688 0.9375 0.25 +0.9688 0.9375 0.2812 +0.9688 0.9375 0.3125 +0.9688 0.9375 0.3438 +0.9688 0.9375 0.375 +0.9688 0.9375 0.4062 +0.9688 0.9375 0.4375 +0.9688 0.9375 0.4688 +0.9688 0.9375 0.5 +0.9688 0.9375 0.5312 +0.9688 0.9375 0.5625 +0.9688 0.9375 0.5938 +0.9688 0.9375 0.625 +0.9688 0.9375 0.6562 +0.9688 0.9375 0.6875 +0.9688 0.9375 0.7188 +0.9688 0.9375 0.75 +0.9688 0.9375 0.7812 +0.9688 0.9375 0.8125 +0.9688 0.9375 0.8438 +0.9688 0.9375 0.875 +0.9688 0.9375 0.9062 +0.9688 0.9375 0.9375 +0.9688 0.9375 0.9688 +0.9688 0.9375 1 +0.9688 0.9688 0 +0.9688 0.9688 0.03125 +0.9688 0.9688 0.0625 +0.9688 0.9688 0.09375 +0.9688 0.9688 0.125 +0.9688 0.9688 0.1562 +0.9688 0.9688 0.1875 +0.9688 0.9688 0.2188 +0.9688 0.9688 0.25 +0.9688 0.9688 0.2812 +0.9688 0.9688 0.3125 +0.9688 0.9688 0.3438 +0.9688 0.9688 0.375 +0.9688 0.9688 0.4062 +0.9688 0.9688 0.4375 +0.9688 0.9688 0.4688 +0.9688 0.9688 0.5 +0.9688 0.9688 0.5312 +0.9688 0.9688 0.5625 +0.9688 0.9688 0.5938 +0.9688 0.9688 0.625 +0.9688 0.9688 0.6562 +0.9688 0.9688 0.6875 +0.9688 0.9688 0.7188 +0.9688 0.9688 0.75 +0.9688 0.9688 0.7812 +0.9688 0.9688 0.8125 +0.9688 0.9688 0.8438 +0.9688 0.9688 0.875 +0.9688 0.9688 0.9062 +0.9688 0.9688 0.9375 +0.9688 0.9688 0.9688 +0.9688 0.9688 1 +0.9688 1 0 +0.9688 1 0.03125 +0.9688 1 0.0625 +0.9688 1 0.09375 +0.9688 1 0.125 +0.9688 1 0.1562 +0.9688 1 0.1875 +0.9688 1 0.2188 +0.9688 1 0.25 +0.9688 1 0.2812 +0.9688 1 0.3125 +0.9688 1 0.3438 +0.9688 1 0.375 +0.9688 1 0.4062 +0.9688 1 0.4375 +0.9688 1 0.4688 +0.9688 1 0.5 +0.9688 1 0.5312 +0.9688 1 0.5625 +0.9688 1 0.5938 +0.9688 1 0.625 +0.9688 1 0.6562 +0.9688 1 0.6875 +0.9688 1 0.7188 +0.9688 1 0.75 +0.9688 1 0.7812 +0.9688 1 0.8125 +0.9688 1 0.8438 +0.9688 1 0.875 +0.9688 1 0.9062 +0.9688 1 0.9375 +0.9688 1 0.9688 +0.9688 1 1 +1 0 0 +1 0 0.03125 +1 0 0.0625 +1 0 0.09375 +1 0 0.125 +1 0 0.1562 +1 0 0.1875 +1 0 0.2188 +1 0 0.25 +1 0 0.2812 +1 0 0.3125 +1 0 0.3438 +1 0 0.375 +1 0 0.4062 +1 0 0.4375 +1 0 0.4688 +1 0 0.5 +1 0 0.5312 +1 0 0.5625 +1 0 0.5938 +1 0 0.625 +1 0 0.6562 +1 0 0.6875 +1 0 0.7188 +1 0 0.75 +1 0 0.7812 +1 0 0.8125 +1 0 0.8438 +1 0 0.875 +1 0 0.9062 +1 0 0.9375 +1 0 0.9688 +1 0 1 +1 0.03125 0 +1 0.03125 0.03125 +1 0.03125 0.0625 +1 0.03125 0.09375 +1 0.03125 0.125 +1 0.03125 0.1562 +1 0.03125 0.1875 +1 0.03125 0.2188 +1 0.03125 0.25 +1 0.03125 0.2812 +1 0.03125 0.3125 +1 0.03125 0.3438 +1 0.03125 0.375 +1 0.03125 0.4062 +1 0.03125 0.4375 +1 0.03125 0.4688 +1 0.03125 0.5 +1 0.03125 0.5312 +1 0.03125 0.5625 +1 0.03125 0.5938 +1 0.03125 0.625 +1 0.03125 0.6562 +1 0.03125 0.6875 +1 0.03125 0.7188 +1 0.03125 0.75 +1 0.03125 0.7812 +1 0.03125 0.8125 +1 0.03125 0.8438 +1 0.03125 0.875 +1 0.03125 0.9062 +1 0.03125 0.9375 +1 0.03125 0.9688 +1 0.03125 1 +1 0.0625 0 +1 0.0625 0.03125 +1 0.0625 0.0625 +1 0.0625 0.09375 +1 0.0625 0.125 +1 0.0625 0.1562 +1 0.0625 0.1875 +1 0.0625 0.2188 +1 0.0625 0.25 +1 0.0625 0.2812 +1 0.0625 0.3125 +1 0.0625 0.3438 +1 0.0625 0.375 +1 0.0625 0.4062 +1 0.0625 0.4375 +1 0.0625 0.4688 +1 0.0625 0.5 +1 0.0625 0.5312 +1 0.0625 0.5625 +1 0.0625 0.5938 +1 0.0625 0.625 +1 0.0625 0.6562 +1 0.0625 0.6875 +1 0.0625 0.7188 +1 0.0625 0.75 +1 0.0625 0.7812 +1 0.0625 0.8125 +1 0.0625 0.8438 +1 0.0625 0.875 +1 0.0625 0.9062 +1 0.0625 0.9375 +1 0.0625 0.9688 +1 0.0625 1 +1 0.09375 0 +1 0.09375 0.03125 +1 0.09375 0.0625 +1 0.09375 0.09375 +1 0.09375 0.125 +1 0.09375 0.1562 +1 0.09375 0.1875 +1 0.09375 0.2188 +1 0.09375 0.25 +1 0.09375 0.2812 +1 0.09375 0.3125 +1 0.09375 0.3438 +1 0.09375 0.375 +1 0.09375 0.4062 +1 0.09375 0.4375 +1 0.09375 0.4688 +1 0.09375 0.5 +1 0.09375 0.5312 +1 0.09375 0.5625 +1 0.09375 0.5938 +1 0.09375 0.625 +1 0.09375 0.6562 +1 0.09375 0.6875 +1 0.09375 0.7188 +1 0.09375 0.75 +1 0.09375 0.7812 +1 0.09375 0.8125 +1 0.09375 0.8438 +1 0.09375 0.875 +1 0.09375 0.9062 +1 0.09375 0.9375 +1 0.09375 0.9688 +1 0.09375 1 +1 0.125 0 +1 0.125 0.03125 +1 0.125 0.0625 +1 0.125 0.09375 +1 0.125 0.125 +1 0.125 0.1562 +1 0.125 0.1875 +1 0.125 0.2188 +1 0.125 0.25 +1 0.125 0.2812 +1 0.125 0.3125 +1 0.125 0.3438 +1 0.125 0.375 +1 0.125 0.4062 +1 0.125 0.4375 +1 0.125 0.4688 +1 0.125 0.5 +1 0.125 0.5312 +1 0.125 0.5625 +1 0.125 0.5938 +1 0.125 0.625 +1 0.125 0.6562 +1 0.125 0.6875 +1 0.125 0.7188 +1 0.125 0.75 +1 0.125 0.7812 +1 0.125 0.8125 +1 0.125 0.8438 +1 0.125 0.875 +1 0.125 0.9062 +1 0.125 0.9375 +1 0.125 0.9688 +1 0.125 1 +1 0.1562 0 +1 0.1562 0.03125 +1 0.1562 0.0625 +1 0.1562 0.09375 +1 0.1562 0.125 +1 0.1562 0.1562 +1 0.1562 0.1875 +1 0.1562 0.2188 +1 0.1562 0.25 +1 0.1562 0.2812 +1 0.1562 0.3125 +1 0.1562 0.3438 +1 0.1562 0.375 +1 0.1562 0.4062 +1 0.1562 0.4375 +1 0.1562 0.4688 +1 0.1562 0.5 +1 0.1562 0.5312 +1 0.1562 0.5625 +1 0.1562 0.5938 +1 0.1562 0.625 +1 0.1562 0.6562 +1 0.1562 0.6875 +1 0.1562 0.7188 +1 0.1562 0.75 +1 0.1562 0.7812 +1 0.1562 0.8125 +1 0.1562 0.8438 +1 0.1562 0.875 +1 0.1562 0.9062 +1 0.1562 0.9375 +1 0.1562 0.9688 +1 0.1562 1 +1 0.1875 0 +1 0.1875 0.03125 +1 0.1875 0.0625 +1 0.1875 0.09375 +1 0.1875 0.125 +1 0.1875 0.1562 +1 0.1875 0.1875 +1 0.1875 0.2188 +1 0.1875 0.25 +1 0.1875 0.2812 +1 0.1875 0.3125 +1 0.1875 0.3438 +1 0.1875 0.375 +1 0.1875 0.4062 +1 0.1875 0.4375 +1 0.1875 0.4688 +1 0.1875 0.5 +1 0.1875 0.5312 +1 0.1875 0.5625 +1 0.1875 0.5938 +1 0.1875 0.625 +1 0.1875 0.6562 +1 0.1875 0.6875 +1 0.1875 0.7188 +1 0.1875 0.75 +1 0.1875 0.7812 +1 0.1875 0.8125 +1 0.1875 0.8438 +1 0.1875 0.875 +1 0.1875 0.9062 +1 0.1875 0.9375 +1 0.1875 0.9688 +1 0.1875 1 +1 0.2188 0 +1 0.2188 0.03125 +1 0.2188 0.0625 +1 0.2188 0.09375 +1 0.2188 0.125 +1 0.2188 0.1562 +1 0.2188 0.1875 +1 0.2188 0.2188 +1 0.2188 0.25 +1 0.2188 0.2812 +1 0.2188 0.3125 +1 0.2188 0.3438 +1 0.2188 0.375 +1 0.2188 0.4062 +1 0.2188 0.4375 +1 0.2188 0.4688 +1 0.2188 0.5 +1 0.2188 0.5312 +1 0.2188 0.5625 +1 0.2188 0.5938 +1 0.2188 0.625 +1 0.2188 0.6562 +1 0.2188 0.6875 +1 0.2188 0.7188 +1 0.2188 0.75 +1 0.2188 0.7812 +1 0.2188 0.8125 +1 0.2188 0.8438 +1 0.2188 0.875 +1 0.2188 0.9062 +1 0.2188 0.9375 +1 0.2188 0.9688 +1 0.2188 1 +1 0.25 0 +1 0.25 0.03125 +1 0.25 0.0625 +1 0.25 0.09375 +1 0.25 0.125 +1 0.25 0.1562 +1 0.25 0.1875 +1 0.25 0.2188 +1 0.25 0.25 +1 0.25 0.2812 +1 0.25 0.3125 +1 0.25 0.3438 +1 0.25 0.375 +1 0.25 0.4062 +1 0.25 0.4375 +1 0.25 0.4688 +1 0.25 0.5 +1 0.25 0.5312 +1 0.25 0.5625 +1 0.25 0.5938 +1 0.25 0.625 +1 0.25 0.6562 +1 0.25 0.6875 +1 0.25 0.7188 +1 0.25 0.75 +1 0.25 0.7812 +1 0.25 0.8125 +1 0.25 0.8438 +1 0.25 0.875 +1 0.25 0.9062 +1 0.25 0.9375 +1 0.25 0.9688 +1 0.25 1 +1 0.2812 0 +1 0.2812 0.03125 +1 0.2812 0.0625 +1 0.2812 0.09375 +1 0.2812 0.125 +1 0.2812 0.1562 +1 0.2812 0.1875 +1 0.2812 0.2188 +1 0.2812 0.25 +1 0.2812 0.2812 +1 0.2812 0.3125 +1 0.2812 0.3438 +1 0.2812 0.375 +1 0.2812 0.4062 +1 0.2812 0.4375 +1 0.2812 0.4688 +1 0.2812 0.5 +1 0.2812 0.5312 +1 0.2812 0.5625 +1 0.2812 0.5938 +1 0.2812 0.625 +1 0.2812 0.6562 +1 0.2812 0.6875 +1 0.2812 0.7188 +1 0.2812 0.75 +1 0.2812 0.7812 +1 0.2812 0.8125 +1 0.2812 0.8438 +1 0.2812 0.875 +1 0.2812 0.9062 +1 0.2812 0.9375 +1 0.2812 0.9688 +1 0.2812 1 +1 0.3125 0 +1 0.3125 0.03125 +1 0.3125 0.0625 +1 0.3125 0.09375 +1 0.3125 0.125 +1 0.3125 0.1562 +1 0.3125 0.1875 +1 0.3125 0.2188 +1 0.3125 0.25 +1 0.3125 0.2812 +1 0.3125 0.3125 +1 0.3125 0.3438 +1 0.3125 0.375 +1 0.3125 0.4062 +1 0.3125 0.4375 +1 0.3125 0.4688 +1 0.3125 0.5 +1 0.3125 0.5312 +1 0.3125 0.5625 +1 0.3125 0.5938 +1 0.3125 0.625 +1 0.3125 0.6562 +1 0.3125 0.6875 +1 0.3125 0.7188 +1 0.3125 0.75 +1 0.3125 0.7812 +1 0.3125 0.8125 +1 0.3125 0.8438 +1 0.3125 0.875 +1 0.3125 0.9062 +1 0.3125 0.9375 +1 0.3125 0.9688 +1 0.3125 1 +1 0.3438 0 +1 0.3438 0.03125 +1 0.3438 0.0625 +1 0.3438 0.09375 +1 0.3438 0.125 +1 0.3438 0.1562 +1 0.3438 0.1875 +1 0.3438 0.2188 +1 0.3438 0.25 +1 0.3438 0.2812 +1 0.3438 0.3125 +1 0.3438 0.3438 +1 0.3438 0.375 +1 0.3438 0.4062 +1 0.3438 0.4375 +1 0.3438 0.4688 +1 0.3438 0.5 +1 0.3438 0.5312 +1 0.3438 0.5625 +1 0.3438 0.5938 +1 0.3438 0.625 +1 0.3438 0.6562 +1 0.3438 0.6875 +1 0.3438 0.7188 +1 0.3438 0.75 +1 0.3438 0.7812 +1 0.3438 0.8125 +1 0.3438 0.8438 +1 0.3438 0.875 +1 0.3438 0.9062 +1 0.3438 0.9375 +1 0.3438 0.9688 +1 0.3438 1 +1 0.375 0 +1 0.375 0.03125 +1 0.375 0.0625 +1 0.375 0.09375 +1 0.375 0.125 +1 0.375 0.1562 +1 0.375 0.1875 +1 0.375 0.2188 +1 0.375 0.25 +1 0.375 0.2812 +1 0.375 0.3125 +1 0.375 0.3438 +1 0.375 0.375 +1 0.375 0.4062 +1 0.375 0.4375 +1 0.375 0.4688 +1 0.375 0.5 +1 0.375 0.5312 +1 0.375 0.5625 +1 0.375 0.5938 +1 0.375 0.625 +1 0.375 0.6562 +1 0.375 0.6875 +1 0.375 0.7188 +1 0.375 0.75 +1 0.375 0.7812 +1 0.375 0.8125 +1 0.375 0.8438 +1 0.375 0.875 +1 0.375 0.9062 +1 0.375 0.9375 +1 0.375 0.9688 +1 0.375 1 +1 0.4062 0 +1 0.4062 0.03125 +1 0.4062 0.0625 +1 0.4062 0.09375 +1 0.4062 0.125 +1 0.4062 0.1562 +1 0.4062 0.1875 +1 0.4062 0.2188 +1 0.4062 0.25 +1 0.4062 0.2812 +1 0.4062 0.3125 +1 0.4062 0.3438 +1 0.4062 0.375 +1 0.4062 0.4062 +1 0.4062 0.4375 +1 0.4062 0.4688 +1 0.4062 0.5 +1 0.4062 0.5312 +1 0.4062 0.5625 +1 0.4062 0.5938 +1 0.4062 0.625 +1 0.4062 0.6562 +1 0.4062 0.6875 +1 0.4062 0.7188 +1 0.4062 0.75 +1 0.4062 0.7812 +1 0.4062 0.8125 +1 0.4062 0.8438 +1 0.4062 0.875 +1 0.4062 0.9062 +1 0.4062 0.9375 +1 0.4062 0.9688 +1 0.4062 1 +1 0.4375 0 +1 0.4375 0.03125 +1 0.4375 0.0625 +1 0.4375 0.09375 +1 0.4375 0.125 +1 0.4375 0.1562 +1 0.4375 0.1875 +1 0.4375 0.2188 +1 0.4375 0.25 +1 0.4375 0.2812 +1 0.4375 0.3125 +1 0.4375 0.3438 +1 0.4375 0.375 +1 0.4375 0.4062 +1 0.4375 0.4375 +1 0.4375 0.4688 +1 0.4375 0.5 +1 0.4375 0.5312 +1 0.4375 0.5625 +1 0.4375 0.5938 +1 0.4375 0.625 +1 0.4375 0.6562 +1 0.4375 0.6875 +1 0.4375 0.7188 +1 0.4375 0.75 +1 0.4375 0.7812 +1 0.4375 0.8125 +1 0.4375 0.8438 +1 0.4375 0.875 +1 0.4375 0.9062 +1 0.4375 0.9375 +1 0.4375 0.9688 +1 0.4375 1 +1 0.4688 0 +1 0.4688 0.03125 +1 0.4688 0.0625 +1 0.4688 0.09375 +1 0.4688 0.125 +1 0.4688 0.1562 +1 0.4688 0.1875 +1 0.4688 0.2188 +1 0.4688 0.25 +1 0.4688 0.2812 +1 0.4688 0.3125 +1 0.4688 0.3438 +1 0.4688 0.375 +1 0.4688 0.4062 +1 0.4688 0.4375 +1 0.4688 0.4688 +1 0.4688 0.5 +1 0.4688 0.5312 +1 0.4688 0.5625 +1 0.4688 0.5938 +1 0.4688 0.625 +1 0.4688 0.6562 +1 0.4688 0.6875 +1 0.4688 0.7188 +1 0.4688 0.75 +1 0.4688 0.7812 +1 0.4688 0.8125 +1 0.4688 0.8438 +1 0.4688 0.875 +1 0.4688 0.9062 +1 0.4688 0.9375 +1 0.4688 0.9688 +1 0.4688 1 +1 0.5 0 +1 0.5 0.03125 +1 0.5 0.0625 +1 0.5 0.09375 +1 0.5 0.125 +1 0.5 0.1562 +1 0.5 0.1875 +1 0.5 0.2188 +1 0.5 0.25 +1 0.5 0.2812 +1 0.5 0.3125 +1 0.5 0.3438 +1 0.5 0.375 +1 0.5 0.4062 +1 0.5 0.4375 +1 0.5 0.4688 +1 0.5 0.5 +1 0.5 0.5312 +1 0.5 0.5625 +1 0.5 0.5938 +1 0.5 0.625 +1 0.5 0.6562 +1 0.5 0.6875 +1 0.5 0.7188 +1 0.5 0.75 +1 0.5 0.7812 +1 0.5 0.8125 +1 0.5 0.8438 +1 0.5 0.875 +1 0.5 0.9062 +1 0.5 0.9375 +1 0.5 0.9688 +1 0.5 1 +1 0.5312 0 +1 0.5312 0.03125 +1 0.5312 0.0625 +1 0.5312 0.09375 +1 0.5312 0.125 +1 0.5312 0.1562 +1 0.5312 0.1875 +1 0.5312 0.2188 +1 0.5312 0.25 +1 0.5312 0.2812 +1 0.5312 0.3125 +1 0.5312 0.3438 +1 0.5312 0.375 +1 0.5312 0.4062 +1 0.5312 0.4375 +1 0.5312 0.4688 +1 0.5312 0.5 +1 0.5312 0.5312 +1 0.5312 0.5625 +1 0.5312 0.5938 +1 0.5312 0.625 +1 0.5312 0.6562 +1 0.5312 0.6875 +1 0.5312 0.7188 +1 0.5312 0.75 +1 0.5312 0.7812 +1 0.5312 0.8125 +1 0.5312 0.8438 +1 0.5312 0.875 +1 0.5312 0.9062 +1 0.5312 0.9375 +1 0.5312 0.9688 +1 0.5312 1 +1 0.5625 0 +1 0.5625 0.03125 +1 0.5625 0.0625 +1 0.5625 0.09375 +1 0.5625 0.125 +1 0.5625 0.1562 +1 0.5625 0.1875 +1 0.5625 0.2188 +1 0.5625 0.25 +1 0.5625 0.2812 +1 0.5625 0.3125 +1 0.5625 0.3438 +1 0.5625 0.375 +1 0.5625 0.4062 +1 0.5625 0.4375 +1 0.5625 0.4688 +1 0.5625 0.5 +1 0.5625 0.5312 +1 0.5625 0.5625 +1 0.5625 0.5938 +1 0.5625 0.625 +1 0.5625 0.6562 +1 0.5625 0.6875 +1 0.5625 0.7188 +1 0.5625 0.75 +1 0.5625 0.7812 +1 0.5625 0.8125 +1 0.5625 0.8438 +1 0.5625 0.875 +1 0.5625 0.9062 +1 0.5625 0.9375 +1 0.5625 0.9688 +1 0.5625 1 +1 0.5938 0 +1 0.5938 0.03125 +1 0.5938 0.0625 +1 0.5938 0.09375 +1 0.5938 0.125 +1 0.5938 0.1562 +1 0.5938 0.1875 +1 0.5938 0.2188 +1 0.5938 0.25 +1 0.5938 0.2812 +1 0.5938 0.3125 +1 0.5938 0.3438 +1 0.5938 0.375 +1 0.5938 0.4062 +1 0.5938 0.4375 +1 0.5938 0.4688 +1 0.5938 0.5 +1 0.5938 0.5312 +1 0.5938 0.5625 +1 0.5938 0.5938 +1 0.5938 0.625 +1 0.5938 0.6562 +1 0.5938 0.6875 +1 0.5938 0.7188 +1 0.5938 0.75 +1 0.5938 0.7812 +1 0.5938 0.8125 +1 0.5938 0.8438 +1 0.5938 0.875 +1 0.5938 0.9062 +1 0.5938 0.9375 +1 0.5938 0.9688 +1 0.5938 1 +1 0.625 0 +1 0.625 0.03125 +1 0.625 0.0625 +1 0.625 0.09375 +1 0.625 0.125 +1 0.625 0.1562 +1 0.625 0.1875 +1 0.625 0.2188 +1 0.625 0.25 +1 0.625 0.2812 +1 0.625 0.3125 +1 0.625 0.3438 +1 0.625 0.375 +1 0.625 0.4062 +1 0.625 0.4375 +1 0.625 0.4688 +1 0.625 0.5 +1 0.625 0.5312 +1 0.625 0.5625 +1 0.625 0.5938 +1 0.625 0.625 +1 0.625 0.6562 +1 0.625 0.6875 +1 0.625 0.7188 +1 0.625 0.75 +1 0.625 0.7812 +1 0.625 0.8125 +1 0.625 0.8438 +1 0.625 0.875 +1 0.625 0.9062 +1 0.625 0.9375 +1 0.625 0.9688 +1 0.625 1 +1 0.6562 0 +1 0.6562 0.03125 +1 0.6562 0.0625 +1 0.6562 0.09375 +1 0.6562 0.125 +1 0.6562 0.1562 +1 0.6562 0.1875 +1 0.6562 0.2188 +1 0.6562 0.25 +1 0.6562 0.2812 +1 0.6562 0.3125 +1 0.6562 0.3438 +1 0.6562 0.375 +1 0.6562 0.4062 +1 0.6562 0.4375 +1 0.6562 0.4688 +1 0.6562 0.5 +1 0.6562 0.5312 +1 0.6562 0.5625 +1 0.6562 0.5938 +1 0.6562 0.625 +1 0.6562 0.6562 +1 0.6562 0.6875 +1 0.6562 0.7188 +1 0.6562 0.75 +1 0.6562 0.7812 +1 0.6562 0.8125 +1 0.6562 0.8438 +1 0.6562 0.875 +1 0.6562 0.9062 +1 0.6562 0.9375 +1 0.6562 0.9688 +1 0.6562 1 +1 0.6875 0 +1 0.6875 0.03125 +1 0.6875 0.0625 +1 0.6875 0.09375 +1 0.6875 0.125 +1 0.6875 0.1562 +1 0.6875 0.1875 +1 0.6875 0.2188 +1 0.6875 0.25 +1 0.6875 0.2812 +1 0.6875 0.3125 +1 0.6875 0.3438 +1 0.6875 0.375 +1 0.6875 0.4062 +1 0.6875 0.4375 +1 0.6875 0.4688 +1 0.6875 0.5 +1 0.6875 0.5312 +1 0.6875 0.5625 +1 0.6875 0.5938 +1 0.6875 0.625 +1 0.6875 0.6562 +1 0.6875 0.6875 +1 0.6875 0.7188 +1 0.6875 0.75 +1 0.6875 0.7812 +1 0.6875 0.8125 +1 0.6875 0.8438 +1 0.6875 0.875 +1 0.6875 0.9062 +1 0.6875 0.9375 +1 0.6875 0.9688 +1 0.6875 1 +1 0.7188 0 +1 0.7188 0.03125 +1 0.7188 0.0625 +1 0.7188 0.09375 +1 0.7188 0.125 +1 0.7188 0.1562 +1 0.7188 0.1875 +1 0.7188 0.2188 +1 0.7188 0.25 +1 0.7188 0.2812 +1 0.7188 0.3125 +1 0.7188 0.3438 +1 0.7188 0.375 +1 0.7188 0.4062 +1 0.7188 0.4375 +1 0.7188 0.4688 +1 0.7188 0.5 +1 0.7188 0.5312 +1 0.7188 0.5625 +1 0.7188 0.5938 +1 0.7188 0.625 +1 0.7188 0.6562 +1 0.7188 0.6875 +1 0.7188 0.7188 +1 0.7188 0.75 +1 0.7188 0.7812 +1 0.7188 0.8125 +1 0.7188 0.8438 +1 0.7188 0.875 +1 0.7188 0.9062 +1 0.7188 0.9375 +1 0.7188 0.9688 +1 0.7188 1 +1 0.75 0 +1 0.75 0.03125 +1 0.75 0.0625 +1 0.75 0.09375 +1 0.75 0.125 +1 0.75 0.1562 +1 0.75 0.1875 +1 0.75 0.2188 +1 0.75 0.25 +1 0.75 0.2812 +1 0.75 0.3125 +1 0.75 0.3438 +1 0.75 0.375 +1 0.75 0.4062 +1 0.75 0.4375 +1 0.75 0.4688 +1 0.75 0.5 +1 0.75 0.5312 +1 0.75 0.5625 +1 0.75 0.5938 +1 0.75 0.625 +1 0.75 0.6562 +1 0.75 0.6875 +1 0.75 0.7188 +1 0.75 0.75 +1 0.75 0.7812 +1 0.75 0.8125 +1 0.75 0.8438 +1 0.75 0.875 +1 0.75 0.9062 +1 0.75 0.9375 +1 0.75 0.9688 +1 0.75 1 +1 0.7812 0 +1 0.7812 0.03125 +1 0.7812 0.0625 +1 0.7812 0.09375 +1 0.7812 0.125 +1 0.7812 0.1562 +1 0.7812 0.1875 +1 0.7812 0.2188 +1 0.7812 0.25 +1 0.7812 0.2812 +1 0.7812 0.3125 +1 0.7812 0.3438 +1 0.7812 0.375 +1 0.7812 0.4062 +1 0.7812 0.4375 +1 0.7812 0.4688 +1 0.7812 0.5 +1 0.7812 0.5312 +1 0.7812 0.5625 +1 0.7812 0.5938 +1 0.7812 0.625 +1 0.7812 0.6562 +1 0.7812 0.6875 +1 0.7812 0.7188 +1 0.7812 0.75 +1 0.7812 0.7812 +1 0.7812 0.8125 +1 0.7812 0.8438 +1 0.7812 0.875 +1 0.7812 0.9062 +1 0.7812 0.9375 +1 0.7812 0.9688 +1 0.7812 1 +1 0.8125 0 +1 0.8125 0.03125 +1 0.8125 0.0625 +1 0.8125 0.09375 +1 0.8125 0.125 +1 0.8125 0.1562 +1 0.8125 0.1875 +1 0.8125 0.2188 +1 0.8125 0.25 +1 0.8125 0.2812 +1 0.8125 0.3125 +1 0.8125 0.3438 +1 0.8125 0.375 +1 0.8125 0.4062 +1 0.8125 0.4375 +1 0.8125 0.4688 +1 0.8125 0.5 +1 0.8125 0.5312 +1 0.8125 0.5625 +1 0.8125 0.5938 +1 0.8125 0.625 +1 0.8125 0.6562 +1 0.8125 0.6875 +1 0.8125 0.7188 +1 0.8125 0.75 +1 0.8125 0.7812 +1 0.8125 0.8125 +1 0.8125 0.8438 +1 0.8125 0.875 +1 0.8125 0.9062 +1 0.8125 0.9375 +1 0.8125 0.9688 +1 0.8125 1 +1 0.8438 0 +1 0.8438 0.03125 +1 0.8438 0.0625 +1 0.8438 0.09375 +1 0.8438 0.125 +1 0.8438 0.1562 +1 0.8438 0.1875 +1 0.8438 0.2188 +1 0.8438 0.25 +1 0.8438 0.2812 +1 0.8438 0.3125 +1 0.8438 0.3438 +1 0.8438 0.375 +1 0.8438 0.4062 +1 0.8438 0.4375 +1 0.8438 0.4688 +1 0.8438 0.5 +1 0.8438 0.5312 +1 0.8438 0.5625 +1 0.8438 0.5938 +1 0.8438 0.625 +1 0.8438 0.6562 +1 0.8438 0.6875 +1 0.8438 0.7188 +1 0.8438 0.75 +1 0.8438 0.7812 +1 0.8438 0.8125 +1 0.8438 0.8438 +1 0.8438 0.875 +1 0.8438 0.9062 +1 0.8438 0.9375 +1 0.8438 0.9688 +1 0.8438 1 +1 0.875 0 +1 0.875 0.03125 +1 0.875 0.0625 +1 0.875 0.09375 +1 0.875 0.125 +1 0.875 0.1562 +1 0.875 0.1875 +1 0.875 0.2188 +1 0.875 0.25 +1 0.875 0.2812 +1 0.875 0.3125 +1 0.875 0.3438 +1 0.875 0.375 +1 0.875 0.4062 +1 0.875 0.4375 +1 0.875 0.4688 +1 0.875 0.5 +1 0.875 0.5312 +1 0.875 0.5625 +1 0.875 0.5938 +1 0.875 0.625 +1 0.875 0.6562 +1 0.875 0.6875 +1 0.875 0.7188 +1 0.875 0.75 +1 0.875 0.7812 +1 0.875 0.8125 +1 0.875 0.8438 +1 0.875 0.875 +1 0.875 0.9062 +1 0.875 0.9375 +1 0.875 0.9688 +1 0.875 1 +1 0.9062 0 +1 0.9062 0.03125 +1 0.9062 0.0625 +1 0.9062 0.09375 +1 0.9062 0.125 +1 0.9062 0.1562 +1 0.9062 0.1875 +1 0.9062 0.2188 +1 0.9062 0.25 +1 0.9062 0.2812 +1 0.9062 0.3125 +1 0.9062 0.3438 +1 0.9062 0.375 +1 0.9062 0.4062 +1 0.9062 0.4375 +1 0.9062 0.4688 +1 0.9062 0.5 +1 0.9062 0.5312 +1 0.9062 0.5625 +1 0.9062 0.5938 +1 0.9062 0.625 +1 0.9062 0.6562 +1 0.9062 0.6875 +1 0.9062 0.7188 +1 0.9062 0.75 +1 0.9062 0.7812 +1 0.9062 0.8125 +1 0.9062 0.8438 +1 0.9062 0.875 +1 0.9062 0.9062 +1 0.9062 0.9375 +1 0.9062 0.9688 +1 0.9062 1 +1 0.9375 0 +1 0.9375 0.03125 +1 0.9375 0.0625 +1 0.9375 0.09375 +1 0.9375 0.125 +1 0.9375 0.1562 +1 0.9375 0.1875 +1 0.9375 0.2188 +1 0.9375 0.25 +1 0.9375 0.2812 +1 0.9375 0.3125 +1 0.9375 0.3438 +1 0.9375 0.375 +1 0.9375 0.4062 +1 0.9375 0.4375 +1 0.9375 0.4688 +1 0.9375 0.5 +1 0.9375 0.5312 +1 0.9375 0.5625 +1 0.9375 0.5938 +1 0.9375 0.625 +1 0.9375 0.6562 +1 0.9375 0.6875 +1 0.9375 0.7188 +1 0.9375 0.75 +1 0.9375 0.7812 +1 0.9375 0.8125 +1 0.9375 0.8438 +1 0.9375 0.875 +1 0.9375 0.9062 +1 0.9375 0.9375 +1 0.9375 0.9688 +1 0.9375 1 +1 0.9688 0 +1 0.9688 0.03125 +1 0.9688 0.0625 +1 0.9688 0.09375 +1 0.9688 0.125 +1 0.9688 0.1562 +1 0.9688 0.1875 +1 0.9688 0.2188 +1 0.9688 0.25 +1 0.9688 0.2812 +1 0.9688 0.3125 +1 0.9688 0.3438 +1 0.9688 0.375 +1 0.9688 0.4062 +1 0.9688 0.4375 +1 0.9688 0.4688 +1 0.9688 0.5 +1 0.9688 0.5312 +1 0.9688 0.5625 +1 0.9688 0.5938 +1 0.9688 0.625 +1 0.9688 0.6562 +1 0.9688 0.6875 +1 0.9688 0.7188 +1 0.9688 0.75 +1 0.9688 0.7812 +1 0.9688 0.8125 +1 0.9688 0.8438 +1 0.9688 0.875 +1 0.9688 0.9062 +1 0.9688 0.9375 +1 0.9688 0.9688 +1 0.9688 1 +1 1 0 +1 1 0.03125 +1 1 0.0625 +1 1 0.09375 +1 1 0.125 +1 1 0.1562 +1 1 0.1875 +1 1 0.2188 +1 1 0.25 +1 1 0.2812 +1 1 0.3125 +1 1 0.3438 +1 1 0.375 +1 1 0.4062 +1 1 0.4375 +1 1 0.4688 +1 1 0.5 +1 1 0.5312 +1 1 0.5625 +1 1 0.5938 +1 1 0.625 +1 1 0.6562 +1 1 0.6875 +1 1 0.7188 +1 1 0.75 +1 1 0.7812 +1 1 0.8125 +1 1 0.8438 +1 1 0.875 +1 1 0.9062 +1 1 0.9375 +1 1 0.9688 +1 1 1 + + + + + Output Scaling - only used for full-range signals + 0.06256109481915934 + 0.91886608015640270 + 0. + 1. + + diff --git a/tests/data/files/clf/smpte_only/illegal/id_bad_value.clf b/tests/data/files/clf/smpte_only/illegal/id_bad_value.clf new file mode 100644 index 0000000000..fa425160e9 --- /dev/null +++ b/tests/data/files/clf/smpte_only/illegal/id_bad_value.clf @@ -0,0 +1,25 @@ + + + 3bae2da8 + The Id element does not adhere to the ST 2136-1 formatting. + CIE-XYZ D65 to CIELAB L*, a*, b* (scaled by 1/100, neutrals at 0.0 chroma) + CIE-XYZ, D65 white (scaled [0,1]) + CIELAB L*, a*, b* (scaled by 1/100, neutrals at 0.0 chroma) + + + 1.052126639 0.000000000 0.000000000 + 0.000000000 1.000000000 0.000000000 + 0.000000000 0.000000000 0.918224951 + + + + + + + + 0.00000000 1.00000000 0.00000000 + 4.31034483 -4.31034483 0.00000000 + 0.00000000 1.72413793 -1.72413793 + + + diff --git a/tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf b/tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf new file mode 100644 index 0000000000..eeea9dc8c6 --- /dev/null +++ b/tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf @@ -0,0 +1,11 @@ + + + The xmlns is newer than the max supported version. + + + 3.24000 -1.53700 -0.49850 +-0.96930 1.87600 0.04156 + 0.05560 -0.20400 1.05730 + + + \ No newline at end of file diff --git a/tests/data/files/clf/smpte_only/namespaces.clf b/tests/data/files/clf/smpte_only/namespaces.clf new file mode 100644 index 0000000000..54670bb8f7 --- /dev/null +++ b/tests/data/files/clf/smpte_only/namespaces.clf @@ -0,0 +1,14 @@ + + + + Example CLF file using namespaces. + + + A tiny 2-sample RGB LUT1D. + 0 0 0 1 1 1 + + diff --git a/tests/data/files/clf/tabulation_support.clf b/tests/data/files/clf/tabulation_support.clf index 0411ece76f..4d0c566d42 100644 --- a/tests/data/files/clf/tabulation_support.clf +++ b/tests/data/files/clf/tabulation_support.clf @@ -1,5 +1,5 @@ - + Test that tabs work as separators diff --git a/tests/data/files/clf/xyz_to_rgb.clf b/tests/data/files/clf/xyz_to_rgb.clf index 14cf13ddbc..dbe21b44c1 100644 --- a/tests/data/files/clf/xyz_to_rgb.clf +++ b/tests/data/files/clf/xyz_to_rgb.clf @@ -1,5 +1,5 @@ - + Example with a Matrix and Lut1D XYZ to sRGB matrix diff --git a/tests/data/files/process_list_conflicting_versions.ctf b/tests/data/files/process_list_conflicting_versions.ctf new file mode 100644 index 0000000000..820cf40430 --- /dev/null +++ b/tests/data/files/process_list_conflicting_versions.ctf @@ -0,0 +1,12 @@ + + + Not allowed to use the CLF / ST 2136-1 namespace in a CTF file. + + XYZ to sRGB matrix + + 3.24000 -1.53700 -0.49850 +-0.96930 1.87600 0.04156 + 0.05560 -0.20400 1.05730 + + + diff --git a/tests/data/files/reference_nested_2.ctf b/tests/data/files/reference_nested_2.ctf index b045d2e1d3..8bf9ba9e49 100644 --- a/tests/data/files/reference_nested_2.ctf +++ b/tests/data/files/reference_nested_2.ctf @@ -1,5 +1,5 @@ - + diff --git a/tests/data/files/reference_one_matrix.ctf b/tests/data/files/reference_one_matrix.ctf index de574c1399..4512d084bf 100644 --- a/tests/data/files/reference_one_matrix.ctf +++ b/tests/data/files/reference_one_matrix.ctf @@ -1,5 +1,5 @@ - + diff --git a/tests/data/files/references_same_twice.ctf b/tests/data/files/references_same_twice.ctf index 25b9036d02..29e2a666b9 100644 --- a/tests/data/files/references_same_twice.ctf +++ b/tests/data/files/references_same_twice.ctf @@ -1,5 +1,5 @@ - - + + diff --git a/tests/python/ConstantsTest.py b/tests/python/ConstantsTest.py index 852d6a9072..489e52f326 100644 --- a/tests/python/ConstantsTest.py +++ b/tests/python/ConstantsTest.py @@ -47,6 +47,7 @@ def test_string_constants(self): self.assertEqual(OCIO.METADATA_OUTPUT_DESCRIPTOR, 'OutputDescriptor') self.assertEqual(OCIO.METADATA_NAME, 'name') self.assertEqual(OCIO.METADATA_ID, 'id') + self.assertEqual(OCIO.METADATA_ID_ELEMENT, 'Id') # FileRules. self.assertEqual(OCIO.DEFAULT_RULE_NAME, 'Default') diff --git a/tests/python/GroupTransformTest.py b/tests/python/GroupTransformTest.py index 0b4e47da68..cf3820cb32 100644 --- a/tests/python/GroupTransformTest.py +++ b/tests/python/GroupTransformTest.py @@ -162,7 +162,7 @@ def test_write_clf(self): self.assertEqual(grp.write(formatName='Academy/ASC Common LUT Format', config=config), """ - + Sample clf file. Sample matrix. diff --git a/tests/python/ProcessorTest.py b/tests/python/ProcessorTest.py index 2a989333e6..59ee32df2d 100644 --- a/tests/python/ProcessorTest.py +++ b/tests/python/ProcessorTest.py @@ -50,7 +50,7 @@ def test_cache_id(self): # Make the transform dynamic. ec.makeContrastDynamic() p = cfg.getProcessor(ec) - self.assertEqual(p.getCacheID(), '818420192074e6466468d59c9ea38667') + self.assertEqual(p.getCacheID(), '6468d59c-9ea3-8667-8184-20192074e646') def test_create_group_transform(self): # Test createGroupTransform() function. diff --git a/tests/testutils/UnitTest.h b/tests/testutils/UnitTest.h index f9d69829b1..c66781e660 100644 --- a/tests/testutils/UnitTest.h +++ b/tests/testutils/UnitTest.h @@ -130,6 +130,9 @@ int UnitTestMain(int argc, const char ** argv); #define OCIO_CHECK_EQUAL(x,y) OCIO_CHECK_EQUAL_FROM(x,y,__LINE__) +#define OCIO_CHECK_EQUAL_STR(x,y) \ + OCIO_CHECK_EQUAL_FROM(std::string_view((x)), std::string_view((y)),__LINE__) + // When using OCIO_CHECK_EQUAL in an helper method used by one or more // unit tests, the error message indicates the helper method line number // and not the unit test line number. From e9c48718e8af4d381d6b9470acf96c9ac88b8a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Renaud-Houde?= Date: Wed, 4 Mar 2026 20:27:24 -0500 Subject: [PATCH 18/37] Fix vector comparison expression for HLSL. (#2270) Signed-off-by: Eric Renaud-Houde --- src/OpenColorIO/GpuShaderUtils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenColorIO/GpuShaderUtils.cpp b/src/OpenColorIO/GpuShaderUtils.cpp index fa1ca43fb2..3f8e158e48 100644 --- a/src/OpenColorIO/GpuShaderUtils.cpp +++ b/src/OpenColorIO/GpuShaderUtils.cpp @@ -482,7 +482,8 @@ std::string GpuShaderText::declareVarStr(const std::string & name, float v) std::string GpuShaderText::vectorCompareExpression(const std::string& lhs, const std::string& op, const std::string& rhs) { std::string ret = lhs + " " + op + " " + rhs; - if(m_lang == GPU_LANGUAGE_MSL_2_0) + // MSL and HLSL do not allow vector bool in if-conditions: wrap with any(). + if(m_lang == GPU_LANGUAGE_MSL_2_0 || m_lang == GPU_LANGUAGE_HLSL_SM_5_0) { ret = "any( " + ret + " )"; } From 0773c267f171aa8b135d52442c80fa5eedb15124 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 4 Mar 2026 21:46:47 -0500 Subject: [PATCH 19/37] Increment lib version to 2.6.0 dev (#2266) Signed-off-by: Doug Walker --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ad6d3c8a7..0b1fce3398 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,7 @@ endif() # Project definition. project(OpenColorIO - VERSION 2.5.0 + VERSION 2.6.0 DESCRIPTION "OpenColorIO (OCIO) is a complete color management solution" HOMEPAGE_URL https://github.com/AcademySoftwareFoundation/OpenColorIO LANGUAGES CXX C) From d9eb50cca5cf2812c60ffdff3c6e3c81766a93da Mon Sep 17 00:00:00 2001 From: PenneLee Date: Wed, 4 Mar 2026 19:27:17 -0800 Subject: [PATCH 20/37] Alpha channel should be 1 by default, rather than 0 (#2197) * For CPU processor, when source has no alpha make it default to 1. Signed-off-by: pylee * Fix alpha channel for integer types. Signed-off-by: pylee * Fix max alpha value to be from input bitdepth not output. Signed-off-by: pylee * Forgot to update ImagePacking.h Signed-off-by: pylee * Remove the unused inputBitDepth name causing compiler error. Signed-off-by: pylee * Update src/OpenColorIO/ImagePacking.cpp Co-authored-by: Cuneyt Ozdas Signed-off-by: PenneLee --------- Signed-off-by: pylee Signed-off-by: PenneLee Co-authored-by: Cuneyt Ozdas Co-authored-by: Doug Walker --- src/OpenColorIO/ImagePacking.cpp | 18 ++++++++---- src/OpenColorIO/ImagePacking.h | 3 +- src/OpenColorIO/ScanlineHelper.cpp | 3 +- tests/cpu/CPUProcessor_tests.cpp | 46 +++++++++++++++--------------- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/OpenColorIO/ImagePacking.cpp b/src/OpenColorIO/ImagePacking.cpp index 3c24c9a58f..4fb185ec2a 100644 --- a/src/OpenColorIO/ImagePacking.cpp +++ b/src/OpenColorIO/ImagePacking.cpp @@ -23,7 +23,8 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, Type * inBitDepthBuffer, float * outputBuffer, int outputBufferSize, - long imagePixelStartIndex) + long imagePixelStartIndex, + BitDepth inputBitDepth) { if(outputBuffer==nullptr) { @@ -62,15 +63,21 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, aPtr = reinterpret_cast(aRow + xStrideBytes*xIndex); } + float maxValue = static_cast(GetBitDepthMaxValue(inputBitDepth)); + if (maxValue <= 0) + { + throw Exception("Invalid bit depth max value."); + } + // Process one single, complete scanline. int pixelsCopied = 0; while(pixelsCopied < outputBufferSize) - { + { // Reorder channels from arbitrary channel ordering to RGBA 32-bit float. inBitDepthBuffer[4*pixelsCopied+0] = *rPtr; inBitDepthBuffer[4*pixelsCopied+1] = *gPtr; inBitDepthBuffer[4*pixelsCopied+2] = *bPtr; - inBitDepthBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : (Type)0.0f; + inBitDepthBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : (Type)(maxValue); pixelsCopied++; xIndex++; @@ -93,7 +100,8 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, float * /*inBitDepthBuffer*/, float * outputBuffer, int outputBufferSize, - long imagePixelStartIndex) + long imagePixelStartIndex, + BitDepth /*inputBitDepth*/) { if(outputBuffer==nullptr) { @@ -140,7 +148,7 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, outputBuffer[4*pixelsCopied+0] = *rPtr; outputBuffer[4*pixelsCopied+1] = *gPtr; outputBuffer[4*pixelsCopied+2] = *bPtr; - outputBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : 0.0f; + outputBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : 1.0f; pixelsCopied++; xIndex++; diff --git a/src/OpenColorIO/ImagePacking.h b/src/OpenColorIO/ImagePacking.h index 578bb997ef..42c3db8dc4 100644 --- a/src/OpenColorIO/ImagePacking.h +++ b/src/OpenColorIO/ImagePacking.h @@ -53,7 +53,8 @@ struct Generic Type * inBitDepthBuffer, float * outputBuffer, int outputBufferSize, - long imagePixelStartIndex); + long imagePixelStartIndex, + BitDepth inputBitDepth); static void UnpackRGBAToImageDesc(GenericImageDesc & dstImg, float * inputBuffer, diff --git a/src/OpenColorIO/ScanlineHelper.cpp b/src/OpenColorIO/ScanlineHelper.cpp index 59a0020a5e..aaa985fa35 100644 --- a/src/OpenColorIO/ScanlineHelper.cpp +++ b/src/OpenColorIO/ScanlineHelper.cpp @@ -143,7 +143,8 @@ void GenericScanlineHelper::prepRGBAScanline(float** buffer, lo &m_inBitDepthBuffer[0], *buffer, m_dstImg.m_width, - m_yIndex * m_dstImg.m_width); + m_yIndex * m_dstImg.m_width, + m_inputBitDepth); } numPixels = m_dstImg.m_width; diff --git a/tests/cpu/CPUProcessor_tests.cpp b/tests/cpu/CPUProcessor_tests.cpp index 925a75397c..e7f37912cc 100644 --- a/tests/cpu/CPUProcessor_tests.cpp +++ b/tests/cpu/CPUProcessor_tests.cpp @@ -276,9 +276,9 @@ OCIO_ADD_TEST(CPUProcessor, with_one_matrix) 1.0000f, 1.2500f, 1.9900f }; const std::vector resImg - = { -0.01929f, -0.3995f, 0.4002f, 0.5f, - 1.58960f, 0.9050f, 1.5025f, 0.5f, - 2.070699f, 1.6505f, 2.4002f, 0.5f }; + = { -0.01929f, -0.3995f, 0.4002f, 1.5f, + 1.58960f, 0.9050f, 1.5025f, 1.5f, + 2.070699f, 1.6505f, 2.4002f, 1.5f }; ComputeValues( __LINE__, processor, @@ -620,10 +620,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) 5120, 20480, 65535 }; const std::vector resImg - = { 95, 24, 0, 0, - 268, 178, 123, 0, - 955, 598, 394, 0, - 65535, 8589, 1986, 0 }; + = { 95, 24, 0, 65535, + 268, 178, 123, 65535, + 955, 598, 394, 65535, + 65535, 8589, 1986, 65535 }; ComputeValues( __LINE__, processor, @@ -656,10 +656,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) 128, 1023, 640 }; const std::vector ui10_resImg - = { 0, 6, 15, 0, - 26, 48, 106, 0, - 36, 106, 252, 0, - 48, 1023, 384, 0 }; + = { 0, 6, 15, 1023, + 26, 48, 106, 1023, + 36, 106, 252, 1023, + 48, 1023, 384, 1023 }; ComputeValues( __LINE__, processor, @@ -668,10 +668,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) NB_PIXELS); const std::vector ui16_resImg - = { 0, 394, 955, 0, - 1656, 3092, 6794, 0, - 2301, 6794, 16162, 0, - 3092, 65535, 24593, 0 }; + = { 0, 394, 955, 65535, + 1656, 3092, 6794, 65535, + 2301, 6794, 16162, 65535, + 3092, 65535, 24593, 65535 }; ComputeValues( __LINE__, processor, @@ -704,10 +704,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) 1024, 2048, 4095 }; const std::vector ui12_resImg - = { 0, 11, 25, 0, - 37, 60, 103, 0, - 49, 103, 193, 0, - 424, 1009, 4095, 0 }; + = { 0, 11, 25, 4095, + 37, 60, 103, 4095, + 49, 103, 193, 4095, + 424, 1009, 4095, 4095 }; ComputeValues( __LINE__, processor, @@ -715,10 +715,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) &ui12_resImg[0], OCIO::CHANNEL_ORDERING_RGBA, NB_PIXELS); const std::vector ui16_resImg - = { 0, 178, 394, 0, - 598, 955, 1655, 0, - 779, 1655, 3089, 0, - 6789, 16143, 65535, 0 }; + = { 0, 178, 394, 65535, + 598, 955, 1655, 65535, + 779, 1655, 3089, 65535, + 6789, 16143, 65535, 65535 }; ComputeValues( __LINE__, processor, From c7612d102a60a5907c99275a68c01e0c14cd20a3 Mon Sep 17 00:00:00 2001 From: Pavan Madduri Date: Wed, 25 Mar 2026 19:04:35 -0500 Subject: [PATCH 21/37] gpu: Add Vulkan unit test framework (#2243) * Add release signing workflow using Sigstore (#2229) This adds a GitHub Actions workflow that signs release artifacts using Sigstore, following the OpenSSF Best Practices Badge recommendations. The workflow is triggered on release publication and: 1. Creates a .tar.gz archive of the source tree 2. Signs the archive using sigstore/gh-action-sigstore-python 3. Uploads both the tarball and .sigstore.json credential bundle Based on the OpenEXR release-sign.yml workflow template. Closes #2034 Signed-off-by: pmady Co-authored-by: Doug Walker Signed-off-by: pmady * gpu: Add Vulkan unit test framework Add initial Vulkan support for GPU unit testing in OpenColorIO. This commit introduces: - vulkanapp.h/cpp: Headless Vulkan rendering framework for GPU tests - CMakeLists.txt updates: Conditional Vulkan build support with OCIO_VULKAN_ENABLED - GPUUnitTest.cpp: --vulkan flag to run tests with Vulkan renderer The Vulkan implementation uses compute shaders for color processing, similar to the existing OpenGL and Metal implementations. It supports headless rendering suitable for CI environments. Note: GLSL to SPIR-V compilation requires linking against glslang or shaderc library (marked as TODO in the implementation). Issue Number: close #2209 Signed-off-by: pmady * gpu: Implement GLSL to SPIR-V compilation using glslang Add glslang library dependency for runtime GLSL to SPIR-V compilation in the Vulkan unit test framework. This enables the Vulkan GPU tests to actually run by compiling OCIO-generated GLSL shaders to SPIR-V. Changes: - CMakeLists.txt: Add find_package(glslang) and link glslang libraries - vulkanapp.cpp: Implement compileGLSLToSPIRV() using glslang API The implementation: - Initializes glslang process (thread-safe, one-time init) - Configures Vulkan 1.2 / SPIR-V 1.5 target environment - Parses GLSL compute shader source - Links shader program - Generates optimized SPIR-V bytecode Signed-off-by: pmady * docs: Add comprehensive Vulkan testing guides for PR #2243 Add detailed testing documentation to help reviewers and contributors test the Vulkan unit test framework locally. Files added: - VULKAN_TESTING_GUIDE.md: Comprehensive guide with installation instructions for macOS, Linux, and Windows, build configuration, troubleshooting, and platform-specific notes - QUICK_TEST_STEPS.md: Quick reference guide with fast-track installation and testing steps for each platform These guides address the request from @doug-walker to provide instructions for installing Vulkan SDK and glslang dependencies needed to test the Vulkan branch locally. Signed-off-by: pmady * Remove testing guide files - will provide as PR comment instead Signed-off-by: pmady * fix: Change Vulkan CMake definitions from PRIVATE to PUBLIC Address feedback from @doug-walker regarding build issues: - Change target_include_directories from PRIVATE to PUBLIC - Change target_link_libraries from PRIVATE to PUBLIC - Change target_compile_definitions from PRIVATE to PUBLIC This allows dependent targets (like test_gpu_exec) to properly access the OCIO_VULKAN_ENABLED definition and Vulkan libraries. Signed-off-by: pmady * fix: Add MoltenVK portability extension for macOS Add VK_KHR_PORTABILITY_ENUMERATION extension and flag for macOS to enable Vulkan instance creation with MoltenVK. Signed-off-by: pmady * feat: Integrate Vulkan test framework into GPU unit tests Complete Vulkan test integration for OpenColorIO GPU unit tests: - Add Vulkan-specific helper functions in GPUUnitTest.cpp: - AllocateImageTexture for VulkanApp - UpdateImageTexture for VulkanApp - UpdateOCIOVulkanState for VulkanApp - ValidateImageTexture for VulkanApp - Wire VulkanApp into test execution loop with proper branching - Fix VulkanApp initialization: - Add MoltenVK portability extension for macOS - Add bounds checking in compute shader - Fix cleanup order to destroy VulkanBuilder before device - Fix CMake: Change PRIVATE to PUBLIC for Vulkan definitions Test Results (macOS with MoltenVK): - 155 tests PASSED (all non-LUT operations) - 108 tests FAILED (LUT1D/LUT3D - require texture sampler support) The LUT tests fail because 3D texture sampler support is not yet implemented in VulkanBuilder. This is a known limitation that requires additional work to implement texture allocation and descriptor set updates for LUT textures. Signed-off-by: pmady * Add Vulkan uniform buffer and LUT texture support - Implement VulkanBuilder uniform buffer creation and update for dynamic parameters - Add 3D LUT texture allocation with RGBA format (RGB32F not supported on MoltenVK) - Add 1D/2D LUT texture allocation with proper format handling - Fix shader generation to use correct descriptor bindings for textures and uniforms - Add std140 layout qualifier to OCIO uniform blocks - Update descriptor set layout and pool sizes to include uniforms and textures - Call updateUniforms() before each dispatch for dynamic parameter updates Test results: 216/263 tests pass (82%) Remaining failures are complex uniform blocks with vec3 types that need additional std140 alignment handling. Signed-off-by: pmady * Fix Vulkan uniform buffer layout and 1D texture handling - Use OCIO's getUniformBufferSize() and m_bufferOffset for correct std140 layout - Write array data with 16-byte stride per element (std140 requirement) - Add std140 layout qualifier to uniform blocks in shader generation - Disable 1D textures for Vulkan (use 2D instead) for MoltenVK compatibility - Add better exception handling in GPU unit tests for debugging This fixes 108 additional Vulkan GPU tests, bringing the pass rate from 155/263 (59%) to 260/263 (98.9%). The 3 remaining failures are ACES2 precision-sensitive edge cases that may need Vulkan-specific tolerance adjustments. Signed-off-by: pmady * Use OCIO's getTextureShaderBindingIndex API for Vulkan texture bindings - Remove manual sampler declarations in buildShader(), use OCIO-generated ones - Configure shader descriptor with setDescriptorSetIndex(0, 2) for Vulkan to start texture bindings at 2 (after input/output storage buffers) - Use get3DTextureShaderBindingIndex() and getTextureShaderBindingIndex() for correct texture binding indices - Add GPU diagnostic output to verify MoltenVK uses actual GPU hardware This addresses review feedback from PR #2243 to use the new texture binding API added in OCIO 2.5.1 (PR #2226) instead of manually declaring samplers. Test results: 260/263 tests pass (98.9%) Remaining 3 failures are ACES2 precision-sensitive edge cases. GPU confirmed: Apple M2 Pro (Integrated GPU), not CPU emulation. Signed-off-by: pmady * Address PR review comments for Vulkan unit test framework - Fix switch warning by explicitly handling VK_PHYSICAL_DEVICE_TYPE_OTHER and VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM cases - Fix unused format parameter warning in transitionImageLayout - Move input/output buffers to high bindings (100, 101) to avoid conflicts with OCIO's uniform binding at 0, eliminating need to edit shader text - Refactor GPUUnitTest.cpp to share code between GL and Vulkan: - Extract PrepareInputValues helper for UpdateImageTexture - Extract ValidateResults and ValidateImageTextureImpl template for ValidateImageTexture - Preserve Mac ARM ifdef for NaN/Infinity test disabling in Vulkan path - Update texture binding start to 1 (was 2) since binding 0 is now used for OCIO uniforms Signed-off-by: pmady * Address PR review: use consecutive bindings and increase tolerances - Change input/output buffer bindings from 100/101 to 1/2 - Update setDescriptorSetIndex(0, 3) so textures start at binding 3 - Increase test tolerances as requested: - Test 39 (line 306): 3e-6f -> 3e-5f - Test 49 (line 659): 0.018f -> 0.019f - Test 51 (line 696): 0.03f -> 0.032f - Update comments to reflect the new binding strategy Signed-off-by: pmady --------- Signed-off-by: pmady Co-authored-by: Doug Walker --- src/libutils/oglapphelpers/CMakeLists.txt | 33 + src/libutils/oglapphelpers/vulkanapp.cpp | 1551 +++++++++++++++++++++ src/libutils/oglapphelpers/vulkanapp.h | 274 ++++ tests/gpu/FixedFunctionOp_test.cpp | 6 +- tests/gpu/GPUUnitTest.cpp | 335 +++-- 5 files changed, 2113 insertions(+), 86 deletions(-) create mode 100644 src/libutils/oglapphelpers/vulkanapp.cpp create mode 100644 src/libutils/oglapphelpers/vulkanapp.h diff --git a/src/libutils/oglapphelpers/CMakeLists.txt b/src/libutils/oglapphelpers/CMakeLists.txt index cef50ede1c..207caf8497 100644 --- a/src/libutils/oglapphelpers/CMakeLists.txt +++ b/src/libutils/oglapphelpers/CMakeLists.txt @@ -31,6 +31,21 @@ if(APPLE) endif() +if(OCIO_VULKAN_ENABLED) + + find_package(Vulkan REQUIRED) + find_package(glslang REQUIRED) + + list(APPEND SOURCES + vulkanapp.cpp + ) + + list(APPEND INCLUDES + vulkanapp.h + ) + +endif() + add_library(oglapphelpers STATIC ${SOURCES}) set_target_properties(oglapphelpers PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(oglapphelpers PROPERTIES OUTPUT_NAME OpenColorIOoglapphelpers) @@ -111,6 +126,24 @@ if(APPLE) ) endif() +if(OCIO_VULKAN_ENABLED) + target_include_directories(oglapphelpers + PUBLIC + ${Vulkan_INCLUDE_DIRS} + ) + target_link_libraries(oglapphelpers + PUBLIC + Vulkan::Vulkan + glslang::glslang + glslang::glslang-default-resource-limits + glslang::SPIRV + ) + target_compile_definitions(oglapphelpers + PUBLIC + OCIO_VULKAN_ENABLED + ) +endif() + if(${OCIO_EGL_HEADLESS}) target_include_directories(oglapphelpers PRIVATE diff --git a/src/libutils/oglapphelpers/vulkanapp.cpp b/src/libutils/oglapphelpers/vulkanapp.cpp new file mode 100644 index 0000000000..ef4c4230a7 --- /dev/null +++ b/src/libutils/oglapphelpers/vulkanapp.cpp @@ -0,0 +1,1551 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifdef OCIO_VULKAN_ENABLED + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "vulkanapp.h" + +namespace OCIO_NAMESPACE +{ + +// +// VulkanApp Implementation +// + +VulkanApp::VulkanApp(int bufWidth, int bufHeight) + : m_bufferWidth(bufWidth) + , m_bufferHeight(bufHeight) +{ + initVulkan(); +} + +VulkanApp::~VulkanApp() +{ + cleanup(); +} + +void VulkanApp::initVulkan() +{ + // Create Vulkan instance + VkApplicationInfo appInfo{}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pApplicationName = "OCIO GPU Test"; + appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.pEngineName = "OCIO"; + appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.apiVersion = VK_API_VERSION_1_2; + + VkInstanceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + createInfo.pApplicationInfo = &appInfo; + + // Required extensions for MoltenVK on macOS + std::vector extensions; +#ifdef __APPLE__ + extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; +#endif + + createInfo.enabledExtensionCount = static_cast(extensions.size()); + createInfo.ppEnabledExtensionNames = extensions.data(); + + if (m_enableValidationLayers) + { + createInfo.enabledLayerCount = static_cast(m_validationLayers.size()); + createInfo.ppEnabledLayerNames = m_validationLayers.data(); + } + else + { + createInfo.enabledLayerCount = 0; + } + + if (vkCreateInstance(&createInfo, nullptr, &m_instance) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create Vulkan instance"); + } + + // Select physical device + uint32_t deviceCount = 0; + vkEnumeratePhysicalDevices(m_instance, &deviceCount, nullptr); + + if (deviceCount == 0) + { + throw std::runtime_error("Failed to find GPUs with Vulkan support"); + } + + std::vector devices(deviceCount); + vkEnumeratePhysicalDevices(m_instance, &deviceCount, devices.data()); + + // Find a device with compute queue support + for (const auto & device : devices) + { + uint32_t queueFamilyCount = 0; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); + + std::vector queueFamilies(queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); + + for (uint32_t i = 0; i < queueFamilyCount; i++) + { + if (queueFamilies[i].queueFlags & VK_QUEUE_COMPUTE_BIT) + { + m_physicalDevice = device; + m_computeQueueFamilyIndex = i; + break; + } + } + + if (m_physicalDevice != VK_NULL_HANDLE) + { + break; + } + } + + if (m_physicalDevice == VK_NULL_HANDLE) + { + throw std::runtime_error("Failed to find a suitable GPU with compute support"); + } + + // Print GPU information for diagnostics + VkPhysicalDeviceProperties deviceProperties; + vkGetPhysicalDeviceProperties(m_physicalDevice, &deviceProperties); + std::cout << "Vulkan GPU: " << deviceProperties.deviceName << std::endl; + std::cout << " Device Type: "; + switch (deviceProperties.deviceType) + { + case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: std::cout << "Discrete GPU"; break; + case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: std::cout << "Integrated GPU"; break; + case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: std::cout << "Virtual GPU"; break; + case VK_PHYSICAL_DEVICE_TYPE_CPU: std::cout << "CPU (Software)"; break; + case VK_PHYSICAL_DEVICE_TYPE_OTHER: + case VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM: + default: std::cout << "Other"; break; + } + std::cout << std::endl; + std::cout << " API Version: " << VK_VERSION_MAJOR(deviceProperties.apiVersion) << "." + << VK_VERSION_MINOR(deviceProperties.apiVersion) << "." + << VK_VERSION_PATCH(deviceProperties.apiVersion) << std::endl; + + // Create logical device + float queuePriority = 1.0f; + VkDeviceQueueCreateInfo queueCreateInfo{}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = m_computeQueueFamilyIndex; + queueCreateInfo.queueCount = 1; + queueCreateInfo.pQueuePriorities = &queuePriority; + + VkPhysicalDeviceFeatures deviceFeatures{}; + + VkDeviceCreateInfo deviceCreateInfo{}; + deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; + deviceCreateInfo.queueCreateInfoCount = 1; + deviceCreateInfo.pEnabledFeatures = &deviceFeatures; + deviceCreateInfo.enabledExtensionCount = 0; + + if (m_enableValidationLayers) + { + deviceCreateInfo.enabledLayerCount = static_cast(m_validationLayers.size()); + deviceCreateInfo.ppEnabledLayerNames = m_validationLayers.data(); + } + else + { + deviceCreateInfo.enabledLayerCount = 0; + } + + if (vkCreateDevice(m_physicalDevice, &deviceCreateInfo, nullptr, &m_device) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create logical device"); + } + + vkGetDeviceQueue(m_device, m_computeQueueFamilyIndex, 0, &m_computeQueue); + + // Create command pool + VkCommandPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + poolInfo.queueFamilyIndex = m_computeQueueFamilyIndex; + poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + + if (vkCreateCommandPool(m_device, &poolInfo, nullptr, &m_commandPool) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create command pool"); + } + + // Allocate command buffer + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.commandPool = m_commandPool; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandBufferCount = 1; + + if (vkAllocateCommandBuffers(m_device, &allocInfo, &m_commandBuffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate command buffer"); + } + + m_initialized = true; +} + +void VulkanApp::cleanup() +{ + if (m_device != VK_NULL_HANDLE) + { + vkDeviceWaitIdle(m_device); + + // Destroy VulkanBuilder first (it holds shader module references) + m_vulkanBuilder.reset(); + + if (m_computePipeline != VK_NULL_HANDLE) + { + vkDestroyPipeline(m_device, m_computePipeline, nullptr); + } + if (m_pipelineLayout != VK_NULL_HANDLE) + { + vkDestroyPipelineLayout(m_device, m_pipelineLayout, nullptr); + } + if (m_descriptorSetLayout != VK_NULL_HANDLE) + { + vkDestroyDescriptorSetLayout(m_device, m_descriptorSetLayout, nullptr); + } + if (m_descriptorPool != VK_NULL_HANDLE) + { + vkDestroyDescriptorPool(m_device, m_descriptorPool, nullptr); + } + if (m_computeShaderModule != VK_NULL_HANDLE) + { + vkDestroyShaderModule(m_device, m_computeShaderModule, nullptr); + } + + if (m_inputBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_inputBuffer, nullptr); + } + if (m_inputBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_inputBufferMemory, nullptr); + } + if (m_outputBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_outputBuffer, nullptr); + } + if (m_outputBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_outputBufferMemory, nullptr); + } + if (m_stagingBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_stagingBuffer, nullptr); + } + if (m_stagingBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_stagingBufferMemory, nullptr); + } + + if (m_commandPool != VK_NULL_HANDLE) + { + vkDestroyCommandPool(m_device, m_commandPool, nullptr); + } + + vkDestroyDevice(m_device, nullptr); + } + + if (m_instance != VK_NULL_HANDLE) + { + vkDestroyInstance(m_instance, nullptr); + } +} + +uint32_t VulkanApp::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) +{ + VkPhysicalDeviceMemoryProperties memProperties; + vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &memProperties); + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) + { + if ((typeFilter & (1 << i)) && + (memProperties.memoryTypes[i].propertyFlags & properties) == properties) + { + return i; + } + } + + throw std::runtime_error("Failed to find suitable memory type"); +} + +void VulkanApp::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, + VkMemoryPropertyFlags properties, VkBuffer & buffer, + VkDeviceMemory & bufferMemory) +{ + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = size; + bufferInfo.usage = usage; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateBuffer(m_device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create buffer"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, buffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); + + if (vkAllocateMemory(m_device, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate buffer memory"); + } + + vkBindBufferMemory(m_device, buffer, bufferMemory, 0); +} + +void VulkanApp::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) +{ + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(m_commandBuffer, &beginInfo); + + VkBufferCopy copyRegion{}; + copyRegion.size = size; + vkCmdCopyBuffer(m_commandBuffer, srcBuffer, dstBuffer, 1, ©Region); + + vkEndCommandBuffer(m_commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &m_commandBuffer; + + vkQueueSubmit(m_computeQueue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_computeQueue); + + vkResetCommandBuffer(m_commandBuffer, 0); +} + +void VulkanApp::initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer) +{ + m_imageWidth = imageWidth; + m_imageHeight = imageHeight; + m_components = comp; + + createBuffers(); + updateImage(imageBuffer); +} + +void VulkanApp::createBuffers() +{ + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + // Create staging buffer (CPU accessible) + createBuffer(bufferSize, + VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + m_stagingBuffer, m_stagingBufferMemory); + + // Create input buffer (GPU only) + createBuffer(bufferSize, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + m_inputBuffer, m_inputBufferMemory); + + // Create output buffer (GPU only) + createBuffer(bufferSize, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + m_outputBuffer, m_outputBufferMemory); +} + +void VulkanApp::updateImage(const float * imageBuffer) +{ + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + // Copy data to staging buffer + void * data; + vkMapMemory(m_device, m_stagingBufferMemory, 0, bufferSize, 0, &data); + memcpy(data, imageBuffer, static_cast(bufferSize)); + vkUnmapMemory(m_device, m_stagingBufferMemory); + + // Copy from staging to input buffer + copyBuffer(m_stagingBuffer, m_inputBuffer, bufferSize); +} + +void VulkanApp::setShader(GpuShaderDescRcPtr & shaderDesc) +{ + if (!m_vulkanBuilder) + { + m_vulkanBuilder = std::make_shared(m_device, m_physicalDevice, + m_commandPool, m_computeQueue); + } + + // Allocate textures and uniforms before building shader + m_vulkanBuilder->allocateAllTextures(shaderDesc); + m_vulkanBuilder->buildShader(shaderDesc); + + if (m_printShader) + { + std::cout << "Vulkan Compute Shader:\n" << m_vulkanBuilder->getShaderSource() << std::endl; + } + + createComputePipeline(); +} + +void VulkanApp::createComputePipeline() +{ + // Create descriptor set layout + // Use bindings 1 and 2 for input/output buffers + // OCIO uses binding 0 for uniforms and 3+ for textures (via setDescriptorSetIndex(0, 3)) + std::vector bindings = { + // Input buffer binding + {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr}, + // Output buffer binding + {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr} + }; + + // Add texture and uniform bindings from shader builder + auto textureBindings = m_vulkanBuilder->getDescriptorSetLayoutBindings(); + bindings.insert(bindings.end(), textureBindings.begin(), textureBindings.end()); + + VkDescriptorSetLayoutCreateInfo layoutInfo{}; + layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + layoutInfo.bindingCount = static_cast(bindings.size()); + layoutInfo.pBindings = bindings.data(); + + if (vkCreateDescriptorSetLayout(m_device, &layoutInfo, nullptr, &m_descriptorSetLayout) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create descriptor set layout"); + } + + // Create pipeline layout + VkPipelineLayoutCreateInfo pipelineLayoutInfo{}; + pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipelineLayoutInfo.setLayoutCount = 1; + pipelineLayoutInfo.pSetLayouts = &m_descriptorSetLayout; + + if (vkCreatePipelineLayout(m_device, &pipelineLayoutInfo, nullptr, &m_pipelineLayout) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create pipeline layout"); + } + + // Create compute pipeline + VkComputePipelineCreateInfo pipelineInfo{}; + pipelineInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + pipelineInfo.layout = m_pipelineLayout; + pipelineInfo.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + pipelineInfo.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT; + pipelineInfo.stage.module = m_vulkanBuilder->getShaderModule(); + pipelineInfo.stage.pName = "main"; + + if (vkCreateComputePipelines(m_device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &m_computePipeline) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create compute pipeline"); + } + + // Create descriptor pool with sizes from VulkanBuilder + std::vector poolSizes = m_vulkanBuilder->getDescriptorPoolSizes(); + + VkDescriptorPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + poolInfo.poolSizeCount = static_cast(poolSizes.size()); + poolInfo.pPoolSizes = poolSizes.data(); + poolInfo.maxSets = 1; + + if (vkCreateDescriptorPool(m_device, &poolInfo, nullptr, &m_descriptorPool) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create descriptor pool"); + } + + // Allocate descriptor set + VkDescriptorSetAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + allocInfo.descriptorPool = m_descriptorPool; + allocInfo.descriptorSetCount = 1; + allocInfo.pSetLayouts = &m_descriptorSetLayout; + + if (vkAllocateDescriptorSets(m_device, &allocInfo, &m_descriptorSet) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate descriptor set"); + } + + // Update descriptor set with buffer bindings + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + VkDescriptorBufferInfo inputBufferInfo{}; + inputBufferInfo.buffer = m_inputBuffer; + inputBufferInfo.offset = 0; + inputBufferInfo.range = bufferSize; + + VkDescriptorBufferInfo outputBufferInfo{}; + outputBufferInfo.buffer = m_outputBuffer; + outputBufferInfo.offset = 0; + outputBufferInfo.range = bufferSize; + + // Use bindings 1 and 2 for input/output buffers + // OCIO uses binding 0 for uniforms and 3+ for textures (via setDescriptorSetIndex(0, 3)) + std::vector descriptorWrites = { + {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, m_descriptorSet, 1, 0, 1, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nullptr, &inputBufferInfo, nullptr}, + {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, m_descriptorSet, 2, 0, 1, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nullptr, &outputBufferInfo, nullptr} + }; + + vkUpdateDescriptorSets(m_device, static_cast(descriptorWrites.size()), + descriptorWrites.data(), 0, nullptr); + + // Update texture and uniform bindings + m_vulkanBuilder->updateDescriptorSet(m_descriptorSet); +} + +void VulkanApp::reshape(int width, int height) +{ + m_bufferWidth = width; + m_bufferHeight = height; +} + +void VulkanApp::redisplay() +{ + // Update uniform values before dispatch (for dynamic parameters) + if (m_vulkanBuilder) + { + m_vulkanBuilder->updateUniforms(); + } + + // Record command buffer + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(m_commandBuffer, &beginInfo); + + vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_computePipeline); + vkCmdBindDescriptorSets(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, + m_pipelineLayout, 0, 1, &m_descriptorSet, 0, nullptr); + + // Dispatch compute shader + const uint32_t groupCountX = (m_imageWidth + 15) / 16; + const uint32_t groupCountY = (m_imageHeight + 15) / 16; + vkCmdDispatch(m_commandBuffer, groupCountX, groupCountY, 1); + + vkEndCommandBuffer(m_commandBuffer); + + // Submit command buffer + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &m_commandBuffer; + + vkQueueSubmit(m_computeQueue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_computeQueue); + + vkResetCommandBuffer(m_commandBuffer, 0); +} + +void VulkanApp::readImage(float * imageBuffer) +{ + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + // Copy from output buffer to staging buffer + copyBuffer(m_outputBuffer, m_stagingBuffer, bufferSize); + + // Read from staging buffer + void * data; + vkMapMemory(m_device, m_stagingBufferMemory, 0, bufferSize, 0, &data); + memcpy(imageBuffer, data, static_cast(bufferSize)); + vkUnmapMemory(m_device, m_stagingBufferMemory); +} + +void VulkanApp::printVulkanInfo() const noexcept +{ + if (m_physicalDevice == VK_NULL_HANDLE) + { + std::cout << "Vulkan not initialized" << std::endl; + return; + } + + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(m_physicalDevice, &properties); + + std::cout << "Vulkan Device: " << properties.deviceName << std::endl; + std::cout << "Vulkan API Version: " + << VK_VERSION_MAJOR(properties.apiVersion) << "." + << VK_VERSION_MINOR(properties.apiVersion) << "." + << VK_VERSION_PATCH(properties.apiVersion) << std::endl; + std::cout << "Driver Version: " << properties.driverVersion << std::endl; +} + +VulkanAppRcPtr VulkanApp::CreateVulkanApp(int bufWidth, int bufHeight) +{ + return std::make_shared(bufWidth, bufHeight); +} + +// +// VulkanBuilder Implementation +// + +VulkanBuilder::VulkanBuilder(VkDevice device, VkPhysicalDevice physicalDevice, + VkCommandPool commandPool, VkQueue queue) + : m_device(device) + , m_physicalDevice(physicalDevice) + , m_commandPool(commandPool) + , m_queue(queue) +{ +} + +VulkanBuilder::~VulkanBuilder() +{ + deleteAllTextures(); + deleteUniformBuffer(); + + if (m_device != VK_NULL_HANDLE && m_shaderModule != VK_NULL_HANDLE) + { + vkDestroyShaderModule(m_device, m_shaderModule, nullptr); + } +} + +void VulkanBuilder::deleteAllTextures() +{ + if (m_device == VK_NULL_HANDLE) return; + + auto deleteTextures = [this](std::vector & textures) { + for (auto & tex : textures) + { + if (tex.sampler != VK_NULL_HANDLE) + vkDestroySampler(m_device, tex.sampler, nullptr); + if (tex.imageView != VK_NULL_HANDLE) + vkDestroyImageView(m_device, tex.imageView, nullptr); + if (tex.image != VK_NULL_HANDLE) + vkDestroyImage(m_device, tex.image, nullptr); + if (tex.memory != VK_NULL_HANDLE) + vkFreeMemory(m_device, tex.memory, nullptr); + } + textures.clear(); + }; + + deleteTextures(m_textures3D); + deleteTextures(m_textures1D2D); +} + +void VulkanBuilder::deleteUniformBuffer() +{ + if (m_device == VK_NULL_HANDLE) return; + + if (m_uniformBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_uniformBuffer, nullptr); + m_uniformBuffer = VK_NULL_HANDLE; + } + if (m_uniformBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_uniformBufferMemory, nullptr); + m_uniformBufferMemory = VK_NULL_HANDLE; + } + m_uniformBufferSize = 0; + m_uniforms.clear(); +} + +uint32_t VulkanBuilder::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) +{ + VkPhysicalDeviceMemoryProperties memProperties; + vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &memProperties); + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) + { + if ((typeFilter & (1 << i)) && + (memProperties.memoryTypes[i].propertyFlags & properties) == properties) + { + return i; + } + } + throw std::runtime_error("Failed to find suitable memory type"); +} + +void VulkanBuilder::createImage(uint32_t width, uint32_t height, uint32_t depth, + VkFormat format, VkImageType imageType, + VkImageUsageFlags usage, VkMemoryPropertyFlags properties, + VkImage & image, VkDeviceMemory & imageMemory) +{ + VkImageCreateInfo imageInfo{}; + imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + imageInfo.imageType = imageType; + imageInfo.extent.width = width; + imageInfo.extent.height = height; + imageInfo.extent.depth = depth; + imageInfo.mipLevels = 1; + imageInfo.arrayLayers = 1; + imageInfo.format = format; + imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; + imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + imageInfo.usage = usage; + imageInfo.samples = VK_SAMPLE_COUNT_1_BIT; + imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateImage(m_device, &imageInfo, nullptr, &image) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create image"); + } + + VkMemoryRequirements memRequirements; + vkGetImageMemoryRequirements(m_device, image, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); + + if (vkAllocateMemory(m_device, &allocInfo, nullptr, &imageMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate image memory"); + } + + vkBindImageMemory(m_device, image, imageMemory, 0); +} + +VkImageView VulkanBuilder::createImageView(VkImage image, VkFormat format, VkImageViewType viewType) +{ + VkImageViewCreateInfo viewInfo{}; + viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + viewInfo.image = image; + viewInfo.viewType = viewType; + viewInfo.format = format; + viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + viewInfo.subresourceRange.baseMipLevel = 0; + viewInfo.subresourceRange.levelCount = 1; + viewInfo.subresourceRange.baseArrayLayer = 0; + viewInfo.subresourceRange.layerCount = 1; + + VkImageView imageView; + if (vkCreateImageView(m_device, &viewInfo, nullptr, &imageView) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create image view"); + } + return imageView; +} + +VkSampler VulkanBuilder::createSampler(Interpolation interpolation) +{ + VkSamplerCreateInfo samplerInfo{}; + samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + + if (interpolation == INTERP_NEAREST) + { + samplerInfo.magFilter = VK_FILTER_NEAREST; + samplerInfo.minFilter = VK_FILTER_NEAREST; + } + else + { + samplerInfo.magFilter = VK_FILTER_LINEAR; + samplerInfo.minFilter = VK_FILTER_LINEAR; + } + + samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.anisotropyEnable = VK_FALSE; + samplerInfo.maxAnisotropy = 1.0f; + samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK; + samplerInfo.unnormalizedCoordinates = VK_FALSE; + samplerInfo.compareEnable = VK_FALSE; + samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS; + samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + samplerInfo.mipLodBias = 0.0f; + samplerInfo.minLod = 0.0f; + samplerInfo.maxLod = 0.0f; + + VkSampler sampler; + if (vkCreateSampler(m_device, &samplerInfo, nullptr, &sampler) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create sampler"); + } + return sampler; +} + +void VulkanBuilder::transitionImageLayout(VkImage image, VkFormat /*format*/, + VkImageLayout oldLayout, VkImageLayout newLayout) +{ + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = m_commandPool; + allocInfo.commandBufferCount = 1; + + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(m_device, &allocInfo, &commandBuffer); + + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + VkImageMemoryBarrier barrier{}; + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.oldLayout = oldLayout; + barrier.newLayout = newLayout; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.image = image; + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier.subresourceRange.baseMipLevel = 0; + barrier.subresourceRange.levelCount = 1; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = 1; + + VkPipelineStageFlags sourceStage; + VkPipelineStageFlags destinationStage; + + if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) + { + barrier.srcAccessMask = 0; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + destinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + } + else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) + { + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + sourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + destinationStage = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + } + else + { + throw std::runtime_error("Unsupported layout transition"); + } + + vkCmdPipelineBarrier(commandBuffer, sourceStage, destinationStage, 0, + 0, nullptr, 0, nullptr, 1, &barrier); + + vkEndCommandBuffer(commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + + vkQueueSubmit(m_queue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_queue); + + vkFreeCommandBuffers(m_device, m_commandPool, 1, &commandBuffer); +} + +void VulkanBuilder::copyBufferToImage(VkBuffer buffer, VkImage image, + uint32_t width, uint32_t height, uint32_t depth) +{ + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = m_commandPool; + allocInfo.commandBufferCount = 1; + + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(m_device, &allocInfo, &commandBuffer); + + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + VkBufferImageCopy region{}; + region.bufferOffset = 0; + region.bufferRowLength = 0; + region.bufferImageHeight = 0; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.mipLevel = 0; + region.imageSubresource.baseArrayLayer = 0; + region.imageSubresource.layerCount = 1; + region.imageOffset = {0, 0, 0}; + region.imageExtent = {width, height, depth}; + + vkCmdCopyBufferToImage(commandBuffer, buffer, image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + + vkEndCommandBuffer(commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + + vkQueueSubmit(m_queue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_queue); + + vkFreeCommandBuffers(m_device, m_commandPool, 1, &commandBuffer); +} + +void VulkanBuilder::createUniformBuffer(GpuShaderDescRcPtr & shaderDesc) +{ + deleteUniformBuffer(); + + const unsigned numUniforms = shaderDesc->getNumUniforms(); + if (numUniforms == 0) return; + + // Use OCIO's provided buffer size and offsets - these are calculated correctly + // for the scalar layout used in Vulkan shaders + m_uniformBufferSize = shaderDesc->getUniformBufferSize(); + if (m_uniformBufferSize == 0) return; + + // Store uniform metadata using OCIO's provided offsets + for (unsigned idx = 0; idx < numUniforms; ++idx) + { + GpuShaderDesc::UniformData data; + const char * name = shaderDesc->getUniform(idx, data); + + UniformData uniformData; + uniformData.name = name; + uniformData.data = data; + uniformData.offset = data.m_bufferOffset; // Use OCIO's calculated offset + + // Calculate size based on type (for debugging/verification) + if (data.m_getDouble) + { + uniformData.size = sizeof(float); + } + else if (data.m_getBool) + { + uniformData.size = sizeof(int); + } + else if (data.m_getFloat3) + { + uniformData.size = 3 * sizeof(float); + } + else if (data.m_vectorFloat.m_getSize) + { + // Size will be determined when writing data + uniformData.size = 0; + } + else if (data.m_vectorInt.m_getSize) + { + // Size will be determined when writing data + uniformData.size = 0; + } + else + { + std::cerr << "Warning: Unknown uniform type for '" << name << "'" << std::endl; + continue; + } + + m_uniforms.push_back(uniformData); + } + + // Create uniform buffer + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = m_uniformBufferSize; + bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateBuffer(m_device, &bufferInfo, nullptr, &m_uniformBuffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create uniform buffer"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, m_uniformBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (vkAllocateMemory(m_device, &allocInfo, nullptr, &m_uniformBufferMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate uniform buffer memory"); + } + + vkBindBufferMemory(m_device, m_uniformBuffer, m_uniformBufferMemory, 0); + + // Initialize uniform values + updateUniforms(); +} + +void VulkanBuilder::updateUniforms() +{ + if (m_uniformBufferSize == 0 || m_uniformBuffer == VK_NULL_HANDLE || !m_shaderDesc) return; + + void * data; + vkMapMemory(m_device, m_uniformBufferMemory, 0, m_uniformBufferSize, 0, &data); + + // Zero-initialize the buffer first to ensure clean state + memset(data, 0, m_uniformBufferSize); + + // Query uniform values directly from shader description (callbacks may have updated) + const unsigned numUniforms = m_shaderDesc->getNumUniforms(); + for (unsigned idx = 0; idx < numUniforms && idx < m_uniforms.size(); ++idx) + { + GpuShaderDesc::UniformData uniformData; + m_shaderDesc->getUniform(idx, uniformData); + + char * dest = static_cast(data) + m_uniforms[idx].offset; + + if (uniformData.m_getDouble) + { + float val = static_cast(uniformData.m_getDouble()); + memcpy(dest, &val, sizeof(float)); + } + else if (uniformData.m_getBool) + { + int val = uniformData.m_getBool() ? 1 : 0; + memcpy(dest, &val, sizeof(int)); + } + else if (uniformData.m_getFloat3) + { + // vec3 in std140: write 3 floats (12 bytes), padded to 16 bytes + auto vals = uniformData.m_getFloat3(); + memcpy(dest, vals.data(), 3 * sizeof(float)); + } + else if (uniformData.m_vectorFloat.m_getSize && uniformData.m_vectorFloat.m_getVector) + { + // In std140, each array element is padded to 16 bytes + const float * vals = uniformData.m_vectorFloat.m_getVector(); + size_t count = uniformData.m_vectorFloat.m_getSize(); + for (size_t i = 0; i < count; ++i) + { + memcpy(dest + i * 16, &vals[i], sizeof(float)); + } + } + else if (uniformData.m_vectorInt.m_getSize && uniformData.m_vectorInt.m_getVector) + { + // In std140, each array element is padded to 16 bytes + const int * vals = uniformData.m_vectorInt.m_getVector(); + size_t count = uniformData.m_vectorInt.m_getSize(); + for (size_t i = 0; i < count; ++i) + { + memcpy(dest + i * 16, &vals[i], sizeof(int)); + } + } + } + + vkUnmapMemory(m_device, m_uniformBufferMemory); +} + +void VulkanBuilder::allocateAllTextures(GpuShaderDescRcPtr & shaderDesc) +{ + deleteAllTextures(); + m_shaderDesc = shaderDesc; + + // Create uniform buffer for dynamic parameters + createUniformBuffer(shaderDesc); + + // Process 3D LUTs - use OCIO's get3DTextureShaderBindingIndex for correct bindings + const unsigned num3DTextures = shaderDesc->getNum3DTextures(); + for (unsigned idx = 0; idx < num3DTextures; ++idx) + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned edgelen = 0; + Interpolation interpolation = INTERP_LINEAR; + shaderDesc->get3DTexture(idx, textureName, samplerName, edgelen, interpolation); + + if (!textureName || !samplerName || edgelen == 0) + { + throw std::runtime_error("Invalid 3D texture data"); + } + + const float * values = nullptr; + shaderDesc->get3DTextureValues(idx, values); + if (!values) + { + throw std::runtime_error("Missing 3D texture values"); + } + + // Use RGBA format since RGB32F is not widely supported (especially on MoltenVK/macOS) + // Convert RGB to RGBA by adding alpha = 1.0 + const size_t numTexels = edgelen * edgelen * edgelen; + std::vector rgbaValues(numTexels * 4); + for (size_t i = 0; i < numTexels; ++i) + { + rgbaValues[i * 4 + 0] = values[i * 3 + 0]; + rgbaValues[i * 4 + 1] = values[i * 3 + 1]; + rgbaValues[i * 4 + 2] = values[i * 3 + 2]; + rgbaValues[i * 4 + 3] = 1.0f; + } + + // Create staging buffer + VkDeviceSize imageSize = numTexels * 4 * sizeof(float); + + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = imageSize; + bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + vkCreateBuffer(m_device, &bufferInfo, nullptr, &stagingBuffer); + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, stagingBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + vkAllocateMemory(m_device, &allocInfo, nullptr, &stagingBufferMemory); + vkBindBufferMemory(m_device, stagingBuffer, stagingBufferMemory, 0); + + // Copy RGBA data to staging buffer + void * data; + vkMapMemory(m_device, stagingBufferMemory, 0, imageSize, 0, &data); + memcpy(data, rgbaValues.data(), static_cast(imageSize)); + vkUnmapMemory(m_device, stagingBufferMemory); + + // Create 3D image with RGBA format + // Use OCIO's get3DTextureShaderBindingIndex for the correct binding index + TextureResource tex; + tex.samplerName = samplerName; + tex.binding = shaderDesc->get3DTextureShaderBindingIndex(idx); + + createImage(edgelen, edgelen, edgelen, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_TYPE_3D, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tex.image, tex.memory); + + // Transition and copy + transitionImageLayout(tex.image, VK_FORMAT_R32G32B32A32_SFLOAT, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + copyBufferToImage(stagingBuffer, tex.image, edgelen, edgelen, edgelen); + transitionImageLayout(tex.image, VK_FORMAT_R32G32B32A32_SFLOAT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // Create image view and sampler + tex.imageView = createImageView(tex.image, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_VIEW_TYPE_3D); + tex.sampler = createSampler(interpolation); + + m_textures3D.push_back(tex); + + // Cleanup staging buffer + vkDestroyBuffer(m_device, stagingBuffer, nullptr); + vkFreeMemory(m_device, stagingBufferMemory, nullptr); + } + + // Process 1D/2D LUTs + const unsigned numTextures = shaderDesc->getNumTextures(); + for (unsigned idx = 0; idx < numTextures; ++idx) + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned width = 0; + unsigned height = 0; + GpuShaderDesc::TextureType channel = GpuShaderDesc::TEXTURE_RGB_CHANNEL; + Interpolation interpolation = INTERP_LINEAR; + GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; + shaderDesc->getTexture(idx, textureName, samplerName, width, height, channel, dimensions, interpolation); + + if (!textureName || !samplerName || width == 0) + { + throw std::runtime_error("Invalid texture data"); + } + + const float * values = nullptr; + shaderDesc->getTextureValues(idx, values); + if (!values) + { + throw std::runtime_error("Missing texture values"); + } + + // Use R32 for single channel, RGBA32 for RGB (since RGB32F not supported on MoltenVK) + unsigned imgHeight = (height > 0) ? height : 1; + const size_t numTexels = width * imgHeight; + VkFormat format; + VkDeviceSize imageSize; + std::vector convertedValues; + + if (channel == GpuShaderDesc::TEXTURE_RED_CHANNEL) + { + format = VK_FORMAT_R32_SFLOAT; + imageSize = numTexels * sizeof(float); + } + else + { + // Convert RGB to RGBA + format = VK_FORMAT_R32G32B32A32_SFLOAT; + imageSize = numTexels * 4 * sizeof(float); + convertedValues.resize(numTexels * 4); + for (size_t i = 0; i < numTexels; ++i) + { + convertedValues[i * 4 + 0] = values[i * 3 + 0]; + convertedValues[i * 4 + 1] = values[i * 3 + 1]; + convertedValues[i * 4 + 2] = values[i * 3 + 2]; + convertedValues[i * 4 + 3] = 1.0f; + } + } + + // Create staging buffer + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = imageSize; + bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + vkCreateBuffer(m_device, &bufferInfo, nullptr, &stagingBuffer); + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, stagingBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + vkAllocateMemory(m_device, &allocInfo, nullptr, &stagingBufferMemory); + vkBindBufferMemory(m_device, stagingBuffer, stagingBufferMemory, 0); + + // Copy data + void * data; + vkMapMemory(m_device, stagingBufferMemory, 0, imageSize, 0, &data); + if (channel == GpuShaderDesc::TEXTURE_RED_CHANNEL) + { + memcpy(data, values, static_cast(imageSize)); + } + else + { + memcpy(data, convertedValues.data(), static_cast(imageSize)); + } + vkUnmapMemory(m_device, stagingBufferMemory); + + // Create image (use 2D for both 1D and 2D textures in Vulkan) + // Use OCIO's getTextureShaderBindingIndex for the correct binding index + TextureResource tex; + tex.samplerName = samplerName; + tex.binding = shaderDesc->getTextureShaderBindingIndex(idx); + + createImage(width, imgHeight, 1, format, VK_IMAGE_TYPE_2D, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tex.image, tex.memory); + + // Transition and copy + transitionImageLayout(tex.image, format, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + copyBufferToImage(stagingBuffer, tex.image, width, imgHeight, 1); + transitionImageLayout(tex.image, format, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // Create image view and sampler + tex.imageView = createImageView(tex.image, format, VK_IMAGE_VIEW_TYPE_2D); + tex.sampler = createSampler(interpolation); + + m_textures1D2D.push_back(tex); + + // Cleanup staging buffer + vkDestroyBuffer(m_device, stagingBuffer, nullptr); + vkFreeMemory(m_device, stagingBufferMemory, nullptr); + } +} + +void VulkanBuilder::buildShader(GpuShaderDescRcPtr & shaderDesc) +{ + // Generate GLSL compute shader source from OCIO shader description + std::ostringstream shader; + + shader << "#version 460\n"; + shader << "#extension GL_EXT_scalar_block_layout : enable\n"; + shader << "\n"; + shader << "layout(local_size_x = 16, local_size_y = 16, local_size_z = 1) in;\n"; + shader << "\n"; + // Use bindings 1 and 2 for input/output buffers. + // OCIO uses binding 0 for uniforms and 3+ for textures (via setDescriptorSetIndex(0, 3)). + shader << "layout(std430, set = 0, binding = 1) readonly buffer InputBuffer {\n"; + shader << " vec4 inputPixels[];\n"; + shader << "};\n"; + shader << "\n"; + shader << "layout(std430, set = 0, binding = 2) writeonly buffer OutputBuffer {\n"; + shader << " vec4 outputPixels[];\n"; + shader << "};\n"; + shader << "\n"; + + // OCIO generates texture sampler declarations with correct bindings when using + // GPU_LANGUAGE_GLSL_VK_4_6 and setDescriptorSetIndex(0, 3) is called on the shader descriptor. + // OCIO uses binding 0 for uniforms (by design) and 3+ for textures. + + // Get OCIO shader text - it already contains sampler and uniform declarations with correct bindings + const char * shaderText = shaderDesc->getShaderText(); + if (shaderText && strlen(shaderText) > 0) + { + shader << shaderText; + } + + shader << "\n"; + shader << "void main() {\n"; + shader << " uvec2 gid = gl_GlobalInvocationID.xy;\n"; + shader << " uint width = 256u;\n"; + shader << " uint height = 256u;\n"; + shader << " \n"; + shader << " // Bounds check to avoid out-of-bounds access\n"; + shader << " if (gid.x >= width || gid.y >= height) return;\n"; + shader << " \n"; + shader << " uint idx = gid.y * width + gid.x;\n"; + shader << " \n"; + shader << " vec4 " << shaderDesc->getPixelName() << " = inputPixels[idx];\n"; + shader << " \n"; + + // Call the OCIO color transformation function + const char * functionName = shaderDesc->getFunctionName(); + if (functionName && strlen(functionName) > 0) + { + shader << " " << shaderDesc->getPixelName() << " = " << functionName + << "(" << shaderDesc->getPixelName() << ");\n"; + } + + shader << " \n"; + shader << " outputPixels[idx] = " << shaderDesc->getPixelName() << ";\n"; + shader << "}\n"; + + m_shaderSource = shader.str(); + + // Compile GLSL to SPIR-V + std::vector spirvCode = compileGLSLToSPIRV(m_shaderSource); + + // Create shader module + VkShaderModuleCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + createInfo.codeSize = spirvCode.size() * sizeof(uint32_t); + createInfo.pCode = spirvCode.data(); + + if (vkCreateShaderModule(m_device, &createInfo, nullptr, &m_shaderModule) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create shader module"); + } +} + +std::vector VulkanBuilder::compileGLSLToSPIRV(const std::string & glslSource) +{ + // Initialize glslang (safe to call multiple times) + static bool glslangInitialized = false; + if (!glslangInitialized) + { + glslang::InitializeProcess(); + glslangInitialized = true; + } + + // Create shader object + glslang::TShader shader(EShLangCompute); + + const char * shaderStrings[1] = { glslSource.c_str() }; + shader.setStrings(shaderStrings, 1); + + // Set up Vulkan 1.2 / SPIR-V 1.5 environment + shader.setEnvInput(glslang::EShSourceGlsl, EShLangCompute, glslang::EShClientVulkan, 460); + shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_2); + shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5); + + // Get default resource limits + const TBuiltInResource * resources = GetDefaultResources(); + + // Parse the shader + const int defaultVersion = 460; + const bool forwardCompatible = false; + const EShMessages messages = static_cast(EShMsgSpvRules | EShMsgVulkanRules); + + if (!shader.parse(resources, defaultVersion, forwardCompatible, messages)) + { + std::string errorMsg = "GLSL parsing failed:\n"; + errorMsg += shader.getInfoLog(); + errorMsg += "\n"; + errorMsg += shader.getInfoDebugLog(); + throw std::runtime_error(errorMsg); + } + + // Create program and link + glslang::TProgram program; + program.addShader(&shader); + + if (!program.link(messages)) + { + std::string errorMsg = "GLSL linking failed:\n"; + errorMsg += program.getInfoLog(); + errorMsg += "\n"; + errorMsg += program.getInfoDebugLog(); + throw std::runtime_error(errorMsg); + } + + // Convert to SPIR-V + std::vector spirv; + glslang::SpvOptions spvOptions; + spvOptions.generateDebugInfo = false; + spvOptions.stripDebugInfo = true; + spvOptions.disableOptimizer = false; + spvOptions.optimizeSize = false; + + glslang::GlslangToSpv(*program.getIntermediate(EShLangCompute), spirv, &spvOptions); + + if (spirv.empty()) + { + throw std::runtime_error("SPIR-V generation produced empty output"); + } + + return spirv; +} + +std::vector VulkanBuilder::getDescriptorSetLayoutBindings() const +{ + std::vector bindings; + + // Add uniform buffer binding at binding 0 (OCIO's default) + // OCIO generates uniform blocks with binding = 0 by design + if (hasUniforms()) + { + VkDescriptorSetLayoutBinding binding{}; + binding.binding = 0; + binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + binding.descriptorCount = 1; + binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + binding.pImmutableSamplers = nullptr; + bindings.push_back(binding); + } + + // Add bindings for 3D LUT textures (starting at binding 1 via setDescriptorSetIndex(0, 1)) + for (const auto & tex : m_textures3D) + { + VkDescriptorSetLayoutBinding binding{}; + binding.binding = tex.binding; + binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + binding.descriptorCount = 1; + binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + binding.pImmutableSamplers = nullptr; + bindings.push_back(binding); + } + + // Add bindings for 1D/2D LUT textures + for (const auto & tex : m_textures1D2D) + { + VkDescriptorSetLayoutBinding binding{}; + binding.binding = tex.binding; + binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + binding.descriptorCount = 1; + binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + binding.pImmutableSamplers = nullptr; + bindings.push_back(binding); + } + + return bindings; +} + +std::vector VulkanBuilder::getDescriptorPoolSizes() const +{ + std::vector poolSizes; + + // Storage buffers for input/output + poolSizes.push_back({VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2}); + + // Uniform buffer for dynamic parameters + if (hasUniforms()) + { + poolSizes.push_back({VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1}); + } + + // Combined image samplers for textures + uint32_t numTextures = static_cast(m_textures3D.size() + m_textures1D2D.size()); + if (numTextures > 0) + { + poolSizes.push_back({VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, numTextures}); + } + + return poolSizes; +} + +void VulkanBuilder::updateDescriptorSet(VkDescriptorSet descriptorSet) +{ + std::vector descriptorWrites; + std::vector imageInfos; + + // Use a single buffer info for uniform buffer (allocated on stack to avoid reallocation issues) + VkDescriptorBufferInfo uniformBufferInfo{}; + + // Reserve space to prevent reallocation + imageInfos.reserve(m_textures3D.size() + m_textures1D2D.size()); + + // Add uniform buffer binding at binding 0 (OCIO's default) + if (hasUniforms()) + { + uniformBufferInfo.buffer = m_uniformBuffer; + uniformBufferInfo.offset = 0; + uniformBufferInfo.range = m_uniformBufferSize; + + VkWriteDescriptorSet uniformWrite{}; + uniformWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + uniformWrite.dstSet = descriptorSet; + uniformWrite.dstBinding = 0; + uniformWrite.dstArrayElement = 0; + uniformWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + uniformWrite.descriptorCount = 1; + uniformWrite.pBufferInfo = &uniformBufferInfo; + descriptorWrites.push_back(uniformWrite); + } + + // Add 3D texture bindings (starting at binding 1 via setDescriptorSetIndex(0, 1)) + for (const auto & tex : m_textures3D) + { + VkDescriptorImageInfo imageInfo{}; + imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.imageView = tex.imageView; + imageInfo.sampler = tex.sampler; + imageInfos.push_back(imageInfo); + + VkWriteDescriptorSet imageWrite{}; + imageWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + imageWrite.dstSet = descriptorSet; + imageWrite.dstBinding = tex.binding; + imageWrite.dstArrayElement = 0; + imageWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + imageWrite.descriptorCount = 1; + imageWrite.pImageInfo = &imageInfos.back(); + descriptorWrites.push_back(imageWrite); + } + + // Add 1D/2D texture bindings + for (const auto & tex : m_textures1D2D) + { + VkDescriptorImageInfo imageInfo{}; + imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.imageView = tex.imageView; + imageInfo.sampler = tex.sampler; + imageInfos.push_back(imageInfo); + + VkWriteDescriptorSet imageWrite{}; + imageWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + imageWrite.dstSet = descriptorSet; + imageWrite.dstBinding = tex.binding; + imageWrite.dstArrayElement = 0; + imageWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + imageWrite.descriptorCount = 1; + imageWrite.pImageInfo = &imageInfos.back(); + descriptorWrites.push_back(imageWrite); + } + + if (!descriptorWrites.empty()) + { + vkUpdateDescriptorSets(m_device, static_cast(descriptorWrites.size()), + descriptorWrites.data(), 0, nullptr); + } +} + +} // namespace OCIO_NAMESPACE + +#endif // OCIO_VULKAN_ENABLED diff --git a/src/libutils/oglapphelpers/vulkanapp.h b/src/libutils/oglapphelpers/vulkanapp.h new file mode 100644 index 0000000000..07689a951a --- /dev/null +++ b/src/libutils/oglapphelpers/vulkanapp.h @@ -0,0 +1,274 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + + +#ifndef INCLUDED_OCIO_VULKANAPP_H +#define INCLUDED_OCIO_VULKANAPP_H + +#ifdef OCIO_VULKAN_ENABLED + +#include +#include +#include + +#include + +#include + +namespace OCIO_NAMESPACE +{ + +class VulkanBuilder; +typedef OCIO_SHARED_PTR VulkanBuilderRcPtr; + +class VulkanApp; +typedef OCIO_SHARED_PTR VulkanAppRcPtr; + +// VulkanApp provides headless Vulkan rendering for GPU unit testing. +// This class is designed to process images using OCIO GPU shaders via Vulkan compute pipelines. +class VulkanApp +{ +public: + VulkanApp() = delete; + VulkanApp(const VulkanApp &) = delete; + VulkanApp & operator=(const VulkanApp &) = delete; + + // Initialize the app with given buffer size for headless rendering. + VulkanApp(int bufWidth, int bufHeight); + + virtual ~VulkanApp(); + + enum Components + { + COMPONENTS_RGB = 0, + COMPONENTS_RGBA + }; + + // Initialize the image buffer. + void initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer); + + // Update the image if it changes. + void updateImage(const float * imageBuffer); + + // Set the shader code from OCIO GpuShaderDesc. + void setShader(GpuShaderDescRcPtr & shaderDesc); + + // Update the size of the buffer used to process the image. + void reshape(int width, int height); + + // Process the image using the Vulkan compute pipeline. + void redisplay(); + + // Read the processed image from the GPU buffer. + void readImage(float * imageBuffer); + + // Print Vulkan device and instance info. + void printVulkanInfo() const noexcept; + + // Factory method to create a VulkanApp instance. + static VulkanAppRcPtr CreateVulkanApp(int bufWidth, int bufHeight); + + // Shader code will be printed when generated. + void setPrintShader(bool print) { m_printShader = print; } + +protected: + // Initialize Vulkan instance, device, and queues. + void initVulkan(); + + // Create Vulkan compute pipeline for shader processing. + void createComputePipeline(); + + // Create buffers for image data. + void createBuffers(); + + // Clean up Vulkan resources. + void cleanup(); + + // Helper to find a suitable memory type. + uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); + + // Helper to create a Vulkan buffer. + void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, + VkMemoryPropertyFlags properties, VkBuffer & buffer, + VkDeviceMemory & bufferMemory); + + // Helper to copy buffer data. + void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); + +private: + // Vulkan core objects + VkInstance m_instance{ VK_NULL_HANDLE }; + VkPhysicalDevice m_physicalDevice{ VK_NULL_HANDLE }; + VkDevice m_device{ VK_NULL_HANDLE }; + VkQueue m_computeQueue{ VK_NULL_HANDLE }; + uint32_t m_computeQueueFamilyIndex{ 0 }; + + // Command pool and buffer + VkCommandPool m_commandPool{ VK_NULL_HANDLE }; + VkCommandBuffer m_commandBuffer{ VK_NULL_HANDLE }; + + // Compute pipeline + VkPipelineLayout m_pipelineLayout{ VK_NULL_HANDLE }; + VkPipeline m_computePipeline{ VK_NULL_HANDLE }; + VkDescriptorSetLayout m_descriptorSetLayout{ VK_NULL_HANDLE }; + VkDescriptorPool m_descriptorPool{ VK_NULL_HANDLE }; + VkDescriptorSet m_descriptorSet{ VK_NULL_HANDLE }; + + // Shader module + VkShaderModule m_computeShaderModule{ VK_NULL_HANDLE }; + + // Image buffers + VkBuffer m_inputBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_inputBufferMemory{ VK_NULL_HANDLE }; + VkBuffer m_outputBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_outputBufferMemory{ VK_NULL_HANDLE }; + VkBuffer m_stagingBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_stagingBufferMemory{ VK_NULL_HANDLE }; + + // Image dimensions + int m_imageWidth{ 0 }; + int m_imageHeight{ 0 }; + int m_bufferWidth{ 0 }; + int m_bufferHeight{ 0 }; + Components m_components{ COMPONENTS_RGBA }; + + // Shader builder + VulkanBuilderRcPtr m_vulkanBuilder; + + // Debug and configuration + bool m_printShader{ false }; + bool m_initialized{ false }; + + // Validation layers (debug builds) +#ifdef NDEBUG + const bool m_enableValidationLayers{ false }; +#else + const bool m_enableValidationLayers{ true }; +#endif + const std::vector m_validationLayers = { + "VK_LAYER_KHRONOS_validation" + }; +}; + +// VulkanBuilder handles OCIO shader compilation for Vulkan. +class VulkanBuilder +{ +public: + VulkanBuilder() = delete; + VulkanBuilder(const VulkanBuilder &) = delete; + VulkanBuilder & operator=(const VulkanBuilder &) = delete; + + explicit VulkanBuilder(VkDevice device, VkPhysicalDevice physicalDevice, + VkCommandPool commandPool, VkQueue queue); + ~VulkanBuilder(); + + // Build compute shader from OCIO GpuShaderDesc. + void buildShader(GpuShaderDescRcPtr & shaderDesc); + + // Get the compiled shader module. + VkShaderModule getShaderModule() const { return m_shaderModule; } + + // Get the shader source code (for debugging). + const std::string & getShaderSource() const { return m_shaderSource; } + + // Allocate and setup all textures (3D LUTs and 1D/2D LUTs). + void allocateAllTextures(GpuShaderDescRcPtr & shaderDesc); + + // Get descriptor set layout bindings for textures and uniforms. + std::vector getDescriptorSetLayoutBindings() const; + + // Get descriptor pool sizes for textures and uniforms. + std::vector getDescriptorPoolSizes() const; + + // Update descriptor set with texture and uniform bindings. + void updateDescriptorSet(VkDescriptorSet descriptorSet); + + // Update uniform values before each dispatch. + void updateUniforms(); + + // Get the uniform buffer for binding. + VkBuffer getUniformBuffer() const { return m_uniformBuffer; } + VkDeviceSize getUniformBufferSize() const { return m_uniformBufferSize; } + + // Check if uniforms are used. + bool hasUniforms() const { return m_uniformBufferSize > 0; } + + // Check if textures are used. + bool hasTextures() const { return !m_textures3D.empty() || !m_textures1D2D.empty(); } + +private: + // Compile GLSL to SPIR-V. + std::vector compileGLSLToSPIRV(const std::string & glslSource); + + // Helper to find memory type. + uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); + + // Helper to create image. + void createImage(uint32_t width, uint32_t height, uint32_t depth, + VkFormat format, VkImageType imageType, + VkImageUsageFlags usage, VkMemoryPropertyFlags properties, + VkImage & image, VkDeviceMemory & imageMemory); + + // Helper to create image view. + VkImageView createImageView(VkImage image, VkFormat format, VkImageViewType viewType); + + // Helper to create sampler. + VkSampler createSampler(Interpolation interpolation); + + // Helper to transition image layout. + void transitionImageLayout(VkImage image, VkFormat format, + VkImageLayout oldLayout, VkImageLayout newLayout); + + // Helper to copy buffer to image. + void copyBufferToImage(VkBuffer buffer, VkImage image, + uint32_t width, uint32_t height, uint32_t depth); + + // Create uniform buffer. + void createUniformBuffer(GpuShaderDescRcPtr & shaderDesc); + + // Delete all resources. + void deleteAllTextures(); + void deleteUniformBuffer(); + + VkDevice m_device{ VK_NULL_HANDLE }; + VkPhysicalDevice m_physicalDevice{ VK_NULL_HANDLE }; + VkCommandPool m_commandPool{ VK_NULL_HANDLE }; + VkQueue m_queue{ VK_NULL_HANDLE }; + VkShaderModule m_shaderModule{ VK_NULL_HANDLE }; + std::string m_shaderSource; + GpuShaderDescRcPtr m_shaderDesc; + + // Texture resources for 3D LUTs + struct TextureResource + { + VkImage image{ VK_NULL_HANDLE }; + VkDeviceMemory memory{ VK_NULL_HANDLE }; + VkImageView imageView{ VK_NULL_HANDLE }; + VkSampler sampler{ VK_NULL_HANDLE }; + std::string samplerName; + uint32_t binding{ 0 }; + }; + std::vector m_textures3D; + std::vector m_textures1D2D; + + // Uniform buffer for dynamic parameters + VkBuffer m_uniformBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_uniformBufferMemory{ VK_NULL_HANDLE }; + VkDeviceSize m_uniformBufferSize{ 0 }; + + // Uniform data structure matching shader layout + struct UniformData + { + std::string name; + GpuShaderDesc::UniformData data; + size_t offset; + size_t size; + }; + std::vector m_uniforms; +}; + +} // namespace OCIO_NAMESPACE + +#endif // OCIO_VULKAN_ENABLED + +#endif // INCLUDED_OCIO_VULKANAPP_H diff --git a/tests/gpu/FixedFunctionOp_test.cpp b/tests/gpu/FixedFunctionOp_test.cpp index 6c3879d858..1daca3a77a 100644 --- a/tests/gpu/FixedFunctionOp_test.cpp +++ b/tests/gpu/FixedFunctionOp_test.cpp @@ -303,7 +303,7 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces_gamutcomp13_inv) }; test.setCustomValues(values); - test.setErrorThreshold(3e-6f); + test.setErrorThreshold(3e-5f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_output_transform_fwd) @@ -656,7 +656,7 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_p3_rndtrip) test.setCustomValues(values); // TODO: Investigate why this is not closer. - test.setErrorThreshold(0.018f); + test.setErrorThreshold(0.019f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_p3_inv) @@ -693,7 +693,7 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_rec2020_rndtrip) test.setCustomValues(values); // TODO: Investigate why this is not closer. - test.setErrorThreshold(0.03f); + test.setErrorThreshold(0.032f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_rec2020_inv) diff --git a/tests/gpu/GPUUnitTest.cpp b/tests/gpu/GPUUnitTest.cpp index 6508131218..252ba43b55 100644 --- a/tests/gpu/GPUUnitTest.cpp +++ b/tests/gpu/GPUUnitTest.cpp @@ -19,6 +19,9 @@ #if __APPLE__ #include "metalapp.h" #endif +#ifdef OCIO_VULKAN_ENABLED +#include "vulkanapp.h" +#endif namespace OCIO = OCIO_NAMESPACE; @@ -164,6 +167,16 @@ OCIO::GpuShaderDescRcPtr & OCIOGPUTest::getShaderDesc() m_shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); m_shaderDesc->setLanguage(m_gpuShadingLanguage); m_shaderDesc->setPixelName("myPixel"); + + // Vulkan doesn't support 1D textures well on all platforms (e.g., MoltenVK/macOS) + // Force 2D textures for Vulkan to ensure compatibility + if (m_gpuShadingLanguage == OCIO::GPU_LANGUAGE_GLSL_VK_4_6) + { + m_shaderDesc->setAllowTexture1D(false); + // Set texture binding start to 3 since bindings 1 and 2 are used for + // input/output storage buffers in the Vulkan compute shader + m_shaderDesc->setDescriptorSetIndex(0, 3); + } } return m_shaderDesc; } @@ -202,6 +215,16 @@ namespace app->initImage(g_winWidth, g_winHeight, OCIO::OglApp::COMPONENTS_RGBA, &image[0]); } +#ifdef OCIO_VULKAN_ENABLED + void AllocateImageTexture(OCIO::VulkanAppRcPtr & app) + { + const unsigned numEntries = g_winWidth * g_winHeight * g_components; + OCIOGPUTest::CustomValues::Values image(numEntries, 0.0f); + + app->initImage(g_winWidth, g_winHeight, OCIO::VulkanApp::COMPONENTS_RGBA, &image[0]); + } +#endif + void SetTestValue(float * image, float val, unsigned numComponents) { for (unsigned component = 0; component < numComponents; ++component) @@ -214,7 +237,9 @@ namespace } } - void UpdateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + // Shared helper to prepare input values for GPU testing. + // Returns a pointer to the prepared input values that should be uploaded to the GPU. + const float * PrepareInputValues(OCIOGPUTestRcPtr & test, bool testNaN, bool testInfinity) { // Note: User-specified custom values are padded out // to the preferred size (g_winWidth x g_winHeight). @@ -225,17 +250,6 @@ namespace { // It means to generate the input values. - -#if __APPLE__ && __aarch64__ - // The Apple M1 chip handles differently the Nan and Inf processing introducing - // differences with CPU processing. - const bool testNaN = false; - const bool testInfinity = false; -#else - const bool testNaN = test->getTestNaN(); - const bool testInfinity = test->getTestInfinity(); -#endif - float min = 0.0f; float max = 1.0f; if(test->getTestWideRange()) @@ -325,9 +339,43 @@ namespace throw OCIO::Exception("Missing some expected input values"); } - app->updateImage(&values.m_inputValues[0]); + return &values.m_inputValues[0]; } + void UpdateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + { +#if __APPLE__ && __aarch64__ + // The Apple M1 chip handles differently the Nan and Inf processing introducing + // differences with CPU processing. + const bool testNaN = false; + const bool testInfinity = false; +#else + const bool testNaN = test->getTestNaN(); + const bool testInfinity = test->getTestInfinity(); +#endif + + const float * inputValues = PrepareInputValues(test, testNaN, testInfinity); + app->updateImage(inputValues); + } + +#ifdef OCIO_VULKAN_ENABLED + void UpdateImageTexture(OCIO::VulkanAppRcPtr & app, OCIOGPUTestRcPtr & test) + { +#if __APPLE__ && __aarch64__ + // The Apple M1 chip handles differently the Nan and Inf processing introducing + // differences with CPU processing. + const bool testNaN = false; + const bool testInfinity = false; +#else + const bool testNaN = test->getTestNaN(); + const bool testInfinity = test->getTestInfinity(); +#endif + + const float * inputValues = PrepareInputValues(test, testNaN, testInfinity); + app->updateImage(inputValues); + } +#endif + void UpdateOCIOGLState(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) { app->setPrintShader(test->isVerbose()); @@ -352,6 +400,32 @@ namespace app->setShader(shaderDesc); } +#ifdef OCIO_VULKAN_ENABLED + void UpdateOCIOVulkanState(OCIO::VulkanAppRcPtr & app, OCIOGPUTestRcPtr & test) + { + app->setPrintShader(test->isVerbose()); + + OCIO::ConstProcessorRcPtr & processor = test->getProcessor(); + OCIO::GpuShaderDescRcPtr & shaderDesc = test->getShaderDesc(); + + OCIO::ConstGPUProcessorRcPtr gpu; + if (test->isLegacyShader()) + { + gpu = processor->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, + test->getLegacyShaderLutEdge()); + } + else + { + gpu = processor->getDefaultGPUProcessor(); + } + + // Collect the shader program information for a specific processor. + gpu->extractGpuShaderInfo(shaderDesc); + + app->setShader(shaderDesc); + } +#endif + void DiffComponent(const std::vector & cpuImage, const std::vector & gpuImage, size_t idx, bool relativeTest, float expectMin, @@ -384,55 +458,18 @@ namespace constexpr size_t invalidIndex = std::numeric_limits::max(); - // Validate the GPU processing against the CPU one. - void ValidateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + // Shared helper to validate GPU processing against CPU. + // The gpuImage parameter should already contain the GPU output. + void ValidateResults(OCIOGPUTestRcPtr & test, + const OCIOGPUTest::CustomValues::Values & cpuImage, + const OCIOGPUTest::CustomValues::Values & gpuImage, + size_t width, size_t height) { - // Each retest is rebuilding a cpu proc. - OCIO::ConstCPUProcessorRcPtr processor = test->getProcessor()->getDefaultCPUProcessor(); - const float epsilon = test->getErrorThreshold(); const float expectMinValue = test->getExpectedMinimalValue(); - - // Compute the width & height to avoid testing the padded values. - - const size_t numPixels = test->getCustomValues().m_originalInputValueSize / g_components; - - size_t width, height = 0; - if(numPixels<=g_winWidth) - { - width = numPixels; - height = 1; - } - else - { - width = g_winWidth; - height = numPixels/g_winWidth; - if((numPixels%g_winWidth)>0) height += 1; - } - - if(width==0 || width>g_winWidth || height==0 || height>g_winHeight) - { - throw OCIO::Exception("Mismatch with the expected image size"); - } - - // Step 1: Compute the output using the CPU engine. - - OCIOGPUTest::CustomValues::Values cpuImage = test->getCustomValues().m_inputValues; - OCIO::PackedImageDesc desc(&cpuImage[0], (long)width, (long)height, g_components); - processor->apply(desc); - - // Step 2: Grab the GPU output from the rendering buffer. - - OCIOGPUTest::CustomValues::Values gpuImage(g_winWidth*g_winHeight*g_components, 0.0f); - app->readImage(&gpuImage[0]); - - // Step 3: Compare the two results. - const OCIOGPUTest::CustomValues::Values & image = test->getCustomValues().m_inputValues; + float diff = 0.0f; - // Initialize these to a known reference value, if any of the four component checks - // below fail, it will be set to the index of the last failure. Only the last failure - // is printed below. size_t idxDiff = invalidIndex; size_t idxNan = invalidIndex; size_t idxInf = invalidIndex; @@ -440,6 +477,7 @@ namespace float minVals[4] = {huge, huge, huge, huge}; float maxVals[4] = {-huge, -huge, -huge, -huge}; const bool relativeTest = test->getRelativeComparison(); + for(size_t idx=0; idx<(width*height); ++idx) { for(size_t chan=0; chan<4; ++chan) @@ -524,6 +562,62 @@ namespace test->updateMaxDiff(diff, idxDiff); } } + + // Shared helper to validate GPU processing against CPU. + // Template function to work with both OglApp and VulkanApp. + template + void ValidateImageTextureImpl(AppType & app, OCIOGPUTestRcPtr & test) + { + // Each retest is rebuilding a cpu proc. + OCIO::ConstCPUProcessorRcPtr processor = test->getProcessor()->getDefaultCPUProcessor(); + + // Compute the width & height to avoid testing the padded values. + const size_t numPixels = test->getCustomValues().m_originalInputValueSize / g_components; + + size_t width, height = 0; + if(numPixels<=g_winWidth) + { + width = numPixels; + height = 1; + } + else + { + width = g_winWidth; + height = numPixels/g_winWidth; + if((numPixels%g_winWidth)>0) height += 1; + } + + if(width==0 || width>g_winWidth || height==0 || height>g_winHeight) + { + throw OCIO::Exception("Mismatch with the expected image size"); + } + + // Step 1: Compute the output using the CPU engine. + OCIOGPUTest::CustomValues::Values cpuImage = test->getCustomValues().m_inputValues; + OCIO::PackedImageDesc desc(&cpuImage[0], (long)width, (long)height, g_components); + processor->apply(desc); + + // Step 2: Grab the GPU output from the rendering buffer. + OCIOGPUTest::CustomValues::Values gpuImage(g_winWidth*g_winHeight*g_components, 0.0f); + app->readImage(&gpuImage[0]); + + // Step 3: Compare the two results. + ValidateResults(test, cpuImage, gpuImage, width, height); + } + + // Validate the GPU processing against the CPU one. + void ValidateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + { + ValidateImageTextureImpl(app, test); + } + +#ifdef OCIO_VULKAN_ENABLED + // Validate the GPU processing against the CPU one for Vulkan. + void ValidateImageTexture(OCIO::VulkanAppRcPtr & app, OCIOGPUTestRcPtr & test) + { + ValidateImageTextureImpl(app, test); + } +#endif }; int main(int argc, const char ** argv) @@ -536,6 +630,7 @@ int main(int argc, const char ** argv) bool printHelp = false; bool useMetalRenderer = false; + bool useVulkanRenderer = false; bool verbose = false; bool stopOnFirstError = false; @@ -546,6 +641,7 @@ int main(int argc, const char ** argv) ap.options("\nCommand line arguments:\n", "--help", &printHelp, "Print help message", "--metal", &useMetalRenderer, "Run the GPU unit test with Metal", + "--vulkan", &useVulkanRenderer, "Run the GPU unit test with Vulkan", "-v", &verbose, "Output the GPU shader program", "--stop_on_error", &stopOnFirstError, "Stop on the first error", "--run_only %s", &filter, "Run only some unit tests\n" @@ -589,6 +685,9 @@ int main(int argc, const char ** argv) // Step 1: Initialize the graphic library engines. OCIO::OglAppRcPtr app; +#ifdef OCIO_VULKAN_ENABLED + OCIO::VulkanAppRcPtr vulkanApp; +#endif try { @@ -599,6 +698,16 @@ int main(int argc, const char ** argv) #else std::cerr << std::endl << "'GPU tests - Metal' is not supported" << std::endl; return 1; +#endif + } + else if(useVulkanRenderer) + { +#ifdef OCIO_VULKAN_ENABLED + vulkanApp = OCIO::VulkanApp::CreateVulkanApp(g_winWidth, g_winHeight); + vulkanApp->printVulkanInfo(); +#else + std::cerr << std::endl << "'GPU tests - Vulkan' is not supported (OCIO_VULKAN_ENABLED not defined)" << std::endl; + return 1; #endif } else @@ -611,16 +720,34 @@ int main(int argc, const char ** argv) std::cerr << std::endl << e.what() << std::endl; return 1; } + catch (const std::exception & e) + { + std::cerr << std::endl << e.what() << std::endl; + return 1; + } - app->printGLInfo(); + if (!useVulkanRenderer) + { + app->printGLInfo(); + } // Step 2: Allocate the texture that holds the image. - AllocateImageTexture(app); +#ifdef OCIO_VULKAN_ENABLED + if (useVulkanRenderer) + { + AllocateImageTexture(vulkanApp); + vulkanApp->reshape(g_winWidth, g_winHeight); + } + else +#endif + { + AllocateImageTexture(app); - // Step 3: Create the frame buffer and render buffer. - app->createGLBuffers(); + // Step 3: Create the frame buffer and render buffer. + app->createGLBuffers(); - app->reshape(g_winWidth, g_winHeight); + app->reshape(g_winWidth, g_winHeight); + } // Step 4: Execute all the unit tests. @@ -661,12 +788,18 @@ int main(int argc, const char ** argv) // Prepare the unit test. test->setVerbose(verbose); - test->setShadingLanguage( + OCIO::GpuLanguage gpuLang = OCIO::GPU_LANGUAGE_GLSL_1_2; #if __APPLE__ - useMetalRenderer ? - OCIO::GPU_LANGUAGE_MSL_2_0 : + if (useMetalRenderer) + { + gpuLang = OCIO::GPU_LANGUAGE_MSL_2_0; + } #endif - OCIO::GPU_LANGUAGE_GLSL_1_2); + if (useVulkanRenderer) + { + gpuLang = OCIO::GPU_LANGUAGE_GLSL_VK_4_6; + } + test->setShadingLanguage(gpuLang); bool enabledTest = true; try @@ -693,28 +826,59 @@ int main(int argc, const char ** argv) if(test->isValid() && enabledTest) { - // Initialize the texture with the RGBA values to be processed. - UpdateImageTexture(app, test); +#ifdef OCIO_VULKAN_ENABLED + if (useVulkanRenderer) + { + // Initialize the texture with the RGBA values to be processed. + UpdateImageTexture(vulkanApp, test); - // Update the GPU shader program. - UpdateOCIOGLState(app, test); + // Update the GPU shader program. + UpdateOCIOVulkanState(vulkanApp, test); - const size_t numRetest = test->getNumRetests(); - // Need to run once and for each retest. - for (size_t idxRetest = 0; idxRetest <= numRetest; ++idxRetest) - { - if (idxRetest != 0) // Skip first run. + const size_t numRetest = test->getNumRetests(); + // Need to run once and for each retest. + for (size_t idxRetest = 0; idxRetest <= numRetest; ++idxRetest) { - // Call the retest callback. - test->retestSetup(idxRetest - 1); + if (idxRetest != 0) // Skip first run. + { + // Call the retest callback. + test->retestSetup(idxRetest - 1); + } + + // Process the image texture into the rendering buffer. + vulkanApp->redisplay(); + + // Compute the expected values using the CPU and compare + // against the GPU values. + ValidateImageTexture(vulkanApp, test); } + } + else +#endif + { + // Initialize the texture with the RGBA values to be processed. + UpdateImageTexture(app, test); - // Process the image texture into the rendering buffer. - app->redisplay(); + // Update the GPU shader program. + UpdateOCIOGLState(app, test); - // Compute the expected values using the CPU and compare - // against the GPU values. - ValidateImageTexture(app, test); + const size_t numRetest = test->getNumRetests(); + // Need to run once and for each retest. + for (size_t idxRetest = 0; idxRetest <= numRetest; ++idxRetest) + { + if (idxRetest != 0) // Skip first run. + { + // Call the retest callback. + test->retestSetup(idxRetest - 1); + } + + // Process the image texture into the rendering buffer. + app->redisplay(); + + // Compute the expected values using the CPU and compare + // against the GPU values. + ValidateImageTexture(app, test); + } } } } @@ -723,10 +887,15 @@ int main(int argc, const char ** argv) ++failures; std::cerr << "FAILED - " << ex.what() << std::endl; } + catch(const std::exception & ex) + { + ++failures; + std::cerr << "FAILED - std::exception: " << ex.what() << std::endl; + } catch(...) { ++failures; - std::cerr << "FAILED - Unexpected error" << std::endl; + std::cerr << "FAILED - Unexpected error (unknown exception type)" << std::endl; } if (!enabledTest) From 75bb9d0a047d3e5b92355550094ead8b0f86ef61 Mon Sep 17 00:00:00 2001 From: Dmitry Kazakov Date: Thu, 2 Apr 2026 01:12:57 +0200 Subject: [PATCH 22/37] Fix linking to self-built deps on Windows + Clang (#2273) 1) Expat: 'MD' suffix is added on MSVC only, 'd' suffix is added on WIN32 2) ZLib: 'd' suffix is added only on MSVC Signed-off-by: Dmitry Kazakov --- share/cmake/modules/install/InstallZLIB.cmake | 4 ++-- share/cmake/modules/install/Installexpat.cmake | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/share/cmake/modules/install/InstallZLIB.cmake b/share/cmake/modules/install/InstallZLIB.cmake index 6cfca2800e..96f09bb09f 100644 --- a/share/cmake/modules/install/InstallZLIB.cmake +++ b/share/cmake/modules/install/InstallZLIB.cmake @@ -53,8 +53,8 @@ if(NOT ZLIB_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGE set(ZLIB_INCLUDE_DIRS "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - # Windows need the "d" suffix at the end. - if(WIN32 AND BUILD_TYPE_DEBUG) + # Windows need the "d" suffix at the end (only for MSVC). + if(MSVC AND BUILD_TYPE_DEBUG) set(_ZLIB_LIB_SUFFIX "d") endif() diff --git a/share/cmake/modules/install/Installexpat.cmake b/share/cmake/modules/install/Installexpat.cmake index cda465312e..ee750a1f41 100644 --- a/share/cmake/modules/install/Installexpat.cmake +++ b/share/cmake/modules/install/Installexpat.cmake @@ -46,9 +46,11 @@ if(NOT expat_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAG if(BUILD_TYPE_DEBUG) set(_expat_LIB_SUFFIX "d") endif() - # Static Linking, Multi-threaded Dll naming (>=2.2.8): - # https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/win32/README.txt - set(_expat_LIB_SUFFIX "${_expat_LIB_SUFFIX}MD") + if (MSVC) + # Static Linking, Multi-threaded Dll naming (>=2.2.8): + # https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/win32/README.txt + set(_expat_LIB_SUFFIX "${_expat_LIB_SUFFIX}MD") + endif() endif() # Expat use a hardcoded lib prefix instead of CMAKE_STATIC_LIBRARY_PREFIX From 044f66bac147e445b41defd9cc1c354027a5086c Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Fri, 3 Apr 2026 15:49:29 -0400 Subject: [PATCH 23/37] Adsk Contrib - Hue curve python binding was not copying all parameters (#2276) * Fix bug in hue curve python binding Signed-off-by: Doug Walker * Pointer check improvement Signed-off-by: Doug Walker * Dangling reference fix Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- src/OpenColorIO/Config.cpp | 2 +- .../fileformats/ctf/CTFReaderHelper.cpp | 14 +++++------ src/bindings/python/PyGradingData.cpp | 3 +++ tests/python/GradingDataTest.py | 23 +++++++++++++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 2ac0572443..d4d5fbe7fa 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -798,7 +798,7 @@ class Config::Impl } const ViewVec & views = searchShared ? m_sharedViews : iter->second.m_views; - const auto & viewIt = FindView(views, view); + const auto viewIt = FindView(views, view); if (viewIt != views.end()) { diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp index f8ecd7eb6e..1bf162db35 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp @@ -856,25 +856,25 @@ void CTFReaderInfoElt::end() ////////////////////////////////////////////////////////// -void CTFReaderDescElt::start(const char ** atttributes ) +void CTFReaderDescElt::start(const char ** atts ) { m_desc = {}; m_language = {}; - const char ** attr = atttributes; - while (*attr) + unsigned i = 0; + while (atts[i] && *atts[i]) { - if (0 == Platform::Strcasecmp(ATTR_LANGUAGE, *attr)) + if (0 == Platform::Strcasecmp(ATTR_LANGUAGE, *atts)) { - if (!attr || !(attr + 1)) + if (!atts[i + 1] || !*atts[i + 1]) { throwMessage("Attribute 'language' does not have a value."); } - m_language = *(attr + 1); + m_language = atts[i + 1]; } - attr += 2; + i += 2; } } diff --git a/src/bindings/python/PyGradingData.cpp b/src/bindings/python/PyGradingData.cpp index a1a093d7b3..c34179cf4e 100644 --- a/src/bindings/python/PyGradingData.cpp +++ b/src/bindings/python/PyGradingData.cpp @@ -21,11 +21,14 @@ using GradingControlPointIterator = PyIteratorsetSplineType(from->getSplineType()); + const size_t numPt = from->getNumControlPoints(); to->setNumControlPoints(numPt); for (size_t pt = 0; pt < numPt; ++pt) { to->getControlPoint(pt) = from->getControlPoint(pt); + to->setSlope(pt, from->getSlope(pt)); } } diff --git a/tests/python/GradingDataTest.py b/tests/python/GradingDataTest.py index 39cd8ba5cc..34abd89fff 100644 --- a/tests/python/GradingDataTest.py +++ b/tests/python/GradingDataTest.py @@ -368,6 +368,29 @@ def test_huecurve(self): assertEqualBSpline(self, hcrv.lum_sat, ls) self.assertEqual(hcrv.lum_sat, ls) + # Check that setting the hue curve preserves the spline type. + hcrv.hue_sat = ls + ls2 = hcrv.hue_sat + # Spline type is now different than what hue_sat normally uses (PERIODIC_1_B_SPLINE). + self.assertEqual(ls2.getSplineType(), OCIO.HORIZONTAL1_B_SPLINE) + self.assertEqual(hcrv.hue_sat, ls) + self.assertEqual(ls2, ls) + + # Check that setting the hue curve preserves the slopes. + self.assertEqual(ls.slopesAreDefault(), True) + slopes = ls.getSlopes() + slopes[1] = 0.5 + ls.setSlopes(slopes) + self.assertEqual(ls.slopesAreDefault(), False) + hcrv.hue_sat = ls + ls2 = hcrv.hue_sat + self.assertEqual(ls2.slopesAreDefault(), False) + slopes2 = ls2.getSlopes() + self.assertEqual(slopes2[1], 0.5) + self.assertEqual(slopes2, slopes) + self.assertEqual(hcrv.hue_sat, ls) + self.assertEqual(ls2, ls) + def test_rgbmsw(self): """ Test the GradingRGBMSW struct. From 812f3a462bb536eed3f1284d3c3f81a291a495d4 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 22 Apr 2026 19:21:40 -0400 Subject: [PATCH 24/37] Adsk Contrib - Update CI to VFX 2026 (#2282) * Update Linux CI to VFX 2026 Signed-off-by: Doug Walker * Implement TSC requests Signed-off-by: Doug Walker * Add pypa action and improve Sonar stuff Signed-off-by: Doug Walker * Update deploy site actions Signed-off-by: Doug Walker * Remove more python 3.9 Signed-off-by: Doug Walker * Update latest dependabot Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- .github/workflows/analysis_workflow.yml | 8 +- .github/workflows/ci_workflow.yml | 249 ++++-------------- .github/workflows/dependencies_latest.yml | 18 +- .github/workflows/deploy_site.yml | 8 +- .github/workflows/platform_latest.yml | 18 +- .github/workflows/release-sign.yml | 4 +- .github/workflows/wheel_workflow.yml | 89 +++---- docs/quick_start/installation.rst | 4 +- setup.cfg | 3 +- .../ops/gradingtone/GradingTone.cpp | 2 +- 10 files changed, 112 insertions(+), 291 deletions(-) diff --git a/.github/workflows/analysis_workflow.yml b/.github/workflows/analysis_workflow.yml index d722232129..98f54c68c4 100644 --- a/.github/workflows/analysis_workflow.yml +++ b/.github/workflows/analysis_workflow.yml @@ -41,11 +41,11 @@ jobs: CC: gcc steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 50 - - name: Install sonar-scanner and build-wrapper - uses: sonarsource/sonarcloud-github-c-cpp@v2 + - name: Install build-wrapper + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v4 - name: Install docs env run: share/ci/scripts/linux/dnf/install_docs_env.sh - name: Install tests env @@ -78,7 +78,7 @@ jobs: - name: Generate code coverage report run: share/ci/scripts/linux/run_gcov.sh - name: Run sonar-scanner + uses: SonarSource/sonarqube-scan-action@a31c9398be7ace6bbfaf30c0bd5d415f843d45e9 # v7.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: sonar-scanner diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 82a186d04d..2d6ba3a12e 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -61,12 +61,12 @@ jobs: strategy: fail-fast: true matrix: - build: [7, 8, 9, 10, 11, 12, 13, 14, 15] + build: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] include: # ------------------------------------------------------------------- - # VFX CY2025 (Python 3.11) + # VFX CY2026 (Python 3.13) # ------------------------------------------------------------------- - - build: 15 + - build: 12 build-type: Debug build-shared: 'ON' build-docs: 'OFF' @@ -77,9 +77,9 @@ jobs: cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2025 + vfx-cy: 2026 install-ext-packages: MISSING - - build: 14 + - build: 11 build-type: Release build-shared: 'ON' build-docs: 'ON' @@ -90,9 +90,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2025 + vfx-cy: 2026 install-ext-packages: ALL - - build: 13 + - build: 10 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -103,12 +103,12 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2025 + vfx-cy: 2026 install-ext-packages: ALL # ------------------------------------------------------------------- - # VFX CY2024 (Python 3.11) + # VFX CY2025 (Python 3.11) # ------------------------------------------------------------------- - - build: 12 + - build: 9 build-type: Debug build-shared: 'ON' build-docs: 'OFF' @@ -119,9 +119,9 @@ jobs: cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2024 + vfx-cy: 2025 install-ext-packages: MISSING - - build: 11 + - build: 8 build-type: Release build-shared: 'ON' build-docs: 'ON' @@ -132,9 +132,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2024 + vfx-cy: 2025 install-ext-packages: ALL - - build: 10 + - build: 7 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -145,12 +145,12 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2024 + vfx-cy: 2025 install-ext-packages: ALL # ------------------------------------------------------------------- - # VFX CY2023 (Python 3.10) + # VFX CY2024 (Python 3.11) # ------------------------------------------------------------------- - - build: 9 + - build: 6 build-type: Debug build-shared: 'ON' build-docs: 'OFF' @@ -161,9 +161,9 @@ jobs: cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2023 + vfx-cy: 2024 install-ext-packages: MISSING - - build: 8 + - build: 5 build-type: Release build-shared: 'ON' build-docs: 'ON' @@ -174,9 +174,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2023 + vfx-cy: 2024 install-ext-packages: ALL - - build: 7 + - build: 4 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -187,136 +187,24 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2023 + vfx-cy: 2024 install-ext-packages: ALL - env: - CXX: ${{ matrix.cxx-compiler }} - CC: ${{ matrix.cc-compiler }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install docs env - run: share/ci/scripts/linux/dnf/install_docs_env.sh - if: matrix.build-docs == 'ON' - - name: Install tests env - run: share/ci/scripts/linux/dnf/install_tests_env.sh - - name: Create build directories - run: | - mkdir _install - mkdir _build - - name: Configure - run: | - cmake ../. \ - -DCMAKE_INSTALL_PREFIX=../_install \ - -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ - -DCMAKE_CXX_STANDARD=${{ matrix.cxx-standard }} \ - -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \ - -DOCIO_BUILD_DOCS=${{ matrix.build-docs }} \ - -DOCIO_BUILD_OPENFX=${{ matrix.build-openfx }} \ - -DOCIO_BUILD_GPU_TESTS=OFF \ - -DOCIO_USE_SIMD=${{ matrix.use-simd }} \ - -DOCIO_USE_OIIO_FOR_APPS=${{ matrix.use-oiio }} \ - -DOCIO_INSTALL_EXT_PACKAGES=${{ matrix.install-ext-packages }} \ - -DOCIO_WARNING_AS_ERROR=ON \ - -DPython_EXECUTABLE=$(which python) - working-directory: _build - - name: Build - run: | - cmake --build . \ - --target install \ - --config ${{ matrix.build-type }} \ - -- -j$(nproc) - echo "ocio_build_path=$(pwd)" >> $GITHUB_ENV - working-directory: _build - - name: Test - run: ctest -V -C ${{ matrix.build-type }} - working-directory: _build - - name: Test CMake Consumer with shared OCIO - if: matrix.build-shared == 'ON' - run: | - cmake . \ - -DCMAKE_PREFIX_PATH=../../../_install \ - -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} - cmake --build . \ - --config ${{ matrix.build-type }} - ./consumer - working-directory: _build/tests/cmake-consumer-dist - - name: Test CMake Consumer with static OCIO - if: matrix.build-shared == 'OFF' - # The yaml-cpp_VERSION is set below because Findyaml-cpp.cmake needs it but is unable to - # extract it from the headers, like the other modules. - # - # Prefer the static version of each dependencies by using _STATIC_LIBRARY. - # Alternatively, this can be done by setting _LIBRARY and _INCLUDE_DIR to - # the static version of the package. - run: | - cmake . \ - -DCMAKE_PREFIX_PATH=../../../_install \ - -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ - -Dexpat_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dexpat_STATIC_LIBRARY=ON \ - -DImath_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -DImath_STATIC_LIBRARY=ON \ - -Dpystring_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dyaml-cpp_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dyaml-cpp_STATIC_LIBRARY=ON \ - -Dyaml-cpp_VERSION=0.8.0 \ - -DZLIB_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -DZLIB_STATIC_LIBRARY=ON \ - -Dminizip-ng_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dminizip-ng_STATIC_LIBRARY=ON - cmake --build . \ - --config ${{ matrix.build-type }} - ./consumer - working-directory: _build/tests/cmake-consumer-dist - - # --------------------------------------------------------------------------- - # Linux (unsupported Node.js) - # --------------------------------------------------------------------------- - - linux-old: - name: 'Linux VFX CY${{ matrix.vfx-cy }} - <${{ matrix.compiler-desc }} - config=${{ matrix.build-type }}, - shared=${{ matrix.build-shared }}, - simd=${{ matrix.use-simd }}, - cxx=${{ matrix.cxx-standard }}, - docs=${{ matrix.build-docs }}, - oiio=${{ matrix.use-oiio }}>' - # Avoid duplicated checks when a pull_request is opened from a local branch. - if: | - github.event_name == 'push' || - github.event.pull_request.head.repo.full_name != github.repository - # GH-hosted VM. The build runs in ASWF 'container' defined below. - runs-on: ubuntu-latest - container: - # DockerHub: https://hub.docker.com/u/aswf - # Source: https://github.com/AcademySoftwareFoundation/aswf-docker - image: aswf/ci-ocio:${{ matrix.vfx-cy }} - volumes: - - /node20217:/node20217:rw,rshared - - /node20217:/__e/node20:ro,rshared - strategy: - fail-fast: true - matrix: - build: [1, 2, 3] - include: # ------------------------------------------------------------------- - # VFX CY2022 (Python 3.9) + # VFX CY2023 (Python 3.10) # ------------------------------------------------------------------- - - build: 1 + - build: 3 build-type: Debug build-shared: 'ON' build-docs: 'OFF' build-openfx: 'ON' use-simd: 'ON' use-oiio: 'ON' - cxx-standard: 17 + cxx-standard: 20 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2022 - install-ext-packages: ALL + vfx-cy: 2023 + install-ext-packages: MISSING - build: 2 build-type: Release build-shared: 'ON' @@ -328,9 +216,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2022 - install-ext-packages: MISSING - - build: 3 + vfx-cy: 2023 + install-ext-packages: ALL + - build: 1 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -341,30 +229,14 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2022 + vfx-cy: 2023 install-ext-packages: ALL env: CXX: ${{ matrix.cxx-compiler }} CC: ${{ matrix.cc-compiler }} steps: - # Install nodejs 20 with glibc 2.17, to work around the face that the - # GHA runners are insisting on a node version that is too new for the - # glibc in the ASWF containers prior to 2023. - - name: Install nodejs20glibc2.17 - run: | - curl --silent https://unofficial-builds.nodejs.org/download/release/v20.18.1/node-v20.18.1-linux-x64-glibc-217.tar.xz | tar -xJ --strip-components 1 -C /node20217 -f - - # We would like to use harden-runner, but it flags too many false - # positives, every time we download a dependency. We should use it only - # on CI runs where we are producing artifacts that users might rely on. - # - name: Harden Runner - # uses: step-security/harden-runner@248ae51c2e8cc9622ecf50685c8bf7150c6e8813 # v1.4.3 - # with: - # egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - # Note: can't upgrade to actions/checkout 4.0 because it needs newer - # glibc than these containers have. - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install docs env run: share/ci/scripts/linux/dnf/install_docs_env.sh if: matrix.build-docs == 'ON' @@ -445,7 +317,7 @@ jobs: # --------------------------------------------------------------------------- macos: - name: 'macOS 13 + name: 'macOS 15 intel = 2.9.2 (for the Python binding) -- Python >= 3.9 (for the Python binding only) -- Python 3.9+ (for building the documentation) +- Python >= 3.10 (for the Python binding only) +- Python 3.10+ (for building the documentation) Building the documentation requires the following packages, available via PyPI: diff --git a/setup.cfg b/setup.cfg index aa1015183a..a34fc55490 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,7 +7,6 @@ classifiers = Topic :: Software Development :: Libraries :: Python Modules Programming Language :: C++ Programming Language :: Python :: 3 - Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 @@ -21,7 +20,7 @@ license_files = LICENSE long_description = file: README.md, LICENSE long_description_content_type = text/markdown name = opencolorio -python_requires = '>=3.9' +python_requires = '>=3.10' url = https://opencolorio.org/ [options] diff --git a/src/OpenColorIO/ops/gradingtone/GradingTone.cpp b/src/OpenColorIO/ops/gradingtone/GradingTone.cpp index 932b0a6d14..4851e72cb5 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingTone.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingTone.cpp @@ -60,7 +60,7 @@ void GradingTone::validate() const static constexpr double MinSHTol = MinSH - Error; static constexpr double MaxSHTol = MaxSH + Error; static constexpr double MinWSCTol = MinWSC - Error; - static constexpr double MaxSCTol = MaxSC - Error; + static constexpr double MaxSCTol = MaxSC + Error; { const auto & bd = m_blacks; From 45ff624270d327597ebc49bf4c8f00d4f22d4720 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 22 Apr 2026 23:34:20 -0400 Subject: [PATCH 25/37] Adsk Contrib - Update Python documentation requirements (#2285) * Implement dependabot requests Signed-off-by: Doug Walker * Revert Sphinx Signed-off-by: Doug Walker * Update latest dependabot Signed-off-by: Doug Walker * Add sphinx-press install Signed-off-by: Doug Walker * Remove outdated comment Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- .github/workflows/wheel_workflow.yml | 5 +++++ docs/requirements.txt | 7 ++----- pyproject.toml | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/wheel_workflow.yml b/.github/workflows/wheel_workflow.yml index e7bbd53ebe..d2602978da 100644 --- a/.github/workflows/wheel_workflow.yml +++ b/.github/workflows/wheel_workflow.yml @@ -138,6 +138,7 @@ jobs: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: @@ -196,6 +197,7 @@ jobs: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.manylinux }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: @@ -252,6 +254,7 @@ jobs: env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: @@ -304,6 +307,7 @@ jobs: env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: @@ -356,6 +360,7 @@ jobs: env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: diff --git a/docs/requirements.txt b/docs/requirements.txt index 334e782153..c212eeb4c4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,4 @@ -# Fix an issue with the OCIO's Linux container images that have OpenSSL under 1.1.1. -# If the container images are updated with OpenSSL 1.1.1+, the restriction on -# urllib3 version <2 can be removed. -urllib3<2 +urllib3<3 # The builds for documentation fails with <0.18.0 docutils>=0.18.1 sphinx<=7.1.2 @@ -11,4 +8,4 @@ recommonmark sphinx-press-theme sphinx-tabs breathe -setuptools<68.0.0 +setuptools<83.0.0 diff --git a/pyproject.toml b/pyproject.toml index 23631c12bc..7c49ae11a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [build-system] requires = [ - "setuptools>=42", + "setuptools>=82.0.1", "wheel", "cmake>=3.14", "ninja; sys_platform != 'win32' and platform_machine != 'arm64'", # Documentation requirements (see docs/requirements.txt for details) - "urllib3<2", - "docutils>=0.18.1", + "urllib3<3", + "docutils>=0.22.4", "sphinx<=7.1.2", "six", "testresources", From e24ce5c05d6a60897d1c960f3cf6fe09d9003830 Mon Sep 17 00:00:00 2001 From: Cuneyt Ozdas Date: Thu, 23 Apr 2026 21:22:44 -0700 Subject: [PATCH 26/37] Adsk Contrib - Setup Debugger Env Paths (#2262) * - Adding a CMake utility function to setup debugger environments so that the debugger can locate the run-time dependencies. This makes it possible to compile and launch the projects directly within visual studio for example. - Calling the above function in projects that need it. Signed-off-by: cuneyt.ozdas * - white space fix Signed-off-by: cuneyt.ozdas * - group the source files in IDE to replicate the source tree structure Signed-off-by: cuneyt.ozdas * - Grouping the cpu test project sources to replicate the source tree structure. OCIO library files and the test files are separately grouped for better clarity. Signed-off-by: cuneyt.ozdas * - Make the gpu test CTest paths modification more robust Signed-off-by: cuneyt.ozdas --------- Signed-off-by: cuneyt.ozdas Co-authored-by: Doug Walker --- CMakeLists.txt | 5 +++ share/cmake/utils/DebuggerEnvironment.cmake | 27 ++++++++++++++++ src/OpenColorIO/CMakeLists.txt | 3 ++ src/apps/ocioarchive/CMakeLists.txt | 4 +++ src/apps/ociobakelut/CMakeLists.txt | 4 +++ src/apps/ociocheck/CMakeLists.txt | 4 +++ src/apps/ociochecklut/CMakeLists.txt | 4 +++ src/apps/ocioconvert/CMakeLists.txt | 4 +++ src/apps/ociodisplay/CMakeLists.txt | 4 +++ src/apps/ociolutimage/CMakeLists.txt | 4 +++ src/apps/ociomakeclf/CMakeLists.txt | 4 +++ src/apps/ociomergeconfigs/CMakeLists.txt | 4 +++ src/apps/ocioperf/CMakeLists.txt | 4 +++ src/apps/ociowrite/CMakeLists.txt | 4 +++ tests/cpu/CMakeLists.txt | 36 ++++++++++++--------- tests/gpu/CMakeLists.txt | 22 +++++++------ 16 files changed, 113 insertions(+), 24 deletions(-) create mode 100644 share/cmake/utils/DebuggerEnvironment.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b1fce3398..7a309a8fd7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -349,6 +349,11 @@ endif() include(CompilerFlags) +############################################################################### +# Include utility functions for setting debugging environments + +include(DebuggerEnvironment) + ############################################################################### # External linking options diff --git a/share/cmake/utils/DebuggerEnvironment.cmake b/share/cmake/utils/DebuggerEnvironment.cmake new file mode 100644 index 0000000000..2b47980976 --- /dev/null +++ b/share/cmake/utils/DebuggerEnvironment.cmake @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. + + +############################################################################### +# Define a function to set debugger environment so that the run time +# dependencies can be located by the debugger. + +function(set_debugger_env target_name) + cmake_parse_arguments(ARG "NEEDS_GL" "" "" ${ARGN}) + + if(NOT TARGET ${target_name}) + message(FATAL_ERROR "set_debugger_env: '${target_name}' is not a CMake target") + endif() + + # Set the Paths for Visual Studio IDE Debugger. + if(MSVC) + if(OCIO_GL_ENABLED AND ARG_NEEDS_GL) + # Add folders for glut and glew DLLs. + set(extra_dirs "${GLUT_INCLUDE_DIR}/../bin;${GLEW_INCLUDE_DIRS}/../bin") + endif() + + set_property(TARGET ${target_name} PROPERTY + VS_DEBUGGER_ENVIRONMENT "PATH=$,;>;${extra_dirs};%PATH%" + ) + endif() +endfunction() \ No newline at end of file diff --git a/src/OpenColorIO/CMakeLists.txt b/src/OpenColorIO/CMakeLists.txt index f56b6219c3..ff20c1a6c7 100755 --- a/src/OpenColorIO/CMakeLists.txt +++ b/src/OpenColorIO/CMakeLists.txt @@ -235,6 +235,9 @@ configure_file(CPUInfoConfig.h.in CPUInfoConfig.h) add_library(OpenColorIO ${SOURCES}) +# Group the source files to replicate the source tree structure in the IDEs. +source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" FILES ${SOURCES}) + # Require at least a C++11 compatible compiler for consumer projects. target_compile_features(OpenColorIO PUBLIC cxx_std_11 diff --git a/src/apps/ocioarchive/CMakeLists.txt b/src/apps/ocioarchive/CMakeLists.txt index 599d706f09..b8af2808fb 100644 --- a/src/apps/ocioarchive/CMakeLists.txt +++ b/src/apps/ocioarchive/CMakeLists.txt @@ -30,3 +30,7 @@ ocio_strip_binary(ocioarchive) install(TARGETS ocioarchive RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ocioarchive) diff --git a/src/apps/ociobakelut/CMakeLists.txt b/src/apps/ociobakelut/CMakeLists.txt index 3d6e586b96..09cd76b137 100755 --- a/src/apps/ociobakelut/CMakeLists.txt +++ b/src/apps/ociobakelut/CMakeLists.txt @@ -39,3 +39,7 @@ ocio_strip_binary(ociobakelut) install(TARGETS ociobakelut RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociobakelut) diff --git a/src/apps/ociocheck/CMakeLists.txt b/src/apps/ociocheck/CMakeLists.txt index 024139546d..50955bc0d7 100755 --- a/src/apps/ociocheck/CMakeLists.txt +++ b/src/apps/ociocheck/CMakeLists.txt @@ -28,3 +28,7 @@ ocio_strip_binary(ociocheck) install(TARGETS ociocheck RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociocheck) diff --git a/src/apps/ociochecklut/CMakeLists.txt b/src/apps/ociochecklut/CMakeLists.txt index 431b1b79fb..f4662f1b02 100644 --- a/src/apps/ociochecklut/CMakeLists.txt +++ b/src/apps/ociochecklut/CMakeLists.txt @@ -36,3 +36,7 @@ ocio_strip_binary(ociochecklut) install(TARGETS ociochecklut RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociochecklut NEEDS_GL) \ No newline at end of file diff --git a/src/apps/ocioconvert/CMakeLists.txt b/src/apps/ocioconvert/CMakeLists.txt index 7b7abddcf2..1172588111 100755 --- a/src/apps/ocioconvert/CMakeLists.txt +++ b/src/apps/ocioconvert/CMakeLists.txt @@ -40,3 +40,7 @@ ocio_strip_binary(ocioconvert) install(TARGETS ocioconvert RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ocioconvert NEEDS_GL) diff --git a/src/apps/ociodisplay/CMakeLists.txt b/src/apps/ociodisplay/CMakeLists.txt index 14b53cfda3..9261f1cab4 100755 --- a/src/apps/ociodisplay/CMakeLists.txt +++ b/src/apps/ociodisplay/CMakeLists.txt @@ -53,3 +53,7 @@ ocio_strip_binary(ociodisplay) install(TARGETS ociodisplay RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociodisplay NEEDS_GL) diff --git a/src/apps/ociolutimage/CMakeLists.txt b/src/apps/ociolutimage/CMakeLists.txt index a470d2f6eb..07bdad9307 100755 --- a/src/apps/ociolutimage/CMakeLists.txt +++ b/src/apps/ociolutimage/CMakeLists.txt @@ -33,3 +33,7 @@ ocio_strip_binary(ociolutimage) install(TARGETS ociolutimage RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociolutimage) diff --git a/src/apps/ociomakeclf/CMakeLists.txt b/src/apps/ociomakeclf/CMakeLists.txt index fc3bd8e9f1..42028303ba 100644 --- a/src/apps/ociomakeclf/CMakeLists.txt +++ b/src/apps/ociomakeclf/CMakeLists.txt @@ -29,3 +29,7 @@ ocio_strip_binary(ociomakeclf) install(TARGETS ociomakeclf RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociomakeclf) diff --git a/src/apps/ociomergeconfigs/CMakeLists.txt b/src/apps/ociomergeconfigs/CMakeLists.txt index 5a2a5bbe12..d78609112a 100644 --- a/src/apps/ociomergeconfigs/CMakeLists.txt +++ b/src/apps/ociomergeconfigs/CMakeLists.txt @@ -30,3 +30,7 @@ ocio_strip_binary(ociomergeconfigs) install(TARGETS ociomergeconfigs RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociomergeconfigs) diff --git a/src/apps/ocioperf/CMakeLists.txt b/src/apps/ocioperf/CMakeLists.txt index c056080bc5..541439e720 100644 --- a/src/apps/ocioperf/CMakeLists.txt +++ b/src/apps/ocioperf/CMakeLists.txt @@ -25,3 +25,7 @@ ocio_strip_binary(ocioperf) install(TARGETS ocioperf RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ocioperf) diff --git a/src/apps/ociowrite/CMakeLists.txt b/src/apps/ociowrite/CMakeLists.txt index bd77acfea6..ebaf60dc90 100644 --- a/src/apps/ociowrite/CMakeLists.txt +++ b/src/apps/ociowrite/CMakeLists.txt @@ -24,3 +24,7 @@ ocio_strip_binary(ociowrite) install(TARGETS ociowrite RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociowrite) diff --git a/tests/cpu/CMakeLists.txt b/tests/cpu/CMakeLists.txt index 12fd06c1ba..2dab084f3e 100755 --- a/tests/cpu/CMakeLists.txt +++ b/tests/cpu/CMakeLists.txt @@ -19,10 +19,28 @@ macro(add_ocio_test_variant NAME BINARY) endif() endmacro() -function(add_ocio_test NAME SOURCES PRIVATE_INCLUDES) +function(prepend var prefix) + set(new "") + foreach(f ${ARGN}) + list(APPEND new "${prefix}${f}") + endforeach(f) + set(${var} "${new}" PARENT_SCOPE) +endfunction(prepend) + +function(add_ocio_test NAME SOURCES TESTS PRIVATE_INCLUDES) set(TEST_BINARY "test_${NAME}_exec") set(TEST_NAME "test_${NAME}") - add_executable(${TEST_BINARY} ${SOURCES}) + + prepend(SOURCES "${PROJECT_SOURCE_DIR}/src/OpenColorIO/" ${SOURCES}) + set(SOURCES_ALL ${SOURCES}) + list(APPEND SOURCES_ALL ${TESTS}) + + add_executable(${TEST_BINARY} ${SOURCES_ALL}) + + # Group the source files to replicate the source tree structure in the IDEs. + source_group(TREE "${PROJECT_SOURCE_DIR}/src/OpenColorIO/" PREFIX "OpenColorIO Library" FILES ${SOURCES}) + source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Tests" FILES ${TESTS}) + target_compile_definitions(${TEST_BINARY} PRIVATE OpenColorIO_SKIP_IMPORTS @@ -331,18 +349,6 @@ set(TESTS ViewTransform_tests.cpp ) -function(prepend var prefix) - set(new "") - foreach(f ${ARGN}) - list(APPEND new "${prefix}${f}") - endforeach(f) - set(${var} "${new}" PARENT_SCOPE) -endfunction(prepend) - -prepend(SOURCES "${PROJECT_SOURCE_DIR}/src/OpenColorIO/" ${SOURCES}) - -list(APPEND SOURCES ${TESTS}) - if(OCIO_USE_SIMD AND (OCIO_ARCH_X86 OR OCIO_USE_SSE2NEON)) # Note that these files are gated by preprocessors to remove them based on the OCIO_USE_* vars. set_property(SOURCE "${CMAKE_SOURCE_DIR}/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_SSE2_ARGS}) @@ -359,4 +365,4 @@ if(OCIO_USE_SIMD AND (OCIO_ARCH_X86 OR OCIO_USE_SSE2NEON)) set_property(SOURCE "AVX512_tests.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX512_ARGS}) endif() -add_ocio_test(cpu "${SOURCES}" TRUE) +add_ocio_test(cpu "${SOURCES}" "${TESTS}" TRUE) diff --git a/tests/gpu/CMakeLists.txt b/tests/gpu/CMakeLists.txt index 5f1c0379cf..4344cbfa26 100644 --- a/tests/gpu/CMakeLists.txt +++ b/tests/gpu/CMakeLists.txt @@ -48,16 +48,20 @@ endif() # Note: To avoid changing PATH from outside the cmake files. if(MSVC AND BUILD_SHARED_LIBS) + # Build time list of runtime dll dirs for the exe target. + set(dll_dirs_expr "$,;>") - if (MSVC_IDE) - # Note: By default Microsoft Visual Studio editor happens the build type to the build directory. - set(BUILD_TYPE ${CMAKE_BUILD_TYPE}) - endif() + # Add folders for glut and glew DLLs. + set(extra_dirs "${GLUT_INCLUDE_DIR}/../bin\\;${GLEW_INCLUDE_DIRS}/../bin\\") - set(NEW_PATH "${PROJECT_BINARY_DIR}/src/OpenColorIO/${BUILD_TYPE}") - set(NEW_PATH "${NEW_PATH}\\\;${GLUT_INCLUDE_DIR}/../bin") - set(NEW_PATH "${NEW_PATH}\\\;${GLEW_INCLUDE_DIRS}/../bin") - - set_tests_properties(test_gpu PROPERTIES ENVIRONMENT PATH=${NEW_PATH}) + # Tell CTest to use this PATH while launching test_gpu_exec + set_tests_properties(test_gpu PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + # Also set the debugger environment so that you can launch + # test_gpu_exec directly within Visual Studio. + set_property(TARGET test_gpu_exec PROPERTY + VS_DEBUGGER_ENVIRONMENT "PATH=${dll_dirs_expr};${extra_dirs};%PATH%" + ) endif() From 39e775bd84f09007ebf1eb8d5272a2d8f3db835d Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Tue, 5 May 2026 15:16:53 -0400 Subject: [PATCH 27/37] Improve CMake and Actions settings (#2302) * Improve cmake and actions settings Signed-off-by: Doug Walker * Bump sonarqube action Signed-off-by: Doug Walker * Fix Windows documentation fail Signed-off-by: Doug Walker * Fix Windows documentation fail, take 2 Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- .github/dependabot.yml | 8 +++- .github/workflows/analysis_workflow.yml | 4 +- CMakeLists.txt | 4 +- docs/api/grading_transforms.rst | 47 +++++++++++++++++++++++ include/OpenColorIO/OpenColorTransforms.h | 8 ++-- 5 files changed, 60 insertions(+), 11 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f8e1c539cd..c650217b1f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,9 +8,13 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" + interval: "monthly" + # Only do security updates rather than all version updates. + open-pull-requests-limit: 0 - package-ecosystem: "pip" directory: "/" schedule: - interval: "weekly" + interval: "monthly" + # Only do security updates rather than all version updates. + open-pull-requests-limit: 0 diff --git a/.github/workflows/analysis_workflow.yml b/.github/workflows/analysis_workflow.yml index 98f54c68c4..1bd42af380 100644 --- a/.github/workflows/analysis_workflow.yml +++ b/.github/workflows/analysis_workflow.yml @@ -45,7 +45,7 @@ jobs: with: fetch-depth: 50 - name: Install build-wrapper - uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v4 + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0 - name: Install docs env run: share/ci/scripts/linux/dnf/install_docs_env.sh - name: Install tests env @@ -78,7 +78,7 @@ jobs: - name: Generate code coverage report run: share/ci/scripts/linux/run_gcov.sh - name: Run sonar-scanner - uses: SonarSource/sonarqube-scan-action@a31c9398be7ace6bbfaf30c0bd5d415f843d45e9 # v7.0.0 + uses: SonarSource/sonarqube-scan-action@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a309a8fd7..a1b8dd0669 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -401,9 +401,7 @@ if(NOT DEFINED OCIO_NAMESPACE) elseif(OCIO_NAMESPACE STREQUAL "") message(FATAL_ERROR "A namespace cannot be empty.") else() - set(OCIO_NAMESPACE "OpenColorIO_${OCIO_NAMESPACE}_v${OpenColorIO_VERSION_MAJOR}_${OpenColorIO_VERSION_MINOR}${OpenColorIO_VERSION_RELEASE_TYPE}" CACHE STRING - "Specify the main OCIO C++ namespace: Options include OpenColorIO OpenColorIO_ etc.") - message(STATUS "Setting namespace to '${OCIO_NAMESPACE}' as none was specified.") + message(STATUS "Setting namespace to '${OCIO_NAMESPACE}'.") endif() diff --git a/docs/api/grading_transforms.rst b/docs/api/grading_transforms.rst index 83fafe2d24..f2d8d7fbf5 100644 --- a/docs/api/grading_transforms.rst +++ b/docs/api/grading_transforms.rst @@ -118,6 +118,53 @@ GradingRGBCurve .. doxygentypedef:: ${OCIO_NAMESPACE}::ConstGradingRGBCurveRcPtr .. doxygentypedef:: ${OCIO_NAMESPACE}::GradingRGBCurveRcPtr +GradingHueCurveTransform +************************ + +.. tabs:: + + .. group-tab:: Python + + .. autoclass:: PyOpenColorIO.GradingHueCurveTransform + :members: + :undoc-members: + :special-members: __init__, __str__ + :inherited-members: + + .. group-tab:: C++ + + .. doxygenclass:: ${OCIO_NAMESPACE}::GradingHueCurveTransform + :members: + :undoc-members: + + .. doxygenfunction:: ${OCIO_NAMESPACE}::operator<<(std::ostream&, const GradingHueCurveTransform&) noexcept + + .. doxygentypedef:: ${OCIO_NAMESPACE}::ConstGradingHueCurveTransformRcPtr + .. doxygentypedef:: ${OCIO_NAMESPACE}::GradingHueCurveTransformRcPtr + +GradingHueCurve +^^^^^^^^^^^^^^^ + +.. tabs:: + + .. group-tab:: Python + + .. autoclass:: PyOpenColorIO.GradingHueCurve + :members: + :undoc-members: + :special-members: __init__, __str__ + + .. group-tab:: C++ + + .. doxygenclass:: ${OCIO_NAMESPACE}::GradingHueCurve + :members: + :undoc-members: + + .. doxygenfunction:: ${OCIO_NAMESPACE}::operator<<(std::ostream&, const GradingHueCurve&) + + .. doxygentypedef:: ${OCIO_NAMESPACE}::ConstGradingHueCurveRcPtr + .. doxygentypedef:: ${OCIO_NAMESPACE}::GradingHueCurveRcPtr + GradingControlPoint ^^^^^^^^^^^^^^^^^^^ diff --git a/include/OpenColorIO/OpenColorTransforms.h b/include/OpenColorIO/OpenColorTransforms.h index 8ef04be8c8..94dc58d0d6 100644 --- a/include/OpenColorIO/OpenColorTransforms.h +++ b/include/OpenColorIO/OpenColorTransforms.h @@ -1367,10 +1367,10 @@ class OCIOEXPORT GradingHueCurveTransform : public Transform virtual HSYTransformStyle getRGBToHSY() const = 0; virtual void setRGBToHSY(HSYTransformStyle style) = 0; - ///** - // * Parameters can be made dynamic so the values can be changed through the CPU or GPU processor, - // * but if there are several GradingHueCurveTransform only one can have dynamic parameters. - // */ + /** + * Parameters can be made dynamic so the values can be changed through the CPU or GPU processor, + * but if there are several GradingHueCurveTransform only one can have dynamic parameters. + */ virtual bool isDynamic() const noexcept = 0; virtual void makeDynamic() noexcept = 0; virtual void makeNonDynamic() noexcept = 0; From 9abd326bde69e2929dc191fd9791c8f116bb0d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Achard?= Date: Wed, 6 May 2026 19:57:12 +0100 Subject: [PATCH 28/37] Add /bigobj for pybind11 target on Windows (#2304) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Achard --- share/cmake/modules/Findpybind11.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/share/cmake/modules/Findpybind11.cmake b/share/cmake/modules/Findpybind11.cmake index bfcb9a696e..89d8cf8ab0 100644 --- a/share/cmake/modules/Findpybind11.cmake +++ b/share/cmake/modules/Findpybind11.cmake @@ -140,5 +140,14 @@ if(_pybind11_TARGET_CREATE) INTERFACE_INCLUDE_DIRECTORIES ${pybind11_INCLUDE_DIR} ) + # /bigobj is needed for bigger binding projects due to the limit to 64k + # addressable sections (see pybind11Common.cmake). + if (MSVC) + set_target_properties(pybind11::module PROPERTIES + INTERFACE_COMPILE_OPTIONS /bigobj + ) + + endif() + mark_as_advanced(pybind11_INCLUDE_DIR pybind11_VERSION) endif() From 4a119df181d94df62b889d7e2fd688ad773aa2fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Achard?= Date: Wed, 6 May 2026 20:22:05 +0100 Subject: [PATCH 29/37] Fix OpenGL ES type issues in ACES2 FixedFunction Ops (#2281) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix OpenGL ES type issues in ACES2 FixedFunction Ops Signed-off-by: Rémi Achard * Update src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp Co-authored-by: Doug Walker Signed-off-by: Rémi Achard * Add 2D texture path tests for ACES2 cusp and reach table sampling Signed-off-by: Rémi Achard --------- Signed-off-by: Rémi Achard Co-authored-by: Doug Walker --- .../ops/fixedfunction/FixedFunctionOpGPU.cpp | 20 +++--- tests/gpu/FixedFunctionOp_test.cpp | 68 +++++++++++++++++++ 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp index 6f3070d557..59ab7121c0 100644 --- a/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp +++ b/src/OpenColorIO/ops/fixedfunction/FixedFunctionOpGPU.cpp @@ -563,18 +563,18 @@ std::string _Add_Reach_table( ss.indent(); ss.newLine() << ss.floatDecl("i_base") << " = floor(h);"; - ss.newLine() << ss.floatDecl("i_lo") << " = i_base + " << table.base_index << ";"; - ss.newLine() << ss.floatDecl("i_hi") << " = i_lo + 1;"; + ss.newLine() << ss.floatDecl("i_lo") << " = i_base + " << ss.floatKeyword() << "(" << table.base_index << ");"; + ss.newLine() << ss.floatDecl("i_hi") << " = i_lo + 1.0;"; if (dimensions == GpuShaderDesc::TEXTURE_1D) { - ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex1D(name, "(i_lo + 0.5) / " + std::to_string(table.total_size)) << ".r;"; - ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex1D(name, "(i_hi + 0.5) / " + std::to_string(table.total_size)) << ".r;"; + ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex1D(name, "(i_lo + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")") << ".r;"; + ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex1D(name, "(i_hi + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")") << ".r;"; } else { - ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_lo + 0.5) / " + std::to_string(table.total_size), "0.0")) << ".r;"; - ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_hi + 0.5) / " + std::to_string(table.total_size), "0.5")) << ".r;"; + ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_lo + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")", "0.0")) << ".r;"; + ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_hi + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")", "0.5")) << ".r;"; } ss.newLine() << ss.floatDecl("t") << " = h - i_base;"; // Hardcoded single degree spacing @@ -901,13 +901,13 @@ std::string _Add_Cusp_table( if (dimensions == GpuShaderDesc::TEXTURE_1D) { - ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex1D(name, std::string("(i_hi - 1 + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size)) << ".rgb;"; - ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex1D(name, std::string("(i_hi + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size)) << ".rgb;"; + ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex1D(name, std::string("(" + ss.floatKeyword() + "(i_hi) - 1.0 + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")") << ".rgb;"; + ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex1D(name, std::string("(" + ss.floatKeyword() + "(i_hi) + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")") << ".rgb;"; } else { - ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(i_hi - 1 + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size), "0.5")) << ".rgb;"; - ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(i_hi + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size), "0.5")) << ".rgb;"; + ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(" + ss.floatKeyword() + "(i_hi) - 1.0 + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")", "0.5")) << ".rgb;"; + ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(" + ss.floatKeyword() + "(i_hi) + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")", "0.5")) << ".rgb;"; } ss.newLine() << ss.floatDecl("t") << " = (h - " << hues_array_name << "[i_hi - 1]) / " diff --git a/tests/gpu/FixedFunctionOp_test.cpp b/tests/gpu/FixedFunctionOp_test.cpp index 1daca3a77a..e709572bcd 100644 --- a/tests/gpu/FixedFunctionOp_test.cpp +++ b/tests/gpu/FixedFunctionOp_test.cpp @@ -1107,6 +1107,74 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_gamut_compress_inv) test.setErrorThreshold(4e-4f); } +OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_gamut_compress_no1dlut) +{ + // Test the 2D TEXTURE path used for Reach and Cusp table sampling + // OpenGL tests would otherwise not use it and prefer 1D TEXTURE + + const double data[9] = { + // Peak luminance + 1000.f, + // P3D65 gamut + 0.680, 0.320, 0.265, 0.690, 0.150, 0.060, 0.3127, 0.3290 + }; + OCIO::FixedFunctionTransformRcPtr func = + OCIO::FixedFunctionTransform::Create(OCIO::FIXED_FUNCTION_ACES_GAMUT_COMPRESS_20, &data[0], 9); + func->setDirection(OCIO::TRANSFORM_DIR_INVERSE); + + test.setProcessor(func); + + OCIOGPUTest::CustomValues values; + values.m_inputValues = + { + // ACEScg primaries and secondaries scaled by 4 + 110.702453613f, 211.251770020f, 25.025110245f, 1.0f, + 168.016815186f, 129.796249390f, 106.183448792f, 1.0f, + 140.814849854f, 193.459213257f, 147.056488037f, 1.0f, + 156.429519653f, 110.938514709f, 192.204727173f, 1.0f, + 80.456542969f, 98.490524292f, 268.442108154f, 1.0f, + 135.172195435f, 175.559280396f, 341.715240479f, 1.0f, + // OCIO test values + 18.187314987f, 33.819175720f, 4.173158169f, 0.5f, + 80.413116455f, 21.309329987f, 332.159759521f, 1.0f, + 83.447891235f, 37.852291107f, 182.925750732f, 0.0f, + // ColorChecker24 (SMPTE 2065-1 2021) + 27.411964417f, 13.382769585f, 38.146659851f, 1.0f, + 59.987670898f, 14.391894341f, 39.841842651f, 1.0f, + 43.298923492f, 12.199877739f, 249.107116699f, 1.0f, + 31.489658356f, 14.075142860f, 128.878036499f, 1.0f, + 50.749198914f, 12.731814384f, 285.658966064f, 1.0f, + 64.728637695f, 18.593795776f, 179.324264526f, 1.0f, + 53.399448395f, 37.394428253f, 50.924011230f, 1.0f, + 34.719596863f, 21.616765976f, 271.008331299f, 1.0f, + 43.910713196f, 36.788166046f, 13.975610733f, 1.0f, + 23.196525574f, 15.118354797f, 317.544281006f, 1.0f, + 63.348674774f, 33.283493042f, 119.145133972f, 1.0f, + 64.908889771f, 35.371044159f, 70.842193604f, 1.0f, + 24.876911163f, 23.143159866f, 273.228973389f, 1.0f, + 44.203376770f, 28.918329239f, 144.154159546f, 1.0f, + 32.824356079f, 43.447875977f, 17.892261505f, 1.0f, + 75.830871582f, 39.872474670f, 90.752044678f, 1.0f, + 45.823116302f, 34.652069092f, 348.832092285f, 1.0f, + 43.597240448f, 23.079078674f, 218.454376221f, 1.0f, + 96.212783813f, 0.322624743f, 108.271926880f, 1.0f, + 78.222122192f, 0.094044082f, 33.296318054f, 1.0f, + 60.364795685f, 0.031291425f, 291.004058838f, 1.0f, + 43.659111023f, 0.038717352f, 297.386047363f, 1.0f, + 26.623359680f, 0.269155562f, 234.276382446f, 1.0f, + 12.961384773f, 0.366550505f, 255.025634766f, 1.0f, + // Spectrally non-selective 18 % reflecting diffuser + 40.609165192f, 0.000000000f, 299.357757568f, 1.0f, + // Perfect reflecting diffuser + 101.899215698f, 0.000068110f, 5.640549183f, 1.0f, + }; + test.setCustomValues(values); + + test.setErrorThreshold(1e-4f); + + test.getShaderDesc()->setAllowTexture1D(false); +} + // The next four tests run into a problem on some graphics cards where 0.0 * Inf = 0.0, // rather than the correct value of NaN. Therefore turning off TestInfinity for these tests. From 222ca509c950fd1d62189b9334ac708fca1da02c Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 6 May 2026 17:23:36 -0400 Subject: [PATCH 30/37] Fix observed behavior (#2307) Signed-off-by: Doug Walker --- src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp | 4 ++-- src/OpenColorIO/fileformats/FileFormatIridasCube.cpp | 8 ++++---- src/OpenColorIO/fileformats/FileFormatSpi1D.cpp | 8 ++++---- src/OpenColorIO/fileformats/FileFormatSpi3D.cpp | 5 ++--- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp index 6a76d968d4..31e8ae519f 100755 --- a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp @@ -411,9 +411,9 @@ int Lut1dUtils::IMLutGet( { char dstDepthS[16] = ""; #ifdef _WIN32 - const int nummatched = sscanf(InString, "%*s %d %d %s", &numtables, &length, dstDepthS, 16); + const int nummatched = sscanf_s(InString, "%*s %d %d %15s", &numtables, &length, dstDepthS, 16); #else - const int nummatched = sscanf(InString, "%*s %d %d %s", &numtables, &length, dstDepthS); + const int nummatched = sscanf(InString, "%*s %d %d %15s", &numtables, &length, dstDepthS); #endif std::string subStr(InString, 5); if (nummatched < 2 || diff --git a/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp b/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp index ca2965e373..3a5b5ed79b 100755 --- a/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp @@ -241,9 +241,9 @@ LocalFileFormat::read(std::istream & istream, char domainMinB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "domain_min %s %s %s %c", domainMinR, 64, domainMinG, 64, domainMinB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "domain_min %63s %63s %63s %c", domainMinR, 64, domainMinG, 64, domainMinB, 64, &endTok, 1) != 3) #else - if (sscanf(line.c_str(), "domain_min %s %s %s %c", domainMinR, domainMinG, domainMinB, &endTok) != 3) + if (sscanf(line.c_str(), "domain_min %63s %63s %63s %c", domainMinR, domainMinG, domainMinB, &endTok) != 3) #endif { ThrowErrorMessage( @@ -275,9 +275,9 @@ LocalFileFormat::read(std::istream & istream, char domainMaxB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "domain_max %s %s %s %c", domainMaxR, 64, domainMaxG, 64, domainMaxB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "domain_max %63s %63s %63s %c", domainMaxR, 64, domainMaxG, 64, domainMaxB, 64, &endTok, 1) != 3) #else - if (sscanf(line.c_str(), "domain_max %s %s %s %c", domainMaxR, domainMaxG, domainMaxB, &endTok) != 3) + if (sscanf(line.c_str(), "domain_max %63s %63s %63s %c", domainMaxR, domainMaxG, domainMaxB, &endTok) != 3) #endif { ThrowErrorMessage( diff --git a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp index 1cdc51b22c..d65df00065 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp @@ -135,9 +135,9 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char fromMinS[64] = ""; char fromMaxS[64] = ""; #ifdef _WIN32 - if (sscanf_s(lineBuffer, "From %s %s", fromMinS, 64, fromMaxS, 64) != 2) + if (sscanf_s(lineBuffer, "From %63s %63s", fromMinS, 64, fromMaxS, 64) != 2) #else - if (sscanf(lineBuffer, "From %s %s", fromMinS, fromMaxS) != 2) + if (sscanf(lineBuffer, "From %63s %63s", fromMinS, fromMaxS) != 2) #endif { ThrowErrorMessage("Invalid 'From' Tag", currentLine, headerLine); @@ -219,11 +219,11 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char inputLUT[4][64] = {"", "", "", ""}; #ifdef _WIN32 - if (sscanf_s(lineBuffer, "%s %s %s %63s", inputLUT[0], 64, + if (sscanf_s(lineBuffer, "%63s %63s %63s %63s", inputLUT[0], 64, inputLUT[1], 64, inputLUT[2], 64, inputLUT[3], 64) != components) #else - if (sscanf(lineBuffer, "%s %s %s %63s", inputLUT[0], + if (sscanf(lineBuffer, "%63s %63s %63s %63s", inputLUT[0], inputLUT[1], inputLUT[2], inputLUT[3]) != components) #endif { diff --git a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp index c3ef153f43..2ac75422f9 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp @@ -153,14 +153,13 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char blueValueS[64] = ""; #ifdef _WIN32 - if (sscanf(lineBuffer, - "%d %d %d %s %s %s", + if (sscanf_s(lineBuffer, "%d %d %d %63s %63s %63s", &rIndex, &gIndex, &bIndex, redValueS, 64, greenValueS, 64, blueValueS, 64) == 6) #else - if (sscanf(lineBuffer, "%d %d %d %s %s %s", + if (sscanf(lineBuffer, "%d %d %d %63s %63s %63s", &rIndex, &gIndex, &bIndex, redValueS, greenValueS, blueValueS) == 6) #endif From c173846ced9a503c1f7a43ab24cd0f6bd3a9b988 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 6 May 2026 17:59:46 -0400 Subject: [PATCH 31/37] Adsk Contrib - Miscellaneous improvements suggested by Claude (#2308) * Various fixes suggested by Claude Signed-off-by: Doug Walker * Address review comments Signed-off-by: Doug Walker * Update security guidelines Signed-off-by: Doug Walker * Address review comments Signed-off-by: Doug Walker * Further max Lut3D size cleanup Signed-off-by: Doug Walker * Improve cast to avoid possible warning Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- SECURITY.md | 17 +++------- docs/site/homepage/config.toml | 8 ----- ext/sampleicc/src/include/iccProfileReader.h | 4 +++ src/OpenColorIO/ColorSpace.cpp | 11 +++++++ src/OpenColorIO/ColorSpaceSet.cpp | 1 + src/OpenColorIO/Config.cpp | 16 +++++++--- src/OpenColorIO/ContextVariableUtils.cpp | 19 ++++++++--- src/OpenColorIO/CustomKeys.h | 18 ++++++++--- src/OpenColorIO/Display.cpp | 2 +- src/OpenColorIO/Display.h | 2 +- src/OpenColorIO/DynamicProperty.cpp | 8 +++++ src/OpenColorIO/GpuShader.cpp | 4 +-- src/OpenColorIO/GpuShaderDesc.cpp | 6 ++-- src/OpenColorIO/HashUtils.cpp | 4 ++- src/OpenColorIO/ImageDesc.cpp | 1 + src/OpenColorIO/Logging.cpp | 6 ++++ src/OpenColorIO/LutLimits.h | 19 +++++++++++ src/OpenColorIO/NamedTransform.cpp | 1 + src/OpenColorIO/OCIOYaml.cpp | 25 +++++++++------ src/OpenColorIO/OCIOZArchive.cpp | 25 ++++++++++----- src/OpenColorIO/Platform.cpp | 14 +++++--- src/OpenColorIO/Processor.cpp | 19 +++++++++-- src/OpenColorIO/SystemMonitor.cpp | 10 +++++- src/OpenColorIO/TokensManager.h | 1 + src/OpenColorIO/Transform.cpp | 3 +- .../apphelpers/CategoryHelpers.cpp | 1 + .../apphelpers/DisplayViewHelpers.cpp | 4 ++- src/OpenColorIO/apphelpers/MixingHelpers.cpp | 10 ++++++ .../mergeconfigs/MergeConfigsHelpers.cpp | 15 ++++++--- .../apphelpers/mergeconfigs/OCIOMYaml.cpp | 32 +++++++++++++++---- .../builtinconfigs/BuiltinConfigRegistry.cpp | 2 ++ src/OpenColorIO/fileformats/FileFormat3DL.cpp | 7 ++++ src/OpenColorIO/fileformats/FileFormatCSP.cpp | 13 ++++++-- .../fileformats/FileFormatDiscreet1DL.cpp | 32 +++++++++++++++---- src/OpenColorIO/fileformats/FileFormatHDL.cpp | 26 +++++++++++++++ src/OpenColorIO/fileformats/FileFormatICC.cpp | 7 +++- .../fileformats/FileFormatIridasCube.cpp | 24 ++++++++++++-- .../fileformats/FileFormatIridasItx.cpp | 18 +++++++++++ .../fileformats/FileFormatIridasLook.cpp | 13 +++++++- .../fileformats/FileFormatPandora.cpp | 19 +++++++++++ .../fileformats/FileFormatResolveCube.cpp | 26 +++++++++++++++ .../fileformats/FileFormatSpi1D.cpp | 6 ++++ .../fileformats/FileFormatSpi3D.cpp | 11 +++++++ .../fileformats/FileFormatSpiMtx.cpp | 26 +++++++-------- .../fileformats/FileFormatTruelight.cpp | 20 ++++++++++++ src/OpenColorIO/fileformats/FileFormatVF.cpp | 14 ++++++++ src/OpenColorIO/fileformats/cdl/CDLParser.cpp | 6 +++- .../fileformats/ctf/CTFReaderHelper.cpp | 29 +++++++++++++++-- src/OpenColorIO/ops/exponent/ExponentOp.cpp | 4 +++ .../gradingprimary/GradingPrimaryOpGPU.cpp | 5 +-- .../gradingrgbcurve/GradingBSplineCurve.cpp | 30 ++++++++++++++--- src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp | 9 ++---- src/OpenColorIO/ops/lut3d/Lut3DOpData.h | 4 +-- src/OpenColorIO/ops/matrix/MatrixOp.cpp | 7 +++- src/OpenColorIO/ops/matrix/MatrixOpData.cpp | 8 +++++ .../transforms/AllocationTransform.cpp | 4 +++ src/OpenColorIO/transforms/FileTransform.cpp | 4 +-- .../transforms/FixedFunctionTransform.cpp | 18 +++++++++-- src/OpenColorIO/transforms/Lut3DTransform.cpp | 6 ++-- .../builtins/BuiltinTransformRegistry.cpp | 2 +- src/utils/StringUtils.h | 2 ++ tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp | 4 +-- tests/gpu/GradingPrimaryOp_test.cpp | 2 +- tests/gpu/Lut3DOp_test.cpp | 3 +- 64 files changed, 580 insertions(+), 137 deletions(-) create mode 100644 src/OpenColorIO/LutLimits.h diff --git a/SECURITY.md b/SECURITY.md index 19555844b9..2693a4a8da 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,20 +14,16 @@ would be naive to say our code is immune to every exploit. ## Reporting Vulnerabilities -Quickly resolving security related issues is a priority. If you think -you've found a potential vulnerability in OpenColorIO, please report it by -emailing security@opencolorio.org. Only TSC members and ASWF project -management have access to these messages. +Quickly resolving security related issues is a priority. The best way to report a +vulnerability is to file a GitHub security advisory. If that is not possible, it +is also fine to email your report to security@opencolorio.org. Only the project +administrators have access to these reports. Include detailed steps to reproduce the issue, and any other information that could aid an investigation. Someone will assess the report and make every effort to respond within 14 days. -## Outstanding Security Issues - -None - -## Addressed Security Issues +## History of CVE Fixes None @@ -64,6 +60,3 @@ set of behaviors as with file loading. It is a bug if calling a function with well-formed arguments causes the library to crash. It is a security issue if calling a function with well-formed arguments causes arbitrary code execution. - -We do not consider this as severe as file format issues because in most -deployments the parameter space is not exposed to potential attackers. diff --git a/docs/site/homepage/config.toml b/docs/site/homepage/config.toml index 7f7e82d351..a7e4dfc865 100644 --- a/docs/site/homepage/config.toml +++ b/docs/site/homepage/config.toml @@ -105,14 +105,6 @@ post_share = true enable = false preloader = "images/opencolorio-color.png" -# google map -[params.map] -enable = false -gmap_api = "https://maps.googleapis.com/maps/api/js?key=AIzaSyBu5nZKbeK-WHQ70oqOWo-_4VmwOwKP9YQ" -map_latitude = "51.5223477" -map_longitude = "-0.1622023" -map_marker = "images/marker.png" - ############################# ASWF LINKS ########################## [[params.aswf]] diff --git a/ext/sampleicc/src/include/iccProfileReader.h b/ext/sampleicc/src/include/iccProfileReader.h index 8b28753c54..9abce18b33 100644 --- a/ext/sampleicc/src/include/iccProfileReader.h +++ b/ext/sampleicc/src/include/iccProfileReader.h @@ -586,6 +586,10 @@ namespace SampleICC if (!Read32(istream, &sizeData, 1)) return false; + // ICC curve entries are indexed by 16-bit values; 65536 is the maximum. + if (sizeData > 65536) + return false; + mCurve.resize(sizeData); if (sizeData) diff --git a/src/OpenColorIO/ColorSpace.cpp b/src/OpenColorIO/ColorSpace.cpp index 98f776fe18..946c7286c1 100644 --- a/src/OpenColorIO/ColorSpace.cpp +++ b/src/OpenColorIO/ColorSpace.cpp @@ -162,6 +162,7 @@ const char * ColorSpace::getAlias(size_t idx) const noexcept bool ColorSpace::hasAlias(const char * alias) const noexcept { + if (!alias) return false; for (size_t idx = 0; idx < getImpl()->m_aliases.size(); ++idx) { if (0 == Platform::Strcasecmp(getImpl()->m_aliases[idx].c_str(), alias)) @@ -430,6 +431,7 @@ int ColorSpace::getAllocationNumVars() const void ColorSpace::getAllocationVars(float * vars) const { + if(!vars) return; if(!getImpl()->m_allocationVars.empty()) { memcpy(vars, @@ -440,6 +442,15 @@ void ColorSpace::getAllocationVars(float * vars) const void ColorSpace::setAllocationVars(int numvars, const float * vars) { + if (numvars < 0) + { + throw Exception("setAllocationVars: numvars must not be negative."); + } + if (numvars > 0 && !vars) + { + throw Exception("setAllocationVars: vars must not be null when numvars is positive."); + } + getImpl()->m_allocationVars.resize(numvars); if(!getImpl()->m_allocationVars.empty()) diff --git a/src/OpenColorIO/ColorSpaceSet.cpp b/src/OpenColorIO/ColorSpaceSet.cpp index 99c659a61b..488099be68 100644 --- a/src/OpenColorIO/ColorSpaceSet.cpp +++ b/src/OpenColorIO/ColorSpaceSet.cpp @@ -180,6 +180,7 @@ class ColorSpaceSet::Impl void remove(const char * csName) { + if (!csName || !*csName) return; const std::string name = StringUtils::Lower(csName); if (name.empty()) return; diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index d4d5fbe7fa..1b5a8c70db 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -4337,7 +4337,7 @@ int Config::getNumDisplaysAll() const noexcept const char * Config::getDisplayAll(int index) const noexcept { - if (index >= 0 || index < static_cast(getImpl()->m_displays.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displays.size())) { return getImpl()->m_displays[index].first.c_str(); } @@ -4365,7 +4365,7 @@ int Config::getDisplayAllByName(const char * name) const noexcept bool Config::isDisplayTemporary(int index) const noexcept { - if (index >= 0 || index < static_cast(getImpl()->m_displays.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displays.size())) { return getImpl()->m_displays[index].second.m_temporary; } @@ -4375,7 +4375,7 @@ bool Config::isDisplayTemporary(int index) const noexcept void Config::setDisplayTemporary(int index, bool isTemporary) noexcept { - if (index >= 0 || index < static_cast(getImpl()->m_displays.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displays.size())) { getImpl()->m_displays[index].second.m_temporary = isTemporary; @@ -4410,7 +4410,7 @@ const char * Config::getView(ViewType type, const char * display, int index) con { if (!display || !*display) { - if (index >= 0 || index < static_cast(getImpl()->m_sharedViews.size())) + if (index >= 0 && index < static_cast(getImpl()->m_sharedViews.size())) { return getImpl()->m_sharedViews[index].m_name.c_str(); } @@ -4449,11 +4449,19 @@ const char * Config::getView(ViewType type, const char * display, int index) con void Config::getDefaultLumaCoefs(double * c3) const { + if (!c3) + { + throw Exception("getDefaultLumaCoefs: c3 must not be null."); + } memcpy(c3, &getImpl()->m_defaultLumaCoefs[0], 3*sizeof(double)); } void Config::setDefaultLumaCoefs(const double * c3) { + if (!c3) + { + throw Exception("setDefaultLumaCoefs: c3 must not be null."); + } memcpy(&getImpl()->m_defaultLumaCoefs[0], c3, 3*sizeof(double)); AutoMutex lock(getImpl()->m_cacheidMutex); diff --git a/src/OpenColorIO/ContextVariableUtils.cpp b/src/OpenColorIO/ContextVariableUtils.cpp index 1207a0363a..82726d4234 100644 --- a/src/OpenColorIO/ContextVariableUtils.cpp +++ b/src/OpenColorIO/ContextVariableUtils.cpp @@ -101,10 +101,12 @@ void LoadEnvironment(EnvMap & map, bool update) const std::string env_str = (char*)*env; #endif - const int pos = static_cast(env_str.find_first_of('=')); + const auto pos = env_str.find_first_of('='); + + if (pos == std::string::npos) continue; const std::string name = env_str.substr(0, pos); - const std::string value = env_str.substr(pos+1, env_str.length()); + const std::string value = env_str.substr(pos+1); if (update) { @@ -122,8 +124,12 @@ void LoadEnvironment(EnvMap & map, bool update) } } -std::string ResolveContextVariables(const std::string & str, const EnvMap & map, UsedEnvs & used) +static std::string ResolveContextVariablesImpl(const std::string & str, const EnvMap & map, + UsedEnvs & used, int depth) { + // Guard against infinite recursion from cyclic variable references. + if (depth > 32) return str; + // Early exit if no reserved tokens are found. if (!ContainsContextVariables(str)) { @@ -159,12 +165,17 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, // recursively call till string doesn't expand anymore if(newstr != orig) { - return ResolveContextVariables(newstr, map, used); + return ResolveContextVariablesImpl(newstr, map, used, depth + 1); } return orig; } +std::string ResolveContextVariables(const std::string & str, const EnvMap & map, UsedEnvs & used) +{ + return ResolveContextVariablesImpl(str, map, used, 0); +} + bool CollectContextVariables(const Config & config, const Context & context, ConstTransformRcPtr transform, diff --git a/src/OpenColorIO/CustomKeys.h b/src/OpenColorIO/CustomKeys.h index b41b9714ce..02f364bc1f 100644 --- a/src/OpenColorIO/CustomKeys.h +++ b/src/OpenColorIO/CustomKeys.h @@ -61,14 +61,24 @@ class CustomKeysContainer bool hasKey(const char * key) { - std::string s = key; - return m_customKeys.count(s) > 0; + if (!key || !*key) return false; + return m_customKeys.count(key) > 0; } const char * getValueForKey(const char * key) { - // NB: Will throw if the map doesn't have the key. - return m_customKeys[key].c_str(); + if (!key || !*key) + { + throw Exception("Key has to be a non-empty string."); + } + auto it = m_customKeys.find(key); + if (it == m_customKeys.end()) + { + std::ostringstream oss; + oss << "Key '" << key << "' not found."; + throw Exception(oss.str().c_str()); + } + return it->second.c_str(); } private: diff --git a/src/OpenColorIO/Display.cpp b/src/OpenColorIO/Display.cpp index 4280b99231..aebc37fb08 100644 --- a/src/OpenColorIO/Display.cpp +++ b/src/OpenColorIO/Display.cpp @@ -52,7 +52,7 @@ void AddView(ViewVec & views, const char * name, const char * viewTransform, const char * displayColorSpace, const char * looks, const char * rule, const char * description) { - if (0 == Platform::Strcasecmp(displayColorSpace, OCIO_VIEW_USE_DISPLAY_NAME)) + if (displayColorSpace && 0 == Platform::Strcasecmp(displayColorSpace, OCIO_VIEW_USE_DISPLAY_NAME)) { displayColorSpace = OCIO_VIEW_USE_DISPLAY_NAME; } diff --git a/src/OpenColorIO/Display.h b/src/OpenColorIO/Display.h index 43e1b2cc9c..b2ffd85b50 100644 --- a/src/OpenColorIO/Display.h +++ b/src/OpenColorIO/Display.h @@ -37,7 +37,7 @@ struct View const char * looks, const char * rule, const char * description) - : m_name(name) + : m_name(name ? name : "") , m_viewTransform(viewTransform ? viewTransform : "") , m_colorspace(colorspace ? colorspace : "") , m_looks(looks ? looks : "") diff --git a/src/OpenColorIO/DynamicProperty.cpp b/src/OpenColorIO/DynamicProperty.cpp index 075973412f..bf61a484cd 100644 --- a/src/OpenColorIO/DynamicProperty.cpp +++ b/src/OpenColorIO/DynamicProperty.cpp @@ -280,6 +280,10 @@ void DynamicPropertyGradingRGBCurveImpl::precompute() { ConstGradingBSplineCurveRcPtr curve = m_gradingRGBCurve->getCurve(c); auto curveImpl = dynamic_cast(curve.get()); + if (!curveImpl) + { + throw Exception("DynamicPropertyGradingRGBCurveImpl: unexpected curve implementation."); + } curveImpl->computeKnotsAndCoefs(m_knotsCoefs, static_cast(c), false); } if (m_knotsCoefs.m_numKnots <= 0) m_knotsCoefs.m_localBypass = true; @@ -375,6 +379,10 @@ void DynamicPropertyGradingHueCurveImpl::precompute() { ConstGradingBSplineCurveRcPtr curve = m_gradingHueCurve->getCurve(c); auto curveImpl = dynamic_cast(curve.get()); + if (!curveImpl) + { + throw Exception("DynamicPropertyGradingHueCurveImpl: unexpected curve implementation."); + } curveImpl->computeKnotsAndCoefs(m_knotsCoefs, static_cast(c), m_gradingHueCurve->getDrawCurveOnly()); } diff --git a/src/OpenColorIO/GpuShader.cpp b/src/OpenColorIO/GpuShader.cpp index 665cee02f1..95d2572750 100644 --- a/src/OpenColorIO/GpuShader.cpp +++ b/src/OpenColorIO/GpuShader.cpp @@ -11,7 +11,7 @@ #include "DynamicProperty.h" #include "GpuShader.h" -#include "ops/lut3d/Lut3DOpData.h" +#include "LutLimits.h" #include "Platform.h" namespace OCIO_NAMESPACE @@ -194,7 +194,7 @@ class PrivateImpl virtual ~PrivateImpl() {} - inline unsigned get3dLutMaxLength() const { return Lut3DOpData::maxSupportedLength; } + inline unsigned get3dLutMaxLength() const { return Max3DLUTLength; } inline unsigned get1dLutMaxWidth() const { return m_max1DLUTWidth; } inline void set1dLutMaxWidth(unsigned maxWidth) { m_max1DLUTWidth = maxWidth; } diff --git a/src/OpenColorIO/GpuShaderDesc.cpp b/src/OpenColorIO/GpuShaderDesc.cpp index 574a7c3594..c16add78ad 100644 --- a/src/OpenColorIO/GpuShaderDesc.cpp +++ b/src/OpenColorIO/GpuShaderDesc.cpp @@ -135,7 +135,7 @@ void GpuShaderCreator::setFunctionName(const char * name) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); // Note: Remove potentially problematic double underscores from GLSL resource names. - getImpl()->m_functionName = StringUtils::Replace(name, "__", "_"); + getImpl()->m_functionName = StringUtils::Replace(name ? name : "", "__", "_"); getImpl()->m_cacheID.clear(); } @@ -148,7 +148,7 @@ void GpuShaderCreator::setResourcePrefix(const char * prefix) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); // Note: Remove potentially problematic double underscores from GLSL resource names. - getImpl()->m_resourcePrefix = StringUtils::Replace(prefix, "__", "_"); + getImpl()->m_resourcePrefix = StringUtils::Replace(prefix ? prefix : "", "__", "_"); getImpl()->m_cacheID.clear(); } @@ -161,7 +161,7 @@ void GpuShaderCreator::setPixelName(const char * name) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); // Note: Remove potentially problematic double underscores from GLSL resource names. - getImpl()->m_pixelName = StringUtils::Replace(name, "__", "_"); + getImpl()->m_pixelName = StringUtils::Replace(name ? name : "", "__", "_"); getImpl()->m_cacheID.clear(); } diff --git a/src/OpenColorIO/HashUtils.cpp b/src/OpenColorIO/HashUtils.cpp index 627ab20661..c5d6035013 100644 --- a/src/OpenColorIO/HashUtils.cpp +++ b/src/OpenColorIO/HashUtils.cpp @@ -22,7 +22,9 @@ std::string CacheIDHash(const char * array, std::size_t size) XXH128_hash_t hash = XXH3_128bits(array, size); std::stringstream oss; - oss << std::hex << hash.low64 << hash.high64; + oss << std::hex << std::setfill('0'); + oss << std::setw(16) << hash.low64; + oss << std::setw(16) << hash.high64; return oss.str(); } diff --git a/src/OpenColorIO/ImageDesc.cpp b/src/OpenColorIO/ImageDesc.cpp index 2f045f1597..7830168987 100644 --- a/src/OpenColorIO/ImageDesc.cpp +++ b/src/OpenColorIO/ImageDesc.cpp @@ -260,6 +260,7 @@ struct PackedImageDesc::Impl { // Confirm xStrideBytes is a pure packing // (I.e., it will divide evenly) + if (m_chanStrideBytes == 0) return false; const div_t result = div((int)m_xStrideBytes, (int)m_chanStrideBytes); if(result.rem != 0) return false; diff --git a/src/OpenColorIO/Logging.cpp b/src/OpenColorIO/Logging.cpp index e40692db7c..4331878dfe 100644 --- a/src/OpenColorIO/Logging.cpp +++ b/src/OpenColorIO/Logging.cpp @@ -114,11 +114,17 @@ void SetLoggingLevel(LoggingLevel level) void SetLoggingFunction(LoggingFunction logFunction) { + if (!logFunction) + { + throw Exception("SetLoggingFunction: logFunction must not be null."); + } + AutoMutex lock(g_logmutex); g_loggingFunction = logFunction; } void ResetToDefaultLoggingFunction() { + AutoMutex lock(g_logmutex); g_loggingFunction = DefaultLoggingFunction; } diff --git a/src/OpenColorIO/LutLimits.h b/src/OpenColorIO/LutLimits.h new file mode 100644 index 0000000000..d7ce24ccc7 --- /dev/null +++ b/src/OpenColorIO/LutLimits.h @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifndef INCLUDED_OCIO_LUTLIMITS_H +#define INCLUDED_OCIO_LUTLIMITS_H + +namespace OCIO_NAMESPACE +{ + +// Maximum number of entries supported in a 1D LUT. +constexpr unsigned long Max1DLUTLength = 300000; + +// Maximum grid size supported for a 3D LUT. +// 129 allows for a MESH dimension of 7 in the 3dl file format. +constexpr unsigned long Max3DLUTLength = 129; + +} // namespace OCIO_NAMESPACE + +#endif // INCLUDED_OCIO_LUTLIMITS_H diff --git a/src/OpenColorIO/NamedTransform.cpp b/src/OpenColorIO/NamedTransform.cpp index 2eb8f53b19..19c6d8d67c 100644 --- a/src/OpenColorIO/NamedTransform.cpp +++ b/src/OpenColorIO/NamedTransform.cpp @@ -67,6 +67,7 @@ const char * NamedTransformImpl::getAlias(size_t idx) const noexcept bool NamedTransformImpl::hasAlias(const char * alias) const noexcept { + if (!alias || !*alias) return false; for (size_t idx = 0; idx < m_aliases.size(); ++idx) { if (0 == Platform::Strcasecmp(m_aliases[idx].c_str(), alias)) diff --git a/src/OpenColorIO/OCIOYaml.cpp b/src/OpenColorIO/OCIOYaml.cpp index c9361579fe..9010dcb606 100644 --- a/src/OpenColorIO/OCIOYaml.cpp +++ b/src/OpenColorIO/OCIOYaml.cpp @@ -4413,17 +4413,24 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen results = StringUtils::Split(version, '.'); - if(results.size()==1) - { - profile_major_version = std::stoi(results[0].c_str()); - profile_minor_version = 0; - } - else if(results.size()==2) + try { - profile_major_version = std::stoi(results[0].c_str()); - profile_minor_version = std::stoi(results[1].c_str()); + if(results.size()==1) + { + profile_major_version = std::stoi(results[0].c_str()); + profile_minor_version = 0; + } + else if(results.size()==2) + { + profile_major_version = std::stoi(results[0].c_str()); + profile_minor_version = std::stoi(results[1].c_str()); + } + else + { + faulty_version = true; + } } - else + catch (const std::exception &) { faulty_version = true; } diff --git a/src/OpenColorIO/OCIOZArchive.cpp b/src/OpenColorIO/OCIOZArchive.cpp index 982fce6823..1caed9ecba 100644 --- a/src/OpenColorIO/OCIOZArchive.cpp +++ b/src/OpenColorIO/OCIOZArchive.cpp @@ -387,6 +387,21 @@ void ExtractOCIOZArchive(const char * archivePath, const char * destination) mz_zip_reader_delete(&extracter); } +std::vector readEntryBuffer(void * reader) +{ + int32_t buf_size = (int32_t)mz_zip_reader_entry_save_buffer_length(reader); + // Reject negative values (minizip error codes) and implausibly large entries. + // 256 MB is well above any realistic individual OCIO config or LUT file size. + static constexpr size_t MAX_ENTRY_SIZE = 256 * 1024 * 1024; + if (buf_size <= 0 || (size_t)buf_size > MAX_ENTRY_SIZE) + { + throw Exception("OCIOZ archive entry size is invalid or exceeds maximum allowed size."); + } + std::vector buffer(buf_size); + mz_zip_reader_entry_save_buffer(reader, &buffer[0], buf_size); + return buffer; +} + /** * \brief Callback function for getFileStringFromArchiveStream in order to get the contents of a * file inside an OCIOZ archive as a buffer. @@ -406,11 +421,7 @@ std::vector getFileBufferByPath(void * reader, mz_zip_file & info, std: std::vector buffer; if (mz_path_compare_wc(filepath.c_str(), info.filename, 1) == MZ_OK) { - // Initialize the buffer for the file. - int32_t buf_size = (int32_t)mz_zip_reader_entry_save_buffer_length(reader); - buffer.resize(buf_size); - // Read the content of the file and return it as buffer. - mz_zip_reader_entry_save_buffer(reader, &buffer[0], buf_size); + buffer = readEntryBuffer(reader); } return buffer; } @@ -434,9 +445,7 @@ std::vector getFileBufferByExtension(void * reader, mz_zip_file & info, pystring::os::path::splitext(root, ext, info.filename); if (Platform::Strcasecmp(extension.c_str(), ext.c_str()) == 0) { - int32_t buf_size = (int32_t)mz_zip_reader_entry_save_buffer_length(reader); - buffer.resize(buf_size); - mz_zip_reader_entry_save_buffer(reader, &buffer[0], buf_size); + buffer = readEntryBuffer(reader); } return buffer; } diff --git a/src/OpenColorIO/Platform.cpp b/src/OpenColorIO/Platform.cpp index 0e7fc68b2d..f579c49bdd 100644 --- a/src/OpenColorIO/Platform.cpp +++ b/src/OpenColorIO/Platform.cpp @@ -22,7 +22,7 @@ namespace OCIO_NAMESPACE const char * GetEnvVariable(const char * name) { - static std::string value; + thread_local std::string value; Platform::Getenv(name, value); return value.c_str(); } @@ -183,12 +183,16 @@ int Strncasecmp(const char * str1, const char * str2, size_t n) void * AlignedMalloc(size_t size, size_t alignment) { #ifdef _WIN32 - return _aligned_malloc(size, alignment); + void * memBlock = _aligned_malloc(size, alignment); #else - void* memBlock = 0x0; - if (!posix_memalign(&memBlock, alignment, size)) return memBlock; - return 0x0; + void* memBlock = nullptr; + if (posix_memalign(&memBlock, alignment, size)) memBlock = nullptr; #endif + if (!memBlock) + { + throw Exception("AlignedMalloc: memory allocation failure."); + } + return memBlock; } void AlignedFree(void* memBlock) diff --git a/src/OpenColorIO/Processor.cpp b/src/OpenColorIO/Processor.cpp index 83b8468b75..992701855f 100755 --- a/src/OpenColorIO/Processor.cpp +++ b/src/OpenColorIO/Processor.cpp @@ -289,6 +289,10 @@ int Processor::Impl::getNumTransforms() const const FormatMetadata & Processor::Impl::getTransformFormatMetadata(int index) const { + if (index < 0 || index >= static_cast(m_ops.size())) + { + throw Exception("Processor::getTransformFormatMetadata: index out of range."); + } auto op = OCIO_DYNAMIC_POINTER_CAST(m_ops[index]); return op->data()->getFormatMetadata(); } @@ -346,8 +350,19 @@ OptimizationFlags EnvironmentOverride(OptimizationFlags oFlags) const std::string envFlag = GetEnvVariable(OCIO_OPTIMIZATION_FLAGS_ENVVAR); if (!envFlag.empty()) { - // Use 0 to allow base to be determined by the format. - oFlags = static_cast(std::stoul(envFlag, nullptr, 0)); + try + { + // Use 0 to allow base to be determined by the format. + oFlags = static_cast(std::stoul(envFlag, nullptr, 0)); + } + catch (const std::exception & e) + { + std::string msg("Illegal value for "); + msg += OCIO_OPTIMIZATION_FLAGS_ENVVAR; + msg += ": "; + msg += e.what(); + throw Exception(msg.c_str()); + } } return oFlags; } diff --git a/src/OpenColorIO/SystemMonitor.cpp b/src/OpenColorIO/SystemMonitor.cpp index 8ee5e915e5..7fcc9c3663 100644 --- a/src/OpenColorIO/SystemMonitor.cpp +++ b/src/OpenColorIO/SystemMonitor.cpp @@ -8,6 +8,7 @@ #include +#include "Logging.h" #include "Mutex.h" #include "SystemMonitor.h" @@ -62,7 +63,14 @@ ConstSystemMonitorsRcPtr SystemMonitors::Get() noexcept if (!monitors) { SystemMonitorsRcPtr m = std::make_shared(); - DynamicPtrCast(m)->getAllMonitors(); + try + { + DynamicPtrCast(m)->getAllMonitors(); + } + catch (const std::exception & ex) + { + LogDebug(ex.what()); + } monitors = m; } diff --git a/src/OpenColorIO/TokensManager.h b/src/OpenColorIO/TokensManager.h index 706487289e..b2f02f3b08 100644 --- a/src/OpenColorIO/TokensManager.h +++ b/src/OpenColorIO/TokensManager.h @@ -51,6 +51,7 @@ class TokensManager void addToken(const char * token) { + if (!token || !*token) return; if (findToken(token) == m_tokens.end()) { m_tokens.push_back(StringUtils::Trim(token)); diff --git a/src/OpenColorIO/Transform.cpp b/src/OpenColorIO/Transform.cpp index 74223096fa..8b2b880699 100755 --- a/src/OpenColorIO/Transform.cpp +++ b/src/OpenColorIO/Transform.cpp @@ -373,9 +373,10 @@ void CreateTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) } else { + const auto & ref = *op; std::ostringstream error; error << "CreateTransform from op. Missing implementation for: " - << typeid(op).name(); + << typeid(ref).name(); throw Exception(error.str().c_str()); } diff --git a/src/OpenColorIO/apphelpers/CategoryHelpers.cpp b/src/OpenColorIO/apphelpers/CategoryHelpers.cpp index 33aa2ade2c..08a2249b6f 100644 --- a/src/OpenColorIO/apphelpers/CategoryHelpers.cpp +++ b/src/OpenColorIO/apphelpers/CategoryHelpers.cpp @@ -262,6 +262,7 @@ T Intersection(const T & list0, const T & list1) StringUtils::StringVec ExtractItems(const char * strings) { + if (!strings) return {}; StringUtils::StringVec tmp = StringUtils::Split(StringUtils::Lower(strings), ','); StringUtils::StringVec all; diff --git a/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp b/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp index d4055f46c1..4d3aa649e3 100644 --- a/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp +++ b/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp @@ -406,7 +406,7 @@ void AddDisplayView(ConfigRcPtr & config, { std::string errMsg; errMsg += "Connection color space name '"; - errMsg += connectionColorSpaceName; + errMsg += connectionColorSpaceName ? connectionColorSpaceName : "(null)"; errMsg += "' does not exist."; throw Exception(errMsg.c_str()); @@ -502,6 +502,8 @@ void AddDisplayView(ConfigRcPtr & config, void RemoveDisplayView(ConfigRcPtr & config, const char * displayName, const char * viewName) { + if (!displayName || !viewName) return; + const std::string name{ config->getDisplayViewColorSpaceName(displayName, viewName) }; const std::string csName{ name.empty() ? displayName : name }; if (csName.empty()) diff --git a/src/OpenColorIO/apphelpers/MixingHelpers.cpp b/src/OpenColorIO/apphelpers/MixingHelpers.cpp index 9f6fa1e396..1895c17a1b 100644 --- a/src/OpenColorIO/apphelpers/MixingHelpers.cpp +++ b/src/OpenColorIO/apphelpers/MixingHelpers.cpp @@ -205,6 +205,11 @@ void MixingColorSpaceManagerImpl::setSelectedMixingSpaceIdx(size_t idx) void MixingColorSpaceManagerImpl::setSelectedMixingSpace(const char * mixingSpace) { + if (!mixingSpace) + { + throw Exception("Invalid null mixing space name."); + } + for (size_t idx = 0 ; idx < m_mixingSpaces.size(); ++idx) { if (m_mixingSpaces[idx] == mixingSpace) @@ -269,6 +274,11 @@ void MixingColorSpaceManagerImpl::setSelectedMixingEncodingIdx(size_t idx) void MixingColorSpaceManagerImpl::setSelectedMixingEncoding(const char * mixingEncoding) { + if (!mixingEncoding) + { + throw Exception("Invalid null mixing encoding name."); + } + for (size_t idx = 0 ; idx < m_mixingEncodings.size(); ++idx) { if (m_mixingEncodings[idx] == mixingEncoding) diff --git a/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp b/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp index ab74ed9975..1342d533cd 100644 --- a/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp +++ b/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp @@ -477,16 +477,19 @@ ConstConfigRcPtr ConfigMerger::Impl::loadConfig(const char * value) const try { // Try to load the provided config using the search paths. - // Return as soon as they find a valid path. - const std::string resolvedfullpath = pystring::os::path::join(searchpaths[i], - value); + // Return as soon as a valid path is found. + // Normalize the path to prevent directory traversal via '../' sequences. + const std::string resolvedfullpath = pystring::os::path::normpath( + pystring::os::path::join(searchpaths[i], value)); return Config::CreateFromFile(resolvedfullpath.c_str()); } // TODO: If the file exists but won't load, this hides the error. // (Tried using ExceptionMissingFile, but the implementation of that is not what I // expected, Config::CreateFromFile only uses that if the argument is empty, not // if it can't read the file.) - catch(...) { /* don't capture the exception */ } + // There is no need to log a warning here, since this is simply trying the various + // locations on the path that might contain the config. + catch(...) { } } // Try to load the provided base config name as a built-in config. @@ -495,7 +498,9 @@ ConstConfigRcPtr ConfigMerger::Impl::loadConfig(const char * value) const // Check if the base config name is a built-in config. return Config::CreateFromBuiltinConfig(value); } - catch(...) { /* don't capture the exception */ } + // There is no need to log a warning here, since this is simply trying the various + // possible sources for the named config. + catch(...) { } // Must be a reference to a config from a previous merge. for (size_t i = 0; i < m_mergeParams.size(); i++) diff --git a/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp b/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp index 3afddf3474..f431c4ccdf 100644 --- a/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp +++ b/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp @@ -299,8 +299,7 @@ void OCIOMYaml::loadParams(const YAML::Node & node, ConfigMergingParametersRcPtr } else { - // Handle unsupported property or use default handler. - std::cout << "Unsupported property : " << key << std::endl; + LogWarning("Unsupported property in merge params: " + key); } } } @@ -324,15 +323,34 @@ void OCIOMYaml::load(const YAML::Node& node, ConfigMergerRcPtr & merger, const c load(node["ociom_version"], version); results = StringUtils::Split(version, '.'); - if(results.size() == 1) + bool faulty_version = false; + try { - merger->setVersion(std::stoi(results[0].c_str()), 0); + if(results.size() == 1) + { + merger->setVersion(std::stoi(results[0].c_str()), 0); + } + else if(results.size() == 2) + { + merger->setVersion(std::stoi(results[0].c_str()), + std::stoi(results[1].c_str())); + } + else + { + faulty_version = true; + } } - else if(results.size() == 2) + catch (const std::exception &) { - merger->setVersion(std::stoi(results[0].c_str()), - std::stoi(results[1].c_str())); + faulty_version = true; } + + if (faulty_version) + { + throwValueError(it->second.Tag(), it->first, + "The value '" + version + "' is not a valid OCIOM version."); + } + if (merger->getMajorVersion() > 1u || merger->getMinorVersion() > 0u) { throwValueError(it->second.Tag(), it->first, diff --git a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp index bced3f4144..6fd3b7b52f 100644 --- a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp +++ b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp @@ -34,6 +34,8 @@ namespace OCIO_NAMESPACE // Note that this function does not require initializing the built-in config registry. const char * ResolveConfigPath(const char * originalPath) noexcept { + if (!originalPath) return ""; + static const std::regex uriPattern(R"(ocio:\/\/([^\s]+))"); std::smatch match; const std::string uri = originalPath; diff --git a/src/OpenColorIO/fileformats/FileFormat3DL.cpp b/src/OpenColorIO/fileformats/FileFormat3DL.cpp index c4d90cc776..59f0bdf2a4 100755 --- a/src/OpenColorIO/fileformats/FileFormat3DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormat3DL.cpp @@ -314,6 +314,13 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // If we've found 3 ints, add it to our 3D LUT. else if(tmpData.size() == 3) { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + std::ostringstream os; + os << "Error parsing .3dl file. "; + os << "Too many 3D LUT entries found."; + throw Exception(os.str().c_str()); + } raw3d.push_back(tmpData[0]); raw3d.push_back(tmpData[1]); raw3d.push_back(tmpData[2]); diff --git a/src/OpenColorIO/fileformats/FileFormatCSP.cpp b/src/OpenColorIO/fileformats/FileFormatCSP.cpp index 418edfa570..aa48762ea5 100755 --- a/src/OpenColorIO/fileformats/FileFormatCSP.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCSP.cpp @@ -487,9 +487,16 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { // How many 1D LUT points do we have. nextline (istream, line); - int points1D = std::stoi(line.c_str()); + int points1D = 0; + if (!StringToInt(&points1D, line.c_str())) + { + std::ostringstream os; + os << "A csp 1D LUT with invalid number of entries ("; + os << line << ") in " << fileName << "."; + throw Exception(os.str().c_str()); + } - if (points1D <= 0) + if (points1D <= 0 || points1D > static_cast(Max1DLUTLength)) { std::ostringstream os; os << "A csp 1D LUT with invalid number of entries ("; @@ -563,7 +570,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - if (lutSize <= 0) + if (lutSize <= 0 || lutSize > static_cast(Max3DLUTLength)) { std::ostringstream os; os << "A csp 3D LUT with invalid cube size ("; diff --git a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp index 31e8ae519f..d22de1ba3c 100755 --- a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp @@ -275,15 +275,13 @@ bool Lut1dUtils::IMLutAlloc(IMLutStruct **plut, int num, int length) // targetBitDepth will be set appropriately for conversion LUTs in IMLutGet lut->targetBitDepth = IMLutTableSizeToBitDepth(length); - lut->tables = (unsigned short **)malloc(4 * sizeof(unsigned short *)); + lut->tables = (unsigned short **)calloc(4, sizeof(unsigned short *)); if (lut->tables == NULL) { delete lut; lut = 0; return false; } - for (i = 0; i < num; i++) - lut->tables[i] = NULL; for (i = 0; i < num; i++) { lut->tables[i] = (unsigned short *)malloc(length * sizeof(unsigned short)); @@ -324,7 +322,15 @@ static int tableLoad( if (isdigit(*InString)) { - ptable[Count++] = (unsigned short)std::stoi(InString); + try + { + ptable[Count++] = (unsigned short)std::stoi(InString); + } + catch (const std::exception &) + { + errorLine = InString; + return Lut1dUtils::IMLUT_ERR_SYNTAX; + } if (Count >= length) break; } @@ -404,7 +410,18 @@ int Lut1dUtils::IMLutGet( } // Load first table value. - (lut->tables[0])[0] = (unsigned short)std::stoi(InString); + try + { + (lut->tables[0])[0] = (unsigned short)std::stoi(InString); + } + catch (const std::exception &) + { + errorLine = InString; + status = IMLUT_ERR_SYNTAX; + IMLutFree(&lut); + *plut = 0; + goto load_abort; + } tablestart = 1; } else @@ -419,7 +436,8 @@ int Lut1dUtils::IMLutGet( if (nummatched < 2 || StringUtils::Lower(subStr) != "lut: " || (numtables != 1 && numtables != 3 && numtables != 4) || - length <= 0) + length <= 0 || + length > 65536) { errorLine = InString; status = IMLUT_ERR_SYNTAX; @@ -435,7 +453,7 @@ int Lut1dUtils::IMLutGet( int dstDepth = 0; char floatC = ' '; #ifdef _WIN32 - sscanf(dstDepthS, "%d%c", &dstDepth, &floatC, 1); + sscanf_s(dstDepthS, "%d%c", &dstDepth, &floatC, 1); #else sscanf(dstDepthS, "%d%c", &dstDepth, &floatC); #endif diff --git a/src/OpenColorIO/fileformats/FileFormatHDL.cpp b/src/OpenColorIO/fileformats/FileFormatHDL.cpp index 16e0ffab53..f2ca6c0059 100755 --- a/src/OpenColorIO/fileformats/FileFormatHDL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatHDL.cpp @@ -189,6 +189,13 @@ readLuts(std::istream& istream, if (result.ec == std::errc()) { + // Cap per-LUT entry count: max is Max3DLUTLength^3 * 3 for a 3D LUT. + if (lutValues[lutname].size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + std::ostringstream os; + os << "Too many values in " << lutname << " LUT block"; + throw Exception(os.str().c_str()); + } lutValues[lutname].push_back(v); } else @@ -452,6 +459,13 @@ LocalFileFormat::read(std::istream & istream, // Set cube size size_3d = lut_sizes[0]; + if(size_3d < 2 || size_3d > static_cast(Max3DLUTLength)) + { + std::ostringstream os; + os << "3D LUT cube size must be between 2 and " << Max3DLUTLength << ", found: " << size_3d; + throw Exception(os.str().c_str()); + } + lut3d_ptr = std::make_shared(lut_sizes[0]); if (Lut3DOpData::IsValidInterpolation(interp)) { @@ -463,11 +477,23 @@ LocalFileFormat::read(std::istream & istream, if(cachedFile->hdltype == "c") { size_1d = lut_sizes[0]; + if(size_1d < 2 || size_1d > static_cast(Max1DLUTLength)) + { + std::ostringstream os; + os << "1D LUT size must be between 2 and " << Max1DLUTLength << ", found: " << size_1d; + throw Exception(os.str().c_str()); + } } if(cachedFile->hdltype == "3d+1d") { size_prelut = lut_sizes[1]; + if(size_prelut < 2 || size_prelut > static_cast(Max1DLUTLength)) + { + std::ostringstream os; + os << "Prelut size must be between 2 and " << Max1DLUTLength << ", found: " << size_prelut; + throw Exception(os.str().c_str()); + } } } diff --git a/src/OpenColorIO/fileformats/FileFormatICC.cpp b/src/OpenColorIO/fileformats/FileFormatICC.cpp index 69c0145d8a..be105bf6d0 100755 --- a/src/OpenColorIO/fileformats/FileFormatICC.cpp +++ b/src/OpenColorIO/fileformats/FileFormatICC.cpp @@ -180,9 +180,14 @@ LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, ThrowErrorMessage("Error loading number of tags.", fileName); } + constexpr icUInt32Number MaxNumICCTags = 100; + if (count > MaxNumICCTags) + { + ThrowErrorMessage("Too many tags in ICC profile.", fileName); + } icc.mTags.resize(count); - // Read Tag offset table. + // Read Tag offset table. for (i = 0; i static_cast(Max1DLUTLength)) + { + ThrowErrorMessage( + ("'LUT_1D_SIZE' must be between 2 and " + + std::to_string(Max1DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } + raw.reserve(3*size1d); in1d = true; } @@ -231,6 +241,16 @@ LocalFileFormat::read(std::istream & istream, line); } + if (size3d < 2 || size3d > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("'LUT_3D_SIZE' must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } + raw.reserve(3*size3d*size3d*size3d); in3d = true; } @@ -322,9 +342,9 @@ LocalFileFormat::read(std::istream & istream, char valB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "%s %s %s %c", valR, 64, valG, 64, valB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "%63s %63s %63s %c", valR, 64, valG, 64, valB, 64, &endTok, 1) != 3) #else - if (sscanf(line.c_str(), "%s %s %s %c", valR, valG, valB, &endTok) != 3) + if (sscanf(line.c_str(), "%63s %63s %63s %c", valR, valG, valB, &endTok) != 3) #endif { // It must be a float triple! diff --git a/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp b/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp index ae6282efb8..b7f84c59fa 100755 --- a/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp @@ -165,6 +165,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, lineNumber, line); } + if (size < 2 || size > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("LUT_3D_SIZE must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } size3d = size; raw.reserve(3*size3d * size3d * size3d); @@ -184,6 +193,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (raw.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, + lineNumber, + line); + } + for(int i=0; i<3; ++i) { raw.push_back(tmpfloats[i]); diff --git a/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp b/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp index 0ba209a905..e2c30cbf5f 100755 --- a/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp @@ -429,6 +429,13 @@ class XMLParserHelper os << "'. Expected quoted integer"; pImpl->Throw(os.str().c_str()); } + if (size_3d < 2 || size_3d > static_cast(Max3DLUTLength)) + { + std::ostringstream os; + os << "Invalid LUT size value: '" << size_raw; + os << "'. Expected value between 2 and " << Max3DLUTLength; + pImpl->Throw(os.str().c_str()); + } pImpl->m_lutSize = static_cast(size_3d); } else if (pImpl->m_data) @@ -441,7 +448,11 @@ class XMLParserHelper StringUtils::ReplaceInPlace(what, "\"", ""); StringUtils::ReplaceInPlace(what, "'", ""); StringUtils::ReplaceInPlace(what, "\n", ""); - // Append to lut string + // Append to lut string (cap at max possible: Max3DLUTLength^3 entries * 3 floats * 8 hex chars) + if (pImpl->m_lutString.size() + what.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3 * 8) + { + pImpl->Throw("Too many characters in 'data' block"); + } pImpl->m_lutString += what; } } diff --git a/src/OpenColorIO/fileformats/FileFormatPandora.cpp b/src/OpenColorIO/fileformats/FileFormatPandora.cpp index 6d36321527..0d2baf5ea5 100755 --- a/src/OpenColorIO/fileformats/FileFormatPandora.cpp +++ b/src/OpenColorIO/fileformats/FileFormatPandora.cpp @@ -156,6 +156,16 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, lineNumber, line); } + if (inval < 8 || inval > static_cast(Max3DLUTLength * Max3DLUTLength * Max3DLUTLength)) + { + ThrowErrorMessage( + ("'in' value must be between 8 and " + + std::to_string(Max3DLUTLength * Max3DLUTLength * Max3DLUTLength) + + " (" + std::to_string(Max3DLUTLength) + "^3).").c_str(), + fileName, + lineNumber, + line); + } raw3d.reserve(inval*3); lutEdgeLen = Get3DLutEdgeLenFromNumPixels(inval); } @@ -213,6 +223,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, + lineNumber, + line); + } + raw3d.push_back(tmpints[1]); raw3d.push_back(tmpints[2]); raw3d.push_back(tmpints[3]); diff --git a/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp b/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp index 6b5e0da8d7..cb43e2be71 100755 --- a/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp +++ b/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp @@ -336,6 +336,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (size1d < 2 || size1d > static_cast(Max1DLUTLength)) + { + ThrowErrorMessage( + ("LUT_1D_SIZE must be between 2 and " + + std::to_string(Max1DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } raw1d.reserve(3*size1d); has1d = true; } @@ -359,6 +368,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (size3d < 2 || size3d > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("LUT_3D_SIZE must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } raw3d.reserve(3*size3d*size3d*size3d); has3d = true; } @@ -410,6 +428,14 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } else { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, + lineNumber, + line); + } raw3d.push_back(tmpfloats[i]); } } diff --git a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp index d65df00065..c63e22ad25 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp @@ -179,6 +179,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { ThrowErrorMessage("Could not find 'Length' Tag", -1, ""); } + if (lut_size < 2 || lut_size > static_cast(Max1DLUTLength)) + { + ThrowErrorMessage( + ("'Length' must be between 2 and " + std::to_string(Max1DLUTLength)).c_str(), + -1, ""); + } if (components == -1) { ThrowErrorMessage("Could not find 'Components' Tag", -1, ""); diff --git a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp index 2ac75422f9..af8150254e 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp @@ -128,6 +128,17 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } + if (rSize < 2 || rSize > static_cast(Max3DLUTLength)) + { + std::ostringstream os; + os << "Error parsing .spi3d file ("; + os << fileName; + os << "). "; + os << "LUT size must be between 2 and " << Max3DLUTLength << ". Found: '"; + os << lineBuffer << "'."; + throw Exception(os.str().c_str()); + } + Lut3DOpDataRcPtr lut3d = std::make_shared((unsigned long)rSize); if (Lut3DOpData::IsValidInterpolation(interp)) { diff --git a/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp b/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp index 663a4e9a5d..87c15182dd 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp @@ -68,23 +68,23 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, Interpolation /*interp*/) const { - // Read the entire file. - std::ostringstream fileStream; - + // Read the entire file (capped: a valid spimtx file contains exactly 12 floats). + constexpr size_t MAX_FILE_SIZE = 1024; + char fileBuf[MAX_FILE_SIZE]; + istream.read(fileBuf, MAX_FILE_SIZE); + const std::streamsize bytesRead = istream.gcount(); + if (!istream.eof()) { - const int MAX_LINE_SIZE = 4096; - char lineBuffer[MAX_LINE_SIZE]; - - while (istream.good()) - { - istream.getline(lineBuffer, MAX_LINE_SIZE); - fileStream << std::string(lineBuffer) << " "; - } + std::ostringstream os; + os << "Error parsing .spimtx file ("; + os << fileName << "). "; + os << "File is too large to be a valid .spimtx file."; + throw Exception(os.str().c_str()); } // Turn it into parts - const StringUtils::StringVec lineParts - = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(fileStream.str())); + const StringUtils::StringVec lineParts + = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(std::string(fileBuf, bytesRead))); if(lineParts.size() != 12) { diff --git a/src/OpenColorIO/fileformats/FileFormatTruelight.cpp b/src/OpenColorIO/fileformats/FileFormatTruelight.cpp index 0d95261cc3..1c5b9452e2 100755 --- a/src/OpenColorIO/fileformats/FileFormatTruelight.cpp +++ b/src/OpenColorIO/fileformats/FileFormatTruelight.cpp @@ -149,6 +149,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } + if (size3d[0] < 2 || size3d[0] > static_cast(Max3DLUTLength)) + { + throw Exception(("Truelight .cub LUT grid size must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str()); + } + raw3d.reserve(3*size3d[0]*size3d[1]*size3d[2]); } else if(parts[1] == "lutlength") @@ -158,6 +164,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { throw Exception("Malformed lutlength tag in Truelight .cub LUT."); } + if (size1d < 2 || size1d > static_cast(Max1DLUTLength)) + { + throw Exception(("Truelight .cub LUT lutlength must be between 2 and " + + std::to_string(Max1DLUTLength) + ".").c_str()); + } + raw1d.reserve(3*size1d); } else if(parts[1] == "inputlut") @@ -187,12 +199,20 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { if(in1d) { + if (raw1d.size() > Max1DLUTLength * 3) + { + throw Exception("Too many 1D LUT entries in Truelight .cub LUT."); + } raw1d.push_back(tmpfloats[0]); raw1d.push_back(tmpfloats[1]); raw1d.push_back(tmpfloats[2]); } else if(in3d) { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + throw Exception("Too many 3D LUT entries in Truelight .cub LUT."); + } raw3d.push_back(tmpfloats[0]); raw3d.push_back(tmpfloats[1]); raw3d.push_back(tmpfloats[2]); diff --git a/src/OpenColorIO/fileformats/FileFormatVF.cpp b/src/OpenColorIO/fileformats/FileFormatVF.cpp index 9026030344..736bf2cc19 100755 --- a/src/OpenColorIO/fileformats/FileFormatVF.cpp +++ b/src/OpenColorIO/fileformats/FileFormatVF.cpp @@ -158,6 +158,14 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, fileName, lineNumber, line); } + if (size3d[0] < 2 || size3d[0] > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("Grid size must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, lineNumber, line); + } + raw3d.reserve(3*size3d[0]*size3d[1]*size3d[2]); } else if(parts[0] == "global_transform") @@ -190,6 +198,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { if(StringVecToFloatVec(tmpfloats, parts) && (tmpfloats.size() == 3)) { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, lineNumber, line); + } raw3d.push_back(tmpfloats[0]); raw3d.push_back(tmpfloats[1]); raw3d.push_back(tmpfloats[2]); diff --git a/src/OpenColorIO/fileformats/cdl/CDLParser.cpp b/src/OpenColorIO/fileformats/cdl/CDLParser.cpp index 1c02d7670e..e2945bdfbb 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLParser.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLParser.cpp @@ -368,7 +368,6 @@ void CDLParser::Impl::reset() m_elms.clear(); m_lineNumber = 0; - m_fileName = ""; m_isCC = false; m_isCCC = false; } @@ -897,6 +896,11 @@ void CDLParser::Impl::CharacterDataHandler(void *userData, // Parsing a single new line. This is valid. if (len == 1 && s[0] == '\n') return; + if (pImpl->m_elms.empty()) + { + pImpl->throwMessage("Unexpected character data before root element"); + } + ElementRcPtr pElt = pImpl->m_elms.back(); if (!pElt) { diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp index 1bf162db35..60e72b42c8 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp @@ -3458,6 +3458,11 @@ ArrayBase * CTFReaderInvLut1DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max1DLUTLength) + { + return nullptr; + } + Array * pArray = &m_invLut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -3596,6 +3601,11 @@ ArrayBase * CTFReaderInvLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max3DLUTLength) + { + return nullptr; + } + Array * pArray = &m_invLut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -4271,6 +4281,11 @@ ArrayBase * CTFReaderLut1DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max1DLUTLength) + { + return nullptr; + } + Array * pArray = &m_lut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -4332,7 +4347,7 @@ IndexMapping * CTFReaderLut1DElt::updateDimensionIM(const DimensionsIM & dims) const unsigned int numComponents = dims[0]; - if (dims[0] == 0) + if (dims[0] < 2 || dims[0] > Max1DLUTLength) { return nullptr; } @@ -4543,6 +4558,11 @@ ArrayBase * CTFReaderLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max3DLUTLength) + { + return nullptr; + } + Array* pArray = &m_lut->getArray(); pArray->resize(dims[0], numColorComponents); @@ -4573,7 +4593,7 @@ IndexMapping * CTFReaderLut3DElt::updateDimensionIM(const DimensionsIM & dims) const unsigned numComponents = dims[0]; - if (dims[0] == 0) + if (dims[0] < 2 || dims[0] > Max3DLUTLength) { return nullptr; } @@ -4677,6 +4697,11 @@ ArrayBase * CTFReaderMatrixElt::updateDimension(const Dimensions & dims) return nullptr; } + if (size < 3 || size > 4) + { + return nullptr; + } + ArrayDouble * pArray = &m_matrix->getArray(); pArray->resize(size, numColorComponents); diff --git a/src/OpenColorIO/ops/exponent/ExponentOp.cpp b/src/OpenColorIO/ops/exponent/ExponentOp.cpp index 41b95992c4..e10eb56b71 100644 --- a/src/OpenColorIO/ops/exponent/ExponentOp.cpp +++ b/src/OpenColorIO/ops/exponent/ExponentOp.cpp @@ -41,6 +41,10 @@ ExponentOpData::ExponentOpData(const ExponentOpData & rhs) ExponentOpData::ExponentOpData(const double * exp4) : OpData() { + if (!exp4) + { + throw Exception("ExponentOpData: exp4 must not be null."); + } memcpy(m_exp4, exp4, 4*sizeof(double)); } diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp index a0d2298f0c..8ada40bdcf 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp @@ -501,10 +501,11 @@ void AddGPVideoInverseShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb = ( " << pxl << ".rgb - " << props.pivotBlack << " ) * "<< props.slope <<" + " << props.pivotBlack << ";"; - st.newLine() << pxl << ".rgb += " << props.offset << " );"; -} + st.newLine() << pxl << ".rgb += " << props.offset << ";"; } +} // namespace + void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstGradingPrimaryOpDataRcPtr & gpData) { diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp index 8dc8d8d23d..d046111651 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp @@ -1155,7 +1155,12 @@ void GradingBSplineCurveImpl::AddShaderEvalRev(GpuShaderText & st, st.newLine() << "float kn = " << knots << "[knotsOffs + i];"; st.newLine() << "float C0 = C - x;"; st.newLine() << "float discrim = sqrt(B * B - 4. * A * C0);"; - st.newLine() << "return kn + (-2. * C0) / (discrim + B);"; + st.newLine() << "float denom = discrim + B;"; + st.newLine() << "if (abs(denom) < 1e-5)"; + st.newLine() << "{"; + st.newLine() << " return abs(B) < 1e-5 ? kn : kn + (-C0 / B);"; + st.newLine() << "}"; + st.newLine() << "return kn + (-2. * C0) / denom;"; } //------------------------------------------------------------------------------------------------ @@ -1229,7 +1234,12 @@ void GradingBSplineCurveImpl::AddShaderEvalRevHue(GpuShaderText & st, st.newLine() << "}"; st.newLine() << "float C0 = C - x;"; st.newLine() << "float discrim = sqrt(B * B - 4. * A * C0);"; - st.newLine() << "return kn + (-2. * C0) / (discrim + B);"; + st.newLine() << "float denom = discrim + B;"; + st.newLine() << "if (abs(denom) < 1e-5)"; + st.newLine() << "{"; + st.newLine() << " return abs(B) < 1e-5 ? kn : kn + (-C0 / B);"; + st.newLine() << "}"; + st.newLine() << "return kn + (-2. * C0) / denom;"; } //------------------------------------------------------------------------------------------------ @@ -1360,7 +1370,13 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRev(int c, float y) const const float kn = m_knotsArray[knotsOffs + i]; const float C0 = C - y; const float discrim = sqrt(B * B - 4.f * A * C0); - return kn + (-2.f * C0) / (discrim + B); + const float denom = discrim + B; + if (std::fabs(denom) < 1e-5f) + { + // A~=0, B<0: linear segment with negative slope; use linear inverse. + return std::fabs(B) < 1e-5f ? kn : kn + (-C0 / B); + } + return kn + (-2.f * C0) / denom; } } @@ -1432,7 +1448,13 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRevHue(int c, float y) const } const float C0 = C - y; const float discrim = sqrt(B * B - 4.f * A * C0); - return kn + (-2.f * C0) / (discrim + B); + const float denom = discrim + B; + if (std::fabs(denom) < 1e-5f) + { + // A~=0, B<0: linear segment with negative slope; use linear inverse. + return std::fabs(B) < 1e-5f ? kn : kn + (-C0 / B); + } + return kn + (-2.f * C0) / denom; // Note: The caller should wrap to ensure the output is a hue on [0,1). } diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp index e17cbcfce6..2331d1777b 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp @@ -58,9 +58,6 @@ Lut3DOpDataRcPtr MakeFastLut3DFromInverse(ConstLut3DOpDataRcPtr & lut) return result; } -// 129 allows for a MESH dimension of 7 in the 3dl file format. -const unsigned long Lut3DOpData::maxSupportedLength = 129; - // Functional composition is a concept from mathematics where two functions // are combined into a single function. This idea may be applied to ops // where we generate a single op that has the same (or similar) effect as @@ -196,11 +193,11 @@ void Lut3DOpData::Lut3DArray::fill() void Lut3DOpData::Lut3DArray::resize(unsigned long length, unsigned long numColorComponents) { - if (length > maxSupportedLength) + if (length > Max3DLUTLength) { std::ostringstream oss; oss << "LUT 3D: Grid size '" << length - << "' must not be greater than '" << maxSupportedLength << "'."; + << "' must not be greater than '" << Max3DLUTLength << "'."; throw Exception(oss.str().c_str()); } Array::resize(length, numColorComponents); @@ -389,7 +386,7 @@ void Lut3DOpData::validate() const throw Exception("Lut3D has an incorrect number of color components. "); } - if (getArray().getLength()>maxSupportedLength) + if (getArray().getLength()>Max3DLUTLength) { // This should never happen. Enforced by resize. std::ostringstream oss; diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpData.h b/src/OpenColorIO/ops/lut3d/Lut3DOpData.h index 370f496c74..c10f2af3eb 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpData.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpData.h @@ -8,6 +8,7 @@ #include +#include "LutLimits.h" #include "Op.h" #include "ops/OpArray.h" #include "PrivateTypes.h" @@ -23,9 +24,6 @@ class Lut3DOpData : public OpData { public: - // The maximum grid size supported for a 3D LUT. - static const unsigned long maxSupportedLength; - // Use functional composition to generate a single op that // approximates the effect of the pair of ops. static Lut3DOpDataRcPtr Compose(ConstLut3DOpDataRcPtr & lut1, ConstLut3DOpDataRcPtr & lut2); diff --git a/src/OpenColorIO/ops/matrix/MatrixOp.cpp b/src/OpenColorIO/ops/matrix/MatrixOp.cpp index 93505a284e..b593983128 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOp.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOp.cpp @@ -304,7 +304,12 @@ void CreateMinMaxOp(OpRcPtrVec & ops, bool somethingToDo = false; for (int i = 0; i < 3; ++i) { - scale4[i] = 1.0 / (from_max3[i] - from_min3[i]); + const double range = from_max3[i] - from_min3[i]; + if (range == 0.0) + { + throw Exception("CreateMinMaxOp: from_min and from_max must not be equal."); + } + scale4[i] = 1.0 / range; offset4[i] = -from_min3[i] * scale4[i]; somethingToDo |= (scale4[i] != 1.0 || offset4[i] != 0.0); } diff --git a/src/OpenColorIO/ops/matrix/MatrixOpData.cpp b/src/OpenColorIO/ops/matrix/MatrixOpData.cpp index 9750b154eb..709cde55ca 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpData.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOpData.cpp @@ -373,6 +373,10 @@ void MatrixOpData::MatrixArray::expandFrom3x3To4x4() void MatrixOpData::MatrixArray::setRGBA(const float * values) { + if (!values) + { + throw Exception("Matrix: setRGBA NULL pointer."); + } Values & v = getValues(); v[0] = values[0]; @@ -398,6 +402,10 @@ void MatrixOpData::MatrixArray::setRGBA(const float * values) void MatrixOpData::MatrixArray::setRGBA(const double * values) { + if (!values) + { + throw Exception("Matrix: setRGBA NULL pointer."); + } Values & v = getValues(); std::memcpy(&v[0], values, 16 * sizeof(double)); } diff --git a/src/OpenColorIO/transforms/AllocationTransform.cpp b/src/OpenColorIO/transforms/AllocationTransform.cpp index eeca74431d..1ab8aea5b6 100755 --- a/src/OpenColorIO/transforms/AllocationTransform.cpp +++ b/src/OpenColorIO/transforms/AllocationTransform.cpp @@ -146,6 +146,10 @@ void AllocationTransform::setVars(int numvars, const float * vars) if(!getImpl()->m_vars.empty()) { + if (!vars) + { + throw Exception("AllocationTransform::setVars: vars pointer must not be null."); + } memcpy(&getImpl()->m_vars[0], vars, numvars*sizeof(float)); diff --git a/src/OpenColorIO/transforms/FileTransform.cpp b/src/OpenColorIO/transforms/FileTransform.cpp index 33da5f3077..6fd1549d61 100755 --- a/src/OpenColorIO/transforms/FileTransform.cpp +++ b/src/OpenColorIO/transforms/FileTransform.cpp @@ -110,7 +110,7 @@ const char * FileTransform::getSrc() const void FileTransform::setSrc(const char * src) { - getImpl()->m_src = src; + getImpl()->m_src = src ? src : ""; } const char * FileTransform::getCCCId() const @@ -120,7 +120,7 @@ const char * FileTransform::getCCCId() const void FileTransform::setCCCId(const char * cccid) { - getImpl()->m_cccid = cccid; + getImpl()->m_cccid = cccid ? cccid : ""; } CDLStyle FileTransform::getCDLStyle() const diff --git a/src/OpenColorIO/transforms/FixedFunctionTransform.cpp b/src/OpenColorIO/transforms/FixedFunctionTransform.cpp index 07baef12a9..1c00c8c0e8 100644 --- a/src/OpenColorIO/transforms/FixedFunctionTransform.cpp +++ b/src/OpenColorIO/transforms/FixedFunctionTransform.cpp @@ -21,8 +21,15 @@ FixedFunctionTransformRcPtr FixedFunctionTransform::Create(FixedFunctionStyle st const double * params, size_t num) { + if (!params && num > 0) + { + throw Exception("FixedFunctionTransform::Create: params pointer must not be null."); + } FixedFunctionOpData::Params p(num); - std::copy(params, params + num, p.begin()); + if (num > 0) + { + std::copy(params, params + num, p.begin()); + } return FixedFunctionTransformRcPtr(new FixedFunctionTransformImpl(style, p), &FixedFunctionTransformImpl::deleter); @@ -125,8 +132,15 @@ size_t FixedFunctionTransformImpl::getNumParams() const void FixedFunctionTransformImpl::setParams(const double * params, size_t num) { + if (!params && num > 0) + { + throw Exception("FixedFunctionTransform::setParams: params pointer must not be null."); + } FixedFunctionOpData::Params p(num); - std::copy(params, params+num, p.begin()); + if (num > 0) + { + std::copy(params, params + num, p.begin()); + } data().setParams(p); } diff --git a/src/OpenColorIO/transforms/Lut3DTransform.cpp b/src/OpenColorIO/transforms/Lut3DTransform.cpp index 6e1a2babeb..d0d12d4087 100644 --- a/src/OpenColorIO/transforms/Lut3DTransform.cpp +++ b/src/OpenColorIO/transforms/Lut3DTransform.cpp @@ -201,9 +201,9 @@ std::ostream & operator<< (std::ostream & os, const Lut3DTransform & t) rMin = std::min(rMin, rv); gMin = std::min(gMin, gv); bMin = std::min(bMin, bv); - rMax = std::max(rMin, rv); - gMax = std::max(gMin, gv); - bMax = std::max(bMin, bv); + rMax = std::max(rMax, rv); + gMax = std::max(gMax, gv); + bMax = std::max(bMax, bv); } } } diff --git a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp index d828f11ace..f06515bcc7 100644 --- a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp +++ b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp @@ -124,7 +124,7 @@ void BuiltinTransformRegistryImpl::registerAll() noexcept void CreateBuiltinTransformOps(OpRcPtrVec & ops, size_t nameIndex, TransformDirection direction) { - if (nameIndex > BuiltinTransformRegistry::Get()->getNumBuiltins()) + if (nameIndex >= BuiltinTransformRegistry::Get()->getNumBuiltins()) { throw Exception("Invalid built-in transform name."); } diff --git a/src/utils/StringUtils.h b/src/utils/StringUtils.h index 7dbfaa1a4b..25600a2760 100644 --- a/src/utils/StringUtils.h +++ b/src/utils/StringUtils.h @@ -252,6 +252,8 @@ inline std::string::size_type ReverseFind(const std::string & subject, const std // In place replace the 'search' substring by the 'replace' string in 'str'. inline bool ReplaceInPlace(std::string & subject, const std::string & search, const std::string & replace) { + if (search.empty()) return false; + bool changed = false; size_t pos = 0; diff --git a/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp b/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp index 69d2234b92..27d7f6d537 100644 --- a/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp +++ b/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp @@ -67,8 +67,8 @@ OCIO_ADD_TEST(Lut3DOpData, clone) OCIO_ADD_TEST(Lut3DOpData, not_supported_length) { - OCIO_CHECK_NO_THROW(OCIO::Lut3DOpData{ OCIO::Lut3DOpData::maxSupportedLength }); - OCIO_CHECK_THROW_WHAT(OCIO::Lut3DOpData{ OCIO::Lut3DOpData::maxSupportedLength + 1 }, + OCIO_CHECK_NO_THROW(OCIO::Lut3DOpData{ OCIO::Max3DLUTLength }); + OCIO_CHECK_THROW_WHAT(OCIO::Lut3DOpData{ OCIO::Max3DLUTLength + 1 }, OCIO::Exception, "must not be greater"); } diff --git a/tests/gpu/GradingPrimaryOp_test.cpp b/tests/gpu/GradingPrimaryOp_test.cpp index 86dd540a4f..8ade7ae568 100644 --- a/tests/gpu/GradingPrimaryOp_test.cpp +++ b/tests/gpu/GradingPrimaryOp_test.cpp @@ -133,7 +133,7 @@ OCIO_ADD_GPU_TEST(GradingPrimary, style_lin_rev_dynamic) namespace GPTest3 { -static constexpr OCIO::GradingStyle style = OCIO::GRADING_LIN; +static constexpr OCIO::GradingStyle style = OCIO::GRADING_VIDEO; static const OCIO::GradingRGBM lift{ 0.05, -0.04, 0.02, 0.05 }; static const OCIO::GradingRGBM gamma{ 0.9, 1.4, 0.7, 0.75 }; static const OCIO::GradingRGBM gain{ 1.2, 1.1, 1.25, 0.8 }; diff --git a/tests/gpu/Lut3DOp_test.cpp b/tests/gpu/Lut3DOp_test.cpp index d1ee3aa3de..3224b64bb1 100644 --- a/tests/gpu/Lut3DOp_test.cpp +++ b/tests/gpu/Lut3DOp_test.cpp @@ -8,6 +8,7 @@ #include #include "GPUUnitTest.h" +#include "LutLimits.h" namespace OCIO = OCIO_NAMESPACE; @@ -241,7 +242,7 @@ OCIO_ADD_GPU_TEST(Lut3DOp, 3dlut_biggest_supported) { // Linear interpolation OCIO::Lut3DTransformRcPtr lut = OCIO::Lut3DTransform::Create(); - lut->setGridSize(129); // Lut3DOpData::maxSupportedLength. + lut->setGridSize(OCIO::Max3DLUTLength); test.setProcessor(lut); From f705d2e6f057884eca3c98858137c57bca4ea5aa Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Wed, 13 May 2026 17:48:51 -0400 Subject: [PATCH 32/37] Add CVE to security (#2311) Signed-off-by: Doug Walker --- SECURITY.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 2693a4a8da..a3f8990a47 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -23,10 +23,6 @@ Include detailed steps to reproduce the issue, and any other information that could aid an investigation. Someone will assess the report and make every effort to respond within 14 days. -## History of CVE Fixes - -None - ## File Format Expectations Attempting to read an OCIO config (YAML) file will: @@ -60,3 +56,7 @@ set of behaviors as with file loading. It is a bug if calling a function with well-formed arguments causes the library to crash. It is a security issue if calling a function with well-formed arguments causes arbitrary code execution. + +## History of CVE Fixes + +CVE-2026-42450 -- Stack buffer overflow in sscanf. (Fixed in OCIO 2.5.2) From 907a643afed5df80121788815af972ddc4879f64 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Fri, 22 May 2026 19:16:59 -0400 Subject: [PATCH 33/37] Adsk Contrib - Fix 2023.3 Linux container break (#2315) * Fix 2023.3 Linux container break Signed-off-by: Doug Walker * Adjust to keep the name constant to use the existing GitHub branch rules Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- .github/workflows/ci_workflow.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 2d6ba3a12e..41c7afb08a 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -57,9 +57,9 @@ jobs: container: # DockerHub: https://hub.docker.com/u/aswf # Source: https://github.com/AcademySoftwareFoundation/aswf-docker - image: aswf/ci-ocio:${{ matrix.vfx-cy }} + image: aswf/ci-ocio:${{ matrix.container-tag || matrix.vfx-cy }} strategy: - fail-fast: true + fail-fast: false matrix: build: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] include: @@ -204,6 +204,7 @@ jobs: cc-compiler: clang compiler-desc: Clang vfx-cy: 2023 + container-tag: 2023.2 install-ext-packages: MISSING - build: 2 build-type: Release @@ -217,6 +218,7 @@ jobs: cc-compiler: gcc compiler-desc: GCC vfx-cy: 2023 + container-tag: 2023.2 install-ext-packages: ALL - build: 1 build-type: Release @@ -230,6 +232,7 @@ jobs: cc-compiler: gcc compiler-desc: GCC vfx-cy: 2023 + container-tag: 2023.2 install-ext-packages: ALL env: CXX: ${{ matrix.cxx-compiler }} From 57a94a8003c00be506a41f54a080d9fefaba6d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Renaud-Houde?= Date: Fri, 22 May 2026 19:48:31 -0400 Subject: [PATCH 34/37] Add DirectX 12 GPU backend for automated unit testing on Windows (#2271) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add DirectX 12 GPU backend for automated unit testing on Windows Introduce a DirectX 12 / HLSL rendering backend alongside the existing OpenGL / GLSL and Metal / MSL backends, enabling the GPU unit test suite to run natively on Windows without requiring an OpenGL context. Key changes: GraphicalApp abstract interface (graphicalapp.h/cpp) Backend-agnostic base class extracted from OglApp. OglApp and MetalApp now inherit from it. DxApp (dxapp.h/cpp) -- DirectX 12 backend Off-screen RGBA32F render target, full-screen triangle via SV_VertexID, staging readback, SM 6.0 DXC shader compilation. HLSLBuilder (hlsl.h/cpp) -- HLSL shader generation Translates GpuShaderDesc into HLSL pixel shaders with 1D and 3D LUT texture uploads in RGBA32F format. CMake integration OCIO_DIRECTX_ENABLED option, FetchContent for DirectX-Headers, auto-copy of DXC runtime DLLs to the test output directory. Test tolerance adjustments Minor epsilon increases for 4 tests due to DX12/SM6.0 FMA and pow() precision differences. All 263 GPU tests pass on the DirectX 12 backend. Build and run: # Configure (OCIO_DIRECTX_ENABLED defaults to ON on Windows) cmake -S . -B build -DCMAKE_BUILD_TYPE=Release # Build the GPU test binary cmake --build build --target test_gpu_exec --config Release # Run GPU tests with the DX12 backend ctest --test-dir build -C Release -R test_dx Signed-off-by: Eric Renaud-Houde * Fix post-rebase issues found in code review - HeadlessOglApp::printGraphicsInfo() was calling pure virtual base (crash on headless EGL) - graphicalapp.cpp included oglapp.h unconditionally; guard under OCIO_GL_ENABLED - tests/gpu/CMakeLists.txt early-return guard excluded Vulkan-only builds - Add missing test_vulkan ctest entry Signed-off-by: Eric Renaud-Houde * Minor additional comments, formatting and fixes. Signed-off-by: Eric Renaud-Houde * Speed up DX12 GPU test backend (~19%) The DX12 test suite was noticeably slower than the OpenGL and Vulkan backends. Profiling the run showed the gap was almost entirely in DXC shader compilation, not in Present, fence waits, or DxcCreateInstance as initially suspected. Three low-risk changes: - Cache IDxcUtils and IDxcCompiler3 as DxApp members instead of recreating them on every setShader() call. The COM instances are thread-safe and perfectly reusable; recreating them per test added no value. - Compile the full-screen-triangle vertex shader exactly once and reuse the bytecode across all tests. The VSMain HLSL is a hard-coded SV_VertexID-driven triangle with no test-specific state — the bytecode is identical every time. Extracted into a new ensureVertexShaderCompiled() helper. This alone eliminated the biggest redundancy (263 duplicate VS compiles). - Present(1, 0) → Present(0, 0). VSync is meaningless for an off-screen test harness that reads back from a float render target. Locally the win shows up mostly in waitForPreviousFrame, which was being throttled by the swap-chain pipeline even on an invisible window. All 263/263 tests still pass; no tolerance changes, no DXIL codegen changes (except for a UTF8 fix), no precision risk. Signed-off-by: Eric Renaud-Houde * Several small fixes tidying up the recently-added GPU test infrastructure. - Fix unused-variable warnings (fatal on macOS with warnings-as-errors): guard useDxRenderer and useVulkanRenderer declarations with the same ifdefs as their usage sites. useMetalRenderer stays unconditional because it's referenced on all platforms. - Propagate the MSVC+shared-libs PATH workaround to test_vulkan so it can find OpenColorIO_*.dll at runtime, matching what's already done for test_dx. - Upgrade the dxcompiler.dll detection message from STATUS to WARNING and rewrite it to name OCIO_DIRECTX_ENABLED and offer concrete recovery paths. The previous STATUS message was easy to miss, leaving users with a silent degradation until test_dx failed at runtime. - Rename the OpenGL ctest from test_gpu to test_opengl now that sibling backend-specific tests (test_dx, test_vulkan, test_metal) exist. The test_gpu_exec binary keeps its name since it's backend-agnostic and selects via CLI flags. - Declare OCIO_VULKAN_ENABLED as a first-class CMake option with mark_as_advanced, matching the existing OCIO_DIRECTX_ENABLED. It was previously used in conditionals without ever being declared, so it never appeared as a toggle in ccmake/cmake-gui. - Document both OCIO_DIRECTX_ENABLED and OCIO_VULKAN_ENABLED in docs/quick_start/installation.rst, noting that Vulkan requires an external SDK. Signed-off-by: Eric Renaud-Houde * Integrate DirectX-Headers with OCIO's external-package pattern Previously InstallDirectXHeaders.cmake was included unconditionally from oglapphelpers/CMakeLists.txt, so DirectX-Headers was always fetched from GitHub regardless of whether the user had a local copy installed. There was no way to use a system install, a vendored copy, or an air-gapped build, and the dep didn't respect OCIO_INSTALL_EXT_PACKAGES. DirectX-Headers is now a first-class OCIO dependency, handled the same way as Imath, ZLIB, yaml-cpp, etc.: try find_package first, fall back to FetchContent only if not found and OCIO_INSTALL_EXT_PACKAGES allows it. Changes: - New share/cmake/modules/FindDirectX-Headers.cmake, modeled on FindImath.cmake. - InstallDirectXHeaders.cmake → InstallDirectX-Headers.cmake (the hyphen matches OCIO's Install convention). - oglapphelpers/CMakeLists.txt now calls ocio_handle_dependency(DirectX-Headers ...) with MIN_VERSION 1.606.0 (Windows SDK 22H2 era — old enough to cover most installed copies) and RECOMMENDED_VERSION 1.619.1 (the version OCIO pins and validates). For users: a local DirectX-Headers install can now be supplied via any of the standard CMake mechanisms — -DDirectX-Headers_DIR, -DDirectX-Headers_ROOT, -DDirectX-Headers_INCLUDE_DIR, or globally with -DOCIO_INSTALL_EXT_PACKAGES=NONE to forbid any network fetch. Signed-off-by: Eric Renaud-Houde * Improve dxcompiler.dll diagnostics and allow overriding its path Addresses test crashes seen on stuck Windows 10 hosts caused by an old dxcompiler.dll shipped in that host's Windows SDK Redist. - Print the version of the found dxcompiler.dll at configure time so crash reports identify the exact DXC build without follow-up diagnostics. - Emit a standing hint pointing at the DirectX Shader Compiler releases page, which is the documented workaround. - New -DOCIO_DXCOMPILER_DLL= overrides the Windows SDK Redist search, letting users supply a newer DLL pre-build instead of copying it by hand after. - Extracted the DXC-runtime logic into share/cmake/utils/LocateDXCompilerRuntime.cmake so tests/gpu/CMakeLists.txt stays focused on the test target. Signed-off-by: Eric Renaud-Houde * Minor comment tweaks in LocateDXCompilerRuntime.cmake. Signed-off-by: Eric Renaud-Houde * Use OCIO_DirectX-Headers_RECOMMENDED_VERSION in InstallDirectX-Headers.cmake ocio_install_dependency already propagates the RECOMMENDED_VERSION from the ocio_handle_dependency call site. Consume it instead of hardcoding the version a second time. Matches the pattern in Installyaml-cpp.cmake and Installpystring.cmake. Signed-off-by: Eric Renaud-Houde * Address local cleanup notes from PR #2271 Claude review. * Name CbvSrvHeapSize and throw in setShader if a shader needs more SRV slots than the heap holds. * Guard ~DxApp() so the GPU wait/CloseHandle are skipped when sync objects were never created (constructor partial-init). * Comment the 16-byte float4 stride used when packing UNIFORM_VECTOR_FLOAT/INT arrays into the HLSL constant buffer. * Only record m_windowClassName when RegisterClassExA actually succeeds, so cleanup won't unregister a class owned by another DxApp. * Drop the redundant trailing else in GPUUnitTest.cpp's shadingLanguage selector (initializer already covers it). Signed-off-by: Eric Renaud-Houde --------- Signed-off-by: Eric Renaud-Houde Co-authored-by: Doug Walker --- CMakeLists.txt | 13 + docs/quick_start/installation.rst | 2 + share/cmake/modules/FindDirectX-Headers.cmake | 76 ++ .../install/InstallDirectX-Headers.cmake | 32 + .../cmake/utils/LocateDXCompilerRuntime.cmake | 78 ++ src/apps/ociochecklut/main.cpp | 12 +- src/apps/ocioconvert/main.cpp | 16 +- src/apps/ociodisplay/main.cpp | 14 +- src/libutils/oglapphelpers/CMakeLists.txt | 135 +- src/libutils/oglapphelpers/dxapp.cpp | 1094 +++++++++++++++++ src/libutils/oglapphelpers/dxapp.h | 124 ++ src/libutils/oglapphelpers/dxutils.h | 37 + src/libutils/oglapphelpers/graphicalapp.cpp | 32 + src/libutils/oglapphelpers/graphicalapp.h | 81 ++ src/libutils/oglapphelpers/hlsl.cpp | 498 ++++++++ src/libutils/oglapphelpers/hlsl.h | 95 ++ src/libutils/oglapphelpers/metalapp.h | 4 +- src/libutils/oglapphelpers/metalapp.mm | 6 +- src/libutils/oglapphelpers/oglapp.cpp | 61 +- src/libutils/oglapphelpers/oglapp.h | 102 +- src/libutils/oglapphelpers/vulkanapp.cpp | 6 +- src/libutils/oglapphelpers/vulkanapp.h | 38 +- tests/gpu/CMakeLists.txt | 52 +- tests/gpu/FixedFunctionOp_test.cpp | 9 +- tests/gpu/GPUUnitTest.cpp | 240 ++-- tests/gpu/MatrixOp_test.cpp | 3 +- 26 files changed, 2509 insertions(+), 351 deletions(-) create mode 100644 share/cmake/modules/FindDirectX-Headers.cmake create mode 100644 share/cmake/modules/install/InstallDirectX-Headers.cmake create mode 100644 share/cmake/utils/LocateDXCompilerRuntime.cmake create mode 100644 src/libutils/oglapphelpers/dxapp.cpp create mode 100644 src/libutils/oglapphelpers/dxapp.h create mode 100644 src/libutils/oglapphelpers/dxutils.h create mode 100644 src/libutils/oglapphelpers/graphicalapp.cpp create mode 100644 src/libutils/oglapphelpers/graphicalapp.h create mode 100644 src/libutils/oglapphelpers/hlsl.cpp create mode 100644 src/libutils/oglapphelpers/hlsl.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a1b8dd0669..ccf2dfbba1 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,6 +287,19 @@ message(STATUS "") message(STATUS "Checking for GPU configuration...") include(CheckSupportGL) +# DirectX 12 is only available on Windows. +if(WIN32) + option(OCIO_DIRECTX_ENABLED "Enable DirectX 12 GPU rendering support" ON) +else() + set(OCIO_DIRECTX_ENABLED OFF CACHE BOOL "Enable DirectX 12 GPU rendering support" FORCE) +endif() +mark_as_advanced(OCIO_DIRECTX_ENABLED) + +# Vulkan is cross-platform but requires an external SDK, so it is off by +# default; enable explicitly with -DOCIO_VULKAN_ENABLED=ON. +option(OCIO_VULKAN_ENABLED "Enable Vulkan GPU rendering support" OFF) +mark_as_advanced(OCIO_VULKAN_ENABLED) + ############################################################################### # Check for ARM neon here because we need to know if ARM NEON is supported diff --git a/docs/quick_start/installation.rst b/docs/quick_start/installation.rst index 28a61a5cbb..71292348c2 100644 --- a/docs/quick_start/installation.rst +++ b/docs/quick_start/installation.rst @@ -287,6 +287,8 @@ Here are the most common OCIO-specific CMake options (the default values are sho - ``-DOCIO_BUILD_TESTS=ON`` (Set to OFF to not build the unit tests) - ``-DOCIO_BUILD_GPU_TESTS=ON`` (Set to OFF to not build the GPU unit tests) - ``-DOCIO_USE_HEADLESS=OFF`` (Set to ON to do headless GPU rendering) +- ``-DOCIO_DIRECTX_ENABLED=ON`` (Windows only; set to OFF to disable the DirectX 12 GPU rendering backend used by ``test_dx``. Forced OFF on non-Windows platforms.) +- ``-DOCIO_VULKAN_ENABLED=OFF`` (Set to ON to enable the Vulkan GPU rendering backend used by ``test_vulkan``. Requires the Vulkan SDK to be installed and findable by CMake.) - ``-DOCIO_WARNING_AS_ERROR=ON`` (Set to OFF to turn off warnings as errors) - ``-DOCIO_BUILD_DOCS=OFF`` (Set to ON to build the documentation) diff --git a/share/cmake/modules/FindDirectX-Headers.cmake b/share/cmake/modules/FindDirectX-Headers.cmake new file mode 100644 index 0000000000..99f2788d4e --- /dev/null +++ b/share/cmake/modules/FindDirectX-Headers.cmake @@ -0,0 +1,76 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Locate DirectX-Headers (header-only, Windows only) +# +# Variables defined by this module: +# DirectX-Headers_FOUND - Indicate whether the package was found or not +# DirectX-Headers_INCLUDE_DIR - Location of the header files +# DirectX-Headers_VERSION - Package version +# +# Global targets defined by this module: +# Microsoft::DirectX-Headers +# +# DirectX-Headers can be supplied by the caller through any of the standard +# CMake mechanisms: +# -- Set -DDirectX-Headers_DIR to the directory containing directx-headers-config.cmake +# -- Set -DDirectX-Headers_ROOT to the install prefix (with include/directx/ underneath) +# -- Set -DDirectX-Headers_INCLUDE_DIR to the directory containing directx/d3d12.h +# +# When OCIO_INSTALL_EXT_PACKAGES is not ALL, this module first tries to locate +# an existing install via the upstream CMake config, then falls back to a +# manual header search. If still not found and OCIO_INSTALL_EXT_PACKAGES is +# MISSING (the default), OCIO's ocio_install_dependency() pathway will invoke +# InstallDirectX-Headers.cmake to build it via FetchContent. +# + +if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) + # Prefer the upstream CMake config (installed as lower-case). + find_package(directx-headers ${DirectX-Headers_FIND_VERSION} CONFIG QUIET) + + if(directx-headers_FOUND) + set(DirectX-Headers_FOUND TRUE) + if(directx-headers_VERSION) + set(DirectX-Headers_VERSION ${directx-headers_VERSION}) + endif() + else() + # Fall back to locating the public header directly (e.g. when the + # headers were installed without the CMake config, or are provided + # by a vendored copy). + find_path(DirectX-Headers_INCLUDE_DIR + NAMES + directx/d3d12.h + HINTS + ${DirectX-Headers_ROOT} + PATH_SUFFIXES + include + ) + endif() + + # If OCIO can install the package itself, demote REQUIRED so a missing + # dependency here does not abort configuration before the install step. + if(OCIO_INSTALL_EXT_PACKAGES STREQUAL MISSING) + set(DirectX-Headers_FIND_REQUIRED FALSE) + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(DirectX-Headers + REQUIRED_VARS + DirectX-Headers_INCLUDE_DIR + VERSION_VAR + DirectX-Headers_VERSION + ) +endif() + +############################################################################### +### Create target (only needed for the manual-header-search fallback; the +### upstream CMake config already defines Microsoft::DirectX-Headers). + +if(DirectX-Headers_FOUND AND NOT TARGET Microsoft::DirectX-Headers AND DirectX-Headers_INCLUDE_DIR) + add_library(Microsoft::DirectX-Headers INTERFACE IMPORTED GLOBAL) + set_target_properties(Microsoft::DirectX-Headers PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${DirectX-Headers_INCLUDE_DIR}" + ) + + mark_as_advanced(DirectX-Headers_INCLUDE_DIR DirectX-Headers_VERSION) +endif() diff --git a/share/cmake/modules/install/InstallDirectX-Headers.cmake b/share/cmake/modules/install/InstallDirectX-Headers.cmake new file mode 100644 index 0000000000..69132f412e --- /dev/null +++ b/share/cmake/modules/install/InstallDirectX-Headers.cmake @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Install DirectX-Headers (header-only, Windows only) +# https://github.com/microsoft/DirectX-Headers +# +############################################################################### + +include(FetchContent) + +if(OCIO_DirectX-Headers_RECOMMENDED_VERSION) + set(DirectX-Headers_VERSION ${OCIO_DirectX-Headers_RECOMMENDED_VERSION}) +else() + set(DirectX-Headers_VERSION ${DirectX-Headers_FIND_VERSION}) +endif() + +set(FETCHCONTENT_BASE_DIR "${CMAKE_BINARY_DIR}/ext/build/DirectX-Headers") +set(DIRECTX_HEADERS_BUILD_TEST OFF CACHE BOOL "" FORCE) + +FetchContent_Declare(DirectX-Headers + GIT_REPOSITORY https://github.com/microsoft/DirectX-Headers.git + GIT_TAG v${DirectX-Headers_VERSION} +) + +FetchContent_MakeAvailable(DirectX-Headers) + +# Signal success to ocio_install_dependency so ocio_handle_dependency does not +# abort at the next required-check. FetchContent_MakeAvailable has just created +# the Microsoft::DirectX-Headers target via the upstream CMakeLists. +if(TARGET Microsoft::DirectX-Headers) + set(DirectX-Headers_FOUND TRUE) +endif() diff --git a/share/cmake/utils/LocateDXCompilerRuntime.cmake b/share/cmake/utils/LocateDXCompilerRuntime.cmake new file mode 100644 index 0000000000..f8d3aacecf --- /dev/null +++ b/share/cmake/utils/LocateDXCompilerRuntime.cmake @@ -0,0 +1,78 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Locate the dxcompiler.dll + dxil.dll runtime pair needed to run D3D12 shader +# compilation at test time, and surface their file version. +# +# Inputs: +# OCIO_DXCOMPILER_DLL - Optional user-supplied path to dxcompiler.dll. +# When set, overrides the Windows SDK Redist/D3D +# search. Useful when the SDK-bundled DLL is too old. +# +# Outputs: +# DXCOMPILER_DLL - Path to dxcompiler.dll (cache variable). +# DXIL_DLL - Path to the adjacent dxil.dll (cache variable, may +# be left unset if not found next to dxcompiler.dll). + +set(OCIO_DXCOMPILER_DLL "" CACHE FILEPATH + "Optional explicit path to dxcompiler.dll (e.g. from a newer DirectX Shader Compiler release). \ +Overrides the automatic Windows SDK Redist/D3D search." +) + +if(OCIO_DXCOMPILER_DLL) + if(NOT EXISTS "${OCIO_DXCOMPILER_DLL}") + message(FATAL_ERROR "OCIO_DXCOMPILER_DLL=${OCIO_DXCOMPILER_DLL} does not exist.") + endif() + set(DXCOMPILER_DLL "${OCIO_DXCOMPILER_DLL}" CACHE FILEPATH + "Path to dxcompiler.dll (user-supplied via OCIO_DXCOMPILER_DLL)" FORCE) +else() + find_file(DXCOMPILER_DLL + NAMES dxcompiler.dll + PATHS + # Note: x64 hardcoded; update if ARM64 Windows support is needed. + "$ENV{WindowsSdkDir}Redist/D3D/x64" + "C:/Program Files (x86)/Windows Kits/10/Redist/D3D/x64" + NO_DEFAULT_PATH + DOC "Path to dxcompiler.dll from Windows SDK" + ) +endif() + +if(DXCOMPILER_DLL) + get_filename_component(_dxc_dll_dir "${DXCOMPILER_DLL}" DIRECTORY) + find_file(DXIL_DLL + NAMES dxil.dll + HINTS "${_dxc_dll_dir}" + NO_DEFAULT_PATH + ) + + # Report the found dxcompiler.dll version so crash reports can identify + # mismatched or outdated DXC builds without re-running diagnostics. + string(REPLACE "'" "''" _dxc_dll_ps "${DXCOMPILER_DLL}") + execute_process( + COMMAND powershell -NoProfile -Command + "(Get-Item -LiteralPath '${_dxc_dll_ps}').VersionInfo.FileVersion" + OUTPUT_VARIABLE _dxc_version + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + if(_dxc_version) + message(STATUS "Found dxcompiler.dll (version ${_dxc_version}): ${DXCOMPILER_DLL}") + else() + message(STATUS "Found dxcompiler.dll (version unknown): ${DXCOMPILER_DLL}") + endif() + message(STATUS + "If test_dx crashes during shader compilation, the Windows SDK's dxcompiler.dll " + "may be too old to produce signed DXIL on this system. Replace it with a newer " + "build from https://github.com/microsoft/DirectXShaderCompiler/releases, or set " + "-DOCIO_DXCOMPILER_DLL= to point at a specific dxcompiler.dll." + ) +else() + message(WARNING + "OCIO_DIRECTX_ENABLED is ON but dxcompiler.dll was not found in the " + "Windows SDK Redist/D3D path. test_dx will fail at runtime unless " + "dxcompiler.dll and dxil.dll are on PATH. Install the Windows SDK " + "redistributable components, set -DOCIO_DXCOMPILER_DLL= to supply " + "a specific dxcompiler.dll, or set -DOCIO_DIRECTX_ENABLED=OFF to " + "disable the DirectX 12 backend." + ) +endif() diff --git a/src/apps/ociochecklut/main.cpp b/src/apps/ociochecklut/main.cpp index 9469090a15..593d676236 100644 --- a/src/apps/ociochecklut/main.cpp +++ b/src/apps/ociochecklut/main.cpp @@ -52,18 +52,18 @@ class ProcessorWrapper m_gpu = gpu; if (!m_oglApp) { - m_oglApp = OCIO::OglApp::CreateOglApp("ociochecklut", 256, 20); + m_oglApp = OCIO::GraphicalApp::CreateApp("ociochecklut", 256, 20); if (m_verbose) { - m_oglApp->printGLInfo(); + m_oglApp->printGraphicsInfo(); } } - m_oglApp->setPrintShader(m_verbose); + m_oglApp->setShaderVerbose(m_verbose); float image[4]{ 0.f, 0.f, 0.f, 0.f }; - m_oglApp->initImage(1, 1, OCIO::OglApp::COMPONENTS_RGBA, image); - m_oglApp->createGLBuffers(); + m_oglApp->initImage(1, 1, OCIO::GraphicalApp::COMPONENTS_RGBA, image); + m_oglApp->createBuffers(); OCIO::GpuShaderDescRcPtr shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); shaderDesc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_2); m_gpu->extractGpuShaderInfo(shaderDesc); @@ -98,7 +98,7 @@ class ProcessorWrapper m_oglApp->redisplay(); m_oglApp->readImage(pixel.data()); } - OCIO::OglAppRcPtr m_oglApp; + OCIO::GraphicalAppRcPtr m_oglApp; #else void applyGPU(std::vector &) { diff --git a/src/apps/ocioconvert/main.cpp b/src/apps/ocioconvert/main.cpp index 31a5ed3542..165aefc4a8 100644 --- a/src/apps/ocioconvert/main.cpp +++ b/src/apps/ocioconvert/main.cpp @@ -361,18 +361,18 @@ int main(int argc, const char **argv) #ifdef OCIO_GPU_ENABLED // Initialize GPU. - OCIO::OglAppRcPtr oglApp; + OCIO::GraphicalAppRcPtr oglApp; if (usegpu || usegpuLegacy) { - OCIO::OglApp::Components comp = OCIO::OglApp::COMPONENTS_RGBA; + OCIO::GraphicalApp::Components comp = OCIO::GraphicalApp::COMPONENTS_RGBA; if (imgInput.getNumChannels() == 4) { - comp = OCIO::OglApp::COMPONENTS_RGBA; + comp = OCIO::GraphicalApp::COMPONENTS_RGBA; } else if (imgInput.getNumChannels() == 3) { - comp = OCIO::OglApp::COMPONENTS_RGB; + comp = OCIO::GraphicalApp::COMPONENTS_RGB; } else { @@ -383,7 +383,7 @@ int main(int argc, const char **argv) try { - oglApp = OCIO::OglApp::CreateOglApp("ocioconvert", 256, 20); + oglApp = OCIO::GraphicalApp::CreateApp("ocioconvert", 256, 20); } catch (const OCIO::Exception & e) { @@ -393,14 +393,14 @@ int main(int argc, const char **argv) if (verbose) { - oglApp->printGLInfo(); + oglApp->printGraphicsInfo(); } - oglApp->setPrintShader(outputgpuInfo); + oglApp->setShaderVerbose(outputgpuInfo); oglApp->initImage(imgInput.getWidth(), imgInput.getHeight(), comp, (float *)imgInput.getData()); - oglApp->createGLBuffers(); + oglApp->createBuffers(); } #endif // OCIO_GPU_ENABLED diff --git a/src/apps/ociodisplay/main.cpp b/src/apps/ociodisplay/main.cpp index ed7f09759a..6eebc3b6a3 100644 --- a/src/apps/ociodisplay/main.cpp +++ b/src/apps/ociodisplay/main.cpp @@ -64,7 +64,7 @@ float g_display_gamma{1.0f}; int g_channelHot[4]{1, 1, 1, 1}; // show rgb int g_viewsMenuID; -OCIO::OglAppRcPtr g_oglApp; +OCIO::GraphicalAppRcPtr g_oglApp; void UpdateOCIOGLState(); @@ -115,14 +115,14 @@ static void InitImageTexture(const char * filename) } } - OCIO::OglApp::Components comp = OCIO::OglApp::COMPONENTS_RGBA; + OCIO::GraphicalApp::Components comp = OCIO::GraphicalApp::COMPONENTS_RGBA; if (img.getNumChannels() == 4) { - comp = OCIO::OglApp::COMPONENTS_RGBA; + comp = OCIO::GraphicalApp::COMPONENTS_RGBA; } else if (img.getNumChannels() == 3) { - comp = OCIO::OglApp::COMPONENTS_RGB; + comp = OCIO::GraphicalApp::COMPONENTS_RGB; } else { @@ -658,7 +658,7 @@ int main(int argc, char **argv) else #endif { - g_oglApp = std::make_shared("ociodisplay", 512, 512); + g_oglApp = std::make_shared("ociodisplay", 512, 512); } } catch (const OCIO::Exception &e) @@ -669,11 +669,11 @@ int main(int argc, char **argv) if (g_verbose) { - g_oglApp->printGLInfo(); + g_oglApp->printGraphicsInfo(); } g_oglApp->setYMirror(); - g_oglApp->setPrintShader(g_gpuinfo); + g_oglApp->setShaderVerbose(g_gpuinfo); glutReshapeFunc(Reshape); glutKeyboardFunc(Key); diff --git a/src/libutils/oglapphelpers/CMakeLists.txt b/src/libutils/oglapphelpers/CMakeLists.txt index 207caf8497..88e53c317b 100644 --- a/src/libutils/oglapphelpers/CMakeLists.txt +++ b/src/libutils/oglapphelpers/CMakeLists.txt @@ -1,20 +1,41 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. -if(NOT OCIO_GL_ENABLED) - message(WARNING "GL component missing. Skipping oglapphelpers.") +if(NOT OCIO_GL_ENABLED AND NOT (WIN32 AND OCIO_DIRECTX_ENABLED) AND NOT OCIO_VULKAN_ENABLED) + message(WARNING "GL component missing, DirectX disabled, and Vulkan disabled. Skipping oglapphelpers.") return() endif() set(SOURCES - glsl.cpp - oglapp.cpp + graphicalapp.cpp ) set(INCLUDES - glsl.h - oglapp.h + graphicalapp.h ) +if(OCIO_GL_ENABLED) + list(APPEND SOURCES + glsl.cpp + oglapp.cpp + ) + list(APPEND INCLUDES + glsl.h + oglapp.h + ) +endif() + +if(WIN32 AND OCIO_DIRECTX_ENABLED) + list(APPEND SOURCES + dxapp.cpp + hlsl.cpp + ) + list(APPEND INCLUDES + dxapp.h + dxutils.h + hlsl.h + ) +endif() + if(APPLE) list(APPEND SOURCES @@ -46,7 +67,7 @@ if(OCIO_VULKAN_ENABLED) endif() -add_library(oglapphelpers STATIC ${SOURCES}) +add_library(oglapphelpers STATIC ${INCLUDES} ${SOURCES}) set_target_properties(oglapphelpers PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(oglapphelpers PROPERTIES OUTPUT_NAME OpenColorIOoglapphelpers) @@ -71,47 +92,55 @@ set_target_properties(oglapphelpers PROPERTIES target_include_directories(oglapphelpers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE - ${OPENGL_INCLUDE_DIR} - ${GLEW_INCLUDE_DIRS} - ${GLUT_INCLUDE_DIR} ) +if(OCIO_GL_ENABLED) + target_include_directories(oglapphelpers + PRIVATE + ${OPENGL_INCLUDE_DIR} + ${GLEW_INCLUDE_DIRS} + ${GLUT_INCLUDE_DIR} + ) +endif() -if(${OCIO_USE_GLVND}) - if(${OCIO_EGL_HEADLESS}) - target_include_directories(oglapphelpers - PRIVATE - ${OPENGL_EGL_INCLUDE_DIRS} - ) - target_link_libraries(oglapphelpers - PRIVATE - OpenColorIO - OpenGL::OpenGL - OpenGL::GLU - ${GLEW_LIBRARIES} - ${GLUT_LIBRARIES} - OpenGL::EGL +target_link_libraries(oglapphelpers + PRIVATE + OpenColorIO +) + +if(OCIO_GL_ENABLED) + if(${OCIO_USE_GLVND}) + if(${OCIO_EGL_HEADLESS}) + target_include_directories(oglapphelpers + PRIVATE + ${OPENGL_EGL_INCLUDE_DIRS} ) + target_link_libraries(oglapphelpers + PRIVATE + OpenGL::OpenGL + OpenGL::GLU + ${GLEW_LIBRARIES} + ${GLUT_LIBRARIES} + OpenGL::EGL + ) + else() + target_link_libraries(oglapphelpers + PRIVATE + OpenGL::OpenGL + OpenGL::GLU + ${GLEW_LIBRARIES} + ${GLUT_LIBRARIES} + ) + endif() else() + # if OCIO_USE_GLVND is OFF, OCIO_EGL_HEADLESS is also OFF target_link_libraries(oglapphelpers PRIVATE - OpenColorIO - OpenGL::OpenGL - OpenGL::GLU + ${OPENGL_LIBRARIES} ${GLEW_LIBRARIES} ${GLUT_LIBRARIES} - ) - endif() -else() - # if OCIO_USE_GLVND is OFF, OCIO_EGL_HEADLESS is also OFF - target_link_libraries(oglapphelpers - PRIVATE - OpenColorIO - ${OPENGL_LIBRARIES} - ${GLEW_LIBRARIES} - ${GLUT_LIBRARIES} - ) + ) + endif() endif() if(APPLE) @@ -126,6 +155,34 @@ if(APPLE) ) endif() +if(OCIO_GL_ENABLED) + target_compile_definitions(oglapphelpers + PUBLIC + OCIO_GL_ENABLED + ) +endif() + +if(WIN32 AND OCIO_DIRECTX_ENABLED) + include(ocio_handle_dependency) + ocio_handle_dependency(DirectX-Headers REQUIRED ALLOW_INSTALL + MIN_VERSION 1.606.0 + RECOMMENDED_VERSION 1.619.1 + RECOMMENDED_VERSION_REASON "Latest version tested with OCIO") + target_compile_definitions(oglapphelpers + PUBLIC + OCIO_DIRECTX_ENABLED + ) + target_link_libraries(oglapphelpers + PUBLIC + Microsoft::DirectX-Headers + PRIVATE + d3d12 + dxgi + dxcompiler + dxguid + ) +endif() + if(OCIO_VULKAN_ENABLED) target_include_directories(oglapphelpers PUBLIC diff --git a/src/libutils/oglapphelpers/dxapp.cpp b/src/libutils/oglapphelpers/dxapp.cpp new file mode 100644 index 0000000000..57fd1f1f03 --- /dev/null +++ b/src/libutils/oglapphelpers/dxapp.cpp @@ -0,0 +1,1094 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include +#include +#include + +#include + +#include "dxapp.h" +#include "dxutils.h" + +#include + +namespace OCIO_NAMESPACE +{ + namespace + { + LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + switch (message) + { + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + + return DefWindowProc(hWnd, message, wParam, lParam); + } + + void GetHardwareAdapter( + IDXGIFactory1* pFactory, + IDXGIAdapter1** ppAdapter, + bool requestHighPerformanceAdapter = true) + { + *ppAdapter = nullptr; + + ComPtr adapter; + + ComPtr factory6; + if (SUCCEEDED(pFactory->QueryInterface(IID_PPV_ARGS(&factory6)))) + { + for ( + UINT adapterIndex = 0; + SUCCEEDED(factory6->EnumAdapterByGpuPreference( + adapterIndex, + requestHighPerformanceAdapter ? DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE : DXGI_GPU_PREFERENCE_UNSPECIFIED, + IID_PPV_ARGS(&adapter))); + ++adapterIndex) + { + DXGI_ADAPTER_DESC1 desc; + adapter->GetDesc1(&desc); + + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) + { + continue; + } + + if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) + { + break; + } + } + } + + if (adapter.Get() == nullptr) + { + for (UINT adapterIndex = 0; SUCCEEDED(pFactory->EnumAdapters1(adapterIndex, &adapter)); ++adapterIndex) + { + DXGI_ADAPTER_DESC1 desc; + adapter->GetDesc1(&desc); + + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) + { + continue; + } + + if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) + { + break; + } + } + } + + *ppAdapter = adapter.Detach(); + } + } + +DxApp::DxApp(const char* winTitle, int winWidth, int winHeight) + : m_viewportWidth{ winWidth } + , m_viewportHeight{ winHeight } +{ + // Initialize the window class. + WNDCLASSEXA windowClass = { 0 }; + windowClass.cbSize = sizeof(WNDCLASSEXA); + windowClass.style = CS_HREDRAW | CS_VREDRAW; + windowClass.lpfnWndProc = WindowProc; + windowClass.hInstance = NULL; + windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); + windowClass.lpszClassName = winTitle; + // Only record the class name for cleanup if we actually registered it. + if (RegisterClassExA(&windowClass)) + { + m_windowClassName = winTitle; + } + + RECT windowRect = { 0, 0, static_cast(m_viewportWidth), static_cast(m_viewportHeight) }; + AdjustWindowRect(&windowRect, WS_OVERLAPPEDWINDOW, FALSE); + + // Create the window and store a handle to it. + m_hwnd = CreateWindowA( + windowClass.lpszClassName, + winTitle, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + windowRect.right - windowRect.left, + windowRect.bottom - windowRect.top, + NULL, // We have no parent window. + NULL, // We aren't using menus. + NULL, + NULL); + + ShowWindow(m_hwnd, SW_RESTORE); + + UINT dxgiFactoryFlags = 0; +#if defined(_DEBUG) + { + ComPtr debugController; + if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) + { + debugController->EnableDebugLayer(); + + // Enable additional debug layers. + dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG; + } + } +#endif + + ComPtr factory; + ThrowIfFailed(CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&factory))); + + ComPtr hardwareAdapter; + GetHardwareAdapter(factory.Get(), &hardwareAdapter); + + ThrowIfFailed(D3D12CreateDevice( + hardwareAdapter.Get(), + D3D_FEATURE_LEVEL_11_0, // Standard minimum for D3D12, maximize compatibility + IID_PPV_ARGS(&m_device) + )); + + // Describe and create the command queue. + D3D12_COMMAND_QUEUE_DESC queueDesc = {}; + queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue))); + + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; + swapChainDesc.BufferCount = FrameCount; + swapChainDesc.Width = m_viewportWidth; + swapChainDesc.Height = m_viewportHeight; + swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + swapChainDesc.SampleDesc.Count = 1; + + ComPtr swapChain; + ThrowIfFailed(factory->CreateSwapChainForHwnd( + m_commandQueue.Get(), // Swap chain needs the queue so that it can force a flush on it. + m_hwnd, + &swapChainDesc, + nullptr, + nullptr, + &swapChain + )); + + // This sample does not support fullscreen transitions. + ThrowIfFailed(factory->MakeWindowAssociation(m_hwnd, DXGI_MWA_NO_ALT_ENTER)); + + ThrowIfFailed(swapChain.As(&m_swapChain)); + + // Create descriptor heaps. + { + // Describe and create a render target view (RTV) descriptor heap. + D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {}; + rtvHeapDesc.NumDescriptors = FrameCount; + rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; + rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap))); + + m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + m_cbvSrvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + } + + // Create frame resources. + { + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); + + // Create a RTV for each frame. + for (UINT n = 0; n < FrameCount; n++) + { + ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n]))); + m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle); + rtvHandle.Offset(1, m_rtvDescriptorSize); + } + } + + ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator))); + // Create the command list. + ThrowIfFailed(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_commandAllocator.Get(), m_pipelineState.Get(), IID_PPV_ARGS(&m_commandList))); + // Close the command list and execute it to begin the initial GPU setup. + ThrowIfFailed(m_commandList->Close()); + + // Create fence + ThrowIfFailed(m_device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&m_fence))); + m_fenceValue = 1; + m_fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (!m_fenceEvent) + { + throw Exception("DxApp: CreateEvent failed."); + } +} + +DxApp::~DxApp() +{ + // Skip the GPU wait if sync objects were never created (constructor threw early). + if (m_commandQueue && m_fence && m_fenceEvent) + { + waitForPreviousFrame(); + } + + if (m_fenceEvent) + { + CloseHandle(m_fenceEvent); + } + + if (m_hwnd) + { + DestroyWindow(m_hwnd); + } + if (!m_windowClassName.empty()) + { + UnregisterClassA(m_windowClassName.c_str(), NULL); + } +} + +void DxApp::initImage(int imageWidth, int imageHeight, Components comp, const float* imageBuffer) +{ + if (comp != COMPONENTS_RGBA) + { + throw Exception("DxApp: COMPONENTS_RGB is unused and not currently implemented."); + } + + m_imageWidth = imageWidth; + m_imageHeight = imageHeight; + m_comp = comp; + + // Create CBV/SRV heap if not already created (room for image + LUT textures) + if (!m_cbvSrvHeap) + { + D3D12_DESCRIPTOR_HEAP_DESC srvHeapDesc = {}; + srvHeapDesc.NumDescriptors = CbvSrvHeapSize; + srvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + srvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&srvHeapDesc, IID_PPV_ARGS(&m_cbvSrvHeap))); + } + + // Create the image texture in default heap + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = m_imageWidth; + textureDesc.Height = m_imageHeight; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(m_device->CreateCommittedResource( + &defaultHeapProps, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&m_imageTexture))); + + // Create the upload buffer with row-pitch aligned size + const UINT pixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(m_imageWidth, pixelSize); + const UINT64 uploadBufferSize = rowPitch * m_imageHeight; + + CD3DX12_HEAP_PROPERTIES uploadHeapProps(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &uploadHeapProps, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&m_imageUploadBuffer))); + + // Perform the initial upload + // Map the upload buffer and copy image data + const UINT srcRowPitch = m_imageWidth * pixelSize; // Source data is tightly packed + BYTE* pData = nullptr; + ThrowIfFailed(m_imageUploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + for (int y = 0; y < m_imageHeight; ++y) + { + const BYTE* srcRow = reinterpret_cast(imageBuffer) + y * srcRowPitch; + BYTE* dstRow = pData + y * rowPitch; + memcpy(dstRow, srcRow, srcRowPitch); + } + + m_imageUploadBuffer->Unmap(0, nullptr); + + // Record commands to copy from upload buffer to the image texture + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Offset = 0; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = m_imageWidth; + footprint.Footprint.Height = m_imageHeight; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = m_imageUploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = m_imageTexture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to PIXEL_SHADER_RESOURCE + auto barrierInit = CD3DX12_RESOURCE_BARRIER::Transition( + m_imageTexture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + m_commandList->ResourceBarrier(1, &barrierInit); + + ThrowIfFailed(m_commandList->Close()); + + // Execute the command list + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + // Wait for GPU to finish + waitForPreviousFrame(); + + // Create SRV for the image texture in slot 0 + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle(m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart()); + m_device->CreateShaderResourceView(m_imageTexture.Get(), &srvDesc, srvHandle); +} + +void DxApp::updateImage(const float* imageBuffer) +{ + // Map the upload buffer and copy image data row-by-row with proper pitch alignment + const UINT pixelSize = 4 * sizeof(float); // RGBA32F + const UINT srcRowPitch = m_imageWidth * pixelSize; + const UINT dstRowPitch = AlignRowPitch(m_imageWidth, pixelSize); + + BYTE* pData = nullptr; + ThrowIfFailed(m_imageUploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + for (int y = 0; y < m_imageHeight; ++y) + { + const BYTE* srcRow = reinterpret_cast(imageBuffer) + y * srcRowPitch; + BYTE* dstRow = pData + y * dstRowPitch; + memcpy(dstRow, srcRow, srcRowPitch); + } + + m_imageUploadBuffer->Unmap(0, nullptr); + + // Record commands to copy from upload buffer to the image texture + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + // Transition texture from PIXEL_SHADER_RESOURCE to COPY_DEST for the update + auto barrierUpdate1 = CD3DX12_RESOURCE_BARRIER::Transition( + m_imageTexture.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_COPY_DEST); + m_commandList->ResourceBarrier(1, &barrierUpdate1); + + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Offset = 0; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = m_imageWidth; + footprint.Footprint.Height = m_imageHeight; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = dstRowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = m_imageUploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = m_imageTexture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to PIXEL_SHADER_RESOURCE + auto barrierUpdate2 = CD3DX12_RESOURCE_BARRIER::Transition( + m_imageTexture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + m_commandList->ResourceBarrier(1, &barrierUpdate2); + + ThrowIfFailed(m_commandList->Close()); + + // Execute the command list + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + // Wait for GPU to finish + waitForPreviousFrame(); +} + +void DxApp::createBuffers() +{ + // Create readback buffer for copying GPU results back to CPU + const UINT pixelSize = 4 * sizeof(float); // RGBA32F + m_readbackRowPitch = AlignRowPitch(m_viewportWidth, pixelSize); + const UINT64 readbackBufferSize = m_readbackRowPitch * m_viewportHeight; + + CD3DX12_HEAP_PROPERTIES readbackHeapProps(D3D12_HEAP_TYPE_READBACK); + CD3DX12_RESOURCE_DESC readbackBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(readbackBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &readbackHeapProps, + D3D12_HEAP_FLAG_NONE, + &readbackBufferDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&m_readbackBuffer))); +} + +void DxApp::setShader(GpuShaderDescRcPtr& shaderDesc) +{ + // Reset command list for LUT texture uploads + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + // Store shader desc so redisplay() can update uniform values each frame. + m_currentShaderDesc = shaderDesc; + + // Guard against shaders that need more SRV slots than the heap holds. + { + const UINT requiredSRVs + = 1 + shaderDesc->getNumTextures() + shaderDesc->getNum3DTextures(); + if (requiredSRVs > CbvSrvHeapSize) + { + std::ostringstream oss; + oss << "DxApp: shader needs " << requiredSRVs + << " SRV descriptors but the CBV/SRV heap only has " + << CbvSrvHeapSize << " slots."; + throw Exception(oss.str().c_str()); + } + } + + // Create HLSLBuilder to allocate all LUT textures. + // Each texture is placed at the descriptor heap slot matching its HLSL register + // (derived from shaderDesc->get3DTextureShaderBindingIndex / getTextureShaderBindingIndex). + m_hlslBuilder = HLSLBuilder::Create(shaderDesc, m_device.Get(), m_commandList.Get(), + m_cbvSrvHeap.Get()); + + // Execute command list to upload LUT textures and wait for completion + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + waitForPreviousFrame(); + + // Create constant buffer for OCIO uniform variables (dynamic properties). + // D3D12 constant buffers must be 256-byte aligned. We always create one so the + // root signature can unconditionally declare a CBV at b0. + { + m_constantBuffer.Reset(); + m_cbMappedData = nullptr; + + const UINT rawSize = static_cast(shaderDesc->getUniformBufferSize()); + m_cbufferAlignedSize = ((rawSize + 255u) & ~255u); + if (m_cbufferAlignedSize == 0) + m_cbufferAlignedSize = 256u; + + auto heapProps = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD); + auto cbDesc = CD3DX12_RESOURCE_DESC::Buffer(m_cbufferAlignedSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &heapProps, D3D12_HEAP_FLAG_NONE, &cbDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, + IID_PPV_ARGS(&m_constantBuffer))); + + CD3DX12_RANGE readRange(0, 0); + ThrowIfFailed(m_constantBuffer->Map(0, &readRange, + reinterpret_cast(&m_cbMappedData))); + memset(m_cbMappedData, 0, m_cbufferAlignedSize); + } + + // Get the OCIO HLSL shader text + std::string ocioShader = m_hlslBuilder->getShaderText(); + + // Build the full HLSL shader source with a full-screen triangle vertex shader + // and pixel shader that applies OCIO color transform + std::ostringstream hlslSource; + + // Add the OCIO shader functions first + hlslSource << ocioShader << "\n\n"; + + // Declare the image texture and its sampler. + // OCIO's generated shader always starts LUT texture bindings at t1+ (textureBindingStart=1), + // so t0/s0 are always free for the input image. + hlslSource << "Texture2D img : register(t0);\n"; + hlslSource << "SamplerState linearSampler : register(s0);\n\n"; + + // Vertex shader: full-screen triangle using SV_VertexID (no vertex buffer needed) + hlslSource << "struct VSOutput {\n"; + hlslSource << " float4 position : SV_Position;\n"; + hlslSource << " float2 texcoord : TEXCOORD0;\n"; + hlslSource << "};\n\n"; + + hlslSource << "VSOutput VSMain(uint vertexID : SV_VertexID) {\n"; + hlslSource << " VSOutput output;\n"; + hlslSource << " // Full-screen triangle: vertices at (-1,-1), (3,-1), (-1,3)\n"; + hlslSource << " float2 texcoord = float2((vertexID << 1) & 2, vertexID & 2);\n"; + hlslSource << " output.position = float4(texcoord * float2(2, -2) + float2(-1, 1), 0, 1);\n"; + hlslSource << " output.texcoord = texcoord;\n"; + hlslSource << " return output;\n"; + hlslSource << "}\n\n"; + + // Pixel shader: sample image and apply OCIO color transform + hlslSource << "float4 PSMain(VSOutput input) : SV_Target {\n"; + hlslSource << " float4 col = img.Sample(linearSampler, input.texcoord);\n"; + hlslSource << " return " << shaderDesc->getFunctionName() << "(col);\n"; + hlslSource << "}\n"; + + std::string fullShader = hlslSource.str(); + + if (isShaderVerbose()) + { + std::cout << std::endl; + std::cout << "GPU Shader Program:" << std::endl; + std::cout << std::endl; + std::cout << fullShader << std::endl; + std::cout << std::endl; + } + + // The DXC compiler instances and the full-screen-triangle VS bytecode are + // cached across tests — both are invariant. + ensureVertexShaderCompiled(); + + // Create a source blob from the shader string + ComPtr sourceBlob; + ThrowIfFailed(m_dxcUtils->CreateBlobFromPinned( + fullShader.c_str(), static_cast(fullShader.size()), + DXC_CP_UTF8, &sourceBlob)); + + DxcBuffer sourceBuffer; + sourceBuffer.Ptr = sourceBlob->GetBufferPointer(); + sourceBuffer.Size = sourceBlob->GetBufferSize(); + sourceBuffer.Encoding = DXC_CP_UTF8; + + // Compile pixel shader (ps_6_0). + LPCWSTR psArgs[] = { L"-T", L"ps_6_0", L"-E", L"PSMain" }; + ComPtr psResult; + ThrowIfFailed(m_dxcCompiler->Compile(&sourceBuffer, psArgs, _countof(psArgs), + nullptr, IID_PPV_ARGS(&psResult))); + HRESULT psHr; + psResult->GetStatus(&psHr); + if (FAILED(psHr)) + { + ComPtr errors; + psResult->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(&errors), nullptr); + std::ostringstream oss; + oss << "Pixel shader compilation failed (" << HrToString(psHr) << ")"; + if (errors && errors->GetStringLength()) + oss << ":\n" << errors->GetStringPointer(); + std::cerr << oss.str() << std::endl; + throw Exception(oss.str().c_str()); + } + ComPtr pixelShaderBlob; + ThrowIfFailed(psResult->GetOutput(DXC_OUT_OBJECT, IID_PPV_ARGS(&pixelShaderBlob), nullptr)); + + // Build root signature with a descriptor table for all SRVs and a static sampler. + // Total SRVs = 1 (image at t0) + total LUT count (at t1..tN). + // We use the total texture count from shaderDesc to cover all possible binding slots, + // since LUT heap slots are derived from binding indices and may not be sequential. + const UINT numLUTs = shaderDesc->getNumTextures() + shaderDesc->getNum3DTextures(); + UINT totalSRVs = 1 + numLUTs; + + CD3DX12_DESCRIPTOR_RANGE1 srvRange; + srvRange.Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, totalSRVs, 0, 0, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC); + + // Root parameter 0: descriptor table for all SRVs (image + LUTs). + // Root parameter 1: root CBV at b0 for OCIO uniform variables. + CD3DX12_ROOT_PARAMETER1 rootParameters[2]; + rootParameters[0].InitAsDescriptorTable(1, &srvRange, D3D12_SHADER_VISIBILITY_PIXEL); + rootParameters[1].InitAsConstantBufferView(0, 0, + D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE, + D3D12_SHADER_VISIBILITY_PIXEL); + + // Build static samplers: s0 for the input image, s1..sN for each OCIO LUT texture. + std::vector staticSamplers(1 + numLUTs); + for (UINT i = 0; i <= numLUTs; ++i) + { + staticSamplers[i] = {}; + staticSamplers[i].Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; + staticSamplers[i].AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; + staticSamplers[i].AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; + staticSamplers[i].AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; + staticSamplers[i].MipLODBias = 0; + staticSamplers[i].MaxAnisotropy = 0; + staticSamplers[i].ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER; + staticSamplers[i].BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK; + staticSamplers[i].MinLOD = 0.0f; + staticSamplers[i].MaxLOD = D3D12_FLOAT32_MAX; + staticSamplers[i].ShaderRegister = i; // s0 = image, s1..sN = OCIO LUT samplers + staticSamplers[i].RegisterSpace = 0; + staticSamplers[i].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL; + } + + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC rootSignatureDesc; + rootSignatureDesc.Init_1_1(_countof(rootParameters), rootParameters, + static_cast(staticSamplers.size()), staticSamplers.data(), + D3D12_ROOT_SIGNATURE_FLAG_NONE); + + ComPtr signature; + ComPtr sigErrorBlob; + HRESULT hr = D3DX12SerializeVersionedRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1_1, + &signature, &sigErrorBlob); + if (FAILED(hr)) + { + if (sigErrorBlob) + { + std::cerr << "Root signature serialization error:\n" + << static_cast(sigErrorBlob->GetBufferPointer()) << std::endl; + } + ThrowIfFailed(hr); + } + + // Release previous root signature if it exists + m_rootSignature.Reset(); + + hr = m_device->CreateRootSignature(0, signature->GetBufferPointer(), + signature->GetBufferSize(), + IID_PPV_ARGS(&m_rootSignature)); + if (FAILED(hr)) + { + throw Exception(("CreateRootSignature failed: " + HrToString(hr)).c_str()); + } + + // Create the pipeline state object (PSO) + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; + psoDesc.InputLayout = { nullptr, 0 }; // No vertex input layout (using SV_VertexID) + psoDesc.pRootSignature = m_rootSignature.Get(); + psoDesc.VS = { m_vertexShaderBlob->GetBufferPointer(), m_vertexShaderBlob->GetBufferSize() }; + psoDesc.PS = { pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize() }; + psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + psoDesc.DepthStencilState.DepthEnable = FALSE; + psoDesc.DepthStencilState.StencilEnable = FALSE; + psoDesc.SampleMask = UINT_MAX; + psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = DXGI_FORMAT_R32G32B32A32_FLOAT; + psoDesc.SampleDesc.Count = 1; + + // Release previous pipeline state if it exists + m_pipelineState.Reset(); + + hr = m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineState)); + if (FAILED(hr)) + { + std::cerr << "CreateGraphicsPipelineState failed (" << HrToString(hr) << ")\n" + << "Full HLSL shader:\n" << fullShader << std::endl; + throw Exception(("CreateGraphicsPipelineState failed: " + HrToString(hr)).c_str()); + } +} + +void DxApp::reshape(int width, int height) +{ + // Skip if nothing changed and resources are already initialized + if (m_viewportWidth == width && m_viewportHeight == height && m_floatRenderTarget) + return; + + // Wait for any in-flight GPU work before resizing resources + waitForPreviousFrame(); + + m_viewportWidth = width; + m_viewportHeight = height; + + // Release swap chain render target references before ResizeBuffers + for (UINT n = 0; n < FrameCount; n++) + m_renderTargets[n].Reset(); + + // Resize swap chain back buffers to the new dimensions + ThrowIfFailed(m_swapChain->ResizeBuffers( + FrameCount, + static_cast(width), + static_cast(height), + DXGI_FORMAT_R8G8B8A8_UNORM, + 0)); + + // Recreate RTVs for the resized swap chain back buffers + { + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); + for (UINT n = 0; n < FrameCount; n++) + { + ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n]))); + m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle); + rtvHandle.Offset(1, m_rtvDescriptorSize); + } + } + + // Create (or recreate) the off-screen R32G32B32A32_FLOAT render target for OCIO rendering. + // This avoids 8-bit UNORM quantization errors when comparing GPU vs CPU results. + m_floatRenderTarget.Reset(); + + D3D12_RESOURCE_DESC floatRtDesc = {}; + floatRtDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + floatRtDesc.Width = static_cast(width); + floatRtDesc.Height = static_cast(height); + floatRtDesc.DepthOrArraySize = 1; + floatRtDesc.MipLevels = 1; + floatRtDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + floatRtDesc.SampleDesc.Count = 1; + floatRtDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + + D3D12_CLEAR_VALUE floatClearValue = {}; + floatClearValue.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(m_device->CreateCommittedResource( + &defaultHeapProps, + D3D12_HEAP_FLAG_NONE, + &floatRtDesc, + D3D12_RESOURCE_STATE_RENDER_TARGET, + &floatClearValue, + IID_PPV_ARGS(&m_floatRenderTarget))); + + // Create a single-slot RTV heap for the float render target (created once) + if (!m_floatRtvHeap) + { + D3D12_DESCRIPTOR_HEAP_DESC floatRtvHeapDesc = {}; + floatRtvHeapDesc.NumDescriptors = 1; + floatRtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; + floatRtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&floatRtvHeapDesc, IID_PPV_ARGS(&m_floatRtvHeap))); + } + + // Create the float RTV + D3D12_RENDER_TARGET_VIEW_DESC floatRtvDesc = {}; + floatRtvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + floatRtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + m_device->CreateRenderTargetView(m_floatRenderTarget.Get(), &floatRtvDesc, + m_floatRtvHeap->GetCPUDescriptorHandleForHeapStart()); + + // Recreate readback buffer with updated dimensions (if already allocated by createBuffers) + if (m_readbackBuffer) + { + m_readbackBuffer.Reset(); + const UINT pixelSize = 4 * sizeof(float); // R32G32B32A32_FLOAT = 16 bytes per pixel + m_readbackRowPitch = AlignRowPitch(static_cast(width), pixelSize); + const UINT64 readbackBufferSize = m_readbackRowPitch * static_cast(height); + + CD3DX12_HEAP_PROPERTIES readbackHeapProps(D3D12_HEAP_TYPE_READBACK); + CD3DX12_RESOURCE_DESC readbackBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(readbackBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &readbackHeapProps, + D3D12_HEAP_FLAG_NONE, + &readbackBufferDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&m_readbackBuffer))); + } +} + +void DxApp::redisplay() +{ + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), m_pipelineState.Get())); + + UINT frameIndex = m_swapChain->GetCurrentBackBufferIndex(); + + // Transition swap chain back buffer to render target for clearing + auto barrierPresentToRt = CD3DX12_RESOURCE_BARRIER::Transition( + m_renderTargets[frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &barrierPresentToRt); + + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle( + m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), frameIndex, m_rtvDescriptorSize); + + // Clear the swap chain back buffer (used for display only) + const float clearColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr); + + // If pipeline state is ready, render the OCIO transform to the off-screen float render target. + // The float RT preserves full precision for accurate GPU vs CPU comparison in tests. + if (m_pipelineState && m_floatRenderTarget) + { + CD3DX12_CPU_DESCRIPTOR_HANDLE floatRtvHandle( + m_floatRtvHeap->GetCPUDescriptorHandleForHeapStart()); + + // Clear the float render target + m_commandList->ClearRenderTargetView(floatRtvHandle, clearColor, 0, nullptr); + + // Set descriptor heap for shader resources + ID3D12DescriptorHeap* descriptorHeaps[] = { m_cbvSrvHeap.Get() }; + m_commandList->SetDescriptorHeaps(_countof(descriptorHeaps), descriptorHeaps); + + // Set the root signature and pipeline state + m_commandList->SetGraphicsRootSignature(m_rootSignature.Get()); + m_commandList->SetPipelineState(m_pipelineState.Get()); + + // Set the root descriptor table to the start of the SRV heap (image + LUTs) + CD3DX12_GPU_DESCRIPTOR_HANDLE srvHandle(m_cbvSrvHeap->GetGPUDescriptorHandleForHeapStart()); + m_commandList->SetGraphicsRootDescriptorTable(0, srvHandle); + + // Update and bind the constant buffer (root parameter 1, b0). + // This fills in any OCIO uniform variables (dynamic properties like exposure, curves). + if (m_constantBuffer && m_cbMappedData && m_currentShaderDesc) + { + memset(m_cbMappedData, 0, m_cbufferAlignedSize); + + const unsigned numUniforms = m_currentShaderDesc->getNumUniforms(); + for (unsigned i = 0; i < numUniforms; ++i) + { + GpuShaderDesc::UniformData data; + m_currentShaderDesc->getUniform(i, data); + UINT8* dst = m_cbMappedData + data.m_bufferOffset; + + switch (data.m_type) + { + case UNIFORM_DOUBLE: + if (data.m_getDouble) + { + const float val = static_cast(data.m_getDouble()); + memcpy(dst, &val, sizeof(float)); + } + break; + case UNIFORM_BOOL: + if (data.m_getBool) + { + const int val = data.m_getBool() ? 1 : 0; + memcpy(dst, &val, sizeof(int)); + } + break; + case UNIFORM_FLOAT3: + if (data.m_getFloat3) + { + const Float3& f3 = data.m_getFloat3(); + memcpy(dst, f3.data(), 3 * sizeof(float)); + } + break; + // HLSL constant-buffer array entries (float or int) occupy a full float4 (16-byte) slot. + case UNIFORM_VECTOR_FLOAT: + if (data.m_vectorFloat.m_getSize && data.m_vectorFloat.m_getVector) + { + const int sz = data.m_vectorFloat.m_getSize(); + const float* vals = data.m_vectorFloat.m_getVector(); + for (int j = 0; j < sz; ++j) + memcpy(dst + j * 16, &vals[j], sizeof(float)); + } + break; + case UNIFORM_VECTOR_INT: + if (data.m_vectorInt.m_getSize && data.m_vectorInt.m_getVector) + { + const int sz = data.m_vectorInt.m_getSize(); + const int* vals = data.m_vectorInt.m_getVector(); + for (int j = 0; j < sz; ++j) + memcpy(dst + j * 16, &vals[j], sizeof(int)); + } + break; + default: + break; + } + } + + m_commandList->SetGraphicsRootConstantBufferView( + 1, m_constantBuffer->GetGPUVirtualAddress()); + } + + // Set viewport and scissor rect + D3D12_VIEWPORT viewport = {}; + viewport.TopLeftX = 0.0f; + viewport.TopLeftY = 0.0f; + viewport.Width = static_cast(m_viewportWidth); + viewport.Height = static_cast(m_viewportHeight); + viewport.MinDepth = 0.0f; + viewport.MaxDepth = 1.0f; + m_commandList->RSSetViewports(1, &viewport); + + D3D12_RECT scissorRect = { 0, 0, m_viewportWidth, m_viewportHeight }; + m_commandList->RSSetScissorRects(1, &scissorRect); + + // Render to the off-screen float render target + m_commandList->OMSetRenderTargets(1, &floatRtvHandle, FALSE, nullptr); + m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + m_commandList->DrawInstanced(3, 1, 0, 0); + } + + // Transition swap chain back buffer back to PRESENT state + auto barrierRtToPresent = CD3DX12_RESOURCE_BARRIER::Transition( + m_renderTargets[frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + m_commandList->ResourceBarrier(1, &barrierRtToPresent); + + ThrowIfFailed(m_commandList->Close()); + + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + // SyncInterval = 0: no VSync. Tests render to an off-screen float RT and + // read back from it; the swap chain back buffer is never used as a source + // of truth, so there is no reason to wait for a vblank. + ThrowIfFailed(m_swapChain->Present(0, 0)); + + waitForPreviousFrame(); +} + +void DxApp::readImage(float* imageBuffer) +{ + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + // Transition the float render target from RENDER_TARGET to COPY_SOURCE for readback + auto barrierReadback1 = CD3DX12_RESOURCE_BARRIER::Transition( + m_floatRenderTarget.Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE); + m_commandList->ResourceBarrier(1, &barrierReadback1); + + // Copy from float render target to readback buffer + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Offset = 0; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = static_cast(m_viewportWidth); + footprint.Footprint.Height = static_cast(m_viewportHeight); + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = m_readbackRowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = m_floatRenderTarget.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + srcLocation.SubresourceIndex = 0; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = m_readbackBuffer.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + dstLocation.PlacedFootprint = footprint; + + m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition the float render target back to RENDER_TARGET for the next frame + auto barrierReadback2 = CD3DX12_RESOURCE_BARRIER::Transition( + m_floatRenderTarget.Get(), D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &barrierReadback2); + + ThrowIfFailed(m_commandList->Close()); + + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + waitForPreviousFrame(); + + // Map the readback buffer and copy float data row-by-row to caller's buffer, + // stripping D3D12 row-pitch alignment padding + BYTE* pData = nullptr; + ThrowIfFailed(m_readbackBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + const UINT dstRowPitch = static_cast(m_viewportWidth) * 4 * sizeof(float); + for (int y = 0; y < m_viewportHeight; ++y) + { + const BYTE* srcRow = pData + y * m_readbackRowPitch; + BYTE* dstRow = reinterpret_cast(imageBuffer) + y * dstRowPitch; + memcpy(dstRow, srcRow, dstRowPitch); + } + + m_readbackBuffer->Unmap(0, nullptr); +} + +void DxApp::printGraphicsInfo() const noexcept +{ + try + { + // Query IDXGIDevice from the D3D12 device + ComPtr dxgiDevice; + if (FAILED(m_device.As(&dxgiDevice))) + { + return; // Silently ignore failure + } + + // Get the adapter from the DXGI device + ComPtr adapter; + if (FAILED(dxgiDevice->GetAdapter(&adapter))) + { + return; // Silently ignore failure + } + + // Get adapter description + DXGI_ADAPTER_DESC desc; + if (FAILED(adapter->GetDesc(&desc))) + { + return; // Silently ignore failure + } + + // Convert wide string to narrow string for Description + char narrowDesc[128]; + WideCharToMultiByte(CP_UTF8, 0, desc.Description, -1, narrowDesc, sizeof(narrowDesc), nullptr, nullptr); + + // Print adapter name and dedicated video memory + std::cout << "Adapter: " << narrowDesc << std::endl; + std::cout << "Dedicated Video Memory: " << (desc.DedicatedVideoMemory / (1024 * 1024)) << " MB" << std::endl; + } + catch (...) + { + // Silently ignore any exceptions + } +} + +void DxApp::ensureVertexShaderCompiled() +{ + if (m_vertexShaderBlob) + return; + + ThrowIfFailed(DxcCreateInstance(CLSID_DxcUtils, IID_PPV_ARGS(&m_dxcUtils))); + ThrowIfFailed(DxcCreateInstance(CLSID_DxcCompiler, IID_PPV_ARGS(&m_dxcCompiler))); + + // Full-screen triangle using SV_VertexID — no vertex buffer, no bindings, + // identical across every test. Kept inline here so the VS source is + // self-contained and does not depend on the OCIO-generated fragment. + static const char * kVsSource = + "struct VSOutput {\n" + " float4 position : SV_Position;\n" + " float2 texcoord : TEXCOORD0;\n" + "};\n" + "VSOutput VSMain(uint vertexID : SV_VertexID) {\n" + " VSOutput output;\n" + " float2 texcoord = float2((vertexID << 1) & 2, vertexID & 2);\n" + " output.position = float4(texcoord * float2(2, -2) + float2(-1, 1), 0, 1);\n" + " output.texcoord = texcoord;\n" + " return output;\n" + "}\n"; + + const UINT32 vsLen = static_cast(strlen(kVsSource)); + ComPtr vsSourceBlob; + ThrowIfFailed(m_dxcUtils->CreateBlobFromPinned(kVsSource, vsLen, DXC_CP_UTF8, &vsSourceBlob)); + + DxcBuffer vsBuffer; + vsBuffer.Ptr = vsSourceBlob->GetBufferPointer(); + vsBuffer.Size = vsSourceBlob->GetBufferSize(); + vsBuffer.Encoding = DXC_CP_UTF8; + + LPCWSTR vsArgs[] = { L"-T", L"vs_6_0", L"-E", L"VSMain" }; + ComPtr vsResult; + ThrowIfFailed(m_dxcCompiler->Compile(&vsBuffer, vsArgs, _countof(vsArgs), + nullptr, IID_PPV_ARGS(&vsResult))); + HRESULT vsHr; + vsResult->GetStatus(&vsHr); + if (FAILED(vsHr)) + { + ComPtr errors; + vsResult->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(&errors), nullptr); + std::ostringstream oss; + oss << "Vertex shader compilation failed (" << HrToString(vsHr) << ")"; + if (errors && errors->GetStringLength()) + oss << ":\n" << errors->GetStringPointer(); + std::cerr << oss.str() << std::endl; + throw Exception(oss.str().c_str()); + } + ThrowIfFailed(vsResult->GetOutput(DXC_OUT_OBJECT, IID_PPV_ARGS(&m_vertexShaderBlob), nullptr)); +} + +void DxApp::waitForPreviousFrame() +{ + // Signal and increment the fence value. + const UINT64 fence = m_fenceValue; + ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), fence)); + m_fenceValue++; + + // Wait until the previous frame is finished. + if (m_fence->GetCompletedValue() < fence) + { + ThrowIfFailed(m_fence->SetEventOnCompletion(fence, m_fenceEvent)); + WaitForSingleObject(m_fenceEvent, INFINITE); + } +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/dxapp.h b/src/libutils/oglapphelpers/dxapp.h new file mode 100644 index 0000000000..f7fb54e9a5 --- /dev/null +++ b/src/libutils/oglapphelpers/dxapp.h @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + + +#pragma once +#include +#include + +#include "graphicalapp.h" +#include "hlsl.h" + +#include + +struct IDxcUtils; +struct IDxcCompiler3; +struct IDxcBlob; + +using Microsoft::WRL::ComPtr; + +namespace OCIO_NAMESPACE +{ + +class DxApp : public GraphicalApp +{ +public: + DxApp() = delete; + DxApp(const DxApp&) = delete; + DxApp& operator=(const DxApp&) = delete; + + DxApp(const char* winTitle, int winWidth, int winHeight); + ~DxApp(); + + virtual void initImage(int imageWidth, int imageHeight, + Components comp, const float* imageBuffer) override; + + virtual void updateImage(const float* imageBuffer) override; + + virtual void createBuffers() override; + + virtual void setShader(GpuShaderDescRcPtr& shaderDesc) override; + + virtual void reshape(int width, int height) override; + + virtual void redisplay() override; + + virtual void readImage(float* imageBuffer) override; + + virtual void printGraphicsInfo() const noexcept override; + +private: + void waitForPreviousFrame(); + + // Compile the (constant) full-screen-triangle vertex shader once and cache + // the blob. Called lazily from setShader(). + void ensureVertexShaderCompiled(); + + static const UINT FrameCount = 2; + + // Slot 0 for the input image; remaining slots for OCIO LUT textures. + static const UINT CbvSrvHeapSize = 16; + + int m_viewportWidth{ 0 }; + int m_viewportHeight{ 0 }; + + int m_imageWidth{ 0 }; + int m_imageHeight{ 0 }; + Components m_comp{ COMPONENTS_RGBA }; + + ComPtr m_swapChain; + ComPtr m_device; + ComPtr m_renderTargets[FrameCount]; + ComPtr m_commandAllocator; + ComPtr m_commandQueue; + ComPtr m_rootSignature; + ComPtr m_rtvHeap; + ComPtr m_cbvSrvHeap; + ComPtr m_pipelineState; + ComPtr m_commandList; + UINT m_rtvDescriptorSize; + UINT m_cbvSrvDescriptorSize; + + // Synchronization objects. + HANDLE m_fenceEvent{ nullptr }; + ComPtr m_fence; + UINT64 m_fenceValue{ 0 }; + + // Image texture and upload resources. + ComPtr m_imageTexture; + ComPtr m_imageUploadBuffer; + ComPtr m_readbackBuffer; + UINT m_readbackRowPitch{ 0 }; + + // Off-screen float render target (R32G32B32A32_FLOAT) for OCIO rendering and readback. + // The swap chain back buffers (UNORM) are required for windowing but unused in tests. + ComPtr m_floatRenderTarget; + ComPtr m_floatRtvHeap; + + // HLSL shader builder + HLSLBuilderRcPtr m_hlslBuilder; + + // Constant buffer for OCIO uniform variables (dynamic properties like exposure, curves). + // Always allocated; root signature always includes a CBV at b0. + ComPtr m_constantBuffer; + UINT8* m_cbMappedData{ nullptr }; + UINT m_cbufferAlignedSize{ 0 }; + + // Current shader description, retained so redisplay() can update uniform values. + GpuShaderDescRcPtr m_currentShaderDesc; + + // Window handle and class name for cleanup. + HWND m_hwnd{ nullptr }; + std::string m_windowClassName; + + // DXC compiler — created once and reused across every setShader() call. + ComPtr m_dxcUtils; + ComPtr m_dxcCompiler; + + // Full-screen-triangle vertex shader blob — the VS source is identical for + // every test, so compile it once and reuse the bytecode. + ComPtr m_vertexShaderBlob; +}; + +} + diff --git a/src/libutils/oglapphelpers/dxutils.h b/src/libutils/oglapphelpers/dxutils.h new file mode 100644 index 0000000000..f7e4ec84a6 --- /dev/null +++ b/src/libutils/oglapphelpers/dxutils.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#pragma once + +#include + +#include + +#include + +namespace OCIO_NAMESPACE +{ + +inline std::string HrToString(HRESULT hr) +{ + char s_str[64] = {}; + sprintf_s(s_str, "HRESULT of 0x%08X", static_cast(hr)); + return std::string(s_str); +} + +inline void ThrowIfFailed(HRESULT hr) +{ + if (FAILED(hr)) + { + throw Exception(HrToString(hr).c_str()); + } +} + +// Align a row pitch to D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 bytes). +inline UINT AlignRowPitch(UINT width, UINT pixelSize) +{ + return (width * pixelSize + D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1) + & ~(D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1); +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/graphicalapp.cpp b/src/libutils/oglapphelpers/graphicalapp.cpp new file mode 100644 index 0000000000..75fdb5c9a3 --- /dev/null +++ b/src/libutils/oglapphelpers/graphicalapp.cpp @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include "graphicalapp.h" + +#ifdef OCIO_GL_ENABLED +#include "oglapp.h" +#endif + +#ifdef OCIO_DIRECTX_ENABLED +#include "dxapp.h" +#endif + +namespace OCIO_NAMESPACE +{ + +// Factory for windowed backends (OGL, DX). For headless Vulkan use +// VulkanApp::CreateVulkanApp(). Metal is always paired with OGL (MetalApp +// inherits ScreenOglApp) and is covered by the OCIO_GL_ENABLED branch. +GraphicalAppRcPtr GraphicalApp::CreateApp(const char * winTitle, int winWidth, int winHeight) +{ +#ifdef OCIO_GL_ENABLED + return OglApp::CreateApp(winTitle, winWidth, winHeight); +#elif defined(OCIO_DIRECTX_ENABLED) + return std::make_shared(winTitle, winWidth, winHeight); +#else + (void)winTitle; (void)winWidth; (void)winHeight; + throw Exception("No suitable GPU backend available for GraphicalApp::CreateApp"); +#endif +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/graphicalapp.h b/src/libutils/oglapphelpers/graphicalapp.h new file mode 100644 index 0000000000..a17730070a --- /dev/null +++ b/src/libutils/oglapphelpers/graphicalapp.h @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#pragma once + +#include + +namespace OCIO_NAMESPACE +{ +// Forward declaration of GraphicalApp. +class GraphicalApp; +typedef OCIO_SHARED_PTR GraphicalAppRcPtr; + +class GraphicalApp +{ +public: + virtual ~GraphicalApp() = default; + enum Components + { + COMPONENTS_RGB = 0, + COMPONENTS_RGBA + }; + + // Shader code will be printed when generated. + void setShaderVerbose(bool print) + { + m_verboseShader = print; + } + + bool isShaderVerbose() const { return m_verboseShader; } + + // When displaying the processed image in a window, enable Y-axis mirroring. + void setYMirror() + { + m_yMirror = true; + } + + bool isYMirror() const { return m_yMirror; } + + // Initialize the image. + virtual void initImage(int imageWidth, int imageHeight, + Components comp, const float* imageBuffer) = 0; + + // Update the image if it changes. + virtual void updateImage(const float* imageBuffer) = 0; + + // Create frame and rendering buffers. Needed if readImage will be used. + virtual void createBuffers() = 0; + + // Set the shader code. + virtual void setShader(GpuShaderDescRcPtr& shaderDesc) = 0; + + // Update the size of the buffer of the viewport that will be used to process the image + // (it does not modify the UI). To be called at least one time. Use image size if we want to + // read back the processed image. To process another image with the same size or using a + // different shader, reshape does not need to be called again. In case of an interactive + // application it should be called by the glutReshapeFunc callback using the windows size. + virtual void reshape(int width, int height) = 0; + + // Process the image. + virtual void redisplay() = 0; + + // Read the image from the rendering buffer. It is not meant to be used by interactive + // applications used to display the image. + virtual void readImage(float* imageBuffer) = 0; + + // Helper to print graphics info. + virtual void printGraphicsInfo() const noexcept = 0; + + // Factory: returns a platform-appropriate GraphicalApp (OGL or DX). + static GraphicalAppRcPtr CreateApp(const char * winTitle, int winWidth, int winHeight); + +private: + // Will shader code be outputed when setShader is called. + bool m_verboseShader{ false }; + // For interactive applications displaying the processed image. + bool m_yMirror{ false }; +}; + +} // namespace OCIO_NAMESPACE + diff --git a/src/libutils/oglapphelpers/hlsl.cpp b/src/libutils/oglapphelpers/hlsl.cpp new file mode 100644 index 0000000000..e165e420a5 --- /dev/null +++ b/src/libutils/oglapphelpers/hlsl.cpp @@ -0,0 +1,498 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include +#include + +#include + +#include "hlsl.h" +#include "dxutils.h" + +namespace OCIO_NAMESPACE +{ + +namespace +{ + +// Upload a TEXTURE_1D LUT as a real D3D12 1D texture with RGBA32F format. +// RGBA32F is used instead of RGB32F because DXGI_FORMAT_R32G32B32_FLOAT has +// limited hardware support in D3D12 (optional for most resource types). +void AllocateTexture1D(ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + UINT width, + UINT numChannels, + const float* values, + Microsoft::WRL::ComPtr& texture, + Microsoft::WRL::ComPtr& uploadBuffer) +{ + if (!values) + { + throw Exception("Missing 1D LUT texture data"); + } + + // Create a 1D texture resource in default heap. + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = width; + textureDesc.Height = 1; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE1D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(device->CreateCommittedResource( + &defaultHeapProps, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&texture))); + + // Create upload buffer with row-pitch alignment + const UINT dstPixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(width, dstPixelSize); + const UINT uploadBufferSize = rowPitch; // Only 1 row + + CD3DX12_HEAP_PROPERTIES uploadHeapProps(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(device->CreateCommittedResource( + &uploadHeapProps, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&uploadBuffer))); + + // Map and expand source data (numChannels floats/pixel) to RGBA32F (4 floats/pixel) + BYTE* pData = nullptr; + ThrowIfFailed(uploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + float* dst = reinterpret_cast(pData); + for (UINT i = 0; i < width; ++i) + { + dst[i * 4 + 0] = (numChannels > 0) ? values[i * numChannels + 0] : 0.0f; + dst[i * 4 + 1] = (numChannels > 1) ? values[i * numChannels + 1] : 0.0f; + dst[i * 4 + 2] = (numChannels > 2) ? values[i * numChannels + 2] : 0.0f; + dst[i * 4 + 3] = 1.0f; + } + uploadBuffer->Unmap(0, nullptr); + + // Copy from upload buffer to texture + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = width; + footprint.Footprint.Height = 1; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = texture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to shader resource state + auto barrier1D = CD3DX12_RESOURCE_BARRIER::Transition( + texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + commandList->ResourceBarrier(1, &barrier1D); +} + +// Upload a TEXTURE_2D (folded) 1D LUT as a 2D texture of width x height with RGBA32F format. +void AllocateTexture2D( ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + UINT width, + UINT height, + UINT numChannels, + const float* values, + Microsoft::WRL::ComPtr& texture, + Microsoft::WRL::ComPtr& uploadBuffer) +{ + if (!values) + { + throw Exception("Missing 2D LUT texture data"); + } + + // Create a 2D texture resource in default heap. + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = width; + textureDesc.Height = height; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps2D(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(device->CreateCommittedResource( + &defaultHeapProps2D, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&texture))); + + // Create upload buffer: each row is padded to D3D12_TEXTURE_DATA_PITCH_ALIGNMENT + const UINT dstPixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(width, dstPixelSize); + const UINT uploadBufferSize = rowPitch * height; + + CD3DX12_HEAP_PROPERTIES uploadHeapProps2D(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc2D = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(device->CreateCommittedResource( + &uploadHeapProps2D, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc2D, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&uploadBuffer))); + + // Map and expand all rows: source is row-major (width * numChannels floats per row) + BYTE* pData = nullptr; + ThrowIfFailed(uploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + for (UINT y = 0; y < height; ++y) + { + const float* srcRow = values + y * width * numChannels; + float* dstRow = reinterpret_cast(pData + y * rowPitch); + for (UINT x = 0; x < width; ++x) + { + dstRow[x * 4 + 0] = (numChannels > 0) ? srcRow[x * numChannels + 0] : 0.0f; + dstRow[x * 4 + 1] = (numChannels > 1) ? srcRow[x * numChannels + 1] : 0.0f; + dstRow[x * 4 + 2] = (numChannels > 2) ? srcRow[x * numChannels + 2] : 0.0f; + dstRow[x * 4 + 3] = 1.0f; + } + } + uploadBuffer->Unmap(0, nullptr); + + // Copy from upload buffer to texture + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = width; + footprint.Footprint.Height = height; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = texture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to shader resource state + auto barrier2D = CD3DX12_RESOURCE_BARRIER::Transition( + texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + commandList->ResourceBarrier(1, &barrier2D); +} + +// Upload a 3D LUT as a 3D texture with RGBA32F format. +void AllocateTexture3D(ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + UINT edgelen, + const float* values, + Microsoft::WRL::ComPtr& texture, + Microsoft::WRL::ComPtr& uploadBuffer) +{ + if (!values) + { + throw Exception("Missing 3D LUT texture data"); + } + + // Create 3D texture in default heap + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = edgelen; + textureDesc.Height = edgelen; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = edgelen; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps3D(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(device->CreateCommittedResource( + &defaultHeapProps3D, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&texture))); + + // Create upload buffer with row-pitch alignment + // Source data is always RGB (3 floats/voxel) for OCIO 3D LUTs. + const UINT srcNumChannels = 3; // OCIO 3D LUTs always provide RGB data + const UINT dstPixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(edgelen, dstPixelSize); + const UINT slicePitch = rowPitch * edgelen; + const UINT uploadBufferSize = slicePitch * edgelen; + + CD3DX12_HEAP_PROPERTIES uploadHeapProps3D(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc3D = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(device->CreateCommittedResource( + &uploadHeapProps3D, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc3D, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&uploadBuffer))); + + // Map RGB source data and expand to RGBA32F + BYTE* pData = nullptr; + ThrowIfFailed(uploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + for (UINT z = 0; z < edgelen; ++z) + { + for (UINT y = 0; y < edgelen; ++y) + { + const float* srcRow = values + (z * edgelen * edgelen + y * edgelen) * srcNumChannels; + float* dstRow = reinterpret_cast(pData + z * slicePitch + y * rowPitch); + for (UINT x = 0; x < edgelen; ++x) + { + dstRow[x * 4 + 0] = srcRow[x * srcNumChannels + 0]; // R + dstRow[x * 4 + 1] = srcRow[x * srcNumChannels + 1]; // G + dstRow[x * 4 + 2] = srcRow[x * srcNumChannels + 2]; // B + dstRow[x * 4 + 3] = 1.0f; // A + } + } + } + + uploadBuffer->Unmap(0, nullptr); + + // Copy from upload buffer to texture + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = edgelen; + footprint.Footprint.Height = edgelen; + footprint.Footprint.Depth = edgelen; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = texture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to shader resource state + auto barrier3D = CD3DX12_RESOURCE_BARRIER::Transition( + texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + commandList->ResourceBarrier(1, &barrier3D); +} + +} // anonymous namespace + + +////////////////////////////////////////////////////////// + +HLSLBuilderRcPtr HLSLBuilder::Create(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap) +{ + if (!shaderDesc) + { + throw Exception("HLSLBuilder: shaderDesc is null"); + } + if (!device) + { + throw Exception("HLSLBuilder: device is null"); + } + if (!commandList) + { + throw Exception("HLSLBuilder: commandList is null"); + } + if (!cbvSrvHeap) + { + throw Exception("HLSLBuilder: cbvSrvHeap is null"); + } + + HLSLBuilderRcPtr builder(new HLSLBuilder(shaderDesc, device, commandList, cbvSrvHeap)); + builder->allocateAllTextures(); + + // Close the command list; the caller executes and fence-waits. + ThrowIfFailed(commandList->Close()); + + return builder; +} + +HLSLBuilder::HLSLBuilder(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap) + : m_shaderDesc(shaderDesc) + , m_device(device) + , m_commandList(commandList) + , m_cbvSrvHeap(cbvSrvHeap) + , m_srvDescriptorSize(0) + , m_verbose(false) +{ + m_srvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); +} + +HLSLBuilder::~HLSLBuilder() +{ + deleteAllTextures(); +} + +void HLSLBuilder::allocateAllTextures() +{ + deleteAllTextures(); + + // Process 3D LUTs + const unsigned maxTexture3D = m_shaderDesc->getNum3DTextures(); + for (unsigned idx = 0; idx < maxTexture3D; ++idx) + { + // Get 3D texture information + const char* textureName = nullptr; + const char* samplerName = nullptr; + unsigned edgelen = 0; + Interpolation interpolation = INTERP_LINEAR; + m_shaderDesc->get3DTexture(idx, textureName, samplerName, edgelen, interpolation); + + if (!textureName || !*textureName || !samplerName || !*samplerName || edgelen == 0) + { + throw Exception("HLSLBuilder: 3D texture data is corrupted"); + } + + const float* values = nullptr; + m_shaderDesc->get3DTextureValues(idx, values); + if (!values) + { + throw Exception("HLSLBuilder: 3D texture values are missing"); + } + + // Allocate the 3D texture + TextureResource texRes(textureName, samplerName); + AllocateTexture3D(m_device, m_commandList, edgelen, values, texRes.m_texture, texRes.m_uploadBuffer); + + // Create SRV at the slot matching the HLSL register assignment + const UINT heapSlot = m_shaderDesc->get3DTextureShaderBindingIndex(idx); + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D; + srvDesc.Texture3D.MipLevels = 1; + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle( + m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart(), + heapSlot, + m_srvDescriptorSize); + + m_device->CreateShaderResourceView(texRes.m_texture.Get(), &srvDesc, srvHandle); + + m_textures.push_back(texRes); + } + + // Process 1D LUTs (stored as 2D textures with height=1) + const unsigned maxTexture1D = m_shaderDesc->getNumTextures(); + for (unsigned idx = 0; idx < maxTexture1D; ++idx) + { + // Get 1D texture information + const char* textureName = nullptr; + const char* samplerName = nullptr; + unsigned width = 0; + unsigned height = 0; + GpuShaderDesc::TextureType channel = GpuShaderDesc::TEXTURE_RGB_CHANNEL; + Interpolation interpolation = INTERP_LINEAR; + GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; + m_shaderDesc->getTexture(idx, textureName, samplerName, width, height, channel, dimensions, interpolation); + + if (!textureName || !*textureName || !samplerName || !*samplerName || width == 0) + { + throw Exception("HLSLBuilder: 1D texture data is corrupted"); + } + + const float* values = nullptr; + m_shaderDesc->getTextureValues(idx, values); + if (!values) + { + throw Exception("HLSLBuilder: 1D texture values are missing"); + } + + // Determine source channel count: RED=1, RGB=3 + const UINT numChannels = (channel == GpuShaderDesc::TEXTURE_RED_CHANNEL) ? 1u : 3u; + TextureResource texRes(textureName, samplerName); + + // Create SRV at the slot matching the HLSL register assignment + const UINT heapSlot = m_shaderDesc->getTextureShaderBindingIndex(idx); + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + + if (dimensions == GpuShaderDesc::TEXTURE_1D) + { + AllocateTexture1D(m_device, m_commandList, width, numChannels, values, + texRes.m_texture, texRes.m_uploadBuffer); + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D; + srvDesc.Texture1D.MipLevels = 1; + } + else + { + AllocateTexture2D(m_device, m_commandList, width, height, numChannels, values, + texRes.m_texture, texRes.m_uploadBuffer); + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + } + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle( + m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart(), + heapSlot, + m_srvDescriptorSize); + + m_device->CreateShaderResourceView(texRes.m_texture.Get(), &srvDesc, srvHandle); + + m_textures.push_back(texRes); + } +} + +void HLSLBuilder::deleteAllTextures() +{ + m_textures.clear(); +} + +std::string HLSLBuilder::getShaderText() const +{ + if (!m_shaderDesc) + { + return ""; + } + + const char* shaderText = m_shaderDesc->getShaderText(); + + if (m_verbose && shaderText && *shaderText) + { + std::cout << "\nOCIO HLSL Shader:\n\n" << shaderText << std::endl; + } + + return shaderText ? std::string(shaderText) : std::string(); +} + +UINT HLSLBuilder::getNumSRVs() const +{ + return static_cast(m_textures.size()); +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/hlsl.h b/src/libutils/oglapphelpers/hlsl.h new file mode 100644 index 0000000000..a0338de3f9 --- /dev/null +++ b/src/libutils/oglapphelpers/hlsl.h @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifndef INCLUDED_OCIO_HLSL_H +#define INCLUDED_OCIO_HLSL_H + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#ifndef NOMINMAX +#define NOMINMAX +#endif + +#include + +#include +#include + +#include + +namespace OCIO_NAMESPACE +{ + +class HLSLBuilder; +typedef OCIO_SHARED_PTR HLSLBuilderRcPtr; + +// This is a DirectX implementation showing how to do texture upload & allocation +// for HLSL shaders, mirroring the role of OpenGLBuilder. + +class HLSLBuilder +{ +public: + // Create an HLSL builder using GPU shader information from a specific processor. + // Allocates D3D12 textures for all LUTs using binding indices from the shaderDesc. + // All GPU uploads are fence-synchronized before returning. + static HLSLBuilderRcPtr Create(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap); + + ~HLSLBuilder(); + + inline void setVerbose(bool verbose) { m_verbose = verbose; } + inline bool isVerbose() const { return m_verbose; } + + // Get the OCIO-generated HLSL shader text. + std::string getShaderText() const; + + // Get the number of SRVs (texture slots) allocated for LUTs. + // This does not include the image texture at slot 0. + UINT getNumSRVs() const; + +protected: + HLSLBuilder(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap); + + void allocateAllTextures(); + void deleteAllTextures(); + +private: + HLSLBuilder() = delete; + HLSLBuilder(const HLSLBuilder&) = delete; + HLSLBuilder& operator=(const HLSLBuilder&) = delete; + + struct TextureResource + { + Microsoft::WRL::ComPtr m_texture; + Microsoft::WRL::ComPtr m_uploadBuffer; + std::string m_textureName; + std::string m_samplerName; + + TextureResource(const std::string& textureName, + const std::string& samplerName) + : m_textureName(textureName) + , m_samplerName(samplerName) + {} + }; + + typedef std::vector TextureResources; + + const GpuShaderDescRcPtr m_shaderDesc; // Description of the shader + ID3D12Device* m_device; // D3D12 device (not owned) + ID3D12GraphicsCommandList* m_commandList; // Command list for uploads (not owned) + ID3D12DescriptorHeap* m_cbvSrvHeap; // Descriptor heap for SRVs (not owned) + UINT m_srvDescriptorSize; // Size of one SRV descriptor + TextureResources m_textures; // All allocated texture resources + bool m_verbose; // Print shader text for debugging +}; + +} // namespace OCIO_NAMESPACE + +#endif // INCLUDED_OCIO_HLSL_H diff --git a/src/libutils/oglapphelpers/metalapp.h b/src/libutils/oglapphelpers/metalapp.h index 37fba14018..cb8c7acc42 100644 --- a/src/libutils/oglapphelpers/metalapp.h +++ b/src/libutils/oglapphelpers/metalapp.h @@ -24,7 +24,7 @@ typedef OCIO_SHARED_PTR MetalAppRcPtr; class MtlTexture; typedef OCIO_SHARED_PTR MtlTextureRcPtr; -class MetalApp : public ScreenApp +class MetalApp : public ScreenOglApp { public: MetalApp() = delete; @@ -53,7 +53,7 @@ class MetalApp : public ScreenApp // Process the image. void redisplay() override; - // Return a pointer of either ScreenApp or HeadlessApp depending on the + // Return a pointer of either ScreenOglApp or HeadlessOglApp depending on the // OCIO_HEADLESS_ENABLED preprocessor. static MetalAppRcPtr CreateMetalGlApp(const char * winTitle, int winWidth, int winHeight); diff --git a/src/libutils/oglapphelpers/metalapp.mm b/src/libutils/oglapphelpers/metalapp.mm index be46d4e1b6..4114108848 100644 --- a/src/libutils/oglapphelpers/metalapp.mm +++ b/src/libutils/oglapphelpers/metalapp.mm @@ -43,7 +43,7 @@ }; MetalApp::MetalApp(const char * winTitle, int winWidth, int winHeight) - : ScreenApp(winTitle, winWidth, winHeight) + : ScreenOglApp(winTitle, winWidth, winHeight) { initContext(); } @@ -346,7 +346,7 @@ vertex VertexOut ColorCorrectionVS(unsigned int vId [[ vertex_id ]]) throw Exception("Metal renderer can only consume MSL shaders"); } - if(printShader()) + if(isShaderVerbose()) { std::cout << std::endl; std::cout << "GPU Shader Program:" << std::endl; @@ -380,7 +380,7 @@ vertex VertexOut ColorCorrectionVS(unsigned int vId [[ vertex_id ]]) prepareAndBindOpenGLState(); } - ScreenApp::redisplay(); + ScreenOglApp::redisplay(); } MetalAppRcPtr MetalApp::CreateMetalGlApp(const char * winTitle, int winWidth, int winHeight) diff --git a/src/libutils/oglapphelpers/oglapp.cpp b/src/libutils/oglapphelpers/oglapp.cpp index 32528a55cc..0b8e49fab6 100644 --- a/src/libutils/oglapphelpers/oglapp.cpp +++ b/src/libutils/oglapphelpers/oglapp.cpp @@ -12,10 +12,17 @@ #include #elif _WIN32 - #include -#include - +#ifndef NDEBUG + // freeglut's header uses a #pragma comment(lib) that links freeglutd.lib in + // debug builds, which we don't ship. Temporarily define NDEBUG so the header + // selects freeglut.lib instead, then restore the original state. + #define NDEBUG + #include + #undef NDEBUG +#else + #include +#endif // !NDEBUG #else #include @@ -33,6 +40,15 @@ namespace OCIO_NAMESPACE { +GraphicalAppRcPtr OglApp::CreateApp(const char* winTitle, int winWidth, int winHeight) +{ +#ifdef OCIO_HEADLESS_ENABLED + return std::make_shared(winTitle, winWidth, winHeight); +#else + return std::make_shared(winTitle, winWidth, winHeight); +#endif +} + OglApp::OglApp(int winWidth, int winHeight) : m_viewportWidth(winWidth) , m_viewportHeight(winHeight) @@ -113,7 +129,7 @@ void OglApp::redisplay() pts[3] = (float)m_viewportHeight * 0.5f + imgHeightScreenSpace * 0.5f; } - if (m_yMirror) + if (isYMirror()) { std::swap(pts[1], pts[3]); } @@ -162,7 +178,7 @@ void OglApp::reshape(int width, int height) glLoadIdentity(); } -void OglApp::createGLBuffers() +void OglApp::createBuffers() { // Create a framebuffer object, you need to delete them when program exits. GLuint fboId; @@ -197,7 +213,7 @@ void OglApp::setShader(GpuShaderDescRcPtr & shaderDesc) { // Create oglBuilder using the shaderDesc. m_oglBuilder = OpenGLBuilder::Create(shaderDesc); - m_oglBuilder->setVerbose(m_printShader); + m_oglBuilder->setVerbose(isShaderVerbose()); // Allocate & upload all the LUTs in a dedicated GPU texture. // Note: The start index for the texture indices is 1 as one texture @@ -227,7 +243,7 @@ void OglApp::setShader(GpuShaderDescRcPtr & shaderDesc) m_oglBuilder->useAllUniforms(); } -void OglApp::printGLInfo() const noexcept +void OglApp::printGraphicsInfo() const noexcept { std::cout << std::endl << "GL Vendor: " << glGetString(GL_VENDOR) << std::endl @@ -262,16 +278,7 @@ void OglApp::setupCommon() glEnable(GL_TEXTURE_2D); } -OglAppRcPtr OglApp::CreateOglApp(const char * winTitle, int winWidth, int winHeight) -{ -#ifdef OCIO_HEADLESS_ENABLED - return std::make_shared(winTitle, winWidth, winHeight); -#else - return std::make_shared(winTitle, winWidth, winHeight); -#endif -} - -ScreenApp::ScreenApp(const char * winTitle, int winWidth, int winHeight): +ScreenOglApp::ScreenOglApp(const char * winTitle, int winWidth, int winHeight): OglApp(winWidth, winHeight) { int argc = 2; @@ -288,25 +295,25 @@ ScreenApp::ScreenApp(const char * winTitle, int winWidth, int winHeight): setupCommon(); } -ScreenApp::~ScreenApp() +ScreenOglApp::~ScreenOglApp() { glutDestroyWindow(m_mainWin); } -void ScreenApp::redisplay() +void ScreenOglApp::redisplay() { OglApp::redisplay(); glutSwapBuffers(); } -void ScreenApp::printGLInfo() const noexcept +void ScreenOglApp::printGraphicsInfo() const noexcept { - OglApp::printGLInfo(); + OglApp::printGraphicsInfo(); } #ifdef OCIO_HEADLESS_ENABLED -HeadlessApp::HeadlessApp(const char * /* winTitle */, int bufWidth, int bufHeight) +HeadlessOglApp::HeadlessOglApp(const char * /* winTitle */, int bufWidth, int bufHeight) : OglApp(bufWidth, bufHeight) , m_pixBufferWidth(bufWidth) , m_pixBufferHeight(bufHeight) @@ -361,25 +368,25 @@ HeadlessApp::HeadlessApp(const char * /* winTitle */, int bufWidth, int bufHeigh setupCommon(); } -HeadlessApp::~HeadlessApp() +HeadlessOglApp::~HeadlessOglApp() { eglTerminate(m_eglDisplay); } -void HeadlessApp::printGLInfo() const noexcept +void HeadlessOglApp::printGraphicsInfo() const noexcept { - OglApp::printGLInfo(); + OglApp::printGraphicsInfo(); printEGLInfo(); } -void HeadlessApp::printEGLInfo() const noexcept +void HeadlessOglApp::printEGLInfo() const noexcept { std::cout << std::endl << "EGL Vendor: " << eglQueryString(m_eglDisplay, EGL_VENDOR) << std::endl << "EGL Version: " << eglQueryString(m_eglDisplay, EGL_VERSION) << std::endl; } -void HeadlessApp::redisplay() +void HeadlessOglApp::redisplay() { OglApp::redisplay(); eglSwapBuffers(m_eglDisplay, m_eglSurface); diff --git a/src/libutils/oglapphelpers/oglapp.h b/src/libutils/oglapphelpers/oglapp.h index 34b2f7d071..51de4c2281 100644 --- a/src/libutils/oglapphelpers/oglapp.h +++ b/src/libutils/oglapphelpers/oglapp.h @@ -9,29 +9,30 @@ #include #include "glsl.h" +#include "graphicalapp.h" namespace OCIO_NAMESPACE { // Here is some sample code to demonstrate how to use this in a simple app that wants to process // using the GPU and OpenGL. Processed image is expected to have the same size as the input image. -// For an interactive application, OglApp can be used, but other OGL code is required. +// For an interactive application, GraphicalApp can be used, but other OGL code is required. // // See ociodisplay for an example of an interactive app that displays an image in the UI and // ocioconvert and ociochecklut for examples of non-interactive apps that just process values with // the GPU. /* -// Create and initialize OglAppRcPtr by creating a shared pointer to ScreenApp. You have to -// specify the name of the window and its size. OglAppRcPtr that points to HeadlessApp object +// Create and initialize OglAppRcPtr by creating a shared pointer to ScreenOglApp. You have to +// specify the name of the window and its size. OglAppRcPtr that points to HeadlessOglApp object // can be created and used in the same way. -OglAppRcPtr scrApp = std::make_shared("Window Name", windowWidth, windowHeight); +OglAppRcPtr scrApp = std::make_shared("Window Name", windowWidth, windowHeight); float * imageBuffer = GetImageBuffer(); int imageWidth = GetImageWidth(); int imageHeight = GetImageHeight(); -scrApp->initImage(imagewidth, imageheight, OglApp::COMPONENTS_RGB, imageBuffer); -scrApp->createGLBuffers(); +scrApp->initImage(imagewidth, imageheight, GraphicalApp::COMPONENTS_RGB, imageBuffer); +scrApp->createBuffers(); // Set (or change) shader. GpuShaderDescRcPtr shader = GpuShaderDesc::CreateShaderDesc(); @@ -51,73 +52,49 @@ scrApp->readImage(imageBufferOut.data()); */ -// Forward declaration of OglApp. -class OglApp; -typedef OCIO_SHARED_PTR OglAppRcPtr; - -class OglApp +class OglApp : public GraphicalApp { public: OglApp() = delete; - OglApp(const OglApp &) = delete; - OglApp & operator=(const OglApp &) = delete; + OglApp(const OglApp&) = delete; + OglApp& operator=(const OglApp&) = delete; // Initialize the app with given window name & client rect size. OglApp(int winWidth, int winHeight); virtual ~OglApp(); - // When displaying the processed image in a window this needs to be done. - // In that case, when image is read, the result will be mirrored on Y. - void setYMirror() - { - m_yMirror = true; - } - - // Shader code will be printed when generated. - void setPrintShader(bool print) - { - m_printShader = print; - } - - enum Components - { - COMPONENTS_RGB = 0, - COMPONENTS_RGBA - }; - - // Initialize the image. virtual void initImage(int imageWidth, int imageHeight, - Components comp, const float * imageBuffer); - // Update the image if it changes. - virtual void updateImage(const float * imageBuffer); + Components comp, const float* imageBuffer) override; + + virtual void updateImage(const float* imageBuffer) override; - // Create GL frame and rendering buffers. Needed if readImage will be used. - void createGLBuffers(); + // Create frame and rendering buffers. Needed if readImage will be used. + void createBuffers() override; // Set the shader code. - virtual void setShader(GpuShaderDescRcPtr & shaderDesc); + virtual void setShader(GpuShaderDescRcPtr& shaderDesc) override; // Update the size of the buffer of the OpenGL viewport that will be used to process the image // (it does not modify the UI). To be called at least one time. Use image size if we want to // read back the processed image. To process another image with the same size or using a // different shader, reshape does not need to be called again. In case of an interactive // application it should be called by the glutReshapeFunc callback using the windows size. - void reshape(int width, int height); + void reshape(int width, int height) override; // Process the image. - void virtual redisplay(); + void virtual redisplay() override; // Read the image from the rendering buffer. It is not meant to be used by interactive // applications used to display the image. - virtual void readImage(float * imageBuffer); + virtual void readImage(float* imageBuffer) override; - // Helper to print GL info. - void virtual printGLInfo() const noexcept; + // Helper to print graphics info. + void virtual printGraphicsInfo() const noexcept override; - // Return a pointer of either ScreenApp or HeadlessApp depending on the + // Return a pointer of either ScreenOglApp or HeadlessOglApp depending on the // OCIO_HEADLESS_ENABLED preprocessor. - static OglAppRcPtr CreateOglApp(const char * winTitle, int winWidth, int winHeight); + static GraphicalAppRcPtr CreateApp(const char* winTitle, int winWidth, int winHeight); protected: // Window or output image size (set using reshape). @@ -133,8 +110,6 @@ class OglApp void setImageDimensions(int imgWidth, int imgHeight, Components comp); Components getImageComponents() const { return m_components; } - - bool printShader() const { return m_printShader; } OpenGLBuilderRcPtr m_oglBuilder; @@ -142,32 +117,27 @@ class OglApp // Keep track of the original image ratio. float m_imageAspect{ 1.0f }; - // For interactive application displaying the processed image, this needs to be true. - bool m_yMirror{ false }; - - // Will shader code be outputed when setShader is called. - bool m_printShader{ false }; - // Image information. int m_imageWidth{ 0 }; int m_imageHeight{ 0 }; Components m_components{ COMPONENTS_RGBA }; + unsigned int m_imageTexID; }; -class ScreenApp: public OglApp +class ScreenOglApp: public OglApp { public: - ScreenApp() = delete; - ScreenApp(const ScreenApp &) = delete; - ScreenApp & operator=(const ScreenApp &) = delete; + ScreenOglApp() = delete; + ScreenOglApp(const ScreenOglApp &) = delete; + ScreenOglApp & operator=(const ScreenOglApp &) = delete; - ScreenApp(const char * winTitle, int winWidth, int winHeight); + ScreenOglApp(const char * winTitle, int winWidth, int winHeight); - ~ScreenApp(); + ~ScreenOglApp(); void redisplay() override; - void printGLInfo() const noexcept override; + void printGraphicsInfo() const noexcept override; private: // Window identifier returned by glutCreateWindow. @@ -178,16 +148,16 @@ class ScreenApp: public OglApp #include -class HeadlessApp: public OglApp +class HeadlessOglApp: public OglApp { public: - HeadlessApp() = delete; + HeadlessOglApp() = delete; - HeadlessApp(const char * winTitle, int bufWidth, int bufHeight); + HeadlessOglApp(const char * winTitle, int bufWidth, int bufHeight); - ~HeadlessApp(); + ~HeadlessOglApp(); - void printGLInfo() const noexcept override; + void printGraphicsInfo() const noexcept override; void redisplay() override; protected: diff --git a/src/libutils/oglapphelpers/vulkanapp.cpp b/src/libutils/oglapphelpers/vulkanapp.cpp index ef4c4230a7..91372c828c 100644 --- a/src/libutils/oglapphelpers/vulkanapp.cpp +++ b/src/libutils/oglapphelpers/vulkanapp.cpp @@ -344,11 +344,11 @@ void VulkanApp::initImage(int imageWidth, int imageHeight, Components comp, cons m_imageHeight = imageHeight; m_components = comp; - createBuffers(); + createVulkanBuffers(); updateImage(imageBuffer); } -void VulkanApp::createBuffers() +void VulkanApp::createVulkanBuffers() { const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); @@ -399,7 +399,7 @@ void VulkanApp::setShader(GpuShaderDescRcPtr & shaderDesc) m_vulkanBuilder->allocateAllTextures(shaderDesc); m_vulkanBuilder->buildShader(shaderDesc); - if (m_printShader) + if (isShaderVerbose()) { std::cout << "Vulkan Compute Shader:\n" << m_vulkanBuilder->getShaderSource() << std::endl; } diff --git a/src/libutils/oglapphelpers/vulkanapp.h b/src/libutils/oglapphelpers/vulkanapp.h index 07689a951a..caa879d92e 100644 --- a/src/libutils/oglapphelpers/vulkanapp.h +++ b/src/libutils/oglapphelpers/vulkanapp.h @@ -15,6 +15,8 @@ #include +#include "graphicalapp.h" + namespace OCIO_NAMESPACE { @@ -26,7 +28,7 @@ typedef OCIO_SHARED_PTR VulkanAppRcPtr; // VulkanApp provides headless Vulkan rendering for GPU unit testing. // This class is designed to process images using OCIO GPU shaders via Vulkan compute pipelines. -class VulkanApp +class VulkanApp : public GraphicalApp { public: VulkanApp() = delete; @@ -38,39 +40,36 @@ class VulkanApp virtual ~VulkanApp(); - enum Components - { - COMPONENTS_RGB = 0, - COMPONENTS_RGBA - }; - // Initialize the image buffer. - void initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer); + void initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer) override; // Update the image if it changes. - void updateImage(const float * imageBuffer); + void updateImage(const float * imageBuffer) override; + + // No-op: Vulkan buffers are created during initImage(). + void createBuffers() override {} // Set the shader code from OCIO GpuShaderDesc. - void setShader(GpuShaderDescRcPtr & shaderDesc); + void setShader(GpuShaderDescRcPtr & shaderDesc) override; // Update the size of the buffer used to process the image. - void reshape(int width, int height); + void reshape(int width, int height) override; // Process the image using the Vulkan compute pipeline. - void redisplay(); + void redisplay() override; // Read the processed image from the GPU buffer. - void readImage(float * imageBuffer); + void readImage(float * imageBuffer) override; // Print Vulkan device and instance info. void printVulkanInfo() const noexcept; + // Implements GraphicalApp::printGraphicsInfo(). + void printGraphicsInfo() const noexcept override { printVulkanInfo(); } + // Factory method to create a VulkanApp instance. static VulkanAppRcPtr CreateVulkanApp(int bufWidth, int bufHeight); - // Shader code will be printed when generated. - void setPrintShader(bool print) { m_printShader = print; } - protected: // Initialize Vulkan instance, device, and queues. void initVulkan(); @@ -78,8 +77,8 @@ class VulkanApp // Create Vulkan compute pipeline for shader processing. void createComputePipeline(); - // Create buffers for image data. - void createBuffers(); + // Create Vulkan buffers for image data (called internally from initImage). + void createVulkanBuffers(); // Clean up Vulkan resources. void cleanup(); @@ -130,13 +129,12 @@ class VulkanApp int m_imageHeight{ 0 }; int m_bufferWidth{ 0 }; int m_bufferHeight{ 0 }; - Components m_components{ COMPONENTS_RGBA }; + Components m_components{ GraphicalApp::COMPONENTS_RGBA }; // Shader builder VulkanBuilderRcPtr m_vulkanBuilder; // Debug and configuration - bool m_printShader{ false }; bool m_initialized{ false }; // Validation layers (debug builds) diff --git a/tests/gpu/CMakeLists.txt b/tests/gpu/CMakeLists.txt index 4344cbfa26..df49452edd 100644 --- a/tests/gpu/CMakeLists.txt +++ b/tests/gpu/CMakeLists.txt @@ -1,8 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. -if(NOT OCIO_GL_ENABLED) - message(WARNING "GL component missing. Skipping the GPU unit tests.") +if(NOT OCIO_GL_ENABLED AND NOT (WIN32 AND OCIO_DIRECTX_ENABLED) AND NOT OCIO_VULKAN_ENABLED) + message(WARNING "GL, DirectX, and Vulkan components all missing. Skipping the GPU unit tests.") return() endif() @@ -41,10 +41,38 @@ target_link_libraries(test_gpu_exec testutils ) -add_test(NAME test_gpu COMMAND test_gpu_exec) +if(OCIO_GL_ENABLED) + add_test(NAME test_opengl COMMAND test_gpu_exec) +endif() if(APPLE) add_test(NAME test_metal COMMAND test_gpu_exec -metal) endif() +if(WIN32 AND OCIO_DIRECTX_ENABLED) + add_test(NAME test_dx COMMAND test_gpu_exec --dx) +endif() +if(OCIO_VULKAN_ENABLED) + add_test(NAME test_vulkan COMMAND test_gpu_exec --vulkan) +endif() + +# Copy dxcompiler.dll and dxil.dll to the test output directory. +# These are required at runtime when DXC (IDxcCompiler3) is used for SM6.0 shader compilation. +if(WIN32 AND OCIO_DIRECTX_ENABLED) + include(LocateDXCompilerRuntime) + if(DXCOMPILER_DLL) + add_custom_command(TARGET test_gpu_exec POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${DXCOMPILER_DLL}" "$" + COMMENT "Copying dxcompiler.dll to test output directory" + ) + if(DXIL_DLL) + add_custom_command(TARGET test_gpu_exec POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${DXIL_DLL}" "$" + COMMENT "Copying dxil.dll to test output directory" + ) + endif() + endif() +endif() # Note: To avoid changing PATH from outside the cmake files. if(MSVC AND BUILD_SHARED_LIBS) @@ -55,9 +83,21 @@ if(MSVC AND BUILD_SHARED_LIBS) set(extra_dirs "${GLUT_INCLUDE_DIR}/../bin\\;${GLEW_INCLUDE_DIRS}/../bin\\") # Tell CTest to use this PATH while launching test_gpu_exec - set_tests_properties(test_gpu PROPERTIES - ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" - ) + if(OCIO_GL_ENABLED) + set_tests_properties(test_opengl PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + endif() + if(WIN32 AND OCIO_DIRECTX_ENABLED) + set_tests_properties(test_dx PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + endif() + if(OCIO_VULKAN_ENABLED) + set_tests_properties(test_vulkan PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + endif() # Also set the debugger environment so that you can launch # test_gpu_exec directly within Visual Studio. diff --git a/tests/gpu/FixedFunctionOp_test.cpp b/tests/gpu/FixedFunctionOp_test.cpp index e709572bcd..08a6dd4534 100644 --- a/tests/gpu/FixedFunctionOp_test.cpp +++ b/tests/gpu/FixedFunctionOp_test.cpp @@ -303,6 +303,7 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces_gamutcomp13_inv) }; test.setCustomValues(values); + // 3e-5 accommodates GPU pow() precision at large output values (~3.08) on DirectX. test.setErrorThreshold(3e-5f); } @@ -618,8 +619,8 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_1000nit_p3_rndtrip) // TODO: Investigate why this is not closer. // Setting the CPUProcessor to OPTIMIZATION_NONE helps slightly, but is not the main - // cause of the error. - test.setErrorThreshold(0.012f); + // cause of the error. 0.014 accommodates DirectX floating point differences. + test.setErrorThreshold(0.014f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_1000nit_p3_inv) @@ -692,8 +693,8 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_rec2020_rndtrip) GenerateIdentityLut3D(values, lut_size, lum_scale); test.setCustomValues(values); - // TODO: Investigate why this is not closer. - test.setErrorThreshold(0.032f); + // TODO: Investigate why this is not closer. 0.034 accommodates DirectX floating point differences. + test.setErrorThreshold(0.034f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_rec2020_inv) diff --git a/tests/gpu/GPUUnitTest.cpp b/tests/gpu/GPUUnitTest.cpp index 252ba43b55..a5aa491c36 100644 --- a/tests/gpu/GPUUnitTest.cpp +++ b/tests/gpu/GPUUnitTest.cpp @@ -15,7 +15,16 @@ #include "apputils/argparse.h" #include "utils/StringUtils.h" +#include "graphicalapp.h" + +#ifdef OCIO_GL_ENABLED #include "oglapp.h" +#endif + +#ifdef OCIO_DIRECTX_ENABLED +#include "dxapp.h" +#endif + #if __APPLE__ #include "metalapp.h" #endif @@ -207,23 +216,13 @@ namespace constexpr unsigned g_winHeight = 256; constexpr unsigned g_components = 4; - void AllocateImageTexture(OCIO::OglAppRcPtr & app) - { - const unsigned numEntries = g_winWidth * g_winHeight * g_components; - OCIOGPUTest::CustomValues::Values image(numEntries, 0.0f); - - app->initImage(g_winWidth, g_winHeight, OCIO::OglApp::COMPONENTS_RGBA, &image[0]); - } - -#ifdef OCIO_VULKAN_ENABLED - void AllocateImageTexture(OCIO::VulkanAppRcPtr & app) + void AllocateImageTexture(OCIO::GraphicalAppRcPtr& app) { const unsigned numEntries = g_winWidth * g_winHeight * g_components; OCIOGPUTest::CustomValues::Values image(numEntries, 0.0f); - app->initImage(g_winWidth, g_winHeight, OCIO::VulkanApp::COMPONENTS_RGBA, &image[0]); + app->initImage(g_winWidth, g_winHeight, OCIO::GraphicalApp::COMPONENTS_RGBA, &image[0]); } -#endif void SetTestValue(float * image, float val, unsigned numComponents) { @@ -342,24 +341,7 @@ namespace return &values.m_inputValues[0]; } - void UpdateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) - { -#if __APPLE__ && __aarch64__ - // The Apple M1 chip handles differently the Nan and Inf processing introducing - // differences with CPU processing. - const bool testNaN = false; - const bool testInfinity = false; -#else - const bool testNaN = test->getTestNaN(); - const bool testInfinity = test->getTestInfinity(); -#endif - - const float * inputValues = PrepareInputValues(test, testNaN, testInfinity); - app->updateImage(inputValues); - } - -#ifdef OCIO_VULKAN_ENABLED - void UpdateImageTexture(OCIO::VulkanAppRcPtr & app, OCIOGPUTestRcPtr & test) + void UpdateImageTexture(OCIO::GraphicalAppRcPtr & app, OCIOGPUTestRcPtr & test) { #if __APPLE__ && __aarch64__ // The Apple M1 chip handles differently the Nan and Inf processing introducing @@ -374,11 +356,10 @@ namespace const float * inputValues = PrepareInputValues(test, testNaN, testInfinity); app->updateImage(inputValues); } -#endif - void UpdateOCIOGLState(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + void UpdateOCIOGPUState(OCIO::GraphicalAppRcPtr & app, OCIOGPUTestRcPtr & test) { - app->setPrintShader(test->isVerbose()); + app->setShaderVerbose(test->isVerbose()); OCIO::ConstProcessorRcPtr & processor = test->getProcessor(); OCIO::GpuShaderDescRcPtr & shaderDesc = test->getShaderDesc(); @@ -400,32 +381,6 @@ namespace app->setShader(shaderDesc); } -#ifdef OCIO_VULKAN_ENABLED - void UpdateOCIOVulkanState(OCIO::VulkanAppRcPtr & app, OCIOGPUTestRcPtr & test) - { - app->setPrintShader(test->isVerbose()); - - OCIO::ConstProcessorRcPtr & processor = test->getProcessor(); - OCIO::GpuShaderDescRcPtr & shaderDesc = test->getShaderDesc(); - - OCIO::ConstGPUProcessorRcPtr gpu; - if (test->isLegacyShader()) - { - gpu = processor->getOptimizedLegacyGPUProcessor(OCIO::OPTIMIZATION_DEFAULT, - test->getLegacyShaderLutEdge()); - } - else - { - gpu = processor->getDefaultGPUProcessor(); - } - - // Collect the shader program information for a specific processor. - gpu->extractGpuShaderInfo(shaderDesc); - - app->setShader(shaderDesc); - } -#endif - void DiffComponent(const std::vector & cpuImage, const std::vector & gpuImage, size_t idx, bool relativeTest, float expectMin, @@ -563,10 +518,8 @@ namespace } } - // Shared helper to validate GPU processing against CPU. - // Template function to work with both OglApp and VulkanApp. - template - void ValidateImageTextureImpl(AppType & app, OCIOGPUTestRcPtr & test) + // Validate the GPU processing against the CPU one. + void ValidateImageTexture(OCIO::GraphicalAppRcPtr & app, OCIOGPUTestRcPtr & test) { // Each retest is rebuilding a cpu proc. OCIO::ConstCPUProcessorRcPtr processor = test->getProcessor()->getDefaultCPUProcessor(); @@ -604,20 +557,6 @@ namespace // Step 3: Compare the two results. ValidateResults(test, cpuImage, gpuImage, width, height); } - - // Validate the GPU processing against the CPU one. - void ValidateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) - { - ValidateImageTextureImpl(app, test); - } - -#ifdef OCIO_VULKAN_ENABLED - // Validate the GPU processing against the CPU one for Vulkan. - void ValidateImageTexture(OCIO::VulkanAppRcPtr & app, OCIOGPUTestRcPtr & test) - { - ValidateImageTextureImpl(app, test); - } -#endif }; int main(int argc, const char ** argv) @@ -630,7 +569,12 @@ int main(int argc, const char ** argv) bool printHelp = false; bool useMetalRenderer = false; +#ifdef OCIO_VULKAN_ENABLED bool useVulkanRenderer = false; +#endif +#ifdef OCIO_DIRECTX_ENABLED + bool useDxRenderer = false; +#endif bool verbose = false; bool stopOnFirstError = false; @@ -641,7 +585,12 @@ int main(int argc, const char ** argv) ap.options("\nCommand line arguments:\n", "--help", &printHelp, "Print help message", "--metal", &useMetalRenderer, "Run the GPU unit test with Metal", +#ifdef OCIO_DIRECTX_ENABLED + "--dx", &useDxRenderer, "Run the GPU unit test with DirectX 12", +#endif +#ifdef OCIO_VULKAN_ENABLED "--vulkan", &useVulkanRenderer, "Run the GPU unit test with Vulkan", +#endif "-v", &verbose, "Output the GPU shader program", "--stop_on_error", &stopOnFirstError, "Stop on the first error", "--run_only %s", &filter, "Run only some unit tests\n" @@ -684,11 +633,8 @@ int main(int argc, const char ** argv) } // Step 1: Initialize the graphic library engines. - OCIO::OglAppRcPtr app; -#ifdef OCIO_VULKAN_ENABLED - OCIO::VulkanAppRcPtr vulkanApp; -#endif - + OCIO::GraphicalAppRcPtr app; + try { if(useMetalRenderer) @@ -700,19 +646,26 @@ int main(int argc, const char ** argv) return 1; #endif } - else if(useVulkanRenderer) +#ifdef OCIO_DIRECTX_ENABLED + else if(useDxRenderer) { -#ifdef OCIO_VULKAN_ENABLED - vulkanApp = OCIO::VulkanApp::CreateVulkanApp(g_winWidth, g_winHeight); - vulkanApp->printVulkanInfo(); -#else - std::cerr << std::endl << "'GPU tests - Vulkan' is not supported (OCIO_VULKAN_ENABLED not defined)" << std::endl; - return 1; + app = std::make_shared("GPU tests - DirectX 12", 10, 10); + } #endif +#ifdef OCIO_VULKAN_ENABLED + else if(useVulkanRenderer) + { + app = OCIO::VulkanApp::CreateVulkanApp(g_winWidth, g_winHeight); } +#endif else { - app = OCIO::OglApp::CreateOglApp("GPU tests", 10, 10); +#ifdef OCIO_GL_ENABLED + app = OCIO::OglApp::CreateApp("GPU tests - OpenGL", 10, 10); +#else + std::cerr << std::endl << "No GPU backend available." << std::endl; + return 1; +#endif } } catch (const OCIO::Exception & e) @@ -726,28 +679,15 @@ int main(int argc, const char ** argv) return 1; } - if (!useVulkanRenderer) - { - app->printGLInfo(); - } + app->printGraphicsInfo(); // Step 2: Allocate the texture that holds the image. -#ifdef OCIO_VULKAN_ENABLED - if (useVulkanRenderer) - { - AllocateImageTexture(vulkanApp); - vulkanApp->reshape(g_winWidth, g_winHeight); - } - else -#endif - { - AllocateImageTexture(app); + AllocateImageTexture(app); - // Step 3: Create the frame buffer and render buffer. - app->createGLBuffers(); + // Step 3: Create the frame buffer and render buffer. + app->createBuffers(); - app->reshape(g_winWidth, g_winHeight); - } + app->reshape(g_winWidth, g_winHeight); // Step 4: Execute all the unit tests. @@ -788,18 +728,31 @@ int main(int argc, const char ** argv) // Prepare the unit test. test->setVerbose(verbose); - OCIO::GpuLanguage gpuLang = OCIO::GPU_LANGUAGE_GLSL_1_2; + + // Select the appropriate shading language based on the renderer + // (default GLSL 1.2 is used when none of the alternate backends match). + OCIO::GpuLanguage shadingLanguage = OCIO::GPU_LANGUAGE_GLSL_1_2; #if __APPLE__ if (useMetalRenderer) { - gpuLang = OCIO::GPU_LANGUAGE_MSL_2_0; + shadingLanguage = OCIO::GPU_LANGUAGE_MSL_2_0; } #endif +#ifdef OCIO_DIRECTX_ENABLED + if (useDxRenderer) + { + // SM_5_0 controls OCIO shader code generation syntax; DxApp always + // compiles to SM 6.0 via DXC regardless of this enum value. + shadingLanguage = OCIO::GPU_LANGUAGE_HLSL_SM_5_0; + } +#endif +#ifdef OCIO_VULKAN_ENABLED if (useVulkanRenderer) { - gpuLang = OCIO::GPU_LANGUAGE_GLSL_VK_4_6; + shadingLanguage = OCIO::GPU_LANGUAGE_GLSL_VK_4_6; } - test->setShadingLanguage(gpuLang); +#endif + test->setShadingLanguage(shadingLanguage); bool enabledTest = true; try @@ -826,59 +779,28 @@ int main(int argc, const char ** argv) if(test->isValid() && enabledTest) { -#ifdef OCIO_VULKAN_ENABLED - if (useVulkanRenderer) - { - // Initialize the texture with the RGBA values to be processed. - UpdateImageTexture(vulkanApp, test); + // Initialize the texture with the RGBA values to be processed. + UpdateImageTexture(app, test); - // Update the GPU shader program. - UpdateOCIOVulkanState(vulkanApp, test); + // Update the GPU shader program. + UpdateOCIOGPUState(app, test); - const size_t numRetest = test->getNumRetests(); - // Need to run once and for each retest. - for (size_t idxRetest = 0; idxRetest <= numRetest; ++idxRetest) + const size_t numRetest = test->getNumRetests(); + // Need to run once and for each retest. + for (size_t idxRetest = 0; idxRetest <= numRetest; ++idxRetest) + { + if (idxRetest != 0) // Skip first run. { - if (idxRetest != 0) // Skip first run. - { - // Call the retest callback. - test->retestSetup(idxRetest - 1); - } - - // Process the image texture into the rendering buffer. - vulkanApp->redisplay(); - - // Compute the expected values using the CPU and compare - // against the GPU values. - ValidateImageTexture(vulkanApp, test); + // Call the retest callback. + test->retestSetup(idxRetest - 1); } - } - else -#endif - { - // Initialize the texture with the RGBA values to be processed. - UpdateImageTexture(app, test); - // Update the GPU shader program. - UpdateOCIOGLState(app, test); + // Process the image texture into the rendering buffer. + app->redisplay(); - const size_t numRetest = test->getNumRetests(); - // Need to run once and for each retest. - for (size_t idxRetest = 0; idxRetest <= numRetest; ++idxRetest) - { - if (idxRetest != 0) // Skip first run. - { - // Call the retest callback. - test->retestSetup(idxRetest - 1); - } - - // Process the image texture into the rendering buffer. - app->redisplay(); - - // Compute the expected values using the CPU and compare - // against the GPU values. - ValidateImageTexture(app, test); - } + // Compute the expected values using the CPU and compare + // against the GPU values. + ValidateImageTexture(app, test); } } } diff --git a/tests/gpu/MatrixOp_test.cpp b/tests/gpu/MatrixOp_test.cpp index 6f47362d8e..6da6ea8a64 100644 --- a/tests/gpu/MatrixOp_test.cpp +++ b/tests/gpu/MatrixOp_test.cpp @@ -9,7 +9,8 @@ namespace OCIO = OCIO_NAMESPACE; -const float g_epsilon = 5e-7f; +// 1e-6 accommodates 1-2 ULP FMA rounding with DirectX tests (matrix output values ~7). +const float g_epsilon = 1e-6f; // Helper method to build unit tests From 7063751feb67643e7119fd6278e131ba5f9fd657 Mon Sep 17 00:00:00 2001 From: Doug Walker Date: Mon, 8 Jun 2026 21:04:01 -0400 Subject: [PATCH 35/37] Adsk Contrib - Avoid possible cycles in transforms (#2318) * Fix potential cycle crash Signed-off-by: Doug Walker * Clarify purpose of the various guards Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker --- src/OpenColorIO/ContextVariableUtils.cpp | 26 +++- src/OpenColorIO/Transform.cpp | 21 ++++ tests/cpu/Config_tests.cpp | 150 +++++++++++++++++++++++ tests/python/ConfigTest.py | 21 ++++ 4 files changed, 216 insertions(+), 2 deletions(-) diff --git a/src/OpenColorIO/ContextVariableUtils.cpp b/src/OpenColorIO/ContextVariableUtils.cpp index 82726d4234..8340a5cd30 100644 --- a/src/OpenColorIO/ContextVariableUtils.cpp +++ b/src/OpenColorIO/ContextVariableUtils.cpp @@ -127,7 +127,10 @@ void LoadEnvironment(EnvMap & map, bool update) static std::string ResolveContextVariablesImpl(const std::string & str, const EnvMap & map, UsedEnvs & used, int depth) { - // Guard against infinite recursion from cyclic variable references. + // Guard against infinite recursion at the string substitution level (e.g. $A expands + // to $B which expands to $A). This is independent from the graph-level guards in + // CollectContextVariables() and Transform.cpp's BuildOps(), which protect against cycles + // in the color space / look / view transform reference graph. if (depth > 32) return str; // Early exit if no reserved tokens are found. @@ -176,11 +179,30 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, return ResolveContextVariablesImpl(str, map, used, 0); } -bool CollectContextVariables(const Config & config, +bool CollectContextVariables(const Config & config, const Context & context, ConstTransformRcPtr transform, ContextRcPtr & usedContextVars) { + // Guard against infinite recursion through cycles in the color space / look / view + // transform reference graph (e.g. a ColorSpace whose from_reference is a + // ColorSpaceTransform pointing back to itself). Distinct from the string-level depth + // check in ResolveContextVariablesImpl, which only guards cyclic context-variable + // substitution within a single string; that check fires once per finite resolveStringVar + // call here and never observes this outer graph traversal. A matching guard exists in + // BuildOps() for the op-builder traversal that runs after this one. + static thread_local int depth = 0; + if (depth > 32) + { + throw Exception("Cycle detected while collecting context variables."); + } + struct DepthGuard + { + int & d; + DepthGuard(int & d_) : d(d_) { ++d; } + ~DepthGuard() { --d; } + } guard(depth); + if(ConstColorSpaceTransformRcPtr tr = DynamicPtrCast(transform)) { if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; diff --git a/src/OpenColorIO/Transform.cpp b/src/OpenColorIO/Transform.cpp index 8b2b880699..061f1f733b 100755 --- a/src/OpenColorIO/Transform.cpp +++ b/src/OpenColorIO/Transform.cpp @@ -49,6 +49,27 @@ void BuildOps(OpRcPtrVec & ops, if(!transform) return; + // Guard against infinite recursion through cycles in the color space / look / view + // transform reference graph (e.g. a ColorSpace whose from_reference is a + // ColorSpaceTransform pointing back to itself). A matching guard in + // CollectContextVariables() catches the same cycles during the earlier context-variable + // scan; this one protects the op-builder traversal. Both are independent from the + // string-level depth check in ResolveContextVariablesImpl, which guards cyclic + // context-variable substitution within a single string. Having the extra guard here + // is necessary for any situations where CollectContextVariables is not called, for + // example, see Config_tests.cpp/cyclic_color_space_linearity_check. + static thread_local int depth = 0; + if (depth > 32) + { + throw Exception("Cycle detected while building ops from transform."); + } + struct DepthGuard + { + int & d; + DepthGuard(int & d_) : d(d_) { ++d; } + ~DepthGuard() { --d; } + } guard(depth); + if(ConstAllocationTransformRcPtr allocationTransform = \ DynamicPtrCast(transform)) { diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index b3d69c1688..28d5e430b1 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -10416,3 +10416,153 @@ OCIO_ADD_TEST(Config, interchange_attributes) } } +OCIO_ADD_TEST(Config, cyclic_color_space_transform) +{ + // Regression test for a stack overflow triggered by a self-referential + // ColorSpaceTransform (a ColorSpace whose from_reference is a ColorSpaceTransform + // that points back to itself). getProcessor() must throw a clean exception + // rather than recursing until the stack guard page is hit. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " isdata: true\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs1"), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_color_space_two_step) +{ + // Two-step cycle: cs1 -> cs2 -> cs1. Verify the depth guard catches indirect cycles too. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " isdata: true\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs2}\n" + " - !\n" + " name: cs2\n" + " from_scene_reference: ! {src: cs0, dst: cs1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs1"), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_look_transform) +{ + // Regression test: a Look whose transform is a LookTransform that references the + // same look must not crash via stack overflow on getProcessor(). Triggered here + // by a ColorSpace whose from_scene_reference is a LookTransform invoking lookA, + // whose own transform is another LookTransform invoking lookA. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "looks:\n" + " - !\n" + " name: lookA\n" + " process_space: cs0\n" + " transform: ! {src: cs0, dst: cs0, looks: lookA}\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs0, looks: lookA}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs1"), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_color_space_linearity_check) +{ + // Regression test for the BuildOps depth guard. Config::isColorSpaceLinear() reaches + // the op-builder via Config::Impl::getProcessorWithoutCaching(), which does NOT call + // CollectContextVariables() first. So even with the CollectContextVariables guard, + // this path will still infinite-recurse on a cyclic color space unless BuildOps + // independently guards against it. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->isColorSpaceLinear("cs1", OCIO::REFERENCE_SPACE_SCENE), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_display_view_transform) +{ + // Regression test: a ColorSpace whose from_scene_reference is a DisplayViewTransform + // that ultimately points back to the same ColorSpace (via the view's color space) + // must not crash via stack overflow on getProcessor(). + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "displays:\n" + " D1:\n" + " - ! {name: V1, colorspace: cs_loop}\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " - !\n" + " name: cs_loop\n" + " from_scene_reference: ! {src: cs0, display: D1, view: V1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs_loop"), + OCIO::Exception, + "Cycle detected"); +} + diff --git a/tests/python/ConfigTest.py b/tests/python/ConfigTest.py index 9debc3da2e..6f3baff7c3 100644 --- a/tests/python/ConfigTest.py +++ b/tests/python/ConfigTest.py @@ -1446,6 +1446,27 @@ def test_active__displayview_lists(self): config.addActiveView(view="v1") self.assertEqual(config.getNumActiveViews(), 1) + def test_cyclic_color_space_transform(self): + """ + Regression test: a ColorSpace whose from_scene_reference is a + ColorSpaceTransform pointing back to itself must not crash the + process via stack overflow on getProcessor(). + """ + CYCLIC_PROFILE = """ocio_profile_version: 2 +roles: + default: cs0 +colorspaces: + - ! + name: cs0 + isdata: true + - ! + name: cs1 + from_scene_reference: ! {src: cs0, dst: cs1} +""" + cfg = OCIO.Config.CreateFromStream(CYCLIC_PROFILE) + with self.assertRaises(OCIO.Exception): + cfg.getProcessor("cs0", "cs1") + class ConfigVirtualWithActiveDisplayTest(unittest.TestCase): def setUp(self): From f660cee6127011fdb03e0d227572901631435d3c Mon Sep 17 00:00:00 2001 From: Mei Chu <33743518+meimchu@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:29:05 -0700 Subject: [PATCH 36/37] ociocheck to check OpenColorIO library version first (#2310) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add to PathUtils Signed-off-by: Mei Chu * Python test switch to ExceptionMissingFile Signed-off-by: Mei Chu * Updated tests to use ExceptionMissingFile instead Signed-off-by: Mei Chu * Revert PathUtil related changes. Signed-off-by: Mei Chu * Remove PathUtils changes Signed-off-by: Mei Chu * Switch exception raised for filepath not provided in CreateFromFile. Signed-off-by: Mei Chu * Remove TODO Signed-off-by: Mei Chu * Add CVE to security (#2311) Signed-off-by: Doug Walker Signed-off-by: Mei Chu * Adsk Contrib - Fix 2023.3 Linux container break (#2315) * Fix 2023.3 Linux container break Signed-off-by: Doug Walker * Adjust to keep the name constant to use the existing GitHub branch rules Signed-off-by: Doug Walker --------- Signed-off-by: Doug Walker Signed-off-by: Mei Chu * Add DirectX 12 GPU backend for automated unit testing on Windows (#2271) * Add DirectX 12 GPU backend for automated unit testing on Windows Introduce a DirectX 12 / HLSL rendering backend alongside the existing OpenGL / GLSL and Metal / MSL backends, enabling the GPU unit test suite to run natively on Windows without requiring an OpenGL context. Key changes: GraphicalApp abstract interface (graphicalapp.h/cpp) Backend-agnostic base class extracted from OglApp. OglApp and MetalApp now inherit from it. DxApp (dxapp.h/cpp) -- DirectX 12 backend Off-screen RGBA32F render target, full-screen triangle via SV_VertexID, staging readback, SM 6.0 DXC shader compilation. HLSLBuilder (hlsl.h/cpp) -- HLSL shader generation Translates GpuShaderDesc into HLSL pixel shaders with 1D and 3D LUT texture uploads in RGBA32F format. CMake integration OCIO_DIRECTX_ENABLED option, FetchContent for DirectX-Headers, auto-copy of DXC runtime DLLs to the test output directory. Test tolerance adjustments Minor epsilon increases for 4 tests due to DX12/SM6.0 FMA and pow() precision differences. All 263 GPU tests pass on the DirectX 12 backend. Build and run: # Configure (OCIO_DIRECTX_ENABLED defaults to ON on Windows) cmake -S . -B build -DCMAKE_BUILD_TYPE=Release # Build the GPU test binary cmake --build build --target test_gpu_exec --config Release # Run GPU tests with the DX12 backend ctest --test-dir build -C Release -R test_dx Signed-off-by: Eric Renaud-Houde * Fix post-rebase issues found in code review - HeadlessOglApp::printGraphicsInfo() was calling pure virtual base (crash on headless EGL) - graphicalapp.cpp included oglapp.h unconditionally; guard under OCIO_GL_ENABLED - tests/gpu/CMakeLists.txt early-return guard excluded Vulkan-only builds - Add missing test_vulkan ctest entry Signed-off-by: Eric Renaud-Houde * Minor additional comments, formatting and fixes. Signed-off-by: Eric Renaud-Houde * Speed up DX12 GPU test backend (~19%) The DX12 test suite was noticeably slower than the OpenGL and Vulkan backends. Profiling the run showed the gap was almost entirely in DXC shader compilation, not in Present, fence waits, or DxcCreateInstance as initially suspected. Three low-risk changes: - Cache IDxcUtils and IDxcCompiler3 as DxApp members instead of recreating them on every setShader() call. The COM instances are thread-safe and perfectly reusable; recreating them per test added no value. - Compile the full-screen-triangle vertex shader exactly once and reuse the bytecode across all tests. The VSMain HLSL is a hard-coded SV_VertexID-driven triangle with no test-specific state — the bytecode is identical every time. Extracted into a new ensureVertexShaderCompiled() helper. This alone eliminated the biggest redundancy (263 duplicate VS compiles). - Present(1, 0) → Present(0, 0). VSync is meaningless for an off-screen test harness that reads back from a float render target. Locally the win shows up mostly in waitForPreviousFrame, which was being throttled by the swap-chain pipeline even on an invisible window. All 263/263 tests still pass; no tolerance changes, no DXIL codegen changes (except for a UTF8 fix), no precision risk. Signed-off-by: Eric Renaud-Houde * Several small fixes tidying up the recently-added GPU test infrastructure. - Fix unused-variable warnings (fatal on macOS with warnings-as-errors): guard useDxRenderer and useVulkanRenderer declarations with the same ifdefs as their usage sites. useMetalRenderer stays unconditional because it's referenced on all platforms. - Propagate the MSVC+shared-libs PATH workaround to test_vulkan so it can find OpenColorIO_*.dll at runtime, matching what's already done for test_dx. - Upgrade the dxcompiler.dll detection message from STATUS to WARNING and rewrite it to name OCIO_DIRECTX_ENABLED and offer concrete recovery paths. The previous STATUS message was easy to miss, leaving users with a silent degradation until test_dx failed at runtime. - Rename the OpenGL ctest from test_gpu to test_opengl now that sibling backend-specific tests (test_dx, test_vulkan, test_metal) exist. The test_gpu_exec binary keeps its name since it's backend-agnostic and selects via CLI flags. - Declare OCIO_VULKAN_ENABLED as a first-class CMake option with mark_as_advanced, matching the existing OCIO_DIRECTX_ENABLED. It was previously used in conditionals without ever being declared, so it never appeared as a toggle in ccmake/cmake-gui. - Document both OCIO_DIRECTX_ENABLED and OCIO_VULKAN_ENABLED in docs/quick_start/installation.rst, noting that Vulkan requires an external SDK. Signed-off-by: Eric Renaud-Houde * Integrate DirectX-Headers with OCIO's external-package pattern Previously InstallDirectXHeaders.cmake was included unconditionally from oglapphelpers/CMakeLists.txt, so DirectX-Headers was always fetched from GitHub regardless of whether the user had a local copy installed. There was no way to use a system install, a vendored copy, or an air-gapped build, and the dep didn't respect OCIO_INSTALL_EXT_PACKAGES. DirectX-Headers is now a first-class OCIO dependency, handled the same way as Imath, ZLIB, yaml-cpp, etc.: try find_package first, fall back to FetchContent only if not found and OCIO_INSTALL_EXT_PACKAGES allows it. Changes: - New share/cmake/modules/FindDirectX-Headers.cmake, modeled on FindImath.cmake. - InstallDirectXHeaders.cmake → InstallDirectX-Headers.cmake (the hyphen matches OCIO's Install convention). - oglapphelpers/CMakeLists.txt now calls ocio_handle_dependency(DirectX-Headers ...) with MIN_VERSION 1.606.0 (Windows SDK 22H2 era — old enough to cover most installed copies) and RECOMMENDED_VERSION 1.619.1 (the version OCIO pins and validates). For users: a local DirectX-Headers install can now be supplied via any of the standard CMake mechanisms — -DDirectX-Headers_DIR, -DDirectX-Headers_ROOT, -DDirectX-Headers_INCLUDE_DIR, or globally with -DOCIO_INSTALL_EXT_PACKAGES=NONE to forbid any network fetch. Signed-off-by: Eric Renaud-Houde * Improve dxcompiler.dll diagnostics and allow overriding its path Addresses test crashes seen on stuck Windows 10 hosts caused by an old dxcompiler.dll shipped in that host's Windows SDK Redist. - Print the version of the found dxcompiler.dll at configure time so crash reports identify the exact DXC build without follow-up diagnostics. - Emit a standing hint pointing at the DirectX Shader Compiler releases page, which is the documented workaround. - New -DOCIO_DXCOMPILER_DLL= overrides the Windows SDK Redist search, letting users supply a newer DLL pre-build instead of copying it by hand after. - Extracted the DXC-runtime logic into share/cmake/utils/LocateDXCompilerRuntime.cmake so tests/gpu/CMakeLists.txt stays focused on the test target. Signed-off-by: Eric Renaud-Houde * Minor comment tweaks in LocateDXCompilerRuntime.cmake. Signed-off-by: Eric Renaud-Houde * Use OCIO_DirectX-Headers_RECOMMENDED_VERSION in InstallDirectX-Headers.cmake ocio_install_dependency already propagates the RECOMMENDED_VERSION from the ocio_handle_dependency call site. Consume it instead of hardcoding the version a second time. Matches the pattern in Installyaml-cpp.cmake and Installpystring.cmake. Signed-off-by: Eric Renaud-Houde * Address local cleanup notes from PR #2271 Claude review. * Name CbvSrvHeapSize and throw in setShader if a shader needs more SRV slots than the heap holds. * Guard ~DxApp() so the GPU wait/CloseHandle are skipped when sync objects were never created (constructor partial-init). * Comment the 16-byte float4 stride used when packing UNIFORM_VECTOR_FLOAT/INT arrays into the HLSL constant buffer. * Only record m_windowClassName when RegisterClassExA actually succeeds, so cleanup won't unregister a class owned by another DxApp. * Drop the redundant trailing else in GPUUnitTest.cpp's shadingLanguage selector (initializer already covers it). Signed-off-by: Eric Renaud-Houde --------- Signed-off-by: Eric Renaud-Houde Co-authored-by: Doug Walker Signed-off-by: Mei Chu --------- Signed-off-by: Mei Chu Signed-off-by: Doug Walker Signed-off-by: Eric Renaud-Houde Co-authored-by: Doug Walker Co-authored-by: Éric Renaud-Houde --- src/OpenColorIO/Config.cpp | 12 +++++++++++- tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp | 4 ++-- tests/python/ConfigTest.py | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 1b5a8c70db..a8f25d5cad 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -1153,9 +1154,10 @@ ConstConfigRcPtr Config::CreateFromEnv() ConstConfigRcPtr Config::CreateFromFile(const char * filename) { + // Specifically check if a config filepath is provided. if (!filename || !*filename) { - throw ExceptionMissingFile ("The config filepath is missing."); + throw Exception("The config filepath is missing."); } // Check for URI Pattern: ocio:// @@ -1167,6 +1169,14 @@ ConstConfigRcPtr Config::CreateFromFile(const char * filename) return CreateFromBuiltinConfig(uri.c_str()); } + // Specifically check if the provided non-builtin config filepath exists. + if (!std::filesystem::exists(filename)) + { + std::ostringstream oss; + oss << "'" << filename << "' file does not exist."; + throw ExceptionMissingFile(oss.str().c_str()); + } + std::ifstream ifstream = Platform::CreateInputFileStream( filename, std::ios_base::in | std::ios_base::binary diff --git a/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp b/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp index c58c3edd24..74a6298efa 100644 --- a/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp +++ b/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp @@ -446,8 +446,8 @@ OCIO_ADD_TEST(BuiltinConfigs, create_builtin_config) // Test that CreateFromFile does not work without ocio:// prefix for built-in config. OCIO_CHECK_THROW_WHAT( OCIO::Config::CreateFromFile("cg-config-v1.0.0_aces-v1.3_ocio-v2.1"), - OCIO::Exception, - "Error could not read 'cg-config-v1.0.0_aces-v1.3_ocio-v2.1' OCIO profile." + OCIO::ExceptionMissingFile, + "'cg-config-v1.0.0_aces-v1.3_ocio-v2.1' file does not exist." ); { diff --git a/tests/python/ConfigTest.py b/tests/python/ConfigTest.py index 6f3baff7c3..62c2c7d043 100644 --- a/tests/python/ConfigTest.py +++ b/tests/python/ConfigTest.py @@ -1011,7 +1011,7 @@ def testFromEnvAndFromFile(uri, numberOfExpectedColorspaces, expectedConfigName) nbOfColorspacesForStudioConfig = 55 # Test that CreateFromFile does not work without ocio:// prefix for built-in config. - with self.assertRaises(OCIO.Exception) as cm: + with self.assertRaises(OCIO.ExceptionMissingFile) as cm: OCIO.Config.CreateFromFile(cgConfigName) # Test CG config. From 73c733a407907bdf19dc51788794a69190c9093d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Achard?= Date: Fri, 26 Jun 2026 14:12:02 +0100 Subject: [PATCH 37/37] Test ABI checker --- .github/workflows/abi_compatibility.yml | 288 ++++++++++++++++++++++++ share/abi/ocio.abignore | 38 ++++ 2 files changed, 326 insertions(+) create mode 100644 .github/workflows/abi_compatibility.yml create mode 100644 share/abi/ocio.abignore diff --git a/.github/workflows/abi_compatibility.yml b/.github/workflows/abi_compatibility.yml new file mode 100644 index 0000000000..fa8345dc25 --- /dev/null +++ b/.github/workflows/abi_compatibility.yml @@ -0,0 +1,288 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# GitHub Actions workflow file +# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions +# +# ABI compatibility gate for patch releases. +# +# Patch releases are cut from the RB-MAJOR.MINOR release branches (e.g. RB-2.6), +# and a patch release must not break the ABI promised by the library's SONAME. +# OpenColorIO sets SOVERSION = MAJOR.MINOR (see the top-level CMakeLists.txt), so +# every binary linked against libOpenColorIO.so. -- i.e. built +# against X.Y.0 -- is expected to keep working with any later X.Y.Z without +# recompilation. +# +# This workflow enforces that contract *before* a patch ships: it runs on every +# pull request targeting an RB-* branch, builds the shared library from the +# post-merge state of the PR and from the series anchor (X.Y.0), and compares +# the two ABIs with libabigail's `abidiff`. If the change would break the +# series ABI, the check fails and the PR is blocked. +# +# ----------------------------------------------------------------------------- +# Why libabigail (`abidiff`)? +# ----------------------------------------------------------------------------- +# Several tools can compare C/C++ ABIs. The options that were considered: +# +# * libabigail (abidiff / abidw) -- CHOSEN. +# Actively maintained by Sourceware/Red Hat and used as the ABI gate by +# the Linux kernel, systemd, and most major distros. Reads DWARF debug +# info straight from the built .so (no source-level reparsing), has a +# deep model of C++ (vtables, templates, member layout, mangling), gives +# scriptable bitmask exit codes that make CI gating trivial, supports +# `--headers-dir` to restrict the diff to the public API, and supports +# suppression files for the rare intentional exception. Installable in +# the ASWF ci-ocio container via dnf. +# +# * abi-compliance-checker (+ abi-dumper) -- the historical ABI Laboratory +# tool. Produces nice HTML reports, but is Perl-based, more loosely +# maintained, needs an extra dumper/vtable-dumper toolchain, and its +# header-driven mode is brittle with modern C++. Worse fit for an +# unattended CI gate; its exit handling is also less granular. +# +# * Symbol-list diffing (nm -D / readelf --dyn-syms, or `abidw` symbol-only) +# -- trivial to run, but only catches added/removed *symbols*. It is +# blind to the changes that most often break consumers silently: struct +# layout, vtable order, enum/parameter/return-type changes. Too coarse to +# trust as the sole gate. +# +# * Off-the-shelf "ABI check" marketplace Actions -- thin wrappers around one +# of the above, generally unmaintained and unpinned. Calling the tool +# directly is more transparent and easier to pin/audit. +# +# libabigail gives the strongest correctness guarantee for the least +# maintenance, which is why it is used here. +# ----------------------------------------------------------------------------- + +name: ABI Compatibility + +on: + # Only run on pull requests that target a release branch. Patch releases are + # the only releases that must preserve the ABI, and they are always prepared + # on RB-MAJOR.MINOR branches. + pull_request: + branches: + - 'RB-*' + + # Manual trigger, e.g. to dry-run the check against a release branch before + # opening the PR. + workflow_dispatch: + inputs: + base_branch: + description: 'Release branch the change targets (e.g. RB-2.6)' + required: true + type: string + ref: + description: 'Ref to check as the proposed change (optional; defaults to the launched ref)' + required: false + type: string + +# A PR can be pushed to repeatedly; this double build is expensive, so cancel +# superseded runs. +concurrency: + group: abi-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + abi: + name: 'ABI compatibility check' + runs-on: ubuntu-latest + # Build inside the same ASWF image used by the CI workflow so the toolchain + # and dependencies match what releases are actually built with. Pinned to a + # stable VFX CY; bump this together with the CI matrix. + container: + image: aswf/ci-ocio:2025 + + steps: + - name: Install libabigail + run: | + dnf install -y libabigail \ + || { dnf install -y epel-release && dnf install -y libabigail; } + abidiff --version + + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + # Full history + tags are needed to resolve the anchor tag and to add + # a worktree for it. For a pull_request, github.ref is the merge ref + # (refs/pull/N/merge), i.e. the post-merge state we want to validate. + fetch-depth: 0 + fetch-tags: true + ref: ${{ github.event_name == 'workflow_dispatch' && inputs.ref || github.ref }} + + - name: Determine ABI baseline + id: versions + shell: bash + run: | + set -euo pipefail + # The container checks out the workspace as a different user than the + # one git expects; mark everything safe so git/worktree commands work. + git config --global --add safe.directory '*' + + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + BASE_REF='${{ inputs.base_branch }}' + CURRENT_DESC="${{ inputs.ref || github.ref_name }} -> ${BASE_REF}" + else + BASE_REF='${{ github.base_ref }}' + CURRENT_DESC="PR #${{ github.event.pull_request.number }} -> ${BASE_REF}" + fi + echo "Target release branch: ${BASE_REF}" + + # The release branch name encodes the series: RB-MAJOR.MINOR. + if [[ ! "${BASE_REF}" =~ ^RB-([0-9]+)\.([0-9]+)$ ]]; then + echo "::notice::Base branch '${BASE_REF}' is not an RB-MAJOR.MINOR release branch; skipping ABI check." + echo "skip=true" >> "${GITHUB_OUTPUT}" + exit 0 + fi + MAJOR="${BASH_REMATCH[1]}" + MINOR="${BASH_REMATCH[2]}" + + # Anchor on X.Y.0, the ABI first published under the MAJOR.MINOR + # SONAME. Comparing the proposed change directly against the series + # anchor enforces compatibility with every consumer linked against any + # release in the series. Fall back to the lowest existing patch tag if + # X.Y.0 is missing for some reason. + ANCHOR="v${MAJOR}.${MINOR}.0" + if git rev-parse -q --verify "refs/tags/${ANCHOR}" >/dev/null; then + BASELINE="${ANCHOR}" + else + BASELINE=$(git tag --list "v${MAJOR}.${MINOR}.*" | grep -E "^v${MAJOR}\.${MINOR}\.[0-9]+$" | sort -V | head -1) + fi + if [ -z "${BASELINE}" ]; then + echo "::notice::The ${MAJOR}.${MINOR} series has no published release tag yet, so there is no ABI to preserve. Skipping." + echo "skip=true" >> "${GITHUB_OUTPUT}" + exit 0 + fi + + echo "Comparing '${CURRENT_DESC}' against baseline ${BASELINE}" + { + echo "skip=false" + echo "baseline=${BASELINE}" + echo "current_desc=${CURRENT_DESC}" + } >> "${GITHUB_OUTPUT}" + + - name: Write build helper + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + cat > "${RUNNER_TEMP}/abi_build.sh" <<'EOF' + #!/usr/bin/env bash + # Build only the shared library so abidiff can read the DWARF ABI. + # RelWithDebInfo is deliberate: it emits -g AND is the only optimized + # build type OCIO leaves unstripped (share/cmake/macros/StripUtils.cmake + # strips Release/MinSizeRel, which would erase the debug info abidiff + # needs). Everything not needed for the .so is turned off to keep the + # double build as fast as possible. + set -euo pipefail + SRC="$1" + OUT="$2" + cmake -S "${SRC}" -B "${OUT}/build" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX="${OUT}/install" \ + -DBUILD_SHARED_LIBS=ON \ + -DOCIO_USE_SOVERSION=ON \ + -DOCIO_BUILD_PYTHON=OFF \ + -DOCIO_BUILD_APPS=OFF \ + -DOCIO_BUILD_TESTS=OFF \ + -DOCIO_BUILD_GPU_TESTS=OFF \ + -DOCIO_BUILD_OPENFX=OFF \ + -DOCIO_BUILD_DOCS=OFF \ + -DOCIO_INSTALL_EXT_PACKAGES=MISSING \ + -DOCIO_WARNING_AS_ERROR=OFF + cmake --build "${OUT}/build" --target install -- -j"$(nproc)" + EOF + chmod +x "${RUNNER_TEMP}/abi_build.sh" + + - name: Build baseline (${{ steps.versions.outputs.baseline }}) + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + git worktree add --detach "${RUNNER_TEMP}/baseline-src" "${{ steps.versions.outputs.baseline }}" + "${RUNNER_TEMP}/abi_build.sh" "${RUNNER_TEMP}/baseline-src" "${RUNNER_TEMP}/old" + + - name: Build proposed change + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + "${RUNNER_TEMP}/abi_build.sh" "${GITHUB_WORKSPACE}" "${RUNNER_TEMP}/new" + + - name: Compare ABI (abidiff) + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + + OLD_LIB=$(find "${RUNNER_TEMP}/old/install" -type f -name 'libOpenColorIO.so.*' | head -1) + NEW_LIB=$(find "${RUNNER_TEMP}/new/install" -type f -name 'libOpenColorIO.so.*' | head -1) + if [ -z "${OLD_LIB}" ] || [ -z "${NEW_LIB}" ]; then + echo "::error::Could not locate the built shared libraries (old='${OLD_LIB}' new='${NEW_LIB}')." + exit 1 + fi + echo "Baseline library: ${OLD_LIB}" + echo "Proposed library: ${NEW_LIB}" + + ARGS=( + # Restrict the comparison to types reachable from the public headers. + --headers-dir1 "${RUNNER_TEMP}/old/install/include" + --headers-dir2 "${RUNNER_TEMP}/new/install/include" + # Added symbols are forward-compatible for existing consumers, so do + # not count them as a breaking change (they would warrant a minor + # bump, but they do not break binaries linked against the baseline). + --no-added-syms + # Fail loudly instead of silently degrading to a weaker, symbol-only + # comparison if a build somehow lacks debug info. + --fail-no-debug-info + ) + SUPPR="${GITHUB_WORKSPACE}/share/abi/ocio.abignore" + if [ -f "${SUPPR}" ]; then + ARGS+=(--suppressions "${SUPPR}") + fi + + set +e + abidiff "${ARGS[@]}" "${OLD_LIB}" "${NEW_LIB}" | tee "${RUNNER_TEMP}/abidiff.txt" + STATUS=${PIPESTATUS[0]} + set -e + + # abidiff exit code is a bitmask: + # 1 = ABIDIFF_ERROR (tool error) + # 2 = ABIDIFF_USAGE_ERROR + # 4 = ABIDIFF_ABI_CHANGE + # 8 = ABIDIFF_ABI_INCOMPATIBLE_CHANGE + { + echo "## ABI compatibility check" + echo "" + echo "- Baseline: \`${{ steps.versions.outputs.baseline }}\`" + echo "- Change: ${{ steps.versions.outputs.current_desc }}" + echo "" + echo '```' + cat "${RUNNER_TEMP}/abidiff.txt" + echo '```' + } >> "${GITHUB_STEP_SUMMARY}" + + if (( STATUS & 2 )); then + echo "::error::abidiff usage error (exit ${STATUS})." + exit 1 + fi + if (( STATUS & 1 )); then + echo "::error::abidiff failed to run (exit ${STATUS}); a build may be missing debug info." + exit 1 + fi + if (( STATUS & (4 | 8) )); then + echo "::error::This change breaks the ABI of the ${{ steps.versions.outputs.baseline }} series. A patch release must preserve the ABI. If the change is intentional and verified safe, add a justified suppression to share/abi/ocio.abignore." + exit 1 + fi + echo "ABI is compatible with the baseline. ✅" + + - name: Upload abidiff report + if: steps.versions.outputs.skip != 'true' && always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: abidiff-report + path: ${{ runner.temp }}/abidiff.txt + if-no-files-found: ignore diff --git a/share/abi/ocio.abignore b/share/abi/ocio.abignore new file mode 100644 index 0000000000..f09c133e74 --- /dev/null +++ b/share/abi/ocio.abignore @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# libabigail suppression specification for the OpenColorIO ABI compatibility +# check (see .github/workflows/abi_compatibility.yml). +# +# Reference: +# https://sourceware.org/libabigail/manual/libabigail-concepts.html#suppression-specifications +# +# The ABI check is run with `--headers-dir`, so abidiff already restricts the +# comparison to the types that are reachable from the installed public headers +# (include/OpenColorIO/*.h). Internal symbols and statically linked third-party +# dependencies (expat, yaml-cpp, pystring, Imath, minizip-ng, zlib, ...) are +# therefore ignored automatically and do NOT need entries here. +# +# Add a suppression below ONLY to allow-list an *intentional* ABI change that +# you have verified is safe for consumers in the current major.minor series +# (this should be very rare in a patch release). Every entry must: +# * carry a comment justifying why the change is ABI-safe, and +# * reference the PR / issue that introduced it. +# Entries become obsolete once the next minor/major release re-baselines the +# ABI, so prune them at that point. +# +# ---------------------------------------------------------------------------- +# Example (kept commented out on purpose): +# +# Allow a new data member appended at the end of an opaque/impl-detail struct, +# which does not change the layout seen by existing consumers: +# +# [suppress_type] +# name = OpenColorIO_v2_6::SomeType::Impl +# has_data_member_inserted_at = end +# +# Allow a newly added member function (additions are backward compatible): +# +# [suppress_function] +# name_regexp = ^OpenColorIO_v2_6::.*::newlyAddedMethod +# ----------------------------------------------------------------------------