From e6a9369814cc7f834091c4f99b6da902f87ce61e Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 15:27:33 +0100 Subject: [PATCH 01/12] Start implementation of CPU triangle tracer --- include/viennaray/rayGeometry.hpp | 192 ++------------ include/viennaray/rayGeometryDisk.hpp | 184 ++++++++++++++ include/viennaray/rayGeometryTriangle.hpp | 162 ++++++++++++ include/viennaray/rayTrace.hpp | 210 +--------------- include/viennaray/rayTraceDisk.hpp | 265 ++++++++++++++++++++ include/viennaray/rayTraceKernel.hpp | 117 +++++---- include/viennaray/rayTraceTriangle.hpp | 235 +++++++++++++++++ tests/traceInterface/traceInterface.cpp | 4 +- tests/triangleGeometry/CMakeLists.txt | 8 + tests/triangleGeometry/triangleGeometry.cpp | 25 ++ 10 files changed, 975 insertions(+), 427 deletions(-) create mode 100644 include/viennaray/rayGeometryDisk.hpp create mode 100644 include/viennaray/rayGeometryTriangle.hpp create mode 100644 include/viennaray/rayTraceDisk.hpp create mode 100644 include/viennaray/rayTraceTriangle.hpp create mode 100644 tests/triangleGeometry/CMakeLists.txt create mode 100644 tests/triangleGeometry/triangleGeometry.cpp diff --git a/include/viennaray/rayGeometry.hpp b/include/viennaray/rayGeometry.hpp index cb1d452..6e07606 100644 --- a/include/viennaray/rayGeometry.hpp +++ b/include/viennaray/rayGeometry.hpp @@ -5,112 +5,18 @@ namespace viennaray { +enum class GeometryType : unsigned { DISK = 0, TRIANGLE = 1, UNDEFINED }; + using namespace viennacore; template class Geometry { - using pointNeighborhoodType = std::vector>; - public: - template - void initGeometry(RTCDevice &device, - std::vector> const &points, - std::vector> const &normals, - NumericType const discRadii) { - static_assert(!(D == 3 && Dim == 2) && - "Setting 2D geometry in 3D trace object"); - - assert(points.size() == normals.size() && - "Geometry: Points/Normals size mismatch"); - - // overwriting the geometry without releasing it beforehand causes the old - // buffer to leak - releaseGeometry(); - pRtcGeometry_ = - rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ORIENTED_DISC_POINT); - assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && - "RTC Error: rtcNewGeometry"); - numPoints_ = points.size(); - - // The buffer data is managed internally (embree) and automatically freed - // when the geometry is destroyed. - pPointBuffer_ = (point_4f_t *)rtcSetNewGeometryBuffer( - pRtcGeometry_, RTC_BUFFER_TYPE_VERTEX, - 0, // slot - RTC_FORMAT_FLOAT4, sizeof(point_4f_t), numPoints_); - assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && - "RTC Error: rtcSetNewGeometryBuffer points"); - discRadii_ = discRadii; - - for (int i = 0; i < D; i++) { - minCoords_[i] = std::numeric_limits::max(); - maxCoords_[i] = std::numeric_limits::lowest(); - } - - for (size_t i = 0; i < numPoints_; ++i) { - pPointBuffer_[i].xx = (float)points[i][0]; - pPointBuffer_[i].yy = (float)points[i][1]; - pPointBuffer_[i].radius = (float)discRadii_; - if (points[i][0] < minCoords_[0]) - minCoords_[0] = points[i][0]; - if (points[i][1] < minCoords_[1]) - minCoords_[1] = points[i][1]; - if (points[i][0] > maxCoords_[0]) - maxCoords_[0] = points[i][0]; - if (points[i][1] > maxCoords_[1]) - maxCoords_[1] = points[i][1]; - if constexpr (D == 2) { - pPointBuffer_[i].zz = 0.f; - minCoords_[2] = 0.; - maxCoords_[2] = 0.; - } else { - pPointBuffer_[i].zz = (float)points[i][2]; - if (points[i][2] < minCoords_[2]) - minCoords_[2] = points[i][2]; - if (points[i][2] > maxCoords_[2]) - maxCoords_[2] = points[i][2]; - } - } - - pNormalVecBuffer_ = (normal_vec_3f_t *)rtcSetNewGeometryBuffer( - pRtcGeometry_, RTC_BUFFER_TYPE_NORMAL, - 0, // slot - RTC_FORMAT_FLOAT3, sizeof(normal_vec_3f_t), numPoints_); - assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && - "RTC Error: rtcSetNewGeometryBuffer normals"); - - for (size_t i = 0; i < numPoints_; ++i) { - pNormalVecBuffer_[i].xx = (float)normals[i][0]; - pNormalVecBuffer_[i].yy = (float)normals[i][1]; - if constexpr (D == 2) { - pNormalVecBuffer_[i].zz = 0.f; - } else { - pNormalVecBuffer_[i].zz = (float)normals[i][2]; - } - } - -#ifdef VIENNARAY_USE_RAY_MASKING - rtcSetGeometryMask(pRtcGeometry_, -1); -#endif - - rtcCommitGeometry(pRtcGeometry_); - assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && - "RTC Error: rtcCommitGeometry"); - - if (materialIds_.empty()) { - materialIds_.resize(numPoints_, 0); - } - - // Initialize point neighborhood - pointNeighborhood_.template init(points, 2 * discRadii_, minCoords_, - maxCoords_); - } + Geometry(GeometryType type) : geoType_(type) {} template void setMaterialIds(std::vector const &pMaterialIds) { - assert(pMaterialIds.size() == numPoints_ && - "Geometry: Material IDs size mismatch"); materialIds_.clear(); - materialIds_.reserve(numPoints_); + materialIds_.reserve(numPrimitives_); for (const auto id : pMaterialIds) { materialIds_.push_back(static_cast(id)); } @@ -120,13 +26,6 @@ template class Geometry { return {minCoords_, maxCoords_}; } - [[nodiscard]] Vec3D getPoint(const unsigned int primID) const { - assert(primID < numPoints_ && "Geometry: Prim ID out of bounds"); - auto const &pnt = pPointBuffer_[primID]; - return Vec3D{(NumericType)pnt.xx, (NumericType)pnt.yy, - (NumericType)pnt.zz}; - } - [[nodiscard]] std::vector const & getNeighborIndices(const unsigned int idx) const { assert(pointNeighborhood_.getDistance() > 0.); // check if initialized @@ -138,93 +37,40 @@ template class Geometry { return pointNeighborhood_; } - [[nodiscard]] size_t getNumPoints() const { return numPoints_; } + [[nodiscard]] size_t getNumPrimitives() const { return numPrimitives_; } - [[nodiscard]] NumericType getDiscRadius() const { return discRadii_; } + virtual Vec3D getPrimNormal(const unsigned int primID) const = 0; - [[nodiscard]] RTCGeometry const &getRTCGeometry() const { - return pRtcGeometry_; - } + virtual std::array &getPrimRef(unsigned int primID) { return zero; } - [[nodiscard]] Vec3D - getPrimNormal(const unsigned int primID) const { - assert(primID < numPoints_ && "Geometry: Prim ID out of bounds"); - auto const &normal = pNormalVecBuffer_[primID]; - return Vec3D{(NumericType)normal.xx, (NumericType)normal.yy, - (NumericType)normal.zz}; + virtual std::array &getNormalRef(unsigned int primID) { + return *reinterpret_cast *>(zero.data()); } - [[nodiscard]] std::array & - getPrimRef(unsigned int primID) { - assert(primID < numPoints_ && "Geometry: Prim ID out of bounds"); - return *reinterpret_cast *>( - &pPointBuffer_[primID]); - } - - [[nodiscard]] std::array & - getNormalRef(unsigned int primID) { - assert(primID < numPoints_ && "Geometry: Prim ID out of bounds"); - return *reinterpret_cast *>( - &pNormalVecBuffer_[primID]); + [[nodiscard]] RTCGeometry const &getRTCGeometry() const { + return pRtcGeometry_; } [[nodiscard]] int getMaterialId(const unsigned int primID) const { - assert(primID < numPoints_ && "Geometry Prim ID out of bounds"); + assert(primID < numPrimitives_ && "Geometry Prim ID out of bounds"); return materialIds_[primID]; } - [[nodiscard]] bool checkGeometryEmpty() const { - if (pPointBuffer_ == nullptr || pNormalVecBuffer_ == nullptr || - pRtcGeometry_ == nullptr) { - return true; - } - return false; - } + virtual bool checkGeometryEmpty() const = 0; - void releaseGeometry() { - // Attention: - // This function must not be called when the RTCGeometry reference count is - // > 1. Doing so leads to leaked memory buffers - if (pPointBuffer_ == nullptr || pNormalVecBuffer_ == nullptr || - pRtcGeometry_ == nullptr) { - return; - } else { - rtcReleaseGeometry(pRtcGeometry_); - pPointBuffer_ = nullptr; - pNormalVecBuffer_ = nullptr; - pRtcGeometry_ = nullptr; - } - } - -private: - // RTC_GEOMETRY_TYPE_POINT: - // The vertex buffer stores each control vertex in the form of a single - // precision position and radius stored in (x, y, z, r) order in memory - // (RTC_FORMAT_FLOAT4 format). The number of vertices is inferred from the - // size of this buffer. - // Source: https://embree.github.io/api.html#rtc_geometry_type_point - struct point_4f_t { - float xx, yy, zz, radius; - }; - point_4f_t *pPointBuffer_ = nullptr; - - // "RTC_GEOMETRY_TYPE_POINT: - // [...] the normal buffer stores a single precision normal per control - // vertex (x, y, z order and RTC_FORMAT_FLOAT3 format)." - // Source: https://embree.github.io/api.html#rtc_geometry_type_point - struct normal_vec_3f_t { - float xx, yy, zz; - }; - normal_vec_3f_t *pNormalVecBuffer_ = nullptr; + virtual void releaseGeometry() = 0; +protected: RTCGeometry pRtcGeometry_ = nullptr; + GeometryType geoType_ = GeometryType::UNDEFINED; - size_t numPoints_ = 0; - NumericType discRadii_; + unsigned numPrimitives_ = 0; Vec3D minCoords_; Vec3D maxCoords_; std::vector materialIds_; + std::array zero = {0.f, 0.f, 0.f, 0.f}; + PointNeighborhood pointNeighborhood_; }; diff --git a/include/viennaray/rayGeometryDisk.hpp b/include/viennaray/rayGeometryDisk.hpp new file mode 100644 index 0000000..5844487 --- /dev/null +++ b/include/viennaray/rayGeometryDisk.hpp @@ -0,0 +1,184 @@ +#pragma once + +#include + +namespace viennaray { + +using namespace viennacore; + +template +class GeometryDisk : public Geometry { +public: + GeometryDisk() : Geometry(GeometryType::DISK) {} + + template + void initGeometry(RTCDevice &device, + std::vector> const &points, + std::vector> const &normals, + NumericType const discRadii) { + static_assert(!(D == 3 && Dim == 2) && + "Setting 2D geometry in 3D trace object"); + + assert(points.size() == normals.size() && + "Geometry: Points/Normals size mismatch"); + + // overwriting the geometry without releasing it beforehand causes the old + // buffer to leak + releaseGeometry(); + this->pRtcGeometry_ = + rtcNewGeometry(device, RTC_GEOMETRY_TYPE_ORIENTED_DISC_POINT); + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcNewGeometry"); + this->numPrimitives_ = points.size(); + + // The buffer data is managed internally (embree) and automatically freed + // when the geometry is destroyed. + pPointBuffer_ = (point_4f_t *)rtcSetNewGeometryBuffer( + this->pRtcGeometry_, RTC_BUFFER_TYPE_VERTEX, + 0, // slot + RTC_FORMAT_FLOAT4, sizeof(point_4f_t), this->numPrimitives_); + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcSetNewGeometryBuffer points"); + discRadii_ = discRadii; + + for (int i = 0; i < D; i++) { + this->minCoords_[i] = std::numeric_limits::max(); + this->maxCoords_[i] = std::numeric_limits::lowest(); + } + + for (size_t i = 0; i < this->numPrimitives_; ++i) { + pPointBuffer_[i].xx = (float)points[i][0]; + pPointBuffer_[i].yy = (float)points[i][1]; + pPointBuffer_[i].radius = (float)discRadii_; + if (points[i][0] < this->minCoords_[0]) + this->minCoords_[0] = points[i][0]; + if (points[i][1] < this->minCoords_[1]) + this->minCoords_[1] = points[i][1]; + if (points[i][0] > this->maxCoords_[0]) + this->maxCoords_[0] = points[i][0]; + if (points[i][1] > this->maxCoords_[1]) + this->maxCoords_[1] = points[i][1]; + if constexpr (D == 2) { + pPointBuffer_[i].zz = 0.f; + this->minCoords_[2] = 0.; + this->maxCoords_[2] = 0.; + } else { + pPointBuffer_[i].zz = (float)points[i][2]; + if (points[i][2] < this->minCoords_[2]) + this->minCoords_[2] = points[i][2]; + if (points[i][2] > this->maxCoords_[2]) + this->maxCoords_[2] = points[i][2]; + } + } + + pNormalVecBuffer_ = (normal_vec_3f_t *)rtcSetNewGeometryBuffer( + this->pRtcGeometry_, RTC_BUFFER_TYPE_NORMAL, + 0, // slot + RTC_FORMAT_FLOAT3, sizeof(normal_vec_3f_t), this->numPrimitives_); + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcSetNewGeometryBuffer normals"); + + for (size_t i = 0; i < this->numPrimitives_; ++i) { + pNormalVecBuffer_[i].xx = (float)normals[i][0]; + pNormalVecBuffer_[i].yy = (float)normals[i][1]; + if constexpr (D == 2) { + pNormalVecBuffer_[i].zz = 0.f; + } else { + pNormalVecBuffer_[i].zz = (float)normals[i][2]; + } + } + +#ifdef VIENNARAY_USE_RAY_MASKING + rtcSetGeometryMask(this->pRtcGeometry_, -1); +#endif + + rtcCommitGeometry(this->pRtcGeometry_); + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcCommitGeometry"); + + if (this->materialIds_.empty()) { + this->materialIds_.resize(this->numPrimitives_, 0); + } + + // Initialize point neighborhood + this->pointNeighborhood_.template init( + points, 2 * discRadii_, this->minCoords_, this->maxCoords_); + } + + [[nodiscard]] Vec3D getPoint(const unsigned int primID) const { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + auto const &pnt = pPointBuffer_[primID]; + return Vec3D{(NumericType)pnt.xx, (NumericType)pnt.yy, + (NumericType)pnt.zz}; + } + + [[nodiscard]] NumericType getDiscRadius() const { return discRadii_; } + + Vec3D getPrimNormal(const unsigned int primID) const override { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + auto const &normal = pNormalVecBuffer_[primID]; + return Vec3D{(NumericType)normal.xx, (NumericType)normal.yy, + (NumericType)normal.zz}; + } + + std::array &getPrimRef(unsigned int primID) { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + return *reinterpret_cast *>( + &pPointBuffer_[primID]); + } + + std::array & + getNormalRef(unsigned int primID) { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + return *reinterpret_cast *>( + &pNormalVecBuffer_[primID]); + } + + bool checkGeometryEmpty() const override { + if (pPointBuffer_ == nullptr || pNormalVecBuffer_ == nullptr || + this->pRtcGeometry_ == nullptr) { + return true; + } + return false; + } + + void releaseGeometry() override { + // Attention: + // This function must not be called when the RTCGeometry reference count is + // > 1. Doing so leads to leaked memory buffers + if (pPointBuffer_ == nullptr || pNormalVecBuffer_ == nullptr || + this->pRtcGeometry_ == nullptr) { + return; + } else { + rtcReleaseGeometry(this->pRtcGeometry_); + pPointBuffer_ = nullptr; + pNormalVecBuffer_ = nullptr; + this->pRtcGeometry_ = nullptr; + } + } + +private: + // RTC_GEOMETRY_TYPE_POINT: + // The vertex buffer stores each control vertex in the form of a single + // precision position and radius stored in (x, y, z, r) order in memory + // (RTC_FORMAT_FLOAT4 format). The number of vertices is inferred from the + // size of this buffer. + // Source: https://embree.github.io/api.html#rtc_geometry_type_point + struct point_4f_t { + float xx, yy, zz, radius; + }; + point_4f_t *pPointBuffer_ = nullptr; + + // "RTC_GEOMETRY_TYPE_POINT: + // [...] the normal buffer stores a single precision normal per control + // vertex (x, y, z order and RTC_FORMAT_FLOAT3 format)." + // Source: https://embree.github.io/api.html#rtc_geometry_type_point + struct normal_vec_3f_t { + float xx, yy, zz; + }; + normal_vec_3f_t *pNormalVecBuffer_ = nullptr; + + NumericType discRadii_; // same for all points +}; + +} // namespace viennaray diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp new file mode 100644 index 0000000..575e7bc --- /dev/null +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -0,0 +1,162 @@ +#pragma once + +#include + +namespace viennaray { + +using namespace viennacore; + +template +class GeometryTriangle : public Geometry { +public: + GeometryTriangle() : Geometry(GeometryType::TRIANGLE) {} + + void initGeometry(RTCDevice &device, + std::vector> const &points, + std::vector> const &elements) { + + // overwriting the geometry without releasing it beforehand causes the old + // buffer to leak + releaseGeometry(); + this->pRtcGeometry_ = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_TRIANGLE); + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcNewGeometry"); + this->numPrimitives_ = elements.size(); + + // The buffer data is managed internally (embree) and automatically freed + // when the geometry is destroyed. + pPointBuffer_ = (point_3f_t *)rtcSetNewGeometryBuffer( + this->pRtcGeometry_, RTC_BUFFER_TYPE_VERTEX, + 0, // slot + RTC_FORMAT_FLOAT3, sizeof(point_3f_t), points.size()); + + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcSetNewGeometryBuffer points"); + + for (int i = 0; i < D; i++) { + this->minCoords_[i] = std::numeric_limits::max(); + this->maxCoords_[i] = std::numeric_limits::lowest(); + } + + for (size_t i = 0; i < points.size(); ++i) { + pPointBuffer_[i].xx = (float)points[i][0]; + pPointBuffer_[i].yy = (float)points[i][1]; + pPointBuffer_[i].zz = (float)points[i][2]; + + // determine max extent + if (points[i][0] < this->minCoords_[0]) + this->minCoords_[0] = points[i][0]; + if (points[i][1] < this->minCoords_[1]) + this->minCoords_[1] = points[i][1]; + if (points[i][0] > this->maxCoords_[0]) + this->maxCoords_[0] = points[i][0]; + if (points[i][1] > this->maxCoords_[1]) + this->maxCoords_[1] = points[i][1]; + if (points[i][2] < this->minCoords_[2]) + this->minCoords_[2] = points[i][2]; + if (points[i][2] > this->maxCoords_[2]) + this->maxCoords_[2] = points[i][2]; + } + + pTriangleBuffer_ = (triangle_3u_t *)rtcSetNewGeometryBuffer( + this->pRtcGeometry_, RTC_BUFFER_TYPE_INDEX, + 0, // slot + RTC_FORMAT_UINT3, sizeof(triangle_3u_t), this->numPrimitives_); + + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcSetNewGeometryBuffer elements"); + + for (size_t i = 0; i < this->numPrimitives_; ++i) { + pTriangleBuffer_[i].uu = elements[i][0]; + pTriangleBuffer_[i].vv = elements[i][1]; + pTriangleBuffer_[i].ww = elements[i][2]; + } + +#ifdef VIENNARAY_USE_RAY_MASKING + rtcSetGeometryMask(this->pRtcGeometry_, -1); +#endif + + rtcCommitGeometry(this->pRtcGeometry_); + assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && + "RTC Error: rtcCommitGeometry"); + + if (this->materialIds_.empty()) { + this->materialIds_.resize(this->numPrimitives_, 0); + } + + // Initialize point neighborhood + /// TODO: + // this->pointNeighborhood_.template init( + // points, 2 * discRadii_, this->minCoords_, this->maxCoords_); + } + + [[nodiscard]] Vec3D getTriangle(const unsigned int primID) const { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + auto const &tri = pTriangleBuffer_[primID]; + return Vec3D{(NumericType)tri.uu, (NumericType)tri.vv, + (NumericType)tri.ww}; + } + + Vec3D getPrimNormal(const unsigned int primID) const override { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + if (normals_.empty()) { + // calculate normal + /// TODO: + return Vec3D{0, 0, 0}; + } else { + return Vec3D{static_cast(normals_[primID][0]), + static_cast(normals_[primID][1]), + static_cast(normals_[primID][2])}; + } + } + + // std::array &getPrimRef(unsigned int primID) override { + // assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of + // bounds"); return *reinterpret_cast + // *>(&pPointBuffer_[primID]); + // } + + // std::array &getNormalRef(unsigned int primID) override { + // assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of + // bounds"); return *reinterpret_cast + // *>(&pTriangleBuffer_[primID]); + // } + + bool checkGeometryEmpty() const override { + if (pPointBuffer_ == nullptr || pTriangleBuffer_ == nullptr || + this->pRtcGeometry_ == nullptr) { + return true; + } + return false; + } + + void releaseGeometry() override { + // Attention: + // This function must not be called when the RTCGeometry reference count is + // > 1. Doing so leads to leaked memory buffers + if (pPointBuffer_ == nullptr || pTriangleBuffer_ == nullptr || + this->pRtcGeometry_ == nullptr) { + return; + } else { + rtcReleaseGeometry(this->pRtcGeometry_); + pPointBuffer_ = nullptr; + pTriangleBuffer_ = nullptr; + this->pRtcGeometry_ = nullptr; + } + } + +private: + struct point_3f_t { + float xx, yy, zz; + }; + point_3f_t *pPointBuffer_ = nullptr; + + struct triangle_3u_t { + unsigned uu, vv, ww; + }; + triangle_3u_t *pTriangleBuffer_ = nullptr; + + std::vector normals_; +}; + +} // namespace viennaray diff --git a/include/viennaray/rayTrace.hpp b/include/viennaray/rayTrace.hpp index 444b471..e0e51ff 100644 --- a/include/viennaray/rayTrace.hpp +++ b/include/viennaray/rayTrace.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -16,59 +15,17 @@ using namespace viennacore; template class Trace { public: - Trace() : device_(rtcNewDevice("hugepages=1")) {} + Trace() : device_(rtcNewDevice("hugepages=1")) { initMemoryFlags(); } Trace(const Trace &) = delete; Trace &operator=(const Trace &) = delete; Trace(Trace &&) = delete; Trace &operator=(Trace &&) = delete; - ~Trace() { - geometry_.releaseGeometry(); - rtcReleaseDevice(device_); - } + ~Trace() { rtcReleaseDevice(device_); } /// Run the ray tracer - void apply() { - checkSettings(); - initMemoryFlags(); - auto boundingBox = geometry_.getBoundingBox(); - rayInternal::adjustBoundingBox( - boundingBox, sourceDirection_, diskRadius_); - auto traceSettings = rayInternal::getTraceSettings(sourceDirection_); - - auto boundary = Boundary( - device_, boundingBox, boundaryConditions_, traceSettings); - - std::array, 3> orthonormalBasis; - if (usePrimaryDirection_) - orthonormalBasis = rayInternal::getOrthonormalBasis(primaryDirection_); - if (!useCustomSource) - pSource_ = std::make_shared>( - boundingBox, pParticle_->getSourceDistributionPower(), traceSettings, - geometry_.getNumPoints(), usePrimaryDirection_, orthonormalBasis); - - auto localDataLabels = pParticle_->getLocalDataLabels(); - if (!localDataLabels.empty()) { - localData_.setNumberOfVectorData(localDataLabels.size()); - auto numPoints = geometry_.getNumPoints(); - for (int i = 0; i < localDataLabels.size(); ++i) { - localData_.setVectorData(i, numPoints, 0., localDataLabels[i]); - } - } - - rayInternal::TraceKernel tracer(device_, geometry_, boundary, pSource_, - pParticle_, config_, dataLog_, hitCounter_, - RTInfo_); - tracer.setTracingData(&localData_, pGlobalData_); - tracer.apply(); - config_.runNumber++; - - if (checkError_) - checkRelativeError(); - - boundary.releaseGeometry(); - } + virtual void apply() {} /// Set the particle type used for ray tracing /// The particle is a user defined object that has to interface the @@ -81,41 +38,6 @@ template class Trace { pParticle_ = particle->clone(); } - /// Set the ray tracing geometry - /// It is possible to set a 2D geometry with 3D points. - /// In this case the last dimension is ignored. - template - void setGeometry(std::vector> const &points, - std::vector> const &normals, - const NumericType gridDelta) { - static_assert((D != 3 || Dim != 2) && - "Setting 2D geometry in 3D trace object"); - - gridDelta_ = gridDelta; - diskRadius_ = gridDelta * rayInternal::DiskFactor; - geometry_.initGeometry(device_, points, normals, diskRadius_); - } - - /// Set the ray tracing geometry - /// Specify the disk radius manually. - template - void setGeometry(std::vector> const &points, - std::vector> const &normals, - const NumericType gridDelta, const NumericType diskRadii) { - static_assert((D != 3 || Dim != 2) && - "Setting 2D geometry in 3D trace object"); - - gridDelta_ = gridDelta; - diskRadius_ = diskRadii; - geometry_.initGeometry(device_, points, normals, diskRadius_); - } - - /// Set material ID's for each geometry point. - /// If not set, all material IDs are default 0. - template void setMaterialIds(std::vector const &materialIds) { - geometry_.setMaterialIds(materialIds); - } - /// Set the boundary conditions. /// There has to be a boundary condition defined for each space dimension, /// however the boundary condition in direction of the tracing direction is @@ -225,93 +147,14 @@ template class Trace { /// Helper function to normalize the recorded flux in a post-processing step. /// The flux can be normalized to the source flux and the maximum recorded /// value. - void normalizeFlux(std::vector &flux, - NormalizationType norm = NormalizationType::SOURCE) { - assert(flux.size() == geometry_.getNumPoints() && - "Unequal number of points in normalizeFlux"); - - auto diskArea = hitCounter_.getDiskAreas(); - const auto totalDiskArea = diskRadius_ * diskRadius_ * M_PI; - - switch (norm) { - case NormalizationType::MAX: { - auto maxv = *std::max_element(flux.begin(), flux.end()); -#pragma omp parallel for - for (int idx = 0; idx < flux.size(); ++idx) { - flux[idx] *= (totalDiskArea / diskArea[idx]) / maxv; - } - break; - } - - case NormalizationType::SOURCE: { - if (!pSource_) { - Logger::getInstance() - .addWarning( - "No source was specified in rayTrace for the normalization.") - .print(); - break; - } - NumericType sourceArea = pSource_->getSourceArea(); - auto numTotalRays = - config_.numRaysFixed == 0 - ? pSource_->getNumPoints() * config_.numRaysPerPoint - : config_.numRaysFixed; - NumericType normFactor = sourceArea / numTotalRays; -#pragma omp parallel for - for (int idx = 0; idx < flux.size(); ++idx) { - flux[idx] *= normFactor / diskArea[idx]; - } - break; - } - - default: - break; - } - } + virtual void + normalizeFlux(std::vector &flux, + NormalizationType norm = NormalizationType::SOURCE) = 0; /// Helper function to smooth the recorded flux by averaging over the /// neighborhood in a post-processing step. - void smoothFlux(std::vector &flux, int numNeighbors = 1) { - assert(flux.size() == geometry_.getNumPoints() && - "Unequal number of points in smoothFlux"); - auto oldFlux = flux; - PointNeighborhood pointNeighborhood; - if (numNeighbors == 1) { - // re-use the neighborhood from the geometry - pointNeighborhood = geometry_.getPointNeighborhood(); - } else { - // create a new neighborhood with a larger radius - auto boundingBox = geometry_.getBoundingBox(); - std::vector> points(geometry_.getNumPoints()); -#pragma omp parallel for - for (int idx = 0; idx < geometry_.getNumPoints(); idx++) { - points[idx] = geometry_.getPoint(idx); - } - pointNeighborhood.template init<3>(points, numNeighbors * 2 * diskRadius_, - boundingBox[0], boundingBox[1]); - } - -#pragma omp parallel for - for (int idx = 0; idx < geometry_.getNumPoints(); idx++) { - - NumericType vv = oldFlux[idx]; - - auto const &neighborhood = pointNeighborhood.getNeighborIndices(idx); - NumericType sum = 1.; - auto const normal = geometry_.getPrimNormal(idx); - - for (auto const &nbi : neighborhood) { - auto nnormal = geometry_.getPrimNormal(nbi); - auto weight = DotProduct(normal, nnormal); - if (weight > 0.) { - vv += oldFlux[nbi] * weight; - sum += weight; - } - } - - flux[idx] = vv / sum; - } - } + virtual void smoothFlux(std::vector &flux, + int numNeighbors = 1) = 0; /// Returns the total number of hits for each geometry point. [[nodiscard]] std::vector getHitCounts() const { @@ -323,19 +166,12 @@ template class Trace { return hitCounter_.getRelativeError(); } - /// Returns the disk area for each geometry point - [[nodiscard]] std::vector getDiskAreas() { - return hitCounter_.getDiskAreas(); - } - [[nodiscard]] TracingData &getLocalData() { return localData_; } [[nodiscard]] TracingData *getGlobalData() { return pGlobalData_; } - Geometry &getGeometry() { return geometry_; } - void setGlobalData(TracingData &data) { pGlobalData_ = &data; } [[nodiscard]] TraceInfo getRayTraceInfo() const { return RTInfo_; } @@ -381,32 +217,6 @@ template class Trace { } } - void checkSettings() { - if (pParticle_ == nullptr) { - RTInfo_.error = true; - Logger::getInstance().addError( - "No particle was specified in rayTrace. Aborting."); - } - if (geometry_.checkGeometryEmpty()) { - RTInfo_.error = true; - Logger::getInstance().addError( - "No geometry was passed to rayTrace. Aborting."); - } - if ((D == 2 && sourceDirection_ == TraceDirection::POS_Z) || - (D == 2 && sourceDirection_ == TraceDirection::NEG_Z)) { - RTInfo_.error = true; - Logger::getInstance().addError( - "Invalid source direction in 2D geometry. Aborting."); - } - if (diskRadius_ > gridDelta_) { - RTInfo_.warning = true; - Logger::getInstance() - .addWarning("Disk radius should be smaller than grid delta. Hit " - "count normalization not correct.") - .print(); - } - } - static void initMemoryFlags() { #ifdef ARCH_X86 // for best performance set FTZ and DAZ flags in MXCSR control and status @@ -416,14 +226,12 @@ template class Trace { #endif } -private: +protected: RTCDevice device_; - Geometry geometry_; std::shared_ptr> pSource_ = nullptr; std::unique_ptr> pParticle_ = nullptr; - NumericType diskRadius_ = 0; NumericType gridDelta_ = 0; BoundaryCondition boundaryConditions_[D] = {}; diff --git a/include/viennaray/rayTraceDisk.hpp b/include/viennaray/rayTraceDisk.hpp new file mode 100644 index 0000000..8d58ce7 --- /dev/null +++ b/include/viennaray/rayTraceDisk.hpp @@ -0,0 +1,265 @@ +#pragma once + +#include +#include + +#include + +namespace viennaray { + +using namespace viennacore; + +template +class TraceDisk : public Trace { +public: + TraceDisk() {} + ~TraceDisk() { geometry_.releaseGeometry(); } + + /// Run the ray tracer + void apply() override { + checkSettings(); + auto boundingBox = geometry_.getBoundingBox(); + rayInternal::adjustBoundingBox( + boundingBox, this->sourceDirection_, this->diskRadius_); + auto traceSettings = rayInternal::getTraceSettings(this->sourceDirection_); + + auto boundary = Boundary( + this->device_, boundingBox, this->boundaryConditions_, traceSettings); + + std::array, 3> orthonormalBasis; + if (this->usePrimaryDirection_) + orthonormalBasis = + rayInternal::getOrthonormalBasis(this->primaryDirection_); + if (!this->useCustomSource) + this->pSource_ = std::make_shared>( + boundingBox, this->pParticle_->getSourceDistributionPower(), + traceSettings, geometry_.getNumPrimitives(), + this->usePrimaryDirection_, orthonormalBasis); + + auto localDataLabels = this->pParticle_->getLocalDataLabels(); + if (!localDataLabels.empty()) { + this->localData_.setNumberOfVectorData(localDataLabels.size()); + auto numPoints = geometry_.getNumPrimitives(); + for (int i = 0; i < localDataLabels.size(); ++i) { + this->localData_.setVectorData(i, numPoints, 0., localDataLabels[i]); + } + } + + rayInternal::TraceKernel tracer( + this->device_, geometry_, boundary, this->pSource_, this->pParticle_, + this->config_, this->dataLog_, this->hitCounter_, this->RTInfo_); + tracer.setTracingData(&this->localData_, this->pGlobalData_); + tracer.apply(); + this->config_.runNumber++; + + if (this->checkError_) + this->checkRelativeError(); + + boundary.releaseGeometry(); + } + + /// Set the ray tracing geometry + /// It is possible to set a 2D geometry with 3D points. + /// In this case the last dimension is ignored. + template + void setGeometry(std::vector> const &points, + std::vector> const &normals, + const NumericType gridDelta) { + static_assert((D != 3 || Dim != 2) && + "Setting 2D geometry in 3D trace object"); + + this->gridDelta_ = gridDelta; + diskRadius_ = gridDelta * rayInternal::DiskFactor; + this->geometry_.initGeometry(this->device_, points, normals, diskRadius_); + } + + /// Set the ray tracing geometry + /// Specify the disk radius manually. + template + void setGeometry(std::vector> const &points, + std::vector> const &normals, + const NumericType gridDelta, const NumericType diskRadii) { + static_assert((D != 3 || Dim != 2) && + "Setting 2D geometry in 3D trace object"); + + this->gridDelta_ = gridDelta; + diskRadius_ = diskRadii; + geometry_.initGeometry(this->device_, points, normals, diskRadius_); + } + + /// Set material ID's for each geometry point. + /// If not set, all material IDs are default 0. + template void setMaterialIds(std::vector const &materialIds) { + geometry_.setMaterialIds(materialIds); + } + + /// Helper function to normalize the recorded flux in a post-processing step. + /// The flux can be normalized to the source flux and the maximum recorded + /// value. + void normalizeFlux(std::vector &flux, + NormalizationType norm = NormalizationType::SOURCE) { + assert(flux.size() == geometry_.getNumPoints() && + "Unequal number of points in normalizeFlux"); + + auto diskArea = this->hitCounter_.getDiskAreas(); + const auto totalDiskArea = diskRadius_ * diskRadius_ * M_PI; + + switch (norm) { + case NormalizationType::MAX: { + auto maxv = *std::max_element(flux.begin(), flux.end()); +#pragma omp parallel for + for (int idx = 0; idx < flux.size(); ++idx) { + flux[idx] *= (totalDiskArea / diskArea[idx]) / maxv; + } + break; + } + + case NormalizationType::SOURCE: { + if (!this->pSource_) { + Logger::getInstance() + .addWarning( + "No source was specified in rayTrace for the normalization.") + .print(); + break; + } + NumericType sourceArea = this->pSource_->getSourceArea(); + auto numTotalRays = + this->config_.numRaysFixed == 0 + ? this->pSource_->getNumPoints() * this->config_.numRaysPerPoint + : this->config_.numRaysFixed; + NumericType normFactor = sourceArea / numTotalRays; +#pragma omp parallel for + for (int idx = 0; idx < flux.size(); ++idx) { + flux[idx] *= normFactor / diskArea[idx]; + } + break; + } + + default: + break; + } + } + + /// Helper function to smooth the recorded flux by averaging over the + /// neighborhood in a post-processing step. + void smoothFlux(std::vector &flux, + int numNeighbors = 1) override { + assert(flux.size() == geometry_.getNumPoints() && + "Unequal number of points in smoothFlux"); + auto oldFlux = flux; + PointNeighborhood pointNeighborhood; + if (numNeighbors == 1) { + // re-use the neighborhood from the geometry + pointNeighborhood = geometry_.getPointNeighborhood(); + } else { + // create a new neighborhood with a larger radius + auto boundingBox = geometry_.getBoundingBox(); + std::vector> points(geometry_.getNumPrimitives()); +#pragma omp parallel for + for (int idx = 0; idx < geometry_.getNumPrimitives(); idx++) { + points[idx] = geometry_.getPoint(idx); + } + pointNeighborhood.template init<3>(points, numNeighbors * 2 * diskRadius_, + boundingBox[0], boundingBox[1]); + } + +#pragma omp parallel for + for (int idx = 0; idx < geometry_.getNumPrimitives(); idx++) { + + NumericType vv = oldFlux[idx]; + + auto const &neighborhood = pointNeighborhood.getNeighborIndices(idx); + NumericType sum = 1.; + auto const normal = geometry_.getPrimNormal(idx); + + for (auto const &nbi : neighborhood) { + auto nnormal = geometry_.getPrimNormal(nbi); + auto weight = DotProduct(normal, nnormal); + if (weight > 0.) { + vv += oldFlux[nbi] * weight; + sum += weight; + } + } + + flux[idx] = vv / sum; + } + } + + /// Returns the disk area for each geometry point + [[nodiscard]] std::vector getDiskAreas() { + return this->hitCounter_.getDiskAreas(); + } + + Geometry &getGeometry() { return geometry_; } + +private: + void checkRelativeError() { + auto error = this->getRelativeError(); + const int numPoints = error.size(); + int numThreads = 1; +#ifdef _OPENMP + numThreads = omp_get_max_threads(); +#endif + std::vector passed(numThreads, true); + +#pragma omp parallel shared(error, passed) + { + int threadId = 0; +#ifdef _OPENMP + threadId = omp_get_thread_num(); +#endif +#pragma omp for + for (int i = 0; i < numPoints; i++) { + if (error[i] > 0.05) { + passed[threadId] = false; + } + } + } + bool allPassed = true; + for (int i = 0; i < numThreads; i++) { + if (!passed[i]) { + allPassed = false; + break; + } + } + if (!allPassed) { + this->RTInfo_.warning = true; + Logger::getInstance() + .addWarning( + "Large relative error detected. Consider using more rays.") + .print(); + } + } + + void checkSettings() { + if (this->pParticle_ == nullptr) { + this->RTInfo_.error = true; + Logger::getInstance().addError( + "No particle was specified in rayTrace. Aborting."); + } + if (geometry_.checkGeometryEmpty()) { + this->RTInfo_.error = true; + Logger::getInstance().addError( + "No geometry was passed to rayTrace. Aborting."); + } + if ((D == 2 && this->sourceDirection_ == TraceDirection::POS_Z) || + (D == 2 && this->sourceDirection_ == TraceDirection::NEG_Z)) { + this->RTInfo_.error = true; + Logger::getInstance().addError( + "Invalid source direction in 2D geometry. Aborting."); + } + if (diskRadius_ > this->gridDelta_) { + this->RTInfo_.warning = true; + Logger::getInstance() + .addWarning("Disk radius should be smaller than grid delta. Hit " + "count normalization not correct.") + .print(); + } + } + +private: + GeometryDisk geometry_; + NumericType diskRadius_ = 0; +}; + +} // namespace viennaray diff --git a/include/viennaray/rayTraceKernel.hpp b/include/viennaray/rayTraceKernel.hpp index 9db193d..d5f0e7d 100644 --- a/include/viennaray/rayTraceKernel.hpp +++ b/include/viennaray/rayTraceKernel.hpp @@ -19,7 +19,7 @@ namespace rayInternal { using namespace viennaray; -template class TraceKernel { +template class TraceKernel { public: TraceKernel(RTCDevice &device, Geometry &geometry, Boundary &boundary, @@ -90,7 +90,7 @@ template class TraceKernel { // hit counters std::vector> threadLocalHitCounter(numThreads); hitCounter_.clear(); - hitCounter_.resize(geometry_.getNumPoints(), config_.calcFlux); + hitCounter_.resize(geometry_.getNumPrimitives(), config_.calcFlux); if (config_.calcFlux) { for (auto &hitC : threadLocalHitCounter) { hitC = hitCounter_; @@ -259,51 +259,61 @@ template class TraceKernel { /* -------- Surface hit -------- */ assert(rayHit.hit.geomID == geometryID && "Geometry hit ID invalid"); ++geoHits; - std::vector hitDiskIds(1, rayHit.hit.primID); + if constexpr (geoType == GeometryType::DISK) { + std::vector hitDiskIds(1, rayHit.hit.primID); #ifdef VIENNARAY_USE_WDIST - std::vector - impactDistances; // distances between point of impact and disk - // origins of hit disks - { // distance on first disk hit - const auto &disk = geometry_.getPrimRef(rayHit.hit.primID); - const auto &diskOrigin = - *reinterpret_cast const *>(&disk); - impactDistances.push_back(Distance(hitPoint, diskOrigin) + - 1e-6f); // add eps to avoid division by 0 - } + std::vector + impactDistances; // distances between point of impact and disk + // origins of hit disks + { // distance on first disk hit + const auto &disk = geometry_.getPrimRef(rayHit.hit.primID); + const auto &diskOrigin = + *reinterpret_cast const *>(&disk); + impactDistances.push_back( + Distance(hitPoint, diskOrigin) + + 1e-6f); // add eps to avoid division by 0 + } #endif - // check for additional intersections - for (const auto &id : - geometry_.getNeighborIndices(rayHit.hit.primID)) { - rtcNumericType distance; - if (checkLocalIntersection(ray, id, distance)) { - hitDiskIds.push_back(id); + // check for additional intersections + for (const auto &id : + geometry_.getNeighborIndices(rayHit.hit.primID)) { + rtcNumericType distance; + if (checkLocalIntersection(ray, id, distance)) { + hitDiskIds.push_back(id); #ifdef VIENNARAY_USE_WDIST - impactDistances.push_back(distance + 1e-6f); + impactDistances.push_back(distance + 1e-6f); #endif + } } - } - const size_t numDisksHit = hitDiskIds.size(); + const size_t numDisksHit = hitDiskIds.size(); #ifdef VIENNARAY_USE_WDIST - rtcNumericType invDistanceWeightSum = 0; - for (const auto &d : impactDistances) - invDistanceWeightSum += 1 / d; + rtcNumericType invDistanceWeightSum = 0; + for (const auto &d : impactDistances) + invDistanceWeightSum += 1 / d; #endif - // for each disk hit - for (size_t diskId = 0; diskId < numDisksHit; ++diskId) { - const auto matID = geometry_.getMaterialId(hitDiskIds[diskId]); - const auto normal = geometry_.getPrimNormal(hitDiskIds[diskId]); + // for each disk hit + for (size_t diskId = 0; diskId < numDisksHit; ++diskId) { + const auto matID = geometry_.getMaterialId(hitDiskIds[diskId]); + const auto normal = geometry_.getPrimNormal(hitDiskIds[diskId]); #ifdef VIENNARAY_USE_WDIST - auto distRayWeight = rayWeight / impactDistances[diskId] / - invDistanceWeightSum * numDisksHit; + auto distRayWeight = rayWeight / impactDistances[diskId] / + invDistanceWeightSum * numDisksHit; #else - auto distRayWeight = rayWeight; + auto distRayWeight = rayWeight; #endif - particle->surfaceCollision(distRayWeight, rayDir, normal, - hitDiskIds[diskId], matID, myLocalData, - pGlobalData_, rngState); + particle->surfaceCollision(distRayWeight, rayDir, normal, + hitDiskIds[diskId], matID, myLocalData, + pGlobalData_, rngState); + } + } else { + // Triangle Geometry + // single hit + particle->surfaceCollision( + rayWeight, rayDir, geomNormal, rayHit.hit.primID, + geometry_.getMaterialId(rayHit.hit.primID), myLocalData, + pGlobalData_, rngState); } // get sticking probability and reflection direction @@ -311,22 +321,25 @@ template class TraceKernel { rayWeight, rayDir, geomNormal, rayHit.hit.primID, geometry_.getMaterialId(rayHit.hit.primID), pGlobalData_, rngState); - auto valueToDrop = rayWeight * stickingDirection.first; - if (config_.calcFlux) { - for (size_t diskId = 0; diskId < numDisksHit; ++diskId) { -#ifdef VIENNARAY_USE_WDIST - auto distRayWeight = valueToDrop / impactDistances[diskId] / - invDistanceWeightSum * numDisksHit; -#else - auto distRayWeight = valueToDrop; -#endif - myHitCounter.use(hitDiskIds[diskId], distRayWeight); - } - } + // auto valueToDrop = rayWeight * stickingDirection.first; + // if (config_.calcFlux) { + // for (size_t diskId = 0; diskId < numDisksHit; ++diskId) + // { + // #ifdef VIENNARAY_USE_WDIST + // auto distRayWeight = valueToDrop / + // impactDistances[diskId] / + // invDistanceWeightSum * + // numDisksHit; + // #else + // auto distRayWeight = valueToDrop; + // #endif + // myHitCounter.use(hitDiskIds[diskId], distRayWeight); + // } + // } // Update ray weight - rayWeight -= valueToDrop; + rayWeight -= rayWeight * stickingDirection.first; if (rayWeight <= 0) { break; } @@ -346,8 +359,10 @@ template class TraceKernel { } while (reflect); } // end ray tracing for loop - auto diskAreas = computeDiskAreas(); - myHitCounter.setDiskAreas(diskAreas); + if constexpr (geoType == GeometryType::DISK) { + auto diskAreas = computeDiskAreas(); + myHitCounter.setDiskAreas(diskAreas); + } } // end parallel section timer.finish(); @@ -472,7 +487,7 @@ template class TraceKernel { constexpr double eps = 1e-3; auto bdBox = geometry_.getBoundingBox(); auto boundaryConds = boundary_.getBoundaryConditions(); - const auto numOfPrimitives = geometry_.getNumPoints(); + const auto numOfPrimitives = geometry_.getNumPrimitives(); const auto boundaryDirs = boundary_.getDirs(); auto areas = std::vector(numOfPrimitives, 0); DiskBoundingBoxXYIntersector bdDiskIntersector(bdBox); diff --git a/include/viennaray/rayTraceTriangle.hpp b/include/viennaray/rayTraceTriangle.hpp new file mode 100644 index 0000000..552f5a8 --- /dev/null +++ b/include/viennaray/rayTraceTriangle.hpp @@ -0,0 +1,235 @@ +#pragma once + +#include +#include + +#include + +namespace viennaray { + +using namespace viennacore; + +template +class TraceTriangle : public Trace { +public: + TraceTriangle() {} + ~TraceTriangle() { geometry_.releaseGeometry(); } + + /// Run the ray tracer + void apply() override { + checkSettings(); + auto boundingBox = geometry_.getBoundingBox(); + // rayInternal::adjustBoundingBox( + // boundingBox, this->sourceDirection_, this->diskRadius_); + auto traceSettings = rayInternal::getTraceSettings(this->sourceDirection_); + + auto boundary = Boundary( + this->device_, boundingBox, this->boundaryConditions_, traceSettings); + + std::array, 3> orthonormalBasis; + if (this->usePrimaryDirection_) + orthonormalBasis = + rayInternal::getOrthonormalBasis(this->primaryDirection_); + if (!this->useCustomSource) + this->pSource_ = std::make_shared>( + boundingBox, this->pParticle_->getSourceDistributionPower(), + traceSettings, geometry_.getNumPrimitives(), + this->usePrimaryDirection_, orthonormalBasis); + + auto localDataLabels = this->pParticle_->getLocalDataLabels(); + if (!localDataLabels.empty()) { + this->localData_.setNumberOfVectorData(localDataLabels.size()); + auto numPoints = geometry_.getNumPrimitives(); + for (int i = 0; i < localDataLabels.size(); ++i) { + this->localData_.setVectorData(i, numPoints, 0., localDataLabels[i]); + } + } + + rayInternal::TraceKernel tracer( + this->device_, geometry_, boundary, this->pSource_, this->pParticle_, + this->config_, this->dataLog_, this->hitCounter_, this->RTInfo_); + tracer.setTracingData(&this->localData_, this->pGlobalData_); + tracer.apply(); + this->config_.runNumber++; + + if (this->checkError_) + this->checkRelativeError(); + + boundary.releaseGeometry(); + } + + /// Set the ray tracing geometry + /// It is possible to set a 2D geometry with 3D points. + /// In this case the last dimension is ignored. + void setGeometry(std::vector> const &points, + std::vector> const &triangles, + const NumericType gridDelta) { + this->gridDelta_ = gridDelta; + this->geometry_.initGeometry(this->device_, points, triangles); + } + + /// Set material ID's for each geometry point. + /// If not set, all material IDs are default 0. + template void setMaterialIds(std::vector const &materialIds) { + geometry_.setMaterialIds(materialIds); + } + + /// Helper function to normalize the recorded flux in a post-processing step. + /// The flux can be normalized to the source flux and the maximum recorded + /// value. + void + normalizeFlux(std::vector &flux, + NormalizationType norm = NormalizationType::SOURCE) override { + assert(flux.size() == geometry_.getNumPrimitives() && + "Unequal number of points in normalizeFlux"); + + // auto diskArea = this->hitCounter_.getDiskAreas(); + // const auto totalDiskArea = diskRadius_ * diskRadius_ * M_PI; + + // switch (norm) { + // case NormalizationType::MAX: { + // auto maxv = *std::max_element(flux.begin(), flux.end()); + // #pragma omp parallel for + // for (int idx = 0; idx < flux.size(); ++idx) { + // flux[idx] *= (totalDiskArea / diskArea[idx]) / maxv; + // } + // break; + // } + + // case NormalizationType::SOURCE: { + // if (!this->pSource_) { + // Logger::getInstance() + // .addWarning( + // "No source was specified in rayTrace for the + // normalization.") + // .print(); + // break; + // } + // NumericType sourceArea = this->pSource_->getSourceArea(); + // auto numTotalRays = this->config_.numRaysFixed == 0 + // ? this->pSource_->getNumPrimitives() * + // this->config_.numRaysPerPoint + // : this->config_.numRaysFixed; + // NumericType normFactor = sourceArea / numTotalRays; + // #pragma omp parallel for + // for (int idx = 0; idx < flux.size(); ++idx) { + // flux[idx] *= normFactor / diskArea[idx]; + // } + // break; + // } + + // default: + // break; + // } + } + + /// Helper function to smooth the recorded flux by averaging over the + /// neighborhood in a post-processing step. + void smoothFlux(std::vector &flux, + int numNeighbors = 1) override { + assert(flux.size() == geometry_.getNumPrimitives() && + "Unequal number of points in smoothFlux"); + // auto oldFlux = flux; + // PointNeighborhood pointNeighborhood; + // if (numNeighbors == 1) { + // // re-use the neighborhood from the geometry + // pointNeighborhood = geometry_.getPointNeighborhood(); + // } else { + // // create a new neighborhood with a larger radius + // auto boundingBox = geometry_.getBoundingBox(); + // std::vector> + // points(geometry_.getNumPrimitives()); + // #pragma omp parallel for + // for (int idx = 0; idx < geometry_.getNumPrimitives(); idx++) { + // points[idx] = geometry_.getPoint(idx); + // } + // pointNeighborhood.template init<3>(points, numNeighbors * 2 * + // diskRadius_, + // boundingBox[0], boundingBox[1]); + // } + + // #pragma omp parallel for + // for (int idx = 0; idx < geometry_.getNumPrimitives(); idx++) { + + // NumericType vv = oldFlux[idx]; + + // auto const &neighborhood = + // pointNeighborhood.getNeighborIndices(idx); NumericType sum = 1.; + // auto const normal = geometry_.getPrimNormal(idx); + + // for (auto const &nbi : neighborhood) { + // auto nnormal = geometry_.getPrimNormal(nbi); + // auto weight = DotProduct(normal, nnormal); + // if (weight > 0.) { + // vv += oldFlux[nbi] * weight; + // sum += weight; + // } + // } + + // flux[idx] = vv / sum; + // } + } + +private: + void checkRelativeError() { + auto error = this->getRelativeError(); + const int numPoints = error.size(); + int numThreads = 1; +#ifdef _OPENMP + numThreads = omp_get_max_threads(); +#endif + std::vector passed(numThreads, true); + +#pragma omp parallel shared(error, passed) + { + int threadId = 0; +#ifdef _OPENMP + threadId = omp_get_thread_num(); +#endif +#pragma omp for + for (int i = 0; i < numPoints; i++) { + if (error[i] > 0.05) { + passed[threadId] = false; + } + } + } + bool allPassed = true; + for (int i = 0; i < numThreads; i++) { + if (!passed[i]) { + allPassed = false; + break; + } + } + if (!allPassed) { + this->RTInfo_.warning = true; + Logger::getInstance() + .addWarning( + "Large relative error detected. Consider using more rays.") + .print(); + } + } + + void checkSettings() { + if (this->pParticle_ == nullptr) { + this->RTInfo_.error = true; + Logger::getInstance().addError( + "No particle was specified in rayTrace. Aborting."); + } + if (geometry_.checkGeometryEmpty()) { + this->RTInfo_.error = true; + Logger::getInstance().addError( + "No geometry was passed to rayTrace. Aborting."); + } + if ((D == 2 && this->sourceDirection_ == TraceDirection::POS_Z) || + (D == 2 && this->sourceDirection_ == TraceDirection::NEG_Z)) { + this->RTInfo_.error = true; + Logger::getInstance().addError( + "Invalid source direction in 2D geometry. Aborting."); + } + } + +private: + GeometryTriangle geometry_; +}; + +} // namespace viennaray diff --git a/tests/traceInterface/traceInterface.cpp b/tests/traceInterface/traceInterface.cpp index 11ebfe8..a7f780a 100644 --- a/tests/traceInterface/traceInterface.cpp +++ b/tests/traceInterface/traceInterface.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include using namespace viennaray; @@ -40,7 +40,7 @@ int main() { boundaryConds[2] = BoundaryCondition::REFLECTIVE; auto particle = std::make_unique>(); - Trace rayTracer; + TraceDisk rayTracer; rayTracer.setParticleType(particle); rayTracer.setGeometry(points, normals, gridDelta); rayTracer.setBoundaryConditions(boundaryConds); diff --git a/tests/triangleGeometry/CMakeLists.txt b/tests/triangleGeometry/CMakeLists.txt new file mode 100644 index 0000000..80c9053 --- /dev/null +++ b/tests/triangleGeometry/CMakeLists.txt @@ -0,0 +1,8 @@ +project(triangleGeometry LANGUAGES CXX) + +add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") +target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) + +add_dependencies(ViennaRay_Tests ${PROJECT_NAME}) +add_test(NAME ${PROJECT_NAME} COMMAND $) +configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) diff --git a/tests/triangleGeometry/triangleGeometry.cpp b/tests/triangleGeometry/triangleGeometry.cpp new file mode 100644 index 0000000..a0790f0 --- /dev/null +++ b/tests/triangleGeometry/triangleGeometry.cpp @@ -0,0 +1,25 @@ +#include +#include +#include + +#include + +using namespace viennaray; + +int main() { + omp_set_num_threads(16); + constexpr int D = 3; + using NumericType = float; + Logger::setLogLevel(LogLevel::DEBUG); + + const auto mesh = gpu::readMeshFromFile("trenchMesh.dat"); + std::vector materialIds(mesh.triangles.size(), 7); + + auto device = rtcNewDevice(""); + GeometryTriangle geo; + geo.setMaterialIds(materialIds); + geo.initGeometry(device, mesh.nodes, mesh.triangles); + + TraceTriangle tracer; + tracer.setGeometry(mesh.nodes, mesh.triangles, mesh.gridDelta); +} \ No newline at end of file From 7dfdb01c1f269e7d2929772954760dc74ae161dd Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 15:57:13 +0100 Subject: [PATCH 02/12] First test working --- include/viennaray/rayGeometry.hpp | 13 -- include/viennaray/rayGeometryDisk.hpp | 16 +- include/viennaray/rayGeometryTriangle.hpp | 51 ++++-- include/viennaray/rayTraceTriangle.hpp | 175 +++++--------------- include/viennaray/rayUtil.hpp | 87 ++++++++++ tests/triangleGeometry/triangleGeometry.cpp | 23 ++- 6 files changed, 201 insertions(+), 164 deletions(-) diff --git a/include/viennaray/rayGeometry.hpp b/include/viennaray/rayGeometry.hpp index 6e07606..92c7c1d 100644 --- a/include/viennaray/rayGeometry.hpp +++ b/include/viennaray/rayGeometry.hpp @@ -26,17 +26,6 @@ template class Geometry { return {minCoords_, maxCoords_}; } - [[nodiscard]] std::vector const & - getNeighborIndices(const unsigned int idx) const { - assert(pointNeighborhood_.getDistance() > 0.); // check if initialized - return pointNeighborhood_.getNeighborIndices(idx); - } - - [[nodiscard]] PointNeighborhood const & - getPointNeighborhood() const { - return pointNeighborhood_; - } - [[nodiscard]] size_t getNumPrimitives() const { return numPrimitives_; } virtual Vec3D getPrimNormal(const unsigned int primID) const = 0; @@ -70,8 +59,6 @@ template class Geometry { std::vector materialIds_; std::array zero = {0.f, 0.f, 0.f, 0.f}; - - PointNeighborhood pointNeighborhood_; }; } // namespace viennaray diff --git a/include/viennaray/rayGeometryDisk.hpp b/include/viennaray/rayGeometryDisk.hpp index 5844487..e056383 100644 --- a/include/viennaray/rayGeometryDisk.hpp +++ b/include/viennaray/rayGeometryDisk.hpp @@ -101,8 +101,19 @@ class GeometryDisk : public Geometry { } // Initialize point neighborhood - this->pointNeighborhood_.template init( - points, 2 * discRadii_, this->minCoords_, this->maxCoords_); + pointNeighborhood_.template init(points, 2 * discRadii_, + this->minCoords_, this->maxCoords_); + } + + [[nodiscard]] std::vector const & + getNeighborIndices(const unsigned int idx) const { + assert(pointNeighborhood_.getDistance() > 0.); // check if initialized + return pointNeighborhood_.getNeighborIndices(idx); + } + + [[nodiscard]] PointNeighborhood const & + getPointNeighborhood() const { + return pointNeighborhood_; } [[nodiscard]] Vec3D getPoint(const unsigned int primID) const { @@ -179,6 +190,7 @@ class GeometryDisk : public Geometry { normal_vec_3f_t *pNormalVecBuffer_ = nullptr; NumericType discRadii_; // same for all points + PointNeighborhood pointNeighborhood_; }; } // namespace viennaray diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp index 575e7bc..bbf872a 100644 --- a/include/viennaray/rayGeometryTriangle.hpp +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -66,10 +66,37 @@ class GeometryTriangle : public Geometry { assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && "RTC Error: rtcSetNewGeometryBuffer elements"); + normals_.resize(this->numPrimitives_); + areas_.resize(this->numPrimitives_); for (size_t i = 0; i < this->numPrimitives_; ++i) { pTriangleBuffer_[i].uu = elements[i][0]; pTriangleBuffer_[i].vv = elements[i][1]; pTriangleBuffer_[i].ww = elements[i][2]; + + // precompute normals + auto const &v0 = points[elements[i][0]]; + auto const &v1 = points[elements[i][1]]; + auto const &v2 = points[elements[i][2]]; + auto edge1 = VectorType{v1[0] - v0[0], v1[1] - v0[1], + v1[2] - v0[2]}; + auto edge2 = VectorType{v2[0] - v0[0], v2[1] - v0[1], + v2[2] - v0[2]}; + auto normal = + VectorType{edge1[1] * edge2[2] - edge1[2] * edge2[1], + edge1[2] * edge2[0] - edge1[0] * edge2[2], + edge1[0] * edge2[1] - edge1[1] * edge2[0]}; + auto length = std::sqrt(normal[0] * normal[0] + normal[1] * normal[1] + + normal[2] * normal[2]); + if (length > 0) { + normal[0] /= length; + normal[1] /= length; + normal[2] /= length; + normals_[i] = normal; + areas_[i] = 0.5 * length; + } else { + normals_[i] = VectorType{0, 0, 0}; + areas_[i] = 0.; + } } #ifdef VIENNARAY_USE_RAY_MASKING @@ -83,11 +110,6 @@ class GeometryTriangle : public Geometry { if (this->materialIds_.empty()) { this->materialIds_.resize(this->numPrimitives_, 0); } - - // Initialize point neighborhood - /// TODO: - // this->pointNeighborhood_.template init( - // points, 2 * discRadii_, this->minCoords_, this->maxCoords_); } [[nodiscard]] Vec3D getTriangle(const unsigned int primID) const { @@ -99,15 +121,14 @@ class GeometryTriangle : public Geometry { Vec3D getPrimNormal(const unsigned int primID) const override { assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); - if (normals_.empty()) { - // calculate normal - /// TODO: - return Vec3D{0, 0, 0}; - } else { - return Vec3D{static_cast(normals_[primID][0]), - static_cast(normals_[primID][1]), - static_cast(normals_[primID][2])}; - } + return Vec3D{static_cast(normals_[primID][0]), + static_cast(normals_[primID][1]), + static_cast(normals_[primID][2])}; + } + + NumericType getPrimArea(const unsigned int primID) const { + assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); + return areas_[primID]; } // std::array &getPrimRef(unsigned int primID) override { @@ -134,6 +155,7 @@ class GeometryTriangle : public Geometry { // Attention: // This function must not be called when the RTCGeometry reference count is // > 1. Doing so leads to leaked memory buffers + normals_.clear(); if (pPointBuffer_ == nullptr || pTriangleBuffer_ == nullptr || this->pRtcGeometry_ == nullptr) { return; @@ -157,6 +179,7 @@ class GeometryTriangle : public Geometry { triangle_3u_t *pTriangleBuffer_ = nullptr; std::vector normals_; + std::vector areas_; }; } // namespace viennaray diff --git a/include/viennaray/rayTraceTriangle.hpp b/include/viennaray/rayTraceTriangle.hpp index 552f5a8..3c60829 100644 --- a/include/viennaray/rayTraceTriangle.hpp +++ b/include/viennaray/rayTraceTriangle.hpp @@ -9,18 +9,24 @@ namespace viennaray { using namespace viennacore; -template +template class TraceTriangle : public Trace { public: - TraceTriangle() {} + TraceTriangle() { + if (D == 2) { + Logger::getInstance() + .addError("TraceTriangle not implemented in 2D.") + .print(); + } + } ~TraceTriangle() { geometry_.releaseGeometry(); } /// Run the ray tracer void apply() override { checkSettings(); auto boundingBox = geometry_.getBoundingBox(); - // rayInternal::adjustBoundingBox( - // boundingBox, this->sourceDirection_, this->diskRadius_); + rayInternal::adjustBoundingBox( + boundingBox, this->sourceDirection_, this->gridDelta_); auto traceSettings = rayInternal::getTraceSettings(this->sourceDirection_); auto boundary = Boundary( @@ -52,9 +58,6 @@ class TraceTriangle : public Trace { tracer.apply(); this->config_.runNumber++; - if (this->checkError_) - this->checkRelativeError(); - boundary.releaseGeometry(); } @@ -83,132 +86,50 @@ class TraceTriangle : public Trace { assert(flux.size() == geometry_.getNumPrimitives() && "Unequal number of points in normalizeFlux"); - // auto diskArea = this->hitCounter_.getDiskAreas(); - // const auto totalDiskArea = diskRadius_ * diskRadius_ * M_PI; - - // switch (norm) { - // case NormalizationType::MAX: { - // auto maxv = *std::max_element(flux.begin(), flux.end()); - // #pragma omp parallel for - // for (int idx = 0; idx < flux.size(); ++idx) { - // flux[idx] *= (totalDiskArea / diskArea[idx]) / maxv; - // } - // break; - // } - - // case NormalizationType::SOURCE: { - // if (!this->pSource_) { - // Logger::getInstance() - // .addWarning( - // "No source was specified in rayTrace for the - // normalization.") - // .print(); - // break; - // } - // NumericType sourceArea = this->pSource_->getSourceArea(); - // auto numTotalRays = this->config_.numRaysFixed == 0 - // ? this->pSource_->getNumPrimitives() * - // this->config_.numRaysPerPoint - // : this->config_.numRaysFixed; - // NumericType normFactor = sourceArea / numTotalRays; - // #pragma omp parallel for - // for (int idx = 0; idx < flux.size(); ++idx) { - // flux[idx] *= normFactor / diskArea[idx]; - // } - // break; - // } - - // default: - // break; - // } + switch (norm) { + case NormalizationType::MAX: { + auto maxv = *std::max_element(flux.begin(), flux.end()); +#pragma omp parallel for + for (int idx = 0; idx < flux.size(); ++idx) { + flux[idx] /= maxv * geometry_.getPrimArea(idx); + } + break; + } + + case NormalizationType::SOURCE: { + if (!this->pSource_) { + Logger::getInstance() + .addWarning( + "No source was specified in rayTrace for the normalization.") + .print(); + break; + } + NumericType sourceArea = this->pSource_->getSourceArea(); + auto numTotalRays = + this->config_.numRaysFixed == 0 + ? this->pSource_->getNumPoints() * this->config_.numRaysPerPoint + : this->config_.numRaysFixed; + NumericType normFactor = sourceArea / numTotalRays; +#pragma omp parallel for + for (int idx = 0; idx < flux.size(); ++idx) { + flux[idx] *= normFactor / geometry_.getPrimArea(idx); + } + break; + } + + default: + break; + } } /// Helper function to smooth the recorded flux by averaging over the /// neighborhood in a post-processing step. void smoothFlux(std::vector &flux, int numNeighbors = 1) override { - assert(flux.size() == geometry_.getNumPrimitives() && - "Unequal number of points in smoothFlux"); - // auto oldFlux = flux; - // PointNeighborhood pointNeighborhood; - // if (numNeighbors == 1) { - // // re-use the neighborhood from the geometry - // pointNeighborhood = geometry_.getPointNeighborhood(); - // } else { - // // create a new neighborhood with a larger radius - // auto boundingBox = geometry_.getBoundingBox(); - // std::vector> - // points(geometry_.getNumPrimitives()); - // #pragma omp parallel for - // for (int idx = 0; idx < geometry_.getNumPrimitives(); idx++) { - // points[idx] = geometry_.getPoint(idx); - // } - // pointNeighborhood.template init<3>(points, numNeighbors * 2 * - // diskRadius_, - // boundingBox[0], boundingBox[1]); - // } - - // #pragma omp parallel for - // for (int idx = 0; idx < geometry_.getNumPrimitives(); idx++) { - - // NumericType vv = oldFlux[idx]; - - // auto const &neighborhood = - // pointNeighborhood.getNeighborIndices(idx); NumericType sum = 1.; - // auto const normal = geometry_.getPrimNormal(idx); - - // for (auto const &nbi : neighborhood) { - // auto nnormal = geometry_.getPrimNormal(nbi); - // auto weight = DotProduct(normal, nnormal); - // if (weight > 0.) { - // vv += oldFlux[nbi] * weight; - // sum += weight; - // } - // } - - // flux[idx] = vv / sum; - // } + // no smoothing } private: - void checkRelativeError() { - auto error = this->getRelativeError(); - const int numPoints = error.size(); - int numThreads = 1; -#ifdef _OPENMP - numThreads = omp_get_max_threads(); -#endif - std::vector passed(numThreads, true); - -#pragma omp parallel shared(error, passed) - { - int threadId = 0; -#ifdef _OPENMP - threadId = omp_get_thread_num(); -#endif -#pragma omp for - for (int i = 0; i < numPoints; i++) { - if (error[i] > 0.05) { - passed[threadId] = false; - } - } - } - bool allPassed = true; - for (int i = 0; i < numThreads; i++) { - if (!passed[i]) { - allPassed = false; - break; - } - } - if (!allPassed) { - this->RTInfo_.warning = true; - Logger::getInstance() - .addWarning( - "Large relative error detected. Consider using more rays.") - .print(); - } - } - void checkSettings() { if (this->pParticle_ == nullptr) { this->RTInfo_.error = true; @@ -220,12 +141,6 @@ class TraceTriangle : public Trace { Logger::getInstance().addError( "No geometry was passed to rayTrace. Aborting."); } - if ((D == 2 && this->sourceDirection_ == TraceDirection::POS_Z) || - (D == 2 && this->sourceDirection_ == TraceDirection::NEG_Z)) { - this->RTInfo_.error = true; - Logger::getInstance().addError( - "Invalid source direction in 2D geometry. Aborting."); - } } private: diff --git a/include/viennaray/rayUtil.hpp b/include/viennaray/rayUtil.hpp index 70a75ab..bec8995 100644 --- a/include/viennaray/rayUtil.hpp +++ b/include/viennaray/rayUtil.hpp @@ -413,6 +413,93 @@ void writeVTK(const std::string &filename, f.close(); } +template +void writeVTP(const std::string &filename, + const std::vector> &points, + const std::vector> &triangles, + const std::vector &flux) { + std::ofstream f(filename.c_str()); + if (!f.is_open()) + return; + + const size_t nPoints = points.size(); + const size_t nPolys = triangles.size(); + + f << "\n"; + f << "\n"; + f << " \n"; + f << " \n"; + + // Points + f << " \n"; + f << " \n"; + for (size_t i = 0; i < nPoints; ++i) { + const auto &p = points[i]; + f << static_cast(p[0]) << " " << static_cast(p[1]) << " " + << static_cast(p[2]) << "\n"; + } + f << " \n"; + f << " \n"; + + // Polys (triangles) + f << " \n"; + // connectivity + f << " \n"; + for (size_t i = 0; i < nPolys; ++i) { + const auto &t = triangles[i]; + f << static_cast(t[0]) << " " << static_cast(t[1]) << " " + << static_cast(t[2]) << "\n"; + } + f << " \n"; + + // offsets + f << " \n"; + int offset = 0; + for (size_t i = 0; i < nPolys; ++i) { + offset += 3; + f << offset << "\n"; + } + f << " \n"; + f << " \n"; + + // Decide whether flux is per-point or per-cell + if (flux.size() == nPoints) { + f << " \n"; + f << " \n"; + for (size_t i = 0; i < nPoints; ++i) + f << ((std::abs(flux[i]) < 1e-6) ? 0.0f : static_cast(flux[i])) + << "\n"; + f << " \n"; + f << " \n"; + } else if (flux.size() == nPolys) { + f << " \n"; + f << " \n"; + for (size_t i = 0; i < nPolys; ++i) + f << ((std::abs(flux[i]) < 1e-6) ? 0.0f : static_cast(flux[i])) + << "\n"; + f << " \n"; + f << " \n"; + } else if (!flux.empty()) { + // size mismatch: write neither but warn to cerr + std::cerr << "writeVTP: flux size does not match points or polys; skipping " + "data\n"; + } + + f << " \n"; + f << " \n"; + f << "\n"; + + f.close(); +} + /* -------------------------------------------------------------- */ template diff --git a/tests/triangleGeometry/triangleGeometry.cpp b/tests/triangleGeometry/triangleGeometry.cpp index a0790f0..ebc0a98 100644 --- a/tests/triangleGeometry/triangleGeometry.cpp +++ b/tests/triangleGeometry/triangleGeometry.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -13,13 +14,25 @@ int main() { Logger::setLogLevel(LogLevel::DEBUG); const auto mesh = gpu::readMeshFromFile("trenchMesh.dat"); - std::vector materialIds(mesh.triangles.size(), 7); + // std::vector materialIds(mesh.triangles.size(), 7); - auto device = rtcNewDevice(""); - GeometryTriangle geo; - geo.setMaterialIds(materialIds); - geo.initGeometry(device, mesh.nodes, mesh.triangles); + // auto device = rtcNewDevice(""); + // GeometryTriangle geo; + // geo.setMaterialIds(materialIds); + // geo.initGeometry(device, mesh.nodes, mesh.triangles); TraceTriangle tracer; tracer.setGeometry(mesh.nodes, mesh.triangles, mesh.gridDelta); + + auto particle = + std::make_unique>(1.0, "flux"); + tracer.setParticleType(particle); + + tracer.apply(); + + auto &localData = tracer.getLocalData(); + tracer.normalizeFlux(localData.getVectorData(0), NormalizationType::SOURCE); + + rayInternal::writeVTP("triangleGeometryOutput.vtp", mesh.nodes, + mesh.triangles, localData.getVectorData(0)); } \ No newline at end of file From f2d1126f8d74027b052cd20e301dbc5ded1cfcfa Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 16:20:38 +0100 Subject: [PATCH 03/12] Fix tests and examples --- examples/{trench2D => disk2D}/CMakeLists.txt | 2 +- .../trench2D.cpp => disk2D/disk2D.cpp} | 14 ++++--- .../{trench2D => disk2D}/trenchGrid2D.dat | 0 examples/{trench => disk3D}/CMakeLists.txt | 2 +- .../{trench/trench.cpp => disk3D/disk3D.cpp} | 21 +++++++--- examples/{trench => disk3D}/trenchGrid3D.dat | 0 examples/triangle3D/CMakeLists.txt | 7 ++++ examples/triangle3D/triangle3D.cpp | 40 +++++++++++++++++++ gpu/examples/CMakeLists.txt | 2 +- include/viennaray/rayGeometry.hpp | 6 +++ include/viennaray/rayGeometryDisk.hpp | 2 +- include/viennaray/rayTraceDisk.hpp | 8 ++-- tests/boundaryHit/boundaryHit.cpp | 8 ++-- tests/boundaryHit2D/boundaryHit2D.cpp | 6 +-- tests/buildBoundary/buildBoundary.cpp | 4 +- tests/buildBoundary2D/buildBoundary2D.cpp | 4 +- tests/createGeometry/createGeometry.cpp | 4 +- tests/createRay/createRay.cpp | 34 ++++++++-------- tests/createSourceGrid/createSourceGrid.cpp | 4 +- tests/diskAreas/diskAreas.cpp | 12 +++--- .../diskBoundingBoxIntersector.cpp | 6 +-- tests/errorChecking/CMakeLists.txt | 7 ---- tests/errorChecking/errorChecking.cpp | 37 ----------------- tests/intersectionTest/intersectionTest.cpp | 4 +- tests/particle/particle.cpp | 6 +-- tests/pointNeighborhood/pointNeighborhood.cpp | 6 +-- .../pointNeighborhood2D.cpp | 6 +-- tests/smoothing/smoothing.cpp | 4 +- tests/trace2D/trace2D.cpp | 4 +- tests/triangleGeometry/triangleGeometry.cpp | 28 +++---------- 30 files changed, 145 insertions(+), 143 deletions(-) rename examples/{trench2D => disk2D}/CMakeLists.txt (88%) rename examples/{trench2D/trench2D.cpp => disk2D/disk2D.cpp} (87%) rename examples/{trench2D => disk2D}/trenchGrid2D.dat (100%) rename examples/{trench => disk3D}/CMakeLists.txt (89%) rename examples/{trench/trench.cpp => disk3D/disk3D.cpp} (81%) rename examples/{trench => disk3D}/trenchGrid3D.dat (100%) create mode 100644 examples/triangle3D/CMakeLists.txt create mode 100644 examples/triangle3D/triangle3D.cpp delete mode 100644 tests/errorChecking/CMakeLists.txt delete mode 100644 tests/errorChecking/errorChecking.cpp diff --git a/examples/trench2D/CMakeLists.txt b/examples/disk2D/CMakeLists.txt similarity index 88% rename from examples/trench2D/CMakeLists.txt rename to examples/disk2D/CMakeLists.txt index ccb918c..86cd9a1 100644 --- a/examples/trench2D/CMakeLists.txt +++ b/examples/disk2D/CMakeLists.txt @@ -1,4 +1,4 @@ -project(trench2D LANGUAGES CXX) +project(disk2D LANGUAGES CXX) add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) diff --git a/examples/trench2D/trench2D.cpp b/examples/disk2D/disk2D.cpp similarity index 87% rename from examples/trench2D/trench2D.cpp rename to examples/disk2D/disk2D.cpp index e823534..d27b80b 100644 --- a/examples/trench2D/trench2D.cpp +++ b/examples/disk2D/disk2D.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include using namespace viennaray; @@ -36,9 +36,10 @@ int main() { // defined, but has to interface the rayParticle class and // provide the functions: initNew(...), surfaceCollision(...), // surfaceReflection(...). - auto particle = std::make_unique>(); + auto particle = + std::make_unique>(0.5, "flux"); - Trace rayTracer; + TraceDisk rayTracer; rayTracer.setGeometry(points, normals, gridDelta); rayTracer.setBoundaryConditions(boundaryConds); rayTracer.setParticleType(particle); @@ -51,9 +52,10 @@ int main() { rayTracer.apply(); // Extract the normalized hit counts for each geometry point - auto normalizedFlux = rayTracer.getNormalizedFlux(NormalizationType::SOURCE); - rayInternal::writeVTK("trenchResult.vtk", points, - normalizedFlux); + auto &flux = rayTracer.getLocalData().getVectorData("flux"); + rayTracer.normalizeFlux(flux, NormalizationType::SOURCE); + + rayInternal::writeVTK("trenchResult.vtk", points, flux); return 0; } diff --git a/examples/trench2D/trenchGrid2D.dat b/examples/disk2D/trenchGrid2D.dat similarity index 100% rename from examples/trench2D/trenchGrid2D.dat rename to examples/disk2D/trenchGrid2D.dat diff --git a/examples/trench/CMakeLists.txt b/examples/disk3D/CMakeLists.txt similarity index 89% rename from examples/trench/CMakeLists.txt rename to examples/disk3D/CMakeLists.txt index 08eaee7..11ce62d 100644 --- a/examples/trench/CMakeLists.txt +++ b/examples/disk3D/CMakeLists.txt @@ -1,4 +1,4 @@ -project(trench LANGUAGES CXX) +project(disk3D LANGUAGES CXX) add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) diff --git a/examples/trench/trench.cpp b/examples/disk3D/disk3D.cpp similarity index 81% rename from examples/trench/trench.cpp rename to examples/disk3D/disk3D.cpp index c78d903..b4bcb02 100644 --- a/examples/trench/trench.cpp +++ b/examples/disk3D/disk3D.cpp @@ -1,6 +1,8 @@ #include #include -#include +#include + +#include using namespace viennaray; @@ -37,9 +39,10 @@ int main() { // defined, but has to interface the rayParticle class and // provide the functions: initNew(...), surfaceCollision(...), // surfaceReflection(...). - auto particle = std::make_unique>(); + auto particle = + std::make_unique>(0.1, "flux"); - Trace rayTracer; + TraceDisk rayTracer; rayTracer.setGeometry(points, normals, gridDelta); rayTracer.setBoundaryConditions(boundaryConds); rayTracer.setParticleType(particle); @@ -48,12 +51,18 @@ int main() { rayTracer.setNumberOfRaysPerPoint(2000); // Run the ray tracer + Timer timer; + timer.start(); rayTracer.apply(); + timer.finish(); + + std::cout << "Tracing time: " << timer.currentDuration / 1e9 << " s\n"; // Extract the normalized hit counts for each geometry point - auto normalizedFlux = rayTracer.getNormalizedFlux(NormalizationType::SOURCE); - rayInternal::writeVTK("trenchResult.vtk", points, - normalizedFlux); + auto &flux = rayTracer.getLocalData().getVectorData("flux"); + rayTracer.normalizeFlux(flux, NormalizationType::SOURCE); + + rayInternal::writeVTK("trenchResult.vtk", points, flux); return 0; } diff --git a/examples/trench/trenchGrid3D.dat b/examples/disk3D/trenchGrid3D.dat similarity index 100% rename from examples/trench/trenchGrid3D.dat rename to examples/disk3D/trenchGrid3D.dat diff --git a/examples/triangle3D/CMakeLists.txt b/examples/triangle3D/CMakeLists.txt new file mode 100644 index 0000000..cecdce4 --- /dev/null +++ b/examples/triangle3D/CMakeLists.txt @@ -0,0 +1,7 @@ +project(triangle3D LANGUAGES CXX) + +add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") +target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) +configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) + +add_dependencies(ViennaRay_Examples ${PROJECT_NAME}) diff --git a/examples/triangle3D/triangle3D.cpp b/examples/triangle3D/triangle3D.cpp new file mode 100644 index 0000000..195954c --- /dev/null +++ b/examples/triangle3D/triangle3D.cpp @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +#include + +#include + +using namespace viennaray; + +int main() { + omp_set_num_threads(16); + constexpr int D = 3; + using NumericType = float; + Logger::setLogLevel(LogLevel::DEBUG); + + const auto mesh = gpu::readMeshFromFile("trenchMesh.dat"); + + TraceTriangle tracer; + tracer.setGeometry(mesh.nodes, mesh.triangles, mesh.gridDelta); + + auto particle = + std::make_unique>(0.1, "flux"); + tracer.setParticleType(particle); + tracer.setNumberOfRaysPerPoint(2000); + + Timer timer; + timer.start(); + tracer.apply(); + timer.finish(); + + std::cout << "Tracing time: " << timer.currentDuration / 1e9 << " s\n"; + + auto &localData = tracer.getLocalData(); + tracer.normalizeFlux(localData.getVectorData(0), NormalizationType::SOURCE); + + rayInternal::writeVTP("triangleGeometryOutput.vtp", mesh.nodes, + mesh.triangles, localData.getVectorData(0)); +} \ No newline at end of file diff --git a/gpu/examples/CMakeLists.txt b/gpu/examples/CMakeLists.txt index 9b8bde3..470b201 100644 --- a/gpu/examples/CMakeLists.txt +++ b/gpu/examples/CMakeLists.txt @@ -7,7 +7,7 @@ configure_file(Resources/trenchMesh.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.d add_dependencies(ViennaRay-GPU_Examples ${target_name}) add_gpu_executable(GPU_trenchDisks target_name trenchDisks.cpp) -configure_file(${CMAKE_SOURCE_DIR}/examples/trench/trenchGrid3D.dat +configure_file(${CMAKE_SOURCE_DIR}/examples/disk3D/trenchGrid3D.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchGrid3D.dat COPYONLY) add_dependencies(ViennaRay-GPU_Examples ${target_name}) diff --git a/include/viennaray/rayGeometry.hpp b/include/viennaray/rayGeometry.hpp index 92c7c1d..3e7c347 100644 --- a/include/viennaray/rayGeometry.hpp +++ b/include/viennaray/rayGeometry.hpp @@ -36,6 +36,11 @@ template class Geometry { return *reinterpret_cast *>(zero.data()); } + virtual std::vector const & + getNeighborIndices(const unsigned int idx) const { + return emptyNeighborIndices_; + } + [[nodiscard]] RTCGeometry const &getRTCGeometry() const { return pRtcGeometry_; } @@ -59,6 +64,7 @@ template class Geometry { std::vector materialIds_; std::array zero = {0.f, 0.f, 0.f, 0.f}; + std::vector emptyNeighborIndices_ = {}; }; } // namespace viennaray diff --git a/include/viennaray/rayGeometryDisk.hpp b/include/viennaray/rayGeometryDisk.hpp index e056383..5117e96 100644 --- a/include/viennaray/rayGeometryDisk.hpp +++ b/include/viennaray/rayGeometryDisk.hpp @@ -106,7 +106,7 @@ class GeometryDisk : public Geometry { } [[nodiscard]] std::vector const & - getNeighborIndices(const unsigned int idx) const { + getNeighborIndices(const unsigned int idx) const override { assert(pointNeighborhood_.getDistance() > 0.); // check if initialized return pointNeighborhood_.getNeighborIndices(idx); } diff --git a/include/viennaray/rayTraceDisk.hpp b/include/viennaray/rayTraceDisk.hpp index 8d58ce7..de1b77d 100644 --- a/include/viennaray/rayTraceDisk.hpp +++ b/include/viennaray/rayTraceDisk.hpp @@ -52,8 +52,8 @@ class TraceDisk : public Trace { tracer.apply(); this->config_.runNumber++; - if (this->checkError_) - this->checkRelativeError(); + // if (this->checkError_) + // this->checkRelativeError(); boundary.releaseGeometry(); } @@ -98,7 +98,7 @@ class TraceDisk : public Trace { /// value. void normalizeFlux(std::vector &flux, NormalizationType norm = NormalizationType::SOURCE) { - assert(flux.size() == geometry_.getNumPoints() && + assert(flux.size() == geometry_.getNumPrimitives() && "Unequal number of points in normalizeFlux"); auto diskArea = this->hitCounter_.getDiskAreas(); @@ -144,7 +144,7 @@ class TraceDisk : public Trace { /// neighborhood in a post-processing step. void smoothFlux(std::vector &flux, int numNeighbors = 1) override { - assert(flux.size() == geometry_.getNumPoints() && + assert(flux.size() == geometry_.getNumPrimitives() && "Unequal number of points in smoothFlux"); auto oldFlux = flux; PointNeighborhood pointNeighborhood; diff --git a/tests/boundaryHit/boundaryHit.cpp b/tests/boundaryHit/boundaryHit.cpp index 8551e12..3bd800f 100644 --- a/tests/boundaryHit/boundaryHit.cpp +++ b/tests/boundaryHit/boundaryHit.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -22,7 +22,7 @@ int main() { std::vector> normals; rayInternal::createPlaneGrid(gridDelta, extent, {0, 1, 2}, points, normals); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); BoundaryCondition boundCons[D]; { @@ -82,7 +82,7 @@ int main() { std::vector> normals; rayInternal::createPlaneGrid(gridDelta, extent, {0, 2, 1}, points, normals); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); BoundaryCondition boundCons[D]; { @@ -142,7 +142,7 @@ int main() { std::vector> normals; rayInternal::createPlaneGrid(gridDelta, extent, {0, 1, 2}, points, normals); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); BoundaryCondition boundCons[D]; { diff --git a/tests/boundaryHit2D/boundaryHit2D.cpp b/tests/boundaryHit2D/boundaryHit2D.cpp index ab048ee..d003ae1 100644 --- a/tests/boundaryHit2D/boundaryHit2D.cpp +++ b/tests/boundaryHit2D/boundaryHit2D.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -27,7 +27,7 @@ int main() { normals.push_back(normal); } - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); boundCons[1] = BoundaryCondition::REFLECTIVE; @@ -140,7 +140,7 @@ int main() { normals.push_back(normal); } - Geometry geometry2; + GeometryDisk geometry2; geometry2.initGeometry(device, points, normals, gridDelta); boundCons[0] = BoundaryCondition::REFLECTIVE; { diff --git a/tests/buildBoundary/buildBoundary.cpp b/tests/buildBoundary/buildBoundary.cpp index f21f9ca..2beff5a 100644 --- a/tests/buildBoundary/buildBoundary.cpp +++ b/tests/buildBoundary/buildBoundary.cpp @@ -1,4 +1,4 @@ -#include +#include #include using namespace viennaray; @@ -16,7 +16,7 @@ int main() { auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); BoundaryCondition mBoundaryConds[D] = {}; diff --git a/tests/buildBoundary2D/buildBoundary2D.cpp b/tests/buildBoundary2D/buildBoundary2D.cpp index 7662516..aa38b79 100644 --- a/tests/buildBoundary2D/buildBoundary2D.cpp +++ b/tests/buildBoundary2D/buildBoundary2D.cpp @@ -1,4 +1,4 @@ -#include +#include #include using namespace viennaray; @@ -16,7 +16,7 @@ int main() { points, normals); auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); { diff --git a/tests/createGeometry/createGeometry.cpp b/tests/createGeometry/createGeometry.cpp index a5cd090..2d13601 100644 --- a/tests/createGeometry/createGeometry.cpp +++ b/tests/createGeometry/createGeometry.cpp @@ -1,4 +1,4 @@ -#include +#include #include using namespace viennaray; @@ -14,7 +14,7 @@ int main() { points, normals); auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry<3>(device, points, normals, gridDelta); auto boundingBox = geometry.getBoundingBox(); diff --git a/tests/createRay/createRay.cpp b/tests/createRay/createRay.cpp index c8cf69b..a62dc82 100644 --- a/tests/createRay/createRay.cpp +++ b/tests/createRay/createRay.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -29,7 +29,7 @@ int main() { points, normals); auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); unsigned seed = 31; @@ -44,8 +44,8 @@ int main() { auto traceSetting = rayInternal::getTraceSettings(direction); std::array, 3> orthoBasis; auto source = SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), false, - orthoBasis); + geometry.getNumPrimitives(), + false, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { @@ -66,8 +66,8 @@ int main() { auto traceSetting = rayInternal::getTraceSettings(direction); std::array, 3> orthoBasis; auto source = SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), false, - orthoBasis); + geometry.getNumPrimitives(), + false, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { @@ -88,8 +88,8 @@ int main() { auto traceSetting = rayInternal::getTraceSettings(direction); std::array, 3> orthoBasis; auto source = SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), false, - orthoBasis); + geometry.getNumPrimitives(), + false, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { @@ -110,8 +110,8 @@ int main() { auto traceSetting = rayInternal::getTraceSettings(direction); std::array, 3> orthoBasis; auto source = SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), false, - orthoBasis); + geometry.getNumPrimitives(), + false, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { @@ -132,8 +132,8 @@ int main() { auto traceSetting = rayInternal::getTraceSettings(direction); std::array, 3> orthoBasis; auto source = SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), false, - orthoBasis); + geometry.getNumPrimitives(), + false, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { @@ -154,8 +154,8 @@ int main() { auto traceSetting = rayInternal::getTraceSettings(direction); std::array, 3> orthoBasis; auto source = SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), false, - orthoBasis); + geometry.getNumPrimitives(), + false, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { @@ -178,9 +178,9 @@ int main() { viennacore::Vec3D primaryDir{1., 1., -1.}; viennacore::Normalize(primaryDir); auto orthoBasis = rayInternal::getOrthonormalBasis(primaryDir); - auto source = - SourceRandom(boundingBox, 2., traceSetting, - geometry.getNumPoints(), true, orthoBasis); + auto source = SourceRandom(boundingBox, 2., traceSetting, + geometry.getNumPrimitives(), + true, orthoBasis); alignas(128) auto rayHit = RTCRayHit{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; for (size_t i = 0; i < 10; ++i) { diff --git a/tests/createSourceGrid/createSourceGrid.cpp b/tests/createSourceGrid/createSourceGrid.cpp index 85cbb32..a785930 100644 --- a/tests/createSourceGrid/createSourceGrid.cpp +++ b/tests/createSourceGrid/createSourceGrid.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -17,7 +17,7 @@ int main() { points, normals); auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); auto boundingBox = geometry.getBoundingBox(); auto traceSettings = rayInternal::getTraceSettings(TraceDirection::POS_Z); diff --git a/tests/diskAreas/diskAreas.cpp b/tests/diskAreas/diskAreas.cpp index f8bfdd7..270eea7 100644 --- a/tests/diskAreas/diskAreas.cpp +++ b/tests/diskAreas/diskAreas.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -27,7 +27,7 @@ int main() { const auto globalData = TracingData(); HitCounter hitCounter; - Geometry geometry; + GeometryDisk geometry; auto diskRadius = gridDelta * rayInternal::DiskFactor; geometry.initGeometry(device, points, normals, diskRadius); @@ -42,13 +42,13 @@ int main() { traceSettings); std::array, 3> orthoBasis; auto raySource = std::make_unique>( - boundingBox, 1., traceSettings, geometry.getNumPoints(), false, + boundingBox, 1., traceSettings, geometry.getNumPrimitives(), false, orthoBasis); TestParticle particle; auto cp = particle.clone(); localData.setNumberOfVectorData(cp->getLocalDataLabels().size()); - auto numPoints = geometry.getNumPoints(); + auto numPoints = geometry.getNumPrimitives(); localData.resizeAllVectorData(numPoints, 0.); DataLog log; @@ -56,7 +56,7 @@ int main() { rayInternal::KernelConfig config; config.numRaysPerPoint = 1; config.numRaysFixed = 0; - rayInternal::TraceKernel tracer( + rayInternal::TraceKernel tracer( device, geometry, boundary, std::move(raySource), cp, config, log, hitCounter, info); tracer.setTracingData(&localData, &globalData); @@ -65,7 +65,7 @@ int main() { auto boundaryDirs = boundary.getDirs(); auto wholeDiskArea = diskRadius * diskRadius * M_PI; - for (unsigned int idx = 0; idx < geometry.getNumPoints(); ++idx) { + for (unsigned int idx = 0; idx < geometry.getNumPrimitives(); ++idx) { auto const &disk = geometry.getPrimRef(idx); if (std::fabs(disk[boundaryDirs[0]] - boundingBox[0][boundaryDirs[0]]) < eps || diff --git a/tests/diskBoundingBoxIntersector/diskBoundingBoxIntersector.cpp b/tests/diskBoundingBoxIntersector/diskBoundingBoxIntersector.cpp index ced1a0c..7fdc488 100644 --- a/tests/diskBoundingBoxIntersector/diskBoundingBoxIntersector.cpp +++ b/tests/diskBoundingBoxIntersector/diskBoundingBoxIntersector.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -15,13 +15,13 @@ template void runTest() { points, normals); auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); auto boundingBox = geometry.getBoundingBox(); DiskBoundingBoxXYIntersector bdDiskIntersector(boundingBox); - for (size_t i = 0; i < geometry.getNumPoints(); ++i) { + for (size_t i = 0; i < geometry.getNumPrimitives(); ++i) { auto const &normal = geometry.getNormalRef(i); auto const &disk = geometry.getPrimRef(i); diff --git a/tests/errorChecking/CMakeLists.txt b/tests/errorChecking/CMakeLists.txt deleted file mode 100644 index deb2cf4..0000000 --- a/tests/errorChecking/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -project(errorChecking LANGUAGES CXX) - -add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") -target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) - -add_dependencies(ViennaRay_Tests ${PROJECT_NAME}) -add_test(NAME ${PROJECT_NAME} COMMAND $) diff --git a/tests/errorChecking/errorChecking.cpp b/tests/errorChecking/errorChecking.cpp deleted file mode 100644 index 626a9bc..0000000 --- a/tests/errorChecking/errorChecking.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include - -using namespace viennaray; - -int main() { - constexpr int D = 3; - using NumericType = float; - omp_set_num_threads(4); - - NumericType extent = 5; - NumericType gridDelta = 0.5; - std::vector> points; - std::vector> normals; - rayInternal::createPlaneGrid(gridDelta, extent, {0, 1, 2}, points, normals); - - BoundaryCondition boundaryConds[D]; - boundaryConds[0] = BoundaryCondition::REFLECTIVE; - boundaryConds[1] = BoundaryCondition::REFLECTIVE; - boundaryConds[2] = BoundaryCondition::REFLECTIVE; - auto particle = std::make_unique>(); - - Trace rayTracer; - rayTracer.setParticleType(particle); - rayTracer.setGeometry(points, normals, gridDelta); - rayTracer.setBoundaryConditions(boundaryConds); - rayTracer.setSourceDirection(TraceDirection::POS_Z); - rayTracer.setNumberOfRaysPerPoint(10); - rayTracer.setUseRandomSeeds(false); - rayTracer.apply(); - - auto info = rayTracer.getRayTraceInfo(); - VC_TEST_ASSERT(info.warning); - - return 0; -} diff --git a/tests/intersectionTest/intersectionTest.cpp b/tests/intersectionTest/intersectionTest.cpp index 799f5de..c766e3c 100644 --- a/tests/intersectionTest/intersectionTest.cpp +++ b/tests/intersectionTest/intersectionTest.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include // void printRay(RTCRayHit &rayHit) @@ -32,7 +32,7 @@ int main() { constexpr NumericType discFactor = 0.5 * 1.7320508 * (1 + 1e-5); auto discRadius = gridDelta * discFactor; - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(rtcDevice, points, normals, discRadius); auto boundingBox = geometry.getBoundingBox(); diff --git a/tests/particle/particle.cpp b/tests/particle/particle.cpp index 35e48d5..e3bda31 100644 --- a/tests/particle/particle.cpp +++ b/tests/particle/particle.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include @@ -20,7 +20,7 @@ template void RunTest() { VC_TEST_ASSERT(labels.size() == 1); VC_TEST_ASSERT(labels[0] == "test"); - Trace tracer; + TraceDisk tracer; tracer.setParticleType(particle); } @@ -35,7 +35,7 @@ template void RunTest() { VC_TEST_ASSERT(labels.size() == 1); VC_TEST_ASSERT(labels[0] == "test"); - Trace tracer; + TraceDisk tracer; tracer.setParticleType(particle); } } diff --git a/tests/pointNeighborhood/pointNeighborhood.cpp b/tests/pointNeighborhood/pointNeighborhood.cpp index ec0284f..06182f2 100644 --- a/tests/pointNeighborhood/pointNeighborhood.cpp +++ b/tests/pointNeighborhood/pointNeighborhood.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -22,11 +22,11 @@ int main() { // assert inner points have 8 neighbors auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta - eps); auto bdBox = geometry.getBoundingBox(); - for (unsigned int idx = 0; idx < geometry.getNumPoints(); ++idx) { + for (unsigned int idx = 0; idx < geometry.getNumPrimitives(); ++idx) { auto point = geometry.getPoint(idx); auto neighbors = geometry.getNeighborIndices(idx); diff --git a/tests/pointNeighborhood2D/pointNeighborhood2D.cpp b/tests/pointNeighborhood2D/pointNeighborhood2D.cpp index 0a15bcf..7877bb6 100644 --- a/tests/pointNeighborhood2D/pointNeighborhood2D.cpp +++ b/tests/pointNeighborhood2D/pointNeighborhood2D.cpp @@ -1,4 +1,4 @@ -#include +#include #include using namespace viennaray; @@ -22,7 +22,7 @@ int main() { } auto device = rtcNewDevice(""); - Geometry geometry; + GeometryDisk geometry; geometry.initGeometry(device, points, normals, gridDelta); // setup simple 2D plane grid with normal in y-direction with discs only // overlapping at adjacent grid points x - x - x - x - x @@ -30,7 +30,7 @@ int main() { // assert boundary points have 1 neighbor // assert inner points have 2 neighbors - for (unsigned int idx = 0; idx < geometry.getNumPoints(); ++idx) { + for (unsigned int idx = 0; idx < geometry.getNumPrimitives(); ++idx) { auto point = geometry.getPoint(idx); auto neighbors = geometry.getNeighborIndices(idx); if (std::fabs(point[0]) > 1 - eps) { diff --git a/tests/smoothing/smoothing.cpp b/tests/smoothing/smoothing.cpp index c780001..200f347 100644 --- a/tests/smoothing/smoothing.cpp +++ b/tests/smoothing/smoothing.cpp @@ -1,4 +1,4 @@ -#include +#include #include using namespace viennaray; @@ -29,7 +29,7 @@ int main() { std::vector flux = {1, 1, 1, 0, 0, 0}; - Trace trace; + TraceDisk trace; trace.setGeometry(points, normals, gridDelta); trace.smoothFlux(flux, 1); diff --git a/tests/trace2D/trace2D.cpp b/tests/trace2D/trace2D.cpp index 4705a29..7388ab1 100644 --- a/tests/trace2D/trace2D.cpp +++ b/tests/trace2D/trace2D.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include using namespace viennaray; @@ -24,7 +24,7 @@ int main() { boundaryConds[1] = BoundaryCondition::REFLECTIVE; auto particle = std::make_unique>(); - Trace rayTracer; + TraceDisk rayTracer; rayTracer.setParticleType(particle); rayTracer.setGeometry(points, normals, gridDelta); rayTracer.setNumberOfRaysPerPoint(10); diff --git a/tests/triangleGeometry/triangleGeometry.cpp b/tests/triangleGeometry/triangleGeometry.cpp index ebc0a98..b822d00 100644 --- a/tests/triangleGeometry/triangleGeometry.cpp +++ b/tests/triangleGeometry/triangleGeometry.cpp @@ -1,6 +1,4 @@ #include -#include -#include #include #include @@ -8,31 +6,15 @@ using namespace viennaray; int main() { - omp_set_num_threads(16); constexpr int D = 3; using NumericType = float; Logger::setLogLevel(LogLevel::DEBUG); const auto mesh = gpu::readMeshFromFile("trenchMesh.dat"); - // std::vector materialIds(mesh.triangles.size(), 7); + std::vector materialIds(mesh.triangles.size(), 7); - // auto device = rtcNewDevice(""); - // GeometryTriangle geo; - // geo.setMaterialIds(materialIds); - // geo.initGeometry(device, mesh.nodes, mesh.triangles); - - TraceTriangle tracer; - tracer.setGeometry(mesh.nodes, mesh.triangles, mesh.gridDelta); - - auto particle = - std::make_unique>(1.0, "flux"); - tracer.setParticleType(particle); - - tracer.apply(); - - auto &localData = tracer.getLocalData(); - tracer.normalizeFlux(localData.getVectorData(0), NormalizationType::SOURCE); - - rayInternal::writeVTP("triangleGeometryOutput.vtp", mesh.nodes, - mesh.triangles, localData.getVectorData(0)); + auto device = rtcNewDevice(""); + GeometryTriangle geo; + geo.setMaterialIds(materialIds); + geo.initGeometry(device, mesh.nodes, mesh.triangles); } \ No newline at end of file From fe2c9ae3f58369217ef6a3b4f9212ee4306180cc Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 16:42:10 +0100 Subject: [PATCH 04/12] Remove hit counter --- include/viennaray/rayGeometryDisk.hpp | 97 ++++++++++++++ include/viennaray/rayHitCounter.hpp | 167 ------------------------ include/viennaray/rayParticle.hpp | 34 ----- include/viennaray/rayTrace.hpp | 89 +------------ include/viennaray/rayTraceDisk.hpp | 56 +------- include/viennaray/rayTraceKernel.hpp | 140 +------------------- include/viennaray/rayTraceTriangle.hpp | 2 +- include/viennaray/rayUtil.hpp | 1 - tests/diskAreas/diskAreas.cpp | 10 +- tests/hitAccumulator/CMakeLists.txt | 7 - tests/hitAccumulator/hitAccumulator.cpp | 50 ------- tests/trace2D/trace2D.cpp | 3 +- tests/traceInterface/traceInterface.cpp | 3 +- 13 files changed, 120 insertions(+), 539 deletions(-) delete mode 100644 include/viennaray/rayHitCounter.hpp delete mode 100644 tests/hitAccumulator/CMakeLists.txt delete mode 100644 tests/hitAccumulator/hitAccumulator.cpp diff --git a/include/viennaray/rayGeometryDisk.hpp b/include/viennaray/rayGeometryDisk.hpp index 5117e96..7538754 100644 --- a/include/viennaray/rayGeometryDisk.hpp +++ b/include/viennaray/rayGeometryDisk.hpp @@ -1,5 +1,7 @@ #pragma once +#include +#include #include namespace viennaray { @@ -125,6 +127,14 @@ class GeometryDisk : public Geometry { [[nodiscard]] NumericType getDiscRadius() const { return discRadii_; } + [[nodiscard]] NumericType getDiskArea(unsigned int primID) const { + return diskAreas_[primID]; + } + + [[nodiscard]] std::vector const &getDiskAreas() const { + return diskAreas_; + } + Vec3D getPrimNormal(const unsigned int primID) const override { assert(primID < this->numPrimitives_ && "Geometry: Prim ID out of bounds"); auto const &normal = pNormalVecBuffer_[primID]; @@ -168,6 +178,92 @@ class GeometryDisk : public Geometry { } } + void computeDiskAreas(Boundary const &boundary) { + constexpr double eps = 1e-3; + auto bdBox = this->getBoundingBox(); + const auto boundaryConds = boundary.getBoundaryConditions(); + const auto boundaryDirs = boundary.getDirs(); + diskAreas_.resize(this->numPrimitives_, 0); + DiskBoundingBoxXYIntersector bdDiskIntersector(bdBox); + +#pragma omp parallel for + for (long idx = 0; idx < this->numPrimitives_; ++idx) { + auto const &disk = getPrimRef(idx); + + if constexpr (D == 3) { + diskAreas_[idx] = disk[3] * disk[3] * M_PI; // full disk area + + if (boundaryConds[boundaryDirs[0]] == BoundaryCondition::IGNORE && + boundaryConds[boundaryDirs[1]] == BoundaryCondition::IGNORE) { + // no boundaries + continue; + } + + if (boundaryDirs[0] != 2 && boundaryDirs[1] != 2) { + // Disk-BBox intersection only works with boundaries in x and y + // direction + auto normal = getNormalRef(idx); + diskAreas_[idx] = bdDiskIntersector.areaInside(disk, normal); + continue; + } + + // Simple approach + if (std::fabs(disk[boundaryDirs[0]] - bdBox[0][boundaryDirs[0]]) < + eps || + std::fabs(disk[boundaryDirs[0]] - bdBox[1][boundaryDirs[0]]) < + eps) { + // disk intersects boundary in first direction + diskAreas_[idx] /= 2; + } + + if (std::fabs(disk[boundaryDirs[1]] - bdBox[0][boundaryDirs[1]]) < + eps || + std::fabs(disk[boundaryDirs[1]] - bdBox[1][boundaryDirs[1]]) < + eps) { + // disk intersects boundary in second direction + diskAreas_[idx] /= 2; + } + + } else { // 2D + + diskAreas_[idx] = 2 * disk[3]; + auto normal = getNormalRef(idx); + + // test min boundary + if ((boundaryConds[boundaryDirs[0]] != BoundaryCondition::IGNORE) && + (std::abs(disk[boundaryDirs[0]] - bdBox[0][boundaryDirs[0]]) < + disk[3])) { + NumericType insideTest = + 1 - normal[boundaryDirs[0]] * normal[boundaryDirs[0]]; + if (insideTest > 1e-4) { + insideTest = + std::abs(disk[boundaryDirs[0]] - bdBox[0][boundaryDirs[0]]) / + std::sqrt(insideTest); + if (insideTest < disk[3]) { + diskAreas_[idx] -= disk[3] - insideTest; + } + } + } + + // test max boundary + if ((boundaryConds[boundaryDirs[0]] != BoundaryCondition::IGNORE) && + (std::abs(disk[boundaryDirs[0]] - bdBox[1][boundaryDirs[0]]) < + disk[3])) { + NumericType insideTest = + 1 - normal[boundaryDirs[0]] * normal[boundaryDirs[0]]; + if (insideTest > 1e-4) { + insideTest = + std::abs(disk[boundaryDirs[0]] - bdBox[1][boundaryDirs[0]]) / + std::sqrt(insideTest); + if (insideTest < disk[3]) { + diskAreas_[idx] -= disk[3] - insideTest; + } + } + } + } + } + } + private: // RTC_GEOMETRY_TYPE_POINT: // The vertex buffer stores each control vertex in the form of a single @@ -190,6 +286,7 @@ class GeometryDisk : public Geometry { normal_vec_3f_t *pNormalVecBuffer_ = nullptr; NumericType discRadii_; // same for all points + std::vector diskAreas_; PointNeighborhood pointNeighborhood_; }; diff --git a/include/viennaray/rayHitCounter.hpp b/include/viennaray/rayHitCounter.hpp deleted file mode 100644 index a5546e6..0000000 --- a/include/viennaray/rayHitCounter.hpp +++ /dev/null @@ -1,167 +0,0 @@ -#pragma once - -#include - -namespace viennaray { - -template class HitCounter { -public: - HitCounter() : totalCounts_(0) {} - - // elements initialized to 0. - explicit HitCounter(size_t size) - : counts_(size, 0), totalCounts_(0), diskAreas_(size, 0), S1s_(size, 0), - S2s_(size, 0) {} - - // copy construct the vector members - HitCounter(HitCounter const &other) - : counts_(other.counts_), totalCounts_(other.totalCounts_), - diskAreas_(other.diskAreas_), S1s_(other.S1s_), S2s_(other.S2s_) {} - - // move the vector members - HitCounter(HitCounter &&other) noexcept - : counts_(std::move(other.counts_)), totalCounts_(other.totalCounts_), - diskAreas_(std::move(other.diskAreas_)), S1s_(std::move(other.S1s_)), - S2s_(std::move(other.S2s_)) {} - - // A copy constructor which can accumulate values from two instances - // Precondition: the size of the accumulators are equal - HitCounter(HitCounter const &A1, - HitCounter const &A2) - : HitCounter(A1) { - for (size_t idx = 0; idx < counts_.size(); ++idx) { - counts_[idx] += A2.counts_[idx]; - S1s_[idx] += A2.S1s_[idx]; - S2s_[idx] += A2.S2s_[idx]; - } - - totalCounts_ = A1.totalCounts_ + A2.totalCounts_; - for (size_t idx = 0; idx < A1.diskAreas_.size(); ++idx) { - diskAreas_[idx] = A1.diskAreas_[idx] > A2.diskAreas_[idx] - ? A1.diskAreas_[idx] - : A2.diskAreas_[idx]; - } - } - - HitCounter &operator=(HitCounter const &pOther) { - if (this != &pOther) { - // copy from pOther to this - counts_.clear(); - counts_ = pOther.counts_; - totalCounts_ = pOther.totalCounts_; - diskAreas_.clear(); - diskAreas_ = pOther.diskAreas_; - S1s_.clear(); - S1s_ = pOther.S1s_; - S2s_.clear(); - S2s_ = pOther.S2s_; - } - return *this; - } - - HitCounter & - operator=(HitCounter &&pOther) noexcept { - if (this != &pOther) { - // move from pOther to this - counts_.clear(); - counts_ = std::move(pOther.counts_); - totalCounts_ = pOther.totalCounts_; - diskAreas_.clear(); - diskAreas_ = std::move(pOther.diskAreas_); - S1s_.clear(); - S1s_ = std::move(pOther.S1s_); - S2s_.clear(); - S2s_ = std::move(pOther.S2s_); - } - return *this; - } - - void use(unsigned int primID, NumericType value) { - counts_[primID] += 1; - totalCounts_ += 1; - S1s_[primID] += value; - S2s_[primID] += value * value; - } - - void merge(HitCounter const &pOther, const bool calcFlux) { - if (calcFlux) { - for (size_t idx = 0; idx < counts_.size(); ++idx) { - counts_[idx] += pOther.counts_[idx]; - S1s_[idx] += pOther.S1s_[idx]; - S2s_[idx] += pOther.S2s_[idx]; - } - } - - totalCounts_ += pOther.totalCounts_; - for (size_t idx = 0; idx < diskAreas_.size(); ++idx) { - diskAreas_[idx] = diskAreas_[idx] > pOther.diskAreas_[idx] - ? diskAreas_[idx] - : pOther.diskAreas_[idx]; - } - } - - void resize(const size_t numPoints, const bool calcFlux) { - diskAreas_.resize(numPoints); - totalCounts_ = 0; - if (calcFlux) { - counts_.resize(numPoints); - S1s_.resize(numPoints); - S2s_.resize(numPoints); - } - } - - void clear() { - diskAreas_.clear(); - counts_.clear(); - S1s_.clear(); - S2s_.clear(); - } - - [[nodiscard]] std::vector getValues() const { return S1s_; } - - [[nodiscard]] std::vector getCounts() const { return counts_; } - - [[nodiscard]] size_t getTotalCounts() const { return totalCounts_; } - - [[nodiscard]] const std::vector &getDiskAreas() const { - return diskAreas_; - } - - [[nodiscard]] std::vector getRelativeError() { - auto result = std::vector( - S1s_.size(), - std::numeric_limits::max()); // size, initial values - if (totalCounts_ == 0) { - return result; - } - for (size_t idx = 0; idx < result.size(); ++idx) { - auto s1square = S1s_[idx] * S1s_[idx]; - if (s1square == 0) { - continue; - } - // This is an approximation of the relative error assuming sqrt(N-1) =~ - // sqrt(N) For details and an exact formula see the book Exploring Monte - // Carlo Methods by Dunn and Shultis page 83 and 84. - result[idx] = static_cast( - std::sqrt(S2s_[idx] / s1square - 1.0 / totalCounts_)); - } - return result; - } - - void setDiskAreas(std::vector &pDiskAreas) { - diskAreas_ = pDiskAreas; - } - -private: - std::vector counts_; - size_t totalCounts_; - std::vector diskAreas_; - - // S1 denotes the sum of sample values - std::vector S1s_; - // S2 denotes the sum of squared sample values - // these are need to compute the relative error - std::vector S2s_; -}; - -} // namespace viennaray diff --git a/include/viennaray/rayParticle.hpp b/include/viennaray/rayParticle.hpp index 2d32aca..ce09021 100644 --- a/include/viennaray/rayParticle.hpp +++ b/include/viennaray/rayParticle.hpp @@ -123,40 +123,6 @@ class Particle : public AbstractParticle { Particle(Particle &&) = default; }; -template -class TestParticle : public Particle, NumericType> { -public: - void initNew(RNG &rngState) final {} - - std::pair> - surfaceReflection(NumericType rayWeight, const Vec3D &rayDir, - const Vec3D &geomNormal, - const unsigned int primID, const int materialId, - const TracingData *globalData, - RNG &rngState) final { - auto direction = ReflectionSpecular(rayDir, geomNormal); - - return std::pair>{.5, direction}; - } - - void surfaceCollision(NumericType rayWeight, const Vec3D &rayDir, - const Vec3D &geomNormal, - const unsigned int primID, const int materialId, - TracingData &localData, - const TracingData *globalData, - RNG &rngState) final { - localData.getVectorData(0)[primID] += rayWeight; - } - - NumericType getSourceDistributionPower() const final { return 1.; } - - [[nodiscard]] std::vector getLocalDataLabels() const final { - return {"testFlux"}; - } - - void logData(DataLog &log) final {} -}; - template class DiffuseParticle : public Particle, NumericType> { diff --git a/include/viennaray/rayTrace.hpp b/include/viennaray/rayTrace.hpp index e0e51ff..b504f22 100644 --- a/include/viennaray/rayTrace.hpp +++ b/include/viennaray/rayTrace.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -15,7 +14,12 @@ using namespace viennacore; template class Trace { public: - Trace() : device_(rtcNewDevice("hugepages=1")) { initMemoryFlags(); } + Trace() : device_(rtcNewDevice("hugepages=1")) { + assert(rtcGetDeviceProperty(device_, RTC_DEVICE_PROPERTY_VERSION) >= + 30601 && + "Error: The minimum version of Embree is 3.6.1"); + initMemoryFlags(); + } Trace(const Trace &) = delete; Trace &operator=(const Trace &) = delete; @@ -112,38 +116,6 @@ template class Trace { config_.useRandomSeed = false; } - /// Set whether the flux and hit counts should be recorded. If not needed, - /// this should be turned off to increase performance. If set to false, the - /// functions getTotalFlux(), getNormalizedFlux(), getHitCounts() and - /// getRelativeError() can not be used. - void setCalculateFlux(const bool calcFlux) { config_.calcFlux = calcFlux; } - - /// Set whether to check the relative error after a tracing. If the relative - /// error at a surface point is larger than 0.05 a warning is printed. The - /// value 0.05 is reported in: "A General Monte Carlo N-Particle Transport - /// Code, Version 5, Vol. I Overview and Theory, LA - UR - 03 - 1987, Los - /// Alamos Nat.Lab., Los Alamos, NM" - void setCheckRelativeError(const bool checkError) { - checkError_ = checkError; - } - - /// Returns the total flux on each disk. - [[nodiscard]] std::vector getTotalFlux() const { - return hitCounter_.getValues(); - } - - /// Returns the normalized flux on each disk. - [[nodiscard]] std::vector - getNormalizedFlux(NormalizationType normalization, - bool averageNeighborhood = false) { - auto flux = hitCounter_.getValues(); - normalizeFlux(flux, normalization); - if (averageNeighborhood) { - smoothFlux(flux); - } - return flux; - } - /// Helper function to normalize the recorded flux in a post-processing step. /// The flux can be normalized to the source flux and the maximum recorded /// value. @@ -156,16 +128,6 @@ template class Trace { virtual void smoothFlux(std::vector &flux, int numNeighbors = 1) = 0; - /// Returns the total number of hits for each geometry point. - [[nodiscard]] std::vector getHitCounts() const { - return hitCounter_.getCounts(); - } - - /// Returns the relative error of the flux for each geometry point - [[nodiscard]] std::vector getRelativeError() { - return hitCounter_.getRelativeError(); - } - [[nodiscard]] TracingData &getLocalData() { return localData_; } [[nodiscard]] TracingData *getGlobalData() { @@ -179,44 +141,6 @@ template class Trace { [[nodiscard]] DataLog &getDataLog() { return dataLog_; } private: - void checkRelativeError() { - auto error = getRelativeError(); - const int numPoints = error.size(); - int numThreads = 1; -#ifdef _OPENMP - numThreads = omp_get_max_threads(); -#endif - std::vector passed(numThreads, true); - -#pragma omp parallel shared(error, passed) - { - int threadId = 0; -#ifdef _OPENMP - threadId = omp_get_thread_num(); -#endif -#pragma omp for - for (int i = 0; i < numPoints; i++) { - if (error[i] > 0.05) { - passed[threadId] = false; - } - } - } - bool allPassed = true; - for (int i = 0; i < numThreads; i++) { - if (!passed[i]) { - allPassed = false; - break; - } - } - if (!allPassed) { - RTInfo_.warning = true; - Logger::getInstance() - .addWarning( - "Large relative error detected. Consider using more rays.") - .print(); - } - } - static void initMemoryFlags() { #ifdef ARCH_X86 // for best performance set FTZ and DAZ flags in MXCSR control and status @@ -245,7 +169,6 @@ template class Trace { rayInternal::KernelConfig config_; - HitCounter hitCounter_; TracingData localData_; TracingData *pGlobalData_ = nullptr; TraceInfo RTInfo_; diff --git a/include/viennaray/rayTraceDisk.hpp b/include/viennaray/rayTraceDisk.hpp index de1b77d..7386641 100644 --- a/include/viennaray/rayTraceDisk.hpp +++ b/include/viennaray/rayTraceDisk.hpp @@ -25,6 +25,7 @@ class TraceDisk : public Trace { auto boundary = Boundary( this->device_, boundingBox, this->boundaryConditions_, traceSettings); + geometry_.computeDiskAreas(boundary); std::array, 3> orthonormalBasis; if (this->usePrimaryDirection_) @@ -47,14 +48,11 @@ class TraceDisk : public Trace { rayInternal::TraceKernel tracer( this->device_, geometry_, boundary, this->pSource_, this->pParticle_, - this->config_, this->dataLog_, this->hitCounter_, this->RTInfo_); + this->config_, this->dataLog_, this->RTInfo_); tracer.setTracingData(&this->localData_, this->pGlobalData_); tracer.apply(); this->config_.runNumber++; - // if (this->checkError_) - // this->checkRelativeError(); - boundary.releaseGeometry(); } @@ -101,7 +99,6 @@ class TraceDisk : public Trace { assert(flux.size() == geometry_.getNumPrimitives() && "Unequal number of points in normalizeFlux"); - auto diskArea = this->hitCounter_.getDiskAreas(); const auto totalDiskArea = diskRadius_ * diskRadius_ * M_PI; switch (norm) { @@ -109,7 +106,7 @@ class TraceDisk : public Trace { auto maxv = *std::max_element(flux.begin(), flux.end()); #pragma omp parallel for for (int idx = 0; idx < flux.size(); ++idx) { - flux[idx] *= (totalDiskArea / diskArea[idx]) / maxv; + flux[idx] *= (totalDiskArea / geometry_.getDiskArea(idx)) / maxv; } break; } @@ -130,7 +127,7 @@ class TraceDisk : public Trace { NumericType normFactor = sourceArea / numTotalRays; #pragma omp parallel for for (int idx = 0; idx < flux.size(); ++idx) { - flux[idx] *= normFactor / diskArea[idx]; + flux[idx] *= normFactor / geometry_.getDiskArea(idx); } break; } @@ -185,52 +182,7 @@ class TraceDisk : public Trace { } } - /// Returns the disk area for each geometry point - [[nodiscard]] std::vector getDiskAreas() { - return this->hitCounter_.getDiskAreas(); - } - - Geometry &getGeometry() { return geometry_; } - private: - void checkRelativeError() { - auto error = this->getRelativeError(); - const int numPoints = error.size(); - int numThreads = 1; -#ifdef _OPENMP - numThreads = omp_get_max_threads(); -#endif - std::vector passed(numThreads, true); - -#pragma omp parallel shared(error, passed) - { - int threadId = 0; -#ifdef _OPENMP - threadId = omp_get_thread_num(); -#endif -#pragma omp for - for (int i = 0; i < numPoints; i++) { - if (error[i] > 0.05) { - passed[threadId] = false; - } - } - } - bool allPassed = true; - for (int i = 0; i < numThreads; i++) { - if (!passed[i]) { - allPassed = false; - break; - } - } - if (!allPassed) { - this->RTInfo_.warning = true; - Logger::getInstance() - .addWarning( - "Large relative error detected. Consider using more rays.") - .print(); - } - } - void checkSettings() { if (this->pParticle_ == nullptr) { this->RTInfo_.error = true; diff --git a/include/viennaray/rayTraceKernel.hpp b/include/viennaray/rayTraceKernel.hpp index d5f0e7d..56cb6b3 100644 --- a/include/viennaray/rayTraceKernel.hpp +++ b/include/viennaray/rayTraceKernel.hpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -26,17 +25,10 @@ template class TraceKernel { std::shared_ptr> source, std::unique_ptr> &particle, KernelConfig const &config, DataLog &dataLog, - HitCounter &hitCounter, TraceInfo &traceInfo) + TraceInfo &traceInfo) : device_(device), geometry_(geometry), boundary_(boundary), pSource_(source), pParticle_(particle->clone()), config_(config), - // numRays(numRaysFixed == 0 ? pSource_->getNumPoints() * - // numRaysPerPoint - // : numRaysFixed), - hitCounter_(hitCounter), traceInfo_(traceInfo), dataLog_(dataLog) { - assert(rtcGetDeviceProperty(device_, RTC_DEVICE_PROPERTY_VERSION) >= - 30601 && - "Error: The minimum version of Embree is 3.6.1"); - } + traceInfo_(traceInfo), dataLog_(dataLog) {} void apply() { auto rtcScene = rtcNewScene(device_); @@ -87,22 +79,11 @@ template class TraceKernel { } } - // hit counters - std::vector> threadLocalHitCounter(numThreads); - hitCounter_.clear(); - hitCounter_.resize(geometry_.getNumPrimitives(), config_.calcFlux); - if (config_.calcFlux) { - for (auto &hitC : threadLocalHitCounter) { - hitC = hitCounter_; - } - } - Timer timer; timer.start(); #pragma omp parallel reduction(+ : geoHits, nonGeoHits, totalTraces, \ - particleHits) \ - shared(threadLocalData, threadLocalHitCounter) + particleHits) shared(threadLocalData) { rtcJoinCommitScene(rtcScene); @@ -123,7 +104,6 @@ template class TraceKernel { auto particle = pParticle_->clone(); auto &myLocalData = threadLocalData[threadID]; - auto &myHitCounter = threadLocalHitCounter[threadID]; auto &myDataLog = threadLocalDataLog[threadID]; #if VIENNARAY_EMBREE_VERSION < 4 @@ -322,22 +302,6 @@ template class TraceKernel { geometry_.getMaterialId(rayHit.hit.primID), pGlobalData_, rngState); - // auto valueToDrop = rayWeight * stickingDirection.first; - // if (config_.calcFlux) { - // for (size_t diskId = 0; diskId < numDisksHit; ++diskId) - // { - // #ifdef VIENNARAY_USE_WDIST - // auto distRayWeight = valueToDrop / - // impactDistances[diskId] / - // invDistanceWeightSum * - // numDisksHit; - // #else - // auto distRayWeight = valueToDrop; - // #endif - // myHitCounter.use(hitDiskIds[diskId], distRayWeight); - // } - // } - // Update ray weight rayWeight -= rayWeight * stickingDirection.first; if (rayWeight <= 0) { @@ -358,18 +322,12 @@ template class TraceKernel { } while (reflect); } // end ray tracing for loop - - if constexpr (geoType == GeometryType::DISK) { - auto diskAreas = computeDiskAreas(); - myHitCounter.setDiskAreas(diskAreas); - } } // end parallel section timer.finish(); - // merge hit counters and data logs + // merge data logs for (int i = 0; i < numThreads; ++i) { - hitCounter_.merge(threadLocalHitCounter[i], config_.calcFlux); dataLog_.merge(threadLocalDataLog[i]); } // merge local data @@ -440,7 +398,6 @@ template class TraceKernel { traceInfo_.numRays = numRays; traceInfo_.totalRaysTraced = totalTraces; - traceInfo_.totalDiskHits = hitCounter_.getTotalCounts(); traceInfo_.nonGeometryHits = nonGeoHits; traceInfo_.geometryHits = geoHits; traceInfo_.particleHits = particleHits; @@ -483,94 +440,6 @@ template class TraceKernel { return true; } - std::vector computeDiskAreas() const { - constexpr double eps = 1e-3; - auto bdBox = geometry_.getBoundingBox(); - auto boundaryConds = boundary_.getBoundaryConditions(); - const auto numOfPrimitives = geometry_.getNumPrimitives(); - const auto boundaryDirs = boundary_.getDirs(); - auto areas = std::vector(numOfPrimitives, 0); - DiskBoundingBoxXYIntersector bdDiskIntersector(bdBox); - -#pragma omp for - for (long idx = 0; idx < numOfPrimitives; ++idx) { - auto const &disk = geometry_.getPrimRef(idx); - - if constexpr (D == 3) { - areas[idx] = disk[3] * disk[3] * M_PI; // full disk area - - if (boundaryConds[boundaryDirs[0]] == BoundaryCondition::IGNORE && - boundaryConds[boundaryDirs[1]] == BoundaryCondition::IGNORE) { - // no boundaries - continue; - } - - if (boundaryDirs[0] != 2 && boundaryDirs[1] != 2) { - // Disk-BBox intersection only works with boundaries in x and y - // direction - auto normal = geometry_.getNormalRef(idx); - areas[idx] = bdDiskIntersector.areaInside(disk, normal); - continue; - } - - // Simple approach - if (std::fabs(disk[boundaryDirs[0]] - bdBox[0][boundaryDirs[0]]) < - eps || - std::fabs(disk[boundaryDirs[0]] - bdBox[1][boundaryDirs[0]]) < - eps) { - // disk intersects boundary in first direction - areas[idx] /= 2; - } - - if (std::fabs(disk[boundaryDirs[1]] - bdBox[0][boundaryDirs[1]]) < - eps || - std::fabs(disk[boundaryDirs[1]] - bdBox[1][boundaryDirs[1]]) < - eps) { - // disk intersects boundary in second direction - areas[idx] /= 2; - } - - } else { // 2D - - areas[idx] = 2 * disk[3]; - auto normal = geometry_.getNormalRef(idx); - - // test min boundary - if ((boundaryConds[boundaryDirs[0]] != BoundaryCondition::IGNORE) && - (std::abs(disk[boundaryDirs[0]] - bdBox[0][boundaryDirs[0]]) < - disk[3])) { - NumericType insideTest = - 1 - normal[boundaryDirs[0]] * normal[boundaryDirs[0]]; - if (insideTest > 1e-4) { - insideTest = - std::abs(disk[boundaryDirs[0]] - bdBox[0][boundaryDirs[0]]) / - std::sqrt(insideTest); - if (insideTest < disk[3]) { - areas[idx] -= disk[3] - insideTest; - } - } - } - - // test max boundary - if ((boundaryConds[boundaryDirs[0]] != BoundaryCondition::IGNORE) && - (std::abs(disk[boundaryDirs[0]] - bdBox[1][boundaryDirs[0]]) < - disk[3])) { - NumericType insideTest = - 1 - normal[boundaryDirs[0]] * normal[boundaryDirs[0]]; - if (insideTest > 1e-4) { - insideTest = - std::abs(disk[boundaryDirs[0]] - bdBox[1][boundaryDirs[0]]) / - std::sqrt(insideTest); - if (insideTest < disk[3]) { - areas[idx] -= disk[3] - insideTest; - } - } - } - } - } - return areas; - } - bool checkLocalIntersection(RTCRay const &ray, const unsigned int primID, rtcNumericType &impactDistance) const { auto const &rayOrigin = @@ -634,7 +503,6 @@ template class TraceKernel { TracingData *pLocalData_ = nullptr; TracingData const *pGlobalData_ = nullptr; - HitCounter &hitCounter_; TraceInfo &traceInfo_; DataLog &dataLog_; }; diff --git a/include/viennaray/rayTraceTriangle.hpp b/include/viennaray/rayTraceTriangle.hpp index 3c60829..21605b8 100644 --- a/include/viennaray/rayTraceTriangle.hpp +++ b/include/viennaray/rayTraceTriangle.hpp @@ -53,7 +53,7 @@ class TraceTriangle : public Trace { rayInternal::TraceKernel tracer( this->device_, geometry_, boundary, this->pSource_, this->pParticle_, - this->config_, this->dataLog_, this->hitCounter_, this->RTInfo_); + this->config_, this->dataLog_, this->RTInfo_); tracer.setTracingData(&this->localData_, this->pGlobalData_); tracer.apply(); this->config_.runNumber++; diff --git a/include/viennaray/rayUtil.hpp b/include/viennaray/rayUtil.hpp index bec8995..0ea581c 100644 --- a/include/viennaray/rayUtil.hpp +++ b/include/viennaray/rayUtil.hpp @@ -64,7 +64,6 @@ template struct DataLog { struct TraceInfo { size_t numRays = 0; size_t totalRaysTraced = 0; - size_t totalDiskHits = 0; size_t nonGeometryHits = 0; size_t geometryHits = 0; size_t particleHits = 0; diff --git a/tests/diskAreas/diskAreas.cpp b/tests/diskAreas/diskAreas.cpp index 270eea7..4ee20de 100644 --- a/tests/diskAreas/diskAreas.cpp +++ b/tests/diskAreas/diskAreas.cpp @@ -12,7 +12,6 @@ int main() { omp_set_num_threads(1); constexpr int D = 3; using NumericType = float; - using ParticleType = TestParticle; NumericType extent = 2; NumericType gridDelta = 1.; NumericType eps = 1e-6; @@ -25,7 +24,6 @@ int main() { auto localData = TracingData(); const auto globalData = TracingData(); - HitCounter hitCounter; GeometryDisk geometry; auto diskRadius = gridDelta * rayInternal::DiskFactor; @@ -44,8 +42,9 @@ int main() { auto raySource = std::make_unique>( boundingBox, 1., traceSettings, geometry.getNumPrimitives(), false, orthoBasis); + geometry.computeDiskAreas(boundary); - TestParticle particle; + DiffuseParticle particle(1.0, "hitFlux"); auto cp = particle.clone(); localData.setNumberOfVectorData(cp->getLocalDataLabels().size()); auto numPoints = geometry.getNumPrimitives(); @@ -57,11 +56,10 @@ int main() { config.numRaysPerPoint = 1; config.numRaysFixed = 0; rayInternal::TraceKernel tracer( - device, geometry, boundary, std::move(raySource), cp, config, log, - hitCounter, info); + device, geometry, boundary, std::move(raySource), cp, config, log, info); tracer.setTracingData(&localData, &globalData); tracer.apply(); - auto diskAreas = hitCounter.getDiskAreas(); + auto diskAreas = geometry.getDiskAreas(); auto boundaryDirs = boundary.getDirs(); auto wholeDiskArea = diskRadius * diskRadius * M_PI; diff --git a/tests/hitAccumulator/CMakeLists.txt b/tests/hitAccumulator/CMakeLists.txt deleted file mode 100644 index 98df474..0000000 --- a/tests/hitAccumulator/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -project(hitAccumulator LANGUAGES CXX) - -add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") -target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) - -add_dependencies(ViennaRay_Tests ${PROJECT_NAME}) -add_test(NAME ${PROJECT_NAME} COMMAND $) diff --git a/tests/hitAccumulator/hitAccumulator.cpp b/tests/hitAccumulator/hitAccumulator.cpp deleted file mode 100644 index 1eff521..0000000 --- a/tests/hitAccumulator/hitAccumulator.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include - -#include - -using namespace viennaray; - -int main() { - using NumericType = double; - NumericType eps = 1e-6; - - size_t numPrims = 1000; - unsigned int primID = 10; - long long numRuns = 10000; - - omp_set_num_threads(4); - const auto numThreads = omp_get_max_threads(); - - // hit counters - std::vector> threadLocalHitCounter(numThreads); - HitCounter hitCounter(numPrims); - for (auto &hitC : threadLocalHitCounter) { - hitC = hitCounter; - } -#pragma omp parallel - { - const auto threadID = omp_get_thread_num(); - auto &hitAcc = threadLocalHitCounter[threadID]; -#pragma omp for - for (long long i = 0; i < numRuns; i++) { - hitAcc.use(primID, 0.1); - } - - if (threadID == 0) { - for (int i = 1; i < numThreads; ++i) { - hitAcc.merge(threadLocalHitCounter[i], true); - } - } - } - - auto totalCounts = threadLocalHitCounter[0].getTotalCounts(); - auto counts = threadLocalHitCounter[0].getCounts(); - auto values = threadLocalHitCounter[0].getValues(); - - VC_TEST_ASSERT(totalCounts == numRuns) - VC_TEST_ASSERT(counts[primID] == numRuns) - VC_TEST_ASSERT_ISCLOSE(values[primID], 0.1 * numRuns, eps) - - return 0; -} diff --git a/tests/trace2D/trace2D.cpp b/tests/trace2D/trace2D.cpp index 7388ab1..0b8d25e 100644 --- a/tests/trace2D/trace2D.cpp +++ b/tests/trace2D/trace2D.cpp @@ -22,7 +22,8 @@ int main() { BoundaryCondition boundaryConds[D]; boundaryConds[0] = BoundaryCondition::REFLECTIVE; boundaryConds[1] = BoundaryCondition::REFLECTIVE; - auto particle = std::make_unique>(); + auto particle = + std::make_unique>(1.0, "hitFlux"); TraceDisk rayTracer; rayTracer.setParticleType(particle); diff --git a/tests/traceInterface/traceInterface.cpp b/tests/traceInterface/traceInterface.cpp index a7f780a..6e2464f 100644 --- a/tests/traceInterface/traceInterface.cpp +++ b/tests/traceInterface/traceInterface.cpp @@ -38,7 +38,8 @@ int main() { boundaryConds[0] = BoundaryCondition::REFLECTIVE; boundaryConds[1] = BoundaryCondition::REFLECTIVE; boundaryConds[2] = BoundaryCondition::REFLECTIVE; - auto particle = std::make_unique>(); + auto particle = + std::make_unique>(1.0, "hitFlux"); TraceDisk rayTracer; rayTracer.setParticleType(particle); From 7e6fbe7739a6321de7aea125d2220e16a2b31fb6 Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 16:59:20 +0100 Subject: [PATCH 05/12] Small fixes --- include/viennaray/rayGeometryTriangle.hpp | 2 +- include/viennaray/rayTraceKernel.hpp | 34 ++++++++++++----------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp index bbf872a..cd1d153 100644 --- a/include/viennaray/rayGeometryTriangle.hpp +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -174,7 +174,7 @@ class GeometryTriangle : public Geometry { point_3f_t *pPointBuffer_ = nullptr; struct triangle_3u_t { - unsigned uu, vv, ww; + uint32_t uu, vv, ww; }; triangle_3u_t *pTriangleBuffer_ = nullptr; diff --git a/include/viennaray/rayTraceKernel.hpp b/include/viennaray/rayTraceKernel.hpp index 56cb6b3..db5df18 100644 --- a/include/viennaray/rayTraceKernel.hpp +++ b/include/viennaray/rayTraceKernel.hpp @@ -59,11 +59,12 @@ template class TraceKernel { static_cast(config_.numRaysPerPoint) : static_cast(config_.numRaysFixed); - // thread local data storage int numThreads = 1; #ifdef _OPENMP numThreads = omp_get_max_threads(); #endif + + // thread local data storage std::vector> threadLocalData(numThreads); for (auto &data : threadLocalData) { data = *pLocalData_; @@ -220,20 +221,22 @@ template class TraceKernel { const auto rayDir = Vec3D{ray.dir_x, ray.dir_y, ray.dir_z}; const auto geomNormal = geometry_.getPrimNormal(rayHit.hit.primID); - if (DotProduct(rayDir, geomNormal) > 0) { - // If the dot product of the ray direction and the surface normal is - // greater than zero, then we hit the back face of the disk. - if (hitFromBack) { - // if hitFromBack == true, then the ray hits the back of a disk - // the second time. In this case we discard the ray. - break; + if constexpr (geoType == GeometryType::DISK) { + if (DotProduct(rayDir, geomNormal) > 0) { + // If the dot product of the ray direction and the surface normal + // is greater than zero, then we hit the back face of the disk. + if (hitFromBack) { + // if hitFromBack == true, then the ray hits the back of a disk + // the second time. In this case we discard the ray. + break; + } + hitFromBack = true; + // Let ray through, i.e., continue. + reflect = true; + fillRayPosition(rayHit.ray, hitPoint); + // keep ray direction as it is + continue; } - hitFromBack = true; - // Let ray through, i.e., continue. - reflect = true; - fillRayPosition(rayHit.ray, hitPoint); - // keep ray direction as it is - continue; } /* -------- Surface hit -------- */ @@ -288,8 +291,7 @@ template class TraceKernel { pGlobalData_, rngState); } } else { - // Triangle Geometry - // single hit + // Triangle Geometry - single hit particle->surfaceCollision( rayWeight, rayDir, geomNormal, rayHit.hit.primID, geometry_.getMaterialId(rayHit.hit.primID), myLocalData, From 9b96dd58b387dc62798e226ed8bb24c85e910c6e Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 17:24:46 +0100 Subject: [PATCH 06/12] Add mesh reader --- CMakeLists.txt | 2 +- README.md | 2 +- examples/triangle3D/CMakeLists.txt | 3 +- examples/triangle3D/triangle3D.cpp | 13 +++--- gpu/examples/trenchTriangles.cpp | 11 +++-- gpu/pipelines/Particle.cuh | 3 +- include/viennaray/rayGeometryTriangle.hpp | 4 +- include/viennaray/rayTraceTriangle.hpp | 2 +- include/viennaray/rayUtil.hpp | 52 +++++++++++++++++++++ tests/triangleGeometry/CMakeLists.txt | 3 +- tests/triangleGeometry/triangleGeometry.cpp | 13 +++--- 11 files changed, 84 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e75248..6ded2ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.20 FATAL_ERROR) project( ViennaRay LANGUAGES CXX - VERSION 3.6.1) + VERSION 3.7.0) # -------------------------------------------------------------------------------------------------------- # Library switches diff --git a/README.md b/README.md index 033caa9..101ea32 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ We recommend using [CPM.cmake](https://github.com/cpm-cmake/CPM.cmake) to consum * Installation with CPM ```cmake - CPMAddPackage("gh:viennatools/viennaray@3.6.1") + CPMAddPackage("gh:viennatools/viennaray@3.7.0") ``` * With a local installation diff --git a/examples/triangle3D/CMakeLists.txt b/examples/triangle3D/CMakeLists.txt index cecdce4..15e4b9d 100644 --- a/examples/triangle3D/CMakeLists.txt +++ b/examples/triangle3D/CMakeLists.txt @@ -2,6 +2,7 @@ project(triangle3D LANGUAGES CXX) add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp") target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) -configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) +configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat + ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) add_dependencies(ViennaRay_Examples ${PROJECT_NAME}) diff --git a/examples/triangle3D/triangle3D.cpp b/examples/triangle3D/triangle3D.cpp index 195954c..70be608 100644 --- a/examples/triangle3D/triangle3D.cpp +++ b/examples/triangle3D/triangle3D.cpp @@ -1,7 +1,5 @@ -#include #include #include -#include #include @@ -15,10 +13,13 @@ int main() { using NumericType = float; Logger::setLogLevel(LogLevel::DEBUG); - const auto mesh = gpu::readMeshFromFile("trenchMesh.dat"); + std::vector> points; + std::vector> triangles; + NumericType gridDelta; + rayInternal::readMeshFromFile("trenchMesh.dat", gridDelta, points, triangles); TraceTriangle tracer; - tracer.setGeometry(mesh.nodes, mesh.triangles, mesh.gridDelta); + tracer.setGeometry(points, triangles, gridDelta); auto particle = std::make_unique>(0.1, "flux"); @@ -35,6 +36,6 @@ int main() { auto &localData = tracer.getLocalData(); tracer.normalizeFlux(localData.getVectorData(0), NormalizationType::SOURCE); - rayInternal::writeVTP("triangleGeometryOutput.vtp", mesh.nodes, - mesh.triangles, localData.getVectorData(0)); + rayInternal::writeVTP("triangleGeometryOutput.vtp", points, triangles, + localData.getVectorData(0)); } \ No newline at end of file diff --git a/gpu/examples/trenchTriangles.cpp b/gpu/examples/trenchTriangles.cpp index 8cfc55a..ea92bee 100644 --- a/gpu/examples/trenchTriangles.cpp +++ b/gpu/examples/trenchTriangles.cpp @@ -25,10 +25,10 @@ int main(int argc, char **argv) { gpu::Particle particle; particle.direction = {0.0f, 0.0f, -1.0f}; particle.name = "Particle"; - particle.sticking = 1.f; + particle.sticking = 0.1f; particle.dataLabels = {"particleFlux"}; - particle.materialSticking[7] = 1.f; - particle.materialSticking[1] = .1f; + particle.materialSticking[7] = 0.1f; + particle.materialSticking[1] = 1.0f; std::unordered_map pMap = {{"Particle", 0}}; std::vector cMap = { @@ -41,7 +41,7 @@ int main(int argc, char **argv) { tracer.setMaterialIds(materialIds); tracer.setCallables("CallableWrapper", context->modulePath); tracer.setParticleCallableMap({pMap, cMap}); - tracer.setNumberOfRaysPerPoint(100); + tracer.setNumberOfRaysPerPoint(2000); tracer.insertNextParticle(particle); tracer.prepareParticlePrograms(); @@ -58,6 +58,9 @@ int main(int argc, char **argv) { std::vector flux(mesh.triangles.size()); tracer.getFlux(flux.data(), 0, 0); + rayInternal::writeVTP("triangleGeometryOutput.vtp", mesh.nodes, + mesh.triangles, flux); + #ifdef COUNT_RAYS rayCountBuffer.download(&rayCount, 1); std::cout << "Trace count: " << rayCount << std::endl; diff --git a/gpu/pipelines/Particle.cuh b/gpu/pipelines/Particle.cuh index bfc856c..b5e0389 100644 --- a/gpu/pipelines/Particle.cuh +++ b/gpu/pipelines/Particle.cuh @@ -23,7 +23,8 @@ particleCollision(viennaray::gpu::PerRayData *prd) { __forceinline__ __device__ void particleReflection(const void *sbtData, viennaray::gpu::PerRayData *prd) { - prd->rayWeight -= prd->rayWeight * launchParams.sticking; + int materialId = launchParams.materialIds[prd->primID]; + prd->rayWeight -= prd->rayWeight * launchParams.materialSticking[materialId]; auto geoNormal = computeNormal(sbtData, prd->primID); diffuseReflection(prd, geoNormal, launchParams.D); } diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp index cd1d153..cbe96ef 100644 --- a/include/viennaray/rayGeometryTriangle.hpp +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -153,8 +153,8 @@ class GeometryTriangle : public Geometry { void releaseGeometry() override { // Attention: - // This function must not be called when the RTCGeometry reference count is - // > 1. Doing so leads to leaked memory buffers + // This function must not be called when the RTCGeometry reference count + // is > 1. Doing so leads to leaked memory buffers normals_.clear(); if (pPointBuffer_ == nullptr || pTriangleBuffer_ == nullptr || this->pRtcGeometry_ == nullptr) { diff --git a/include/viennaray/rayTraceTriangle.hpp b/include/viennaray/rayTraceTriangle.hpp index 21605b8..0c09701 100644 --- a/include/viennaray/rayTraceTriangle.hpp +++ b/include/viennaray/rayTraceTriangle.hpp @@ -68,7 +68,7 @@ class TraceTriangle : public Trace { std::vector> const &triangles, const NumericType gridDelta) { this->gridDelta_ = gridDelta; - this->geometry_.initGeometry(this->device_, points, triangles); + geometry_.initGeometry(this->device_, points, triangles); } /// Set material ID's for each geometry point. diff --git a/include/viennaray/rayUtil.hpp b/include/viennaray/rayUtil.hpp index 0ea581c..6c50852 100644 --- a/include/viennaray/rayUtil.hpp +++ b/include/viennaray/rayUtil.hpp @@ -374,6 +374,58 @@ void readGridFromFile(const std::string &fileName, NumericType &gridDelta, dataFile.close(); } +template +void readMeshFromFile(const std::string &fileName, NumericType &gridDelta, + std::vector> &nodes, + std::vector> &triangles) { + std::ifstream dataFile(fileName); + if (!dataFile.is_open()) { + Logger::getInstance() + .addError("Failed to open mesh file: " + fileName) + .print(); + } + std::string id; + dataFile >> id; + assert(id == "grid_delta"); + dataFile >> gridDelta; + + // unused + std::array minimumExtent; + std::array maximumExtent; + + dataFile >> id; + assert(id == "min_extent"); + dataFile >> minimumExtent[0] >> minimumExtent[1] >> minimumExtent[2]; + + dataFile >> id; + assert(id == "max_extent"); + dataFile >> maximumExtent[0] >> maximumExtent[1] >> maximumExtent[2]; + + dataFile >> id; + assert(id == "n_nodes"); + size_t numPoints; + dataFile >> numPoints; + + dataFile >> id; + assert(id == "n_triangles"); + size_t numTriangles; + dataFile >> numTriangles; + + nodes.resize(numPoints); + triangles.resize(numTriangles); + for (size_t i = 0; i < numPoints; ++i) { + dataFile >> id; + assert(id == "n"); + dataFile >> nodes[i][0] >> nodes[i][1] >> nodes[i][2]; + } + for (size_t i = 0; i < numTriangles; ++i) { + dataFile >> id; + assert(id == "t"); + dataFile >> triangles[i][0] >> triangles[i][1] >> triangles[i][2]; + } + dataFile.close(); +} + template void writeVTK(const std::string &filename, const std::vector> &points, diff --git a/tests/triangleGeometry/CMakeLists.txt b/tests/triangleGeometry/CMakeLists.txt index 80c9053..f9902c9 100644 --- a/tests/triangleGeometry/CMakeLists.txt +++ b/tests/triangleGeometry/CMakeLists.txt @@ -5,4 +5,5 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) add_dependencies(ViennaRay_Tests ${PROJECT_NAME}) add_test(NAME ${PROJECT_NAME} COMMAND $) -configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) +configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat + ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) diff --git a/tests/triangleGeometry/triangleGeometry.cpp b/tests/triangleGeometry/triangleGeometry.cpp index b822d00..d93b6f0 100644 --- a/tests/triangleGeometry/triangleGeometry.cpp +++ b/tests/triangleGeometry/triangleGeometry.cpp @@ -1,7 +1,5 @@ #include -#include - -#include +#include using namespace viennaray; @@ -10,11 +8,14 @@ int main() { using NumericType = float; Logger::setLogLevel(LogLevel::DEBUG); - const auto mesh = gpu::readMeshFromFile("trenchMesh.dat"); - std::vector materialIds(mesh.triangles.size(), 7); + std::vector> points; + std::vector> triangles; + NumericType gridDelta; + rayInternal::readMeshFromFile("trenchMesh.dat", gridDelta, points, triangles); + std::vector materialIds(triangles.size(), 7); auto device = rtcNewDevice(""); GeometryTriangle geo; geo.setMaterialIds(materialIds); - geo.initGeometry(device, mesh.nodes, mesh.triangles); + geo.initGeometry(device, points, triangles); } \ No newline at end of file From a2565d630a269df79847d8c3b0d4a0b59a721f52 Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 18:27:16 +0100 Subject: [PATCH 07/12] Fix numeric type in triangle normals --- include/viennaray/rayGeometryTriangle.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp index cbe96ef..8e293b5 100644 --- a/include/viennaray/rayGeometryTriangle.hpp +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -77,14 +77,14 @@ class GeometryTriangle : public Geometry { auto const &v0 = points[elements[i][0]]; auto const &v1 = points[elements[i][1]]; auto const &v2 = points[elements[i][2]]; - auto edge1 = VectorType{v1[0] - v0[0], v1[1] - v0[1], - v1[2] - v0[2]}; - auto edge2 = VectorType{v2[0] - v0[0], v2[1] - v0[1], - v2[2] - v0[2]}; + auto edge1 = + Vec3D{v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]}; + auto edge2 = + Vec3D{v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2]}; auto normal = - VectorType{edge1[1] * edge2[2] - edge1[2] * edge2[1], - edge1[2] * edge2[0] - edge1[0] * edge2[2], - edge1[0] * edge2[1] - edge1[1] * edge2[0]}; + Vec3D{edge1[1] * edge2[2] - edge1[2] * edge2[1], + edge1[2] * edge2[0] - edge1[0] * edge2[2], + edge1[0] * edge2[1] - edge1[1] * edge2[0]}; auto length = std::sqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]); if (length > 0) { @@ -94,7 +94,7 @@ class GeometryTriangle : public Geometry { normals_[i] = normal; areas_[i] = 0.5 * length; } else { - normals_[i] = VectorType{0, 0, 0}; + normals_[i] = Vec3D{0, 0, 0}; areas_[i] = 0.; } } @@ -178,7 +178,7 @@ class GeometryTriangle : public Geometry { }; triangle_3u_t *pTriangleBuffer_ = nullptr; - std::vector normals_; + std::vector> normals_; std::vector areas_; }; From 89fa49ee23733ecb3f826d24f8fefeb4c47a0d4d Mon Sep 17 00:00:00 2001 From: reiter Date: Tue, 4 Nov 2025 18:47:38 +0100 Subject: [PATCH 08/12] Remove index map --- gpu/include/raygIndexMap.hpp | 56 ------------------------------------ 1 file changed, 56 deletions(-) delete mode 100644 gpu/include/raygIndexMap.hpp diff --git a/gpu/include/raygIndexMap.hpp b/gpu/include/raygIndexMap.hpp deleted file mode 100644 index 8a39569..0000000 --- a/gpu/include/raygIndexMap.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include -#include -#include - -#include - -namespace viennaray::gpu { - -class IndexMap { - std::vector dataLabels; - -public: - IndexMap() = default; - - template - explicit IndexMap(const std::vector> &particles) { - for (size_t pIdx = 0; pIdx < particles.size(); pIdx++) { - for (size_t dIdx = 0; dIdx < particles[pIdx].dataLabels.size(); dIdx++) { - dataLabels.push_back(particles[pIdx].dataLabels[dIdx]); - } - } - } - - void insertNextDataLabel(std::string dataLabel) { - dataLabels.push_back(std::move(dataLabel)); - } - - std::size_t getIndex(const std::string &label) const { - for (std::size_t idx = 0; idx < dataLabels.size(); idx++) { - if (dataLabels[idx] == label) { - return idx; - } - } - assert(false && "Data label not found"); - return 0; - } - - [[nodiscard]] const std::string &getLabel(std::size_t idx) const { - assert(idx < dataLabels.size()); - return dataLabels[idx]; - } - - std::size_t getNumberOfData() const { return dataLabels.size(); } - - std::vector::const_iterator begin() const { - return dataLabels.cbegin(); - } - - std::vector::const_iterator end() const { - return dataLabels.cend(); - } -}; - -} // namespace viennaray::gpu From 72393ccd1bd81cfc72213086ca7fb5ac657da0e5 Mon Sep 17 00:00:00 2001 From: reiter Date: Wed, 5 Nov 2025 10:33:05 +0100 Subject: [PATCH 09/12] Adjust conedSpecularReflection --- gpu/include/raygReflection.hpp | 112 +++------------------------- include/viennaray/rayReflection.hpp | 34 ++++----- 2 files changed, 27 insertions(+), 119 deletions(-) diff --git a/gpu/include/raygReflection.hpp b/gpu/include/raygReflection.hpp index 7ef160b..c694498 100644 --- a/gpu/include/raygReflection.hpp +++ b/gpu/include/raygReflection.hpp @@ -63,97 +63,6 @@ specularReflection(viennaray::gpu::PerRayData *prd, prd->dir = prd->dir - (2 * DotProduct(prd->dir, geoNormal)) * geoNormal; } -// static __device__ __forceinline__ void -// specularReflection(viennaray::gpu::PerRayData *prd) { -// using namespace viennacore; -// const viennaray::gpu::HitSBTDataDisk *sbtData = -// (const viennaray::gpu::HitSBTDataDisk *)optixGetSbtDataPointer(); -// const Vec3Df geoNormal = computeNormal(sbtData, optixGetPrimitiveIndex()); -// specularReflection(prd, geoNormal); -// } - -// GPU coned specular reflection (fast, branch-light). Expects getNextRand(&rng) -// in [0,1). Requires: Vec3D, DotProduct, Normalize, Inv, ReflectionSpecular, -// ReflectionDiffuse. -// template -// __forceinline__ __device__ Vec3D -// ReflectionConedCosineGPU(const Vec3D &rayDir, const Vec3D &geomNormal, -// RNG &rng, const T maxConeAngle) { -// constexpr T kPi = T(3.14159265358979323846); -// constexpr T kTwoPi = T(6.2831853071795864769); -// constexpr T kHalfPi = T(1.57079632679489661923); - -// if (maxConeAngle <= T(0)) -// return ReflectionSpecular(rayDir, geomNormal); -// if (maxConeAngle >= kHalfPi) -// return ReflectionDiffuse(geomNormal, rng); - -// // Specular direction -// const auto v = Inv(rayDir); -// Vec3D w = (T(2) * DotProduct(geomNormal, v)) * geomNormal - v; -// Normalize(w); - -// // Frisvad ONB around w -// Vec3D t, b; -// if (w[2] < T(-0.999999)) { -// t = {T(0), T(-1), T(0)}; -// b = {T(-1), T(0), T(0)}; -// } else { -// const T a = T(1) / (T(1) + w[2]); -// const T bx = -w[0] * w[1] * a; -// t = {T(1) - w[0] * w[0] * a, bx, -w[0]}; -// b = {bx, T(1) - w[1] * w[1] * a, -w[1]}; -// } - -// // Sample polar angle via accept-reject (keeps your distribution) -// T theta; -// for (;;) { -// const T u = sqrt(static_cast(getNextRand(&rng))); // in (0,1) -// const T s = sqrt(fmax(T(0), T(1) - u)); // sqrt(1-u) -// theta = maxConeAngle * s; -// // RHS = cos(pi/2 * s) * sin(theta) -// T sT, cT; -// if constexpr (std::is_same::value) { -// __sincosf(theta, &sT, &cT); -// } else { -// sincos(theta, &sT, &cT); -// } -// const T rhs = (std::is_same::value) -// ? __cosf(T(1.5707963267948966f) * s) * sT -// : cos(T(1.5707963267948966) * s) * sT; -// if (static_cast(getNextRand(&rng)) * theta * u <= rhs) -// break; -// } - -// // One azimuth sample -// const T phi = kTwoPi * static_cast(getNextRand(&rng)); -// T sP, cP, sT, cT; -// if constexpr (std::is_same::value) { -// __sincosf(theta, &sT, &cT); -// __sincosf(phi, &sP, &cP); -// } else { -// sincos(theta, &sT, &cT); -// sincos(phi, &sP, &cP); -// } - -// // Combine: d = sinT*(cosP*t + sinP*b) + cosT*w -// Vec3D dir{sT * (cP * t[0] + sP * b[0]) + cT * w[0], -// sT * (cP * t[1] + sP * b[1]) + cT * w[1], -// sT * (cP * t[2] + sP * b[2]) + cT * w[2]}; - -// // Ensure correct hemisphere without retry -// const T dp = DotProduct(dir, geomNormal); -// if (dp <= T(0)) -// dir = dir - T(2) * dp * geomNormal; - -// if constexpr (D == 2) { -// dir[2] = T(0); -// Normalize(dir); -// } -// Normalize(dir); -// return dir; -// } - static __device__ viennacore::Vec3Df PickRandomPointOnUnitSphere(viennaray::gpu::RNGState *state) { const float4 u = curand_uniform4(state); // (0,1] @@ -198,15 +107,17 @@ conedCosineReflection(viennaray::gpu::PerRayData *prd, const float maxConeAngle, const uint8_t D) { using namespace viennacore; - // TODO: Is this needed? Done in the CPU version - // if (maxConeAngle <= 0.f) - // return specularReflection(prd, geomNormal); - // if (maxConeAngle >= M_PI_2f) - // return diffuseReflection(prd, geomNormal, D); - // Calculate specular direction specularReflection(prd, geomNormal); + if (maxConeAngle <= 0.f) { + return; + } + if (maxConeAngle >= M_PI_2f) { + diffuseReflection(prd, geomNormal, D); + return; + } + // Frisvad ONB around specular direction const auto &w = prd->dir; Vec3Df t, b; @@ -227,9 +138,7 @@ conedCosineReflection(viennaray::gpu::PerRayData *prd, const float s = sqrt(fmax(0.f, 1.f - u)); // sqrt(1-u) theta = maxConeAngle * s; // RHS = cos(pi/2 * s) * sin(theta) - float sT, cT; - __sincosf(theta, &sT, &cT); - const float rhs = __cosf(M_PI_2f * s) * sT; + const float rhs = __cosf(M_PI_2f * s) * __sinf(theta); if (getNextRand(&prd->RNGstate) * theta * u <= rhs) break; } @@ -245,13 +154,14 @@ conedCosineReflection(viennaray::gpu::PerRayData *prd, __fmaf_rn(sT, __fmaf_rn(cP, t[1], sP * b[1]), cT * w[1]), __fmaf_rn(sT, __fmaf_rn(cP, t[2], sP * b[2]), cT * w[2])}; - // Ensure correct hemisphere without retry + // Ensure correct hemisphere const float dp = DotProduct(dir, geomNormal); if (dp <= 0.f) dir = dir - 2.f * dp * geomNormal; if (D == 2) dir[2] = 0.f; + Normalize(dir); prd->dir = dir; } diff --git a/include/viennaray/rayReflection.hpp b/include/viennaray/rayReflection.hpp index aa3eb74..68986bd 100644 --- a/include/viennaray/rayReflection.hpp +++ b/include/viennaray/rayReflection.hpp @@ -54,21 +54,18 @@ template ReflectionConedCosine(const Vec3D &rayDir, const Vec3D &geomNormal, RNG &rng, const NumericType maxConeAngle) { - using T = NumericType; - constexpr NumericType kPi = T(3.14159265358979323846); - constexpr NumericType kTwoPi = T(6.2831853071795864769); - constexpr NumericType kHalfPi = T(1.57079632679489661923); - std::uniform_real_distribution rand01(0.0, 1.0); + std::uniform_real_distribution rand01(0.0, 1.0); if (maxConeAngle <= NumericType(0)) return ReflectionSpecular(rayDir, geomNormal); - if (maxConeAngle >= kHalfPi) + if (maxConeAngle >= M_PI_2) return ReflectionDiffuse(geomNormal, rng); - // specular direction (unit) + // specular direction (w) const auto v = Inv(rayDir); - Vec3D w = (T(2) * DotProduct(geomNormal, v)) * geomNormal - v; + Vec3D w = + (NumericType(2) * DotProduct(geomNormal, v)) * geomNormal - v; Normalize(w); // cheap; keeps basis stable // fast ONB around w (Frisvad) @@ -86,14 +83,13 @@ ReflectionConedCosine(const Vec3D &rayDir, } // sample polar angle (accept-reject) - NumericType theta; + double theta; for (;;) { - const NumericType r1 = std::sqrt(rand01(rng)); // u - const NumericType s = - std::sqrt(std::max(NumericType(1) - r1, NumericType(0))); // sqrt(1-u) + const double u = std::sqrt(rand01(rng)); + const double s = std::sqrt(std::max(1.0 - u, 0.0)); // sqrt(1-u) theta = maxConeAngle * s; - const NumericType rhs = std::cos(kHalfPi * s) * std::sin(theta); - if (rand01(rng) * theta * r1 <= rhs) + const double rhs = std::cos(M_PI_2 * s) * std::sin(theta); + if (rand01(rng) * theta * u <= rhs) break; } @@ -101,21 +97,23 @@ ReflectionConedCosine(const Vec3D &rayDir, const NumericType sinT = std::sin(theta); const NumericType cosT = std::cos(theta); - const NumericType phi = kTwoPi * rand01(rng); + const double phi = 2.0 * M_PI * rand01(rng); NumericType sinP = std::sin(phi), cosP = std::cos(phi); - // local combination: d = sinT*(cosP*t + sinP*b) + cosT*w + // Combine: d = sinT*(cosP*t + sinP*b) + cosT*w Vec3D dir{sinT * (cosP * t[0] + sinP * b[0]) + cosT * w[0], sinT * (cosP * t[1] + sinP * b[1]) + cosT * w[1], sinT * (cosP * t[2] + sinP * b[2]) + cosT * w[2]}; // ensure the correct hemisphere - if (DotProduct(dir, geomNormal) <= NumericType(0)) - dir = dir - NumericType(2) * DotProduct(dir, geomNormal) * geomNormal; + const NumericType dp = DotProduct(dir, geomNormal); + if (dp <= NumericType(0)) + dir = dir - NumericType(2) * dp * geomNormal; if constexpr (D == 2) { dir[2] = NumericType(0); } + // small renorm to counter float drift Normalize(dir); return dir; From 282a1f5ad3a1ee0574f9643529365ee856cb4264 Mon Sep 17 00:00:00 2001 From: reiter Date: Thu, 6 Nov 2025 16:00:31 +0100 Subject: [PATCH 10/12] Finish triangle implementation --- include/viennaray/rayGeometryDisk.hpp | 2 +- include/viennaray/rayGeometryTriangle.hpp | 22 +++++++--------------- include/viennaray/rayTrace.hpp | 1 - include/viennaray/rayTraceKernel.hpp | 10 ++++++++-- include/viennaray/rayUtil.hpp | 1 + 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/include/viennaray/rayGeometryDisk.hpp b/include/viennaray/rayGeometryDisk.hpp index 7538754..75a37fe 100644 --- a/include/viennaray/rayGeometryDisk.hpp +++ b/include/viennaray/rayGeometryDisk.hpp @@ -98,7 +98,7 @@ class GeometryDisk : public Geometry { assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && "RTC Error: rtcCommitGeometry"); - if (this->materialIds_.empty()) { + if (this->materialIds_.size() != this->numPrimitives_) { this->materialIds_.resize(this->numPrimitives_, 0); } diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp index 8e293b5..8e88074 100644 --- a/include/viennaray/rayGeometryTriangle.hpp +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -77,25 +77,17 @@ class GeometryTriangle : public Geometry { auto const &v0 = points[elements[i][0]]; auto const &v1 = points[elements[i][1]]; auto const &v2 = points[elements[i][2]]; - auto edge1 = - Vec3D{v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]}; - auto edge2 = - Vec3D{v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2]}; - auto normal = - Vec3D{edge1[1] * edge2[2] - edge1[2] * edge2[1], - edge1[2] * edge2[0] - edge1[0] * edge2[2], - edge1[0] * edge2[1] - edge1[1] * edge2[0]}; - auto length = std::sqrt(normal[0] * normal[0] + normal[1] * normal[1] + - normal[2] * normal[2]); + auto normal = CrossProduct(v1 - v0, v2 - v0); + auto length = Norm(normal); if (length > 0) { - normal[0] /= length; - normal[1] /= length; - normal[2] /= length; - normals_[i] = normal; + normals_[i] = normal / length; areas_[i] = 0.5 * length; } else { normals_[i] = Vec3D{0, 0, 0}; areas_[i] = 0.; + Logger::getInstance() + .addWarning("Degenerate triangle with zero area detected.") + .print(); } } @@ -107,7 +99,7 @@ class GeometryTriangle : public Geometry { assert(rtcGetDeviceError(device) == RTC_ERROR_NONE && "RTC Error: rtcCommitGeometry"); - if (this->materialIds_.empty()) { + if (this->materialIds_.size() != this->numPrimitives_) { this->materialIds_.resize(this->numPrimitives_, 0); } } diff --git a/include/viennaray/rayTrace.hpp b/include/viennaray/rayTrace.hpp index b504f22..d383c5a 100644 --- a/include/viennaray/rayTrace.hpp +++ b/include/viennaray/rayTrace.hpp @@ -165,7 +165,6 @@ template class Trace { bool usePrimaryDirection_ = false; bool useCustomSource = false; - bool checkError_ = true; rayInternal::KernelConfig config_; diff --git a/include/viennaray/rayTraceKernel.hpp b/include/viennaray/rayTraceKernel.hpp index db5df18..63ce4ec 100644 --- a/include/viennaray/rayTraceKernel.hpp +++ b/include/viennaray/rayTraceKernel.hpp @@ -52,6 +52,7 @@ template class TraceKernel { size_t nonGeoHits = 0; size_t totalTraces = 0; size_t particleHits = 0; + size_t boundaryHits = 0; auto const lambda = pParticle_->getMeanFreePath(); const long long numRays = config_.numRaysFixed == 0 @@ -84,7 +85,8 @@ template class TraceKernel { timer.start(); #pragma omp parallel reduction(+ : geoHits, nonGeoHits, totalTraces, \ - particleHits) shared(threadLocalData) + particleHits, boundaryHits) \ + shared(threadLocalData) { rtcJoinCommitScene(rtcScene); @@ -206,6 +208,7 @@ template class TraceKernel { /* -------- Boundary hit -------- */ if (rayHit.hit.geomID == boundaryID) { + ++boundaryHits; boundary_.processHit(rayHit, reflect); continue; } @@ -217,10 +220,11 @@ template class TraceKernel { ray.org_y + ray.dir_y * ray.tfar, ray.org_z + ray.dir_z * ray.tfar}; - /* -------- Hit from back -------- */ const auto rayDir = Vec3D{ray.dir_x, ray.dir_y, ray.dir_z}; const auto geomNormal = geometry_.getPrimNormal(rayHit.hit.primID); + + // Check for backface hit in case of disks if constexpr (geoType == GeometryType::DISK) { if (DotProduct(rayDir, geomNormal) > 0) { // If the dot product of the ray direction and the surface normal @@ -244,6 +248,7 @@ template class TraceKernel { ++geoHits; if constexpr (geoType == GeometryType::DISK) { + // Disk Geometry - multiple hits possible std::vector hitDiskIds(1, rayHit.hit.primID); #ifdef VIENNARAY_USE_WDIST std::vector @@ -403,6 +408,7 @@ template class TraceKernel { traceInfo_.nonGeometryHits = nonGeoHits; traceInfo_.geometryHits = geoHits; traceInfo_.particleHits = particleHits; + traceInfo_.boundaryHits = boundaryHits; traceInfo_.time = static_cast(timer.currentDuration) * 1e-9; rtcReleaseScene(rtcScene); diff --git a/include/viennaray/rayUtil.hpp b/include/viennaray/rayUtil.hpp index 6c50852..661f0c0 100644 --- a/include/viennaray/rayUtil.hpp +++ b/include/viennaray/rayUtil.hpp @@ -67,6 +67,7 @@ struct TraceInfo { size_t nonGeometryHits = 0; size_t geometryHits = 0; size_t particleHits = 0; + size_t boundaryHits = 0; double time = 0.0; bool warning = false; bool error = false; From 82c7a0a928f0fb69af601ea97b746f7c4715702b Mon Sep 17 00:00:00 2001 From: reiter Date: Thu, 6 Nov 2025 16:02:50 +0100 Subject: [PATCH 11/12] Change logging verbosity --- include/viennaray/rayGeometryTriangle.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/viennaray/rayGeometryTriangle.hpp b/include/viennaray/rayGeometryTriangle.hpp index 8e88074..97f2a01 100644 --- a/include/viennaray/rayGeometryTriangle.hpp +++ b/include/viennaray/rayGeometryTriangle.hpp @@ -86,7 +86,7 @@ class GeometryTriangle : public Geometry { normals_[i] = Vec3D{0, 0, 0}; areas_[i] = 0.; Logger::getInstance() - .addWarning("Degenerate triangle with zero area detected.") + .addDebug("Degenerate triangle with zero area detected.") .print(); } } From dc6a46778fcacb69f1b53e312c79ee54ed00f02e Mon Sep 17 00:00:00 2001 From: Tobias Reiter Date: Thu, 6 Nov 2025 17:50:55 +0100 Subject: [PATCH 12/12] Fix test --- include/viennaray/rayParticle.hpp | 2 +- tests/triangleGeometry/CMakeLists.txt | 3 +- tests/triangleGeometry/trenchMesh.dat | 19384 ++++++++++++++++++++++++ 3 files changed, 19386 insertions(+), 3 deletions(-) create mode 100644 tests/triangleGeometry/trenchMesh.dat diff --git a/include/viennaray/rayParticle.hpp b/include/viennaray/rayParticle.hpp index ce09021..bb8c3d6 100644 --- a/include/viennaray/rayParticle.hpp +++ b/include/viennaray/rayParticle.hpp @@ -11,7 +11,7 @@ #define VIENNARAY_PARTICLE_STOP \ std::pair> { \ - 1., Vec3D { 0., 0., 0. } \ + 1., Vec3D{0., 0., 0.} \ } namespace viennaray { diff --git a/tests/triangleGeometry/CMakeLists.txt b/tests/triangleGeometry/CMakeLists.txt index f9902c9..efb28d0 100644 --- a/tests/triangleGeometry/CMakeLists.txt +++ b/tests/triangleGeometry/CMakeLists.txt @@ -5,5 +5,4 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ViennaRay) add_dependencies(ViennaRay_Tests ${PROJECT_NAME}) add_test(NAME ${PROJECT_NAME} COMMAND $) -configure_file(${CMAKE_SOURCE_DIR}/gpu/examples/Resources/trenchMesh.dat - ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) +configure_file(trenchMesh.dat ${CMAKE_CURRENT_BINARY_DIR}/trenchMesh.dat COPYONLY) diff --git a/tests/triangleGeometry/trenchMesh.dat b/tests/triangleGeometry/trenchMesh.dat new file mode 100644 index 0000000..f611620 --- /dev/null +++ b/tests/triangleGeometry/trenchMesh.dat @@ -0,0 +1,19384 @@ +grid_delta 1 +min_extent -25 -25 -40 +max_extent 25 25 0 +n_nodes 6579 +n_triangles 12800 +n -7 -24 -40 +n -7 -25 -40 +n -6 -25 -40 +n -6 -24 -40 +n -5 -25 -40 +n -5 -24 -40 +n -4 -25 -40 +n -4 -24 -40 +n -3 -25 -40 +n -3 -24 -40 +n -2 -25 -40 +n -2 -24 -40 +n -1 -25 -40 +n -1 -24 -40 +n 0 -25 -40 +n 0 -24 -40 +n 1 -25 -40 +n 1 -24 -40 +n 2 -25 -40 +n 2 -24 -40 +n 3 -25 -40 +n 3 -24 -40 +n 4 -25 -40 +n 4 -24 -40 +n 5 -25 -40 +n 5 -24 -40 +n 6 -25 -40 +n 6 -24 -40 +n 7 -25 -40 +n 7 -24 -40 +n -7 -23 -40 +n -6 -23 -40 +n -5 -23 -40 +n -4 -23 -40 +n -3 -23 -40 +n -2 -23 -40 +n -1 -23 -40 +n 0 -23 -40 +n 1 -23 -40 +n 2 -23 -40 +n 3 -23 -40 +n 4 -23 -40 +n 5 -23 -40 +n 6 -23 -40 +n 7 -23 -40 +n -7 -22 -40 +n -6 -22 -40 +n -5 -22 -40 +n -4 -22 -40 +n -3 -22 -40 +n -2 -22 -40 +n -1 -22 -40 +n 0 -22 -40 +n 1 -22 -40 +n 2 -22 -40 +n 3 -22 -40 +n 4 -22 -40 +n 5 -22 -40 +n 6 -22 -40 +n 7 -22 -40 +n -7 -21 -40 +n -6 -21 -40 +n -5 -21 -40 +n -4 -21 -40 +n -3 -21 -40 +n -2 -21 -40 +n -1 -21 -40 +n 0 -21 -40 +n 1 -21 -40 +n 2 -21 -40 +n 3 -21 -40 +n 4 -21 -40 +n 5 -21 -40 +n 6 -21 -40 +n 7 -21 -40 +n -7 -20 -40 +n -6 -20 -40 +n -5 -20 -40 +n -4 -20 -40 +n -3 -20 -40 +n -2 -20 -40 +n -1 -20 -40 +n 0 -20 -40 +n 1 -20 -40 +n 2 -20 -40 +n 3 -20 -40 +n 4 -20 -40 +n 5 -20 -40 +n 6 -20 -40 +n 7 -20 -40 +n -7 -19 -40 +n -6 -19 -40 +n -5 -19 -40 +n -4 -19 -40 +n -3 -19 -40 +n -2 -19 -40 +n -1 -19 -40 +n 0 -19 -40 +n 1 -19 -40 +n 2 -19 -40 +n 3 -19 -40 +n 4 -19 -40 +n 5 -19 -40 +n 6 -19 -40 +n 7 -19 -40 +n -7 -18 -40 +n -6 -18 -40 +n -5 -18 -40 +n -4 -18 -40 +n -3 -18 -40 +n -2 -18 -40 +n -1 -18 -40 +n 0 -18 -40 +n 1 -18 -40 +n 2 -18 -40 +n 3 -18 -40 +n 4 -18 -40 +n 5 -18 -40 +n 6 -18 -40 +n 7 -18 -40 +n -7 -17 -40 +n -6 -17 -40 +n -5 -17 -40 +n -4 -17 -40 +n -3 -17 -40 +n -2 -17 -40 +n -1 -17 -40 +n 0 -17 -40 +n 1 -17 -40 +n 2 -17 -40 +n 3 -17 -40 +n 4 -17 -40 +n 5 -17 -40 +n 6 -17 -40 +n 7 -17 -40 +n -7 -16 -40 +n -6 -16 -40 +n -5 -16 -40 +n -4 -16 -40 +n -3 -16 -40 +n -2 -16 -40 +n -1 -16 -40 +n 0 -16 -40 +n 1 -16 -40 +n 2 -16 -40 +n 3 -16 -40 +n 4 -16 -40 +n 5 -16 -40 +n 6 -16 -40 +n 7 -16 -40 +n -7 -15 -40 +n -6 -15 -40 +n -5 -15 -40 +n -4 -15 -40 +n -3 -15 -40 +n -2 -15 -40 +n -1 -15 -40 +n 0 -15 -40 +n 1 -15 -40 +n 2 -15 -40 +n 3 -15 -40 +n 4 -15 -40 +n 5 -15 -40 +n 6 -15 -40 +n 7 -15 -40 +n -7 -14 -40 +n -6 -14 -40 +n -5 -14 -40 +n -4 -14 -40 +n -3 -14 -40 +n -2 -14 -40 +n -1 -14 -40 +n 0 -14 -40 +n 1 -14 -40 +n 2 -14 -40 +n 3 -14 -40 +n 4 -14 -40 +n 5 -14 -40 +n 6 -14 -40 +n 7 -14 -40 +n -7 -13 -40 +n -6 -13 -40 +n -5 -13 -40 +n -4 -13 -40 +n -3 -13 -40 +n -2 -13 -40 +n -1 -13 -40 +n 0 -13 -40 +n 1 -13 -40 +n 2 -13 -40 +n 3 -13 -40 +n 4 -13 -40 +n 5 -13 -40 +n 6 -13 -40 +n 7 -13 -40 +n -7 -12 -40 +n -6 -12 -40 +n -5 -12 -40 +n -4 -12 -40 +n -3 -12 -40 +n -2 -12 -40 +n -1 -12 -40 +n 0 -12 -40 +n 1 -12 -40 +n 2 -12 -40 +n 3 -12 -40 +n 4 -12 -40 +n 5 -12 -40 +n 6 -12 -40 +n 7 -12 -40 +n -7 -11 -40 +n -6 -11 -40 +n -5 -11 -40 +n -4 -11 -40 +n -3 -11 -40 +n -2 -11 -40 +n -1 -11 -40 +n 0 -11 -40 +n 1 -11 -40 +n 2 -11 -40 +n 3 -11 -40 +n 4 -11 -40 +n 5 -11 -40 +n 6 -11 -40 +n 7 -11 -40 +n -7 -10 -40 +n -6 -10 -40 +n -5 -10 -40 +n -4 -10 -40 +n -3 -10 -40 +n -2 -10 -40 +n -1 -10 -40 +n 0 -10 -40 +n 1 -10 -40 +n 2 -10 -40 +n 3 -10 -40 +n 4 -10 -40 +n 5 -10 -40 +n 6 -10 -40 +n 7 -10 -40 +n -7 -9 -40 +n -6 -9 -40 +n -5 -9 -40 +n -4 -9 -40 +n -3 -9 -40 +n -2 -9 -40 +n -1 -9 -40 +n 0 -9 -40 +n 1 -9 -40 +n 2 -9 -40 +n 3 -9 -40 +n 4 -9 -40 +n 5 -9 -40 +n 6 -9 -40 +n 7 -9 -40 +n -7 -8 -40 +n -6 -8 -40 +n -5 -8 -40 +n -4 -8 -40 +n -3 -8 -40 +n -2 -8 -40 +n -1 -8 -40 +n 0 -8 -40 +n 1 -8 -40 +n 2 -8 -40 +n 3 -8 -40 +n 4 -8 -40 +n 5 -8 -40 +n 6 -8 -40 +n 7 -8 -40 +n -7 -7 -40 +n -6 -7 -40 +n -5 -7 -40 +n -4 -7 -40 +n -3 -7 -40 +n -2 -7 -40 +n -1 -7 -40 +n 0 -7 -40 +n 1 -7 -40 +n 2 -7 -40 +n 3 -7 -40 +n 4 -7 -40 +n 5 -7 -40 +n 6 -7 -40 +n 7 -7 -40 +n -7 -6 -40 +n -6 -6 -40 +n -5 -6 -40 +n -4 -6 -40 +n -3 -6 -40 +n -2 -6 -40 +n -1 -6 -40 +n 0 -6 -40 +n 1 -6 -40 +n 2 -6 -40 +n 3 -6 -40 +n 4 -6 -40 +n 5 -6 -40 +n 6 -6 -40 +n 7 -6 -40 +n -7 -5 -40 +n -6 -5 -40 +n -5 -5 -40 +n -4 -5 -40 +n -3 -5 -40 +n -2 -5 -40 +n -1 -5 -40 +n 0 -5 -40 +n 1 -5 -40 +n 2 -5 -40 +n 3 -5 -40 +n 4 -5 -40 +n 5 -5 -40 +n 6 -5 -40 +n 7 -5 -40 +n -7 -4 -40 +n -6 -4 -40 +n -5 -4 -40 +n -4 -4 -40 +n -3 -4 -40 +n -2 -4 -40 +n -1 -4 -40 +n 0 -4 -40 +n 1 -4 -40 +n 2 -4 -40 +n 3 -4 -40 +n 4 -4 -40 +n 5 -4 -40 +n 6 -4 -40 +n 7 -4 -40 +n -7 -3 -40 +n -6 -3 -40 +n -5 -3 -40 +n -4 -3 -40 +n -3 -3 -40 +n -2 -3 -40 +n -1 -3 -40 +n 0 -3 -40 +n 1 -3 -40 +n 2 -3 -40 +n 3 -3 -40 +n 4 -3 -40 +n 5 -3 -40 +n 6 -3 -40 +n 7 -3 -40 +n -7 -2 -40 +n -6 -2 -40 +n -5 -2 -40 +n -4 -2 -40 +n -3 -2 -40 +n -2 -2 -40 +n -1 -2 -40 +n 0 -2 -40 +n 1 -2 -40 +n 2 -2 -40 +n 3 -2 -40 +n 4 -2 -40 +n 5 -2 -40 +n 6 -2 -40 +n 7 -2 -40 +n -7 -1 -40 +n -6 -1 -40 +n -5 -1 -40 +n -4 -1 -40 +n -3 -1 -40 +n -2 -1 -40 +n -1 -1 -40 +n 0 -1 -40 +n 1 -1 -40 +n 2 -1 -40 +n 3 -1 -40 +n 4 -1 -40 +n 5 -1 -40 +n 6 -1 -40 +n 7 -1 -40 +n -7 0 -40 +n -6 0 -40 +n -5 0 -40 +n -4 0 -40 +n -3 0 -40 +n -2 0 -40 +n -1 0 -40 +n 0 0 -40 +n 1 0 -40 +n 2 0 -40 +n 3 0 -40 +n 4 0 -40 +n 5 0 -40 +n 6 0 -40 +n 7 0 -40 +n -7 1 -40 +n -6 1 -40 +n -5 1 -40 +n -4 1 -40 +n -3 1 -40 +n -2 1 -40 +n -1 1 -40 +n 0 1 -40 +n 1 1 -40 +n 2 1 -40 +n 3 1 -40 +n 4 1 -40 +n 5 1 -40 +n 6 1 -40 +n 7 1 -40 +n -7 2 -40 +n -6 2 -40 +n -5 2 -40 +n -4 2 -40 +n -3 2 -40 +n -2 2 -40 +n -1 2 -40 +n 0 2 -40 +n 1 2 -40 +n 2 2 -40 +n 3 2 -40 +n 4 2 -40 +n 5 2 -40 +n 6 2 -40 +n 7 2 -40 +n -7 3 -40 +n -6 3 -40 +n -5 3 -40 +n -4 3 -40 +n -3 3 -40 +n -2 3 -40 +n -1 3 -40 +n 0 3 -40 +n 1 3 -40 +n 2 3 -40 +n 3 3 -40 +n 4 3 -40 +n 5 3 -40 +n 6 3 -40 +n 7 3 -40 +n -7 4 -40 +n -6 4 -40 +n -5 4 -40 +n -4 4 -40 +n -3 4 -40 +n -2 4 -40 +n -1 4 -40 +n 0 4 -40 +n 1 4 -40 +n 2 4 -40 +n 3 4 -40 +n 4 4 -40 +n 5 4 -40 +n 6 4 -40 +n 7 4 -40 +n -7 5 -40 +n -6 5 -40 +n -5 5 -40 +n -4 5 -40 +n -3 5 -40 +n -2 5 -40 +n -1 5 -40 +n 0 5 -40 +n 1 5 -40 +n 2 5 -40 +n 3 5 -40 +n 4 5 -40 +n 5 5 -40 +n 6 5 -40 +n 7 5 -40 +n -7 6 -40 +n -6 6 -40 +n -5 6 -40 +n -4 6 -40 +n -3 6 -40 +n -2 6 -40 +n -1 6 -40 +n 0 6 -40 +n 1 6 -40 +n 2 6 -40 +n 3 6 -40 +n 4 6 -40 +n 5 6 -40 +n 6 6 -40 +n 7 6 -40 +n -7 7 -40 +n -6 7 -40 +n -5 7 -40 +n -4 7 -40 +n -3 7 -40 +n -2 7 -40 +n -1 7 -40 +n 0 7 -40 +n 1 7 -40 +n 2 7 -40 +n 3 7 -40 +n 4 7 -40 +n 5 7 -40 +n 6 7 -40 +n 7 7 -40 +n -7 8 -40 +n -6 8 -40 +n -5 8 -40 +n -4 8 -40 +n -3 8 -40 +n -2 8 -40 +n -1 8 -40 +n 0 8 -40 +n 1 8 -40 +n 2 8 -40 +n 3 8 -40 +n 4 8 -40 +n 5 8 -40 +n 6 8 -40 +n 7 8 -40 +n -7 9 -40 +n -6 9 -40 +n -5 9 -40 +n -4 9 -40 +n -3 9 -40 +n -2 9 -40 +n -1 9 -40 +n 0 9 -40 +n 1 9 -40 +n 2 9 -40 +n 3 9 -40 +n 4 9 -40 +n 5 9 -40 +n 6 9 -40 +n 7 9 -40 +n -7 10 -40 +n -6 10 -40 +n -5 10 -40 +n -4 10 -40 +n -3 10 -40 +n -2 10 -40 +n -1 10 -40 +n 0 10 -40 +n 1 10 -40 +n 2 10 -40 +n 3 10 -40 +n 4 10 -40 +n 5 10 -40 +n 6 10 -40 +n 7 10 -40 +n -7 11 -40 +n -6 11 -40 +n -5 11 -40 +n -4 11 -40 +n -3 11 -40 +n -2 11 -40 +n -1 11 -40 +n 0 11 -40 +n 1 11 -40 +n 2 11 -40 +n 3 11 -40 +n 4 11 -40 +n 5 11 -40 +n 6 11 -40 +n 7 11 -40 +n -7 12 -40 +n -6 12 -40 +n -5 12 -40 +n -4 12 -40 +n -3 12 -40 +n -2 12 -40 +n -1 12 -40 +n 0 12 -40 +n 1 12 -40 +n 2 12 -40 +n 3 12 -40 +n 4 12 -40 +n 5 12 -40 +n 6 12 -40 +n 7 12 -40 +n -7 13 -40 +n -6 13 -40 +n -5 13 -40 +n -4 13 -40 +n -3 13 -40 +n -2 13 -40 +n -1 13 -40 +n 0 13 -40 +n 1 13 -40 +n 2 13 -40 +n 3 13 -40 +n 4 13 -40 +n 5 13 -40 +n 6 13 -40 +n 7 13 -40 +n -7 14 -40 +n -6 14 -40 +n -5 14 -40 +n -4 14 -40 +n -3 14 -40 +n -2 14 -40 +n -1 14 -40 +n 0 14 -40 +n 1 14 -40 +n 2 14 -40 +n 3 14 -40 +n 4 14 -40 +n 5 14 -40 +n 6 14 -40 +n 7 14 -40 +n -7 15 -40 +n -6 15 -40 +n -5 15 -40 +n -4 15 -40 +n -3 15 -40 +n -2 15 -40 +n -1 15 -40 +n 0 15 -40 +n 1 15 -40 +n 2 15 -40 +n 3 15 -40 +n 4 15 -40 +n 5 15 -40 +n 6 15 -40 +n 7 15 -40 +n -7 16 -40 +n -6 16 -40 +n -5 16 -40 +n -4 16 -40 +n -3 16 -40 +n -2 16 -40 +n -1 16 -40 +n 0 16 -40 +n 1 16 -40 +n 2 16 -40 +n 3 16 -40 +n 4 16 -40 +n 5 16 -40 +n 6 16 -40 +n 7 16 -40 +n -7 17 -40 +n -6 17 -40 +n -5 17 -40 +n -4 17 -40 +n -3 17 -40 +n -2 17 -40 +n -1 17 -40 +n 0 17 -40 +n 1 17 -40 +n 2 17 -40 +n 3 17 -40 +n 4 17 -40 +n 5 17 -40 +n 6 17 -40 +n 7 17 -40 +n -7 18 -40 +n -6 18 -40 +n -5 18 -40 +n -4 18 -40 +n -3 18 -40 +n -2 18 -40 +n -1 18 -40 +n 0 18 -40 +n 1 18 -40 +n 2 18 -40 +n 3 18 -40 +n 4 18 -40 +n 5 18 -40 +n 6 18 -40 +n 7 18 -40 +n -7 19 -40 +n -6 19 -40 +n -5 19 -40 +n -4 19 -40 +n -3 19 -40 +n -2 19 -40 +n -1 19 -40 +n 0 19 -40 +n 1 19 -40 +n 2 19 -40 +n 3 19 -40 +n 4 19 -40 +n 5 19 -40 +n 6 19 -40 +n 7 19 -40 +n -7 20 -40 +n -6 20 -40 +n -5 20 -40 +n -4 20 -40 +n -3 20 -40 +n -2 20 -40 +n -1 20 -40 +n 0 20 -40 +n 1 20 -40 +n 2 20 -40 +n 3 20 -40 +n 4 20 -40 +n 5 20 -40 +n 6 20 -40 +n 7 20 -40 +n -7 21 -40 +n -6 21 -40 +n -5 21 -40 +n -4 21 -40 +n -3 21 -40 +n -2 21 -40 +n -1 21 -40 +n 0 21 -40 +n 1 21 -40 +n 2 21 -40 +n 3 21 -40 +n 4 21 -40 +n 5 21 -40 +n 6 21 -40 +n 7 21 -40 +n -7 22 -40 +n -6 22 -40 +n -5 22 -40 +n -4 22 -40 +n -3 22 -40 +n -2 22 -40 +n -1 22 -40 +n 0 22 -40 +n 1 22 -40 +n 2 22 -40 +n 3 22 -40 +n 4 22 -40 +n 5 22 -40 +n 6 22 -40 +n 7 22 -40 +n -7 23 -40 +n -6 23 -40 +n -5 23 -40 +n -4 23 -40 +n -3 23 -40 +n -2 23 -40 +n -1 23 -40 +n 0 23 -40 +n 1 23 -40 +n 2 23 -40 +n 3 23 -40 +n 4 23 -40 +n 5 23 -40 +n 6 23 -40 +n 7 23 -40 +n -7 24 -40 +n -6 24 -40 +n -5 24 -40 +n -4 24 -40 +n -3 24 -40 +n -2 24 -40 +n -1 24 -40 +n 0 24 -40 +n 1 24 -40 +n 2 24 -40 +n 3 24 -40 +n 4 24 -40 +n 5 24 -40 +n 6 24 -40 +n 7 24 -40 +n -7 25 -40 +n -6 25 -40 +n -5 25 -40 +n -4 25 -40 +n -3 25 -40 +n -2 25 -40 +n -1 25 -40 +n 0 25 -40 +n 1 25 -40 +n 2 25 -40 +n 3 25 -40 +n 4 25 -40 +n 5 25 -40 +n 6 25 -40 +n 7 25 -40 +n -7.5 -25 -39 +n -7.5 -24 -39 +n 7.5 -25 -39 +n 7.5 -24 -39 +n -7.5 -23 -39 +n 7.5 -23 -39 +n -7.5 -22 -39 +n 7.5 -22 -39 +n -7.5 -21 -39 +n 7.5 -21 -39 +n -7.5 -20 -39 +n 7.5 -20 -39 +n -7.5 -19 -39 +n 7.5 -19 -39 +n -7.5 -18 -39 +n 7.5 -18 -39 +n -7.5 -17 -39 +n 7.5 -17 -39 +n -7.5 -16 -39 +n 7.5 -16 -39 +n -7.5 -15 -39 +n 7.5 -15 -39 +n -7.5 -14 -39 +n 7.5 -14 -39 +n -7.5 -13 -39 +n 7.5 -13 -39 +n -7.5 -12 -39 +n 7.5 -12 -39 +n -7.5 -11 -39 +n 7.5 -11 -39 +n -7.5 -10 -39 +n 7.5 -10 -39 +n -7.5 -9 -39 +n 7.5 -9 -39 +n -7.5 -8 -39 +n 7.5 -8 -39 +n -7.5 -7 -39 +n 7.5 -7 -39 +n -7.5 -6 -39 +n 7.5 -6 -39 +n -7.5 -5 -39 +n 7.5 -5 -39 +n -7.5 -4 -39 +n 7.5 -4 -39 +n -7.5 -3 -39 +n 7.5 -3 -39 +n -7.5 -2 -39 +n 7.5 -2 -39 +n -7.5 -1 -39 +n 7.5 -1 -39 +n -7.5 0 -39 +n 7.5 0 -39 +n -7.5 1 -39 +n 7.5 1 -39 +n -7.5 2 -39 +n 7.5 2 -39 +n -7.5 3 -39 +n 7.5 3 -39 +n -7.5 4 -39 +n 7.5 4 -39 +n -7.5 5 -39 +n 7.5 5 -39 +n -7.5 6 -39 +n 7.5 6 -39 +n -7.5 7 -39 +n 7.5 7 -39 +n -7.5 8 -39 +n 7.5 8 -39 +n -7.5 9 -39 +n 7.5 9 -39 +n -7.5 10 -39 +n 7.5 10 -39 +n -7.5 11 -39 +n 7.5 11 -39 +n -7.5 12 -39 +n 7.5 12 -39 +n -7.5 13 -39 +n 7.5 13 -39 +n -7.5 14 -39 +n 7.5 14 -39 +n -7.5 15 -39 +n 7.5 15 -39 +n -7.5 16 -39 +n 7.5 16 -39 +n -7.5 17 -39 +n 7.5 17 -39 +n -7.5 18 -39 +n 7.5 18 -39 +n -7.5 19 -39 +n 7.5 19 -39 +n -7.5 20 -39 +n 7.5 20 -39 +n -7.5 21 -39 +n 7.5 21 -39 +n -7.5 22 -39 +n 7.5 22 -39 +n -7.5 23 -39 +n 7.5 23 -39 +n -7.5 24 -39 +n 7.5 24 -39 +n -7.5 25 -39 +n 7.5 25 -39 +n -7.5 -25 -38 +n -7.5 -24 -38 +n 7.5 -25 -38 +n 7.5 -24 -38 +n -7.5 -23 -38 +n 7.5 -23 -38 +n -7.5 -22 -38 +n 7.5 -22 -38 +n -7.5 -21 -38 +n 7.5 -21 -38 +n -7.5 -20 -38 +n 7.5 -20 -38 +n -7.5 -19 -38 +n 7.5 -19 -38 +n -7.5 -18 -38 +n 7.5 -18 -38 +n -7.5 -17 -38 +n 7.5 -17 -38 +n -7.5 -16 -38 +n 7.5 -16 -38 +n -7.5 -15 -38 +n 7.5 -15 -38 +n -7.5 -14 -38 +n 7.5 -14 -38 +n -7.5 -13 -38 +n 7.5 -13 -38 +n -7.5 -12 -38 +n 7.5 -12 -38 +n -7.5 -11 -38 +n 7.5 -11 -38 +n -7.5 -10 -38 +n 7.5 -10 -38 +n -7.5 -9 -38 +n 7.5 -9 -38 +n -7.5 -8 -38 +n 7.5 -8 -38 +n -7.5 -7 -38 +n 7.5 -7 -38 +n -7.5 -6 -38 +n 7.5 -6 -38 +n -7.5 -5 -38 +n 7.5 -5 -38 +n -7.5 -4 -38 +n 7.5 -4 -38 +n -7.5 -3 -38 +n 7.5 -3 -38 +n -7.5 -2 -38 +n 7.5 -2 -38 +n -7.5 -1 -38 +n 7.5 -1 -38 +n -7.5 0 -38 +n 7.5 0 -38 +n -7.5 1 -38 +n 7.5 1 -38 +n -7.5 2 -38 +n 7.5 2 -38 +n -7.5 3 -38 +n 7.5 3 -38 +n -7.5 4 -38 +n 7.5 4 -38 +n -7.5 5 -38 +n 7.5 5 -38 +n -7.5 6 -38 +n 7.5 6 -38 +n -7.5 7 -38 +n 7.5 7 -38 +n -7.5 8 -38 +n 7.5 8 -38 +n -7.5 9 -38 +n 7.5 9 -38 +n -7.5 10 -38 +n 7.5 10 -38 +n -7.5 11 -38 +n 7.5 11 -38 +n -7.5 12 -38 +n 7.5 12 -38 +n -7.5 13 -38 +n 7.5 13 -38 +n -7.5 14 -38 +n 7.5 14 -38 +n -7.5 15 -38 +n 7.5 15 -38 +n -7.5 16 -38 +n 7.5 16 -38 +n -7.5 17 -38 +n 7.5 17 -38 +n -7.5 18 -38 +n 7.5 18 -38 +n -7.5 19 -38 +n 7.5 19 -38 +n -7.5 20 -38 +n 7.5 20 -38 +n -7.5 21 -38 +n 7.5 21 -38 +n -7.5 22 -38 +n 7.5 22 -38 +n -7.5 23 -38 +n 7.5 23 -38 +n -7.5 24 -38 +n 7.5 24 -38 +n -7.5 25 -38 +n 7.5 25 -38 +n -7.5 -25 -37 +n -7.5 -24 -37 +n 7.5 -25 -37 +n 7.5 -24 -37 +n -7.5 -23 -37 +n 7.5 -23 -37 +n -7.5 -22 -37 +n 7.5 -22 -37 +n -7.5 -21 -37 +n 7.5 -21 -37 +n -7.5 -20 -37 +n 7.5 -20 -37 +n -7.5 -19 -37 +n 7.5 -19 -37 +n -7.5 -18 -37 +n 7.5 -18 -37 +n -7.5 -17 -37 +n 7.5 -17 -37 +n -7.5 -16 -37 +n 7.5 -16 -37 +n -7.5 -15 -37 +n 7.5 -15 -37 +n -7.5 -14 -37 +n 7.5 -14 -37 +n -7.5 -13 -37 +n 7.5 -13 -37 +n -7.5 -12 -37 +n 7.5 -12 -37 +n -7.5 -11 -37 +n 7.5 -11 -37 +n -7.5 -10 -37 +n 7.5 -10 -37 +n -7.5 -9 -37 +n 7.5 -9 -37 +n -7.5 -8 -37 +n 7.5 -8 -37 +n -7.5 -7 -37 +n 7.5 -7 -37 +n -7.5 -6 -37 +n 7.5 -6 -37 +n -7.5 -5 -37 +n 7.5 -5 -37 +n -7.5 -4 -37 +n 7.5 -4 -37 +n -7.5 -3 -37 +n 7.5 -3 -37 +n -7.5 -2 -37 +n 7.5 -2 -37 +n -7.5 -1 -37 +n 7.5 -1 -37 +n -7.5 0 -37 +n 7.5 0 -37 +n -7.5 1 -37 +n 7.5 1 -37 +n -7.5 2 -37 +n 7.5 2 -37 +n -7.5 3 -37 +n 7.5 3 -37 +n -7.5 4 -37 +n 7.5 4 -37 +n -7.5 5 -37 +n 7.5 5 -37 +n -7.5 6 -37 +n 7.5 6 -37 +n -7.5 7 -37 +n 7.5 7 -37 +n -7.5 8 -37 +n 7.5 8 -37 +n -7.5 9 -37 +n 7.5 9 -37 +n -7.5 10 -37 +n 7.5 10 -37 +n -7.5 11 -37 +n 7.5 11 -37 +n -7.5 12 -37 +n 7.5 12 -37 +n -7.5 13 -37 +n 7.5 13 -37 +n -7.5 14 -37 +n 7.5 14 -37 +n -7.5 15 -37 +n 7.5 15 -37 +n -7.5 16 -37 +n 7.5 16 -37 +n -7.5 17 -37 +n 7.5 17 -37 +n -7.5 18 -37 +n 7.5 18 -37 +n -7.5 19 -37 +n 7.5 19 -37 +n -7.5 20 -37 +n 7.5 20 -37 +n -7.5 21 -37 +n 7.5 21 -37 +n -7.5 22 -37 +n 7.5 22 -37 +n -7.5 23 -37 +n 7.5 23 -37 +n -7.5 24 -37 +n 7.5 24 -37 +n -7.5 25 -37 +n 7.5 25 -37 +n -7.5 -25 -36 +n -7.5 -24 -36 +n 7.5 -25 -36 +n 7.5 -24 -36 +n -7.5 -23 -36 +n 7.5 -23 -36 +n -7.5 -22 -36 +n 7.5 -22 -36 +n -7.5 -21 -36 +n 7.5 -21 -36 +n -7.5 -20 -36 +n 7.5 -20 -36 +n -7.5 -19 -36 +n 7.5 -19 -36 +n -7.5 -18 -36 +n 7.5 -18 -36 +n -7.5 -17 -36 +n 7.5 -17 -36 +n -7.5 -16 -36 +n 7.5 -16 -36 +n -7.5 -15 -36 +n 7.5 -15 -36 +n -7.5 -14 -36 +n 7.5 -14 -36 +n -7.5 -13 -36 +n 7.5 -13 -36 +n -7.5 -12 -36 +n 7.5 -12 -36 +n -7.5 -11 -36 +n 7.5 -11 -36 +n -7.5 -10 -36 +n 7.5 -10 -36 +n -7.5 -9 -36 +n 7.5 -9 -36 +n -7.5 -8 -36 +n 7.5 -8 -36 +n -7.5 -7 -36 +n 7.5 -7 -36 +n -7.5 -6 -36 +n 7.5 -6 -36 +n -7.5 -5 -36 +n 7.5 -5 -36 +n -7.5 -4 -36 +n 7.5 -4 -36 +n -7.5 -3 -36 +n 7.5 -3 -36 +n -7.5 -2 -36 +n 7.5 -2 -36 +n -7.5 -1 -36 +n 7.5 -1 -36 +n -7.5 0 -36 +n 7.5 0 -36 +n -7.5 1 -36 +n 7.5 1 -36 +n -7.5 2 -36 +n 7.5 2 -36 +n -7.5 3 -36 +n 7.5 3 -36 +n -7.5 4 -36 +n 7.5 4 -36 +n -7.5 5 -36 +n 7.5 5 -36 +n -7.5 6 -36 +n 7.5 6 -36 +n -7.5 7 -36 +n 7.5 7 -36 +n -7.5 8 -36 +n 7.5 8 -36 +n -7.5 9 -36 +n 7.5 9 -36 +n -7.5 10 -36 +n 7.5 10 -36 +n -7.5 11 -36 +n 7.5 11 -36 +n -7.5 12 -36 +n 7.5 12 -36 +n -7.5 13 -36 +n 7.5 13 -36 +n -7.5 14 -36 +n 7.5 14 -36 +n -7.5 15 -36 +n 7.5 15 -36 +n -7.5 16 -36 +n 7.5 16 -36 +n -7.5 17 -36 +n 7.5 17 -36 +n -7.5 18 -36 +n 7.5 18 -36 +n -7.5 19 -36 +n 7.5 19 -36 +n -7.5 20 -36 +n 7.5 20 -36 +n -7.5 21 -36 +n 7.5 21 -36 +n -7.5 22 -36 +n 7.5 22 -36 +n -7.5 23 -36 +n 7.5 23 -36 +n -7.5 24 -36 +n 7.5 24 -36 +n -7.5 25 -36 +n 7.5 25 -36 +n -7.5 -25 -35 +n -7.5 -24 -35 +n 7.5 -25 -35 +n 7.5 -24 -35 +n -7.5 -23 -35 +n 7.5 -23 -35 +n -7.5 -22 -35 +n 7.5 -22 -35 +n -7.5 -21 -35 +n 7.5 -21 -35 +n -7.5 -20 -35 +n 7.5 -20 -35 +n -7.5 -19 -35 +n 7.5 -19 -35 +n -7.5 -18 -35 +n 7.5 -18 -35 +n -7.5 -17 -35 +n 7.5 -17 -35 +n -7.5 -16 -35 +n 7.5 -16 -35 +n -7.5 -15 -35 +n 7.5 -15 -35 +n -7.5 -14 -35 +n 7.5 -14 -35 +n -7.5 -13 -35 +n 7.5 -13 -35 +n -7.5 -12 -35 +n 7.5 -12 -35 +n -7.5 -11 -35 +n 7.5 -11 -35 +n -7.5 -10 -35 +n 7.5 -10 -35 +n -7.5 -9 -35 +n 7.5 -9 -35 +n -7.5 -8 -35 +n 7.5 -8 -35 +n -7.5 -7 -35 +n 7.5 -7 -35 +n -7.5 -6 -35 +n 7.5 -6 -35 +n -7.5 -5 -35 +n 7.5 -5 -35 +n -7.5 -4 -35 +n 7.5 -4 -35 +n -7.5 -3 -35 +n 7.5 -3 -35 +n -7.5 -2 -35 +n 7.5 -2 -35 +n -7.5 -1 -35 +n 7.5 -1 -35 +n -7.5 0 -35 +n 7.5 0 -35 +n -7.5 1 -35 +n 7.5 1 -35 +n -7.5 2 -35 +n 7.5 2 -35 +n -7.5 3 -35 +n 7.5 3 -35 +n -7.5 4 -35 +n 7.5 4 -35 +n -7.5 5 -35 +n 7.5 5 -35 +n -7.5 6 -35 +n 7.5 6 -35 +n -7.5 7 -35 +n 7.5 7 -35 +n -7.5 8 -35 +n 7.5 8 -35 +n -7.5 9 -35 +n 7.5 9 -35 +n -7.5 10 -35 +n 7.5 10 -35 +n -7.5 11 -35 +n 7.5 11 -35 +n -7.5 12 -35 +n 7.5 12 -35 +n -7.5 13 -35 +n 7.5 13 -35 +n -7.5 14 -35 +n 7.5 14 -35 +n -7.5 15 -35 +n 7.5 15 -35 +n -7.5 16 -35 +n 7.5 16 -35 +n -7.5 17 -35 +n 7.5 17 -35 +n -7.5 18 -35 +n 7.5 18 -35 +n -7.5 19 -35 +n 7.5 19 -35 +n -7.5 20 -35 +n 7.5 20 -35 +n -7.5 21 -35 +n 7.5 21 -35 +n -7.5 22 -35 +n 7.5 22 -35 +n -7.5 23 -35 +n 7.5 23 -35 +n -7.5 24 -35 +n 7.5 24 -35 +n -7.5 25 -35 +n 7.5 25 -35 +n -7.5 -25 -34 +n -7.5 -24 -34 +n 7.5 -25 -34 +n 7.5 -24 -34 +n -7.5 -23 -34 +n 7.5 -23 -34 +n -7.5 -22 -34 +n 7.5 -22 -34 +n -7.5 -21 -34 +n 7.5 -21 -34 +n -7.5 -20 -34 +n 7.5 -20 -34 +n -7.5 -19 -34 +n 7.5 -19 -34 +n -7.5 -18 -34 +n 7.5 -18 -34 +n -7.5 -17 -34 +n 7.5 -17 -34 +n -7.5 -16 -34 +n 7.5 -16 -34 +n -7.5 -15 -34 +n 7.5 -15 -34 +n -7.5 -14 -34 +n 7.5 -14 -34 +n -7.5 -13 -34 +n 7.5 -13 -34 +n -7.5 -12 -34 +n 7.5 -12 -34 +n -7.5 -11 -34 +n 7.5 -11 -34 +n -7.5 -10 -34 +n 7.5 -10 -34 +n -7.5 -9 -34 +n 7.5 -9 -34 +n -7.5 -8 -34 +n 7.5 -8 -34 +n -7.5 -7 -34 +n 7.5 -7 -34 +n -7.5 -6 -34 +n 7.5 -6 -34 +n -7.5 -5 -34 +n 7.5 -5 -34 +n -7.5 -4 -34 +n 7.5 -4 -34 +n -7.5 -3 -34 +n 7.5 -3 -34 +n -7.5 -2 -34 +n 7.5 -2 -34 +n -7.5 -1 -34 +n 7.5 -1 -34 +n -7.5 0 -34 +n 7.5 0 -34 +n -7.5 1 -34 +n 7.5 1 -34 +n -7.5 2 -34 +n 7.5 2 -34 +n -7.5 3 -34 +n 7.5 3 -34 +n -7.5 4 -34 +n 7.5 4 -34 +n -7.5 5 -34 +n 7.5 5 -34 +n -7.5 6 -34 +n 7.5 6 -34 +n -7.5 7 -34 +n 7.5 7 -34 +n -7.5 8 -34 +n 7.5 8 -34 +n -7.5 9 -34 +n 7.5 9 -34 +n -7.5 10 -34 +n 7.5 10 -34 +n -7.5 11 -34 +n 7.5 11 -34 +n -7.5 12 -34 +n 7.5 12 -34 +n -7.5 13 -34 +n 7.5 13 -34 +n -7.5 14 -34 +n 7.5 14 -34 +n -7.5 15 -34 +n 7.5 15 -34 +n -7.5 16 -34 +n 7.5 16 -34 +n -7.5 17 -34 +n 7.5 17 -34 +n -7.5 18 -34 +n 7.5 18 -34 +n -7.5 19 -34 +n 7.5 19 -34 +n -7.5 20 -34 +n 7.5 20 -34 +n -7.5 21 -34 +n 7.5 21 -34 +n -7.5 22 -34 +n 7.5 22 -34 +n -7.5 23 -34 +n 7.5 23 -34 +n -7.5 24 -34 +n 7.5 24 -34 +n -7.5 25 -34 +n 7.5 25 -34 +n -7.5 -25 -33 +n -7.5 -24 -33 +n 7.5 -25 -33 +n 7.5 -24 -33 +n -7.5 -23 -33 +n 7.5 -23 -33 +n -7.5 -22 -33 +n 7.5 -22 -33 +n -7.5 -21 -33 +n 7.5 -21 -33 +n -7.5 -20 -33 +n 7.5 -20 -33 +n -7.5 -19 -33 +n 7.5 -19 -33 +n -7.5 -18 -33 +n 7.5 -18 -33 +n -7.5 -17 -33 +n 7.5 -17 -33 +n -7.5 -16 -33 +n 7.5 -16 -33 +n -7.5 -15 -33 +n 7.5 -15 -33 +n -7.5 -14 -33 +n 7.5 -14 -33 +n -7.5 -13 -33 +n 7.5 -13 -33 +n -7.5 -12 -33 +n 7.5 -12 -33 +n -7.5 -11 -33 +n 7.5 -11 -33 +n -7.5 -10 -33 +n 7.5 -10 -33 +n -7.5 -9 -33 +n 7.5 -9 -33 +n -7.5 -8 -33 +n 7.5 -8 -33 +n -7.5 -7 -33 +n 7.5 -7 -33 +n -7.5 -6 -33 +n 7.5 -6 -33 +n -7.5 -5 -33 +n 7.5 -5 -33 +n -7.5 -4 -33 +n 7.5 -4 -33 +n -7.5 -3 -33 +n 7.5 -3 -33 +n -7.5 -2 -33 +n 7.5 -2 -33 +n -7.5 -1 -33 +n 7.5 -1 -33 +n -7.5 0 -33 +n 7.5 0 -33 +n -7.5 1 -33 +n 7.5 1 -33 +n -7.5 2 -33 +n 7.5 2 -33 +n -7.5 3 -33 +n 7.5 3 -33 +n -7.5 4 -33 +n 7.5 4 -33 +n -7.5 5 -33 +n 7.5 5 -33 +n -7.5 6 -33 +n 7.5 6 -33 +n -7.5 7 -33 +n 7.5 7 -33 +n -7.5 8 -33 +n 7.5 8 -33 +n -7.5 9 -33 +n 7.5 9 -33 +n -7.5 10 -33 +n 7.5 10 -33 +n -7.5 11 -33 +n 7.5 11 -33 +n -7.5 12 -33 +n 7.5 12 -33 +n -7.5 13 -33 +n 7.5 13 -33 +n -7.5 14 -33 +n 7.5 14 -33 +n -7.5 15 -33 +n 7.5 15 -33 +n -7.5 16 -33 +n 7.5 16 -33 +n -7.5 17 -33 +n 7.5 17 -33 +n -7.5 18 -33 +n 7.5 18 -33 +n -7.5 19 -33 +n 7.5 19 -33 +n -7.5 20 -33 +n 7.5 20 -33 +n -7.5 21 -33 +n 7.5 21 -33 +n -7.5 22 -33 +n 7.5 22 -33 +n -7.5 23 -33 +n 7.5 23 -33 +n -7.5 24 -33 +n 7.5 24 -33 +n -7.5 25 -33 +n 7.5 25 -33 +n -7.5 -25 -32 +n -7.5 -24 -32 +n 7.5 -25 -32 +n 7.5 -24 -32 +n -7.5 -23 -32 +n 7.5 -23 -32 +n -7.5 -22 -32 +n 7.5 -22 -32 +n -7.5 -21 -32 +n 7.5 -21 -32 +n -7.5 -20 -32 +n 7.5 -20 -32 +n -7.5 -19 -32 +n 7.5 -19 -32 +n -7.5 -18 -32 +n 7.5 -18 -32 +n -7.5 -17 -32 +n 7.5 -17 -32 +n -7.5 -16 -32 +n 7.5 -16 -32 +n -7.5 -15 -32 +n 7.5 -15 -32 +n -7.5 -14 -32 +n 7.5 -14 -32 +n -7.5 -13 -32 +n 7.5 -13 -32 +n -7.5 -12 -32 +n 7.5 -12 -32 +n -7.5 -11 -32 +n 7.5 -11 -32 +n -7.5 -10 -32 +n 7.5 -10 -32 +n -7.5 -9 -32 +n 7.5 -9 -32 +n -7.5 -8 -32 +n 7.5 -8 -32 +n -7.5 -7 -32 +n 7.5 -7 -32 +n -7.5 -6 -32 +n 7.5 -6 -32 +n -7.5 -5 -32 +n 7.5 -5 -32 +n -7.5 -4 -32 +n 7.5 -4 -32 +n -7.5 -3 -32 +n 7.5 -3 -32 +n -7.5 -2 -32 +n 7.5 -2 -32 +n -7.5 -1 -32 +n 7.5 -1 -32 +n -7.5 0 -32 +n 7.5 0 -32 +n -7.5 1 -32 +n 7.5 1 -32 +n -7.5 2 -32 +n 7.5 2 -32 +n -7.5 3 -32 +n 7.5 3 -32 +n -7.5 4 -32 +n 7.5 4 -32 +n -7.5 5 -32 +n 7.5 5 -32 +n -7.5 6 -32 +n 7.5 6 -32 +n -7.5 7 -32 +n 7.5 7 -32 +n -7.5 8 -32 +n 7.5 8 -32 +n -7.5 9 -32 +n 7.5 9 -32 +n -7.5 10 -32 +n 7.5 10 -32 +n -7.5 11 -32 +n 7.5 11 -32 +n -7.5 12 -32 +n 7.5 12 -32 +n -7.5 13 -32 +n 7.5 13 -32 +n -7.5 14 -32 +n 7.5 14 -32 +n -7.5 15 -32 +n 7.5 15 -32 +n -7.5 16 -32 +n 7.5 16 -32 +n -7.5 17 -32 +n 7.5 17 -32 +n -7.5 18 -32 +n 7.5 18 -32 +n -7.5 19 -32 +n 7.5 19 -32 +n -7.5 20 -32 +n 7.5 20 -32 +n -7.5 21 -32 +n 7.5 21 -32 +n -7.5 22 -32 +n 7.5 22 -32 +n -7.5 23 -32 +n 7.5 23 -32 +n -7.5 24 -32 +n 7.5 24 -32 +n -7.5 25 -32 +n 7.5 25 -32 +n -7.5 -25 -31 +n -7.5 -24 -31 +n 7.5 -25 -31 +n 7.5 -24 -31 +n -7.5 -23 -31 +n 7.5 -23 -31 +n -7.5 -22 -31 +n 7.5 -22 -31 +n -7.5 -21 -31 +n 7.5 -21 -31 +n -7.5 -20 -31 +n 7.5 -20 -31 +n -7.5 -19 -31 +n 7.5 -19 -31 +n -7.5 -18 -31 +n 7.5 -18 -31 +n -7.5 -17 -31 +n 7.5 -17 -31 +n -7.5 -16 -31 +n 7.5 -16 -31 +n -7.5 -15 -31 +n 7.5 -15 -31 +n -7.5 -14 -31 +n 7.5 -14 -31 +n -7.5 -13 -31 +n 7.5 -13 -31 +n -7.5 -12 -31 +n 7.5 -12 -31 +n -7.5 -11 -31 +n 7.5 -11 -31 +n -7.5 -10 -31 +n 7.5 -10 -31 +n -7.5 -9 -31 +n 7.5 -9 -31 +n -7.5 -8 -31 +n 7.5 -8 -31 +n -7.5 -7 -31 +n 7.5 -7 -31 +n -7.5 -6 -31 +n 7.5 -6 -31 +n -7.5 -5 -31 +n 7.5 -5 -31 +n -7.5 -4 -31 +n 7.5 -4 -31 +n -7.5 -3 -31 +n 7.5 -3 -31 +n -7.5 -2 -31 +n 7.5 -2 -31 +n -7.5 -1 -31 +n 7.5 -1 -31 +n -7.5 0 -31 +n 7.5 0 -31 +n -7.5 1 -31 +n 7.5 1 -31 +n -7.5 2 -31 +n 7.5 2 -31 +n -7.5 3 -31 +n 7.5 3 -31 +n -7.5 4 -31 +n 7.5 4 -31 +n -7.5 5 -31 +n 7.5 5 -31 +n -7.5 6 -31 +n 7.5 6 -31 +n -7.5 7 -31 +n 7.5 7 -31 +n -7.5 8 -31 +n 7.5 8 -31 +n -7.5 9 -31 +n 7.5 9 -31 +n -7.5 10 -31 +n 7.5 10 -31 +n -7.5 11 -31 +n 7.5 11 -31 +n -7.5 12 -31 +n 7.5 12 -31 +n -7.5 13 -31 +n 7.5 13 -31 +n -7.5 14 -31 +n 7.5 14 -31 +n -7.5 15 -31 +n 7.5 15 -31 +n -7.5 16 -31 +n 7.5 16 -31 +n -7.5 17 -31 +n 7.5 17 -31 +n -7.5 18 -31 +n 7.5 18 -31 +n -7.5 19 -31 +n 7.5 19 -31 +n -7.5 20 -31 +n 7.5 20 -31 +n -7.5 21 -31 +n 7.5 21 -31 +n -7.5 22 -31 +n 7.5 22 -31 +n -7.5 23 -31 +n 7.5 23 -31 +n -7.5 24 -31 +n 7.5 24 -31 +n -7.5 25 -31 +n 7.5 25 -31 +n -7.5 -25 -30 +n -7.5 -24 -30 +n 7.5 -25 -30 +n 7.5 -24 -30 +n -7.5 -23 -30 +n 7.5 -23 -30 +n -7.5 -22 -30 +n 7.5 -22 -30 +n -7.5 -21 -30 +n 7.5 -21 -30 +n -7.5 -20 -30 +n 7.5 -20 -30 +n -7.5 -19 -30 +n 7.5 -19 -30 +n -7.5 -18 -30 +n 7.5 -18 -30 +n -7.5 -17 -30 +n 7.5 -17 -30 +n -7.5 -16 -30 +n 7.5 -16 -30 +n -7.5 -15 -30 +n 7.5 -15 -30 +n -7.5 -14 -30 +n 7.5 -14 -30 +n -7.5 -13 -30 +n 7.5 -13 -30 +n -7.5 -12 -30 +n 7.5 -12 -30 +n -7.5 -11 -30 +n 7.5 -11 -30 +n -7.5 -10 -30 +n 7.5 -10 -30 +n -7.5 -9 -30 +n 7.5 -9 -30 +n -7.5 -8 -30 +n 7.5 -8 -30 +n -7.5 -7 -30 +n 7.5 -7 -30 +n -7.5 -6 -30 +n 7.5 -6 -30 +n -7.5 -5 -30 +n 7.5 -5 -30 +n -7.5 -4 -30 +n 7.5 -4 -30 +n -7.5 -3 -30 +n 7.5 -3 -30 +n -7.5 -2 -30 +n 7.5 -2 -30 +n -7.5 -1 -30 +n 7.5 -1 -30 +n -7.5 0 -30 +n 7.5 0 -30 +n -7.5 1 -30 +n 7.5 1 -30 +n -7.5 2 -30 +n 7.5 2 -30 +n -7.5 3 -30 +n 7.5 3 -30 +n -7.5 4 -30 +n 7.5 4 -30 +n -7.5 5 -30 +n 7.5 5 -30 +n -7.5 6 -30 +n 7.5 6 -30 +n -7.5 7 -30 +n 7.5 7 -30 +n -7.5 8 -30 +n 7.5 8 -30 +n -7.5 9 -30 +n 7.5 9 -30 +n -7.5 10 -30 +n 7.5 10 -30 +n -7.5 11 -30 +n 7.5 11 -30 +n -7.5 12 -30 +n 7.5 12 -30 +n -7.5 13 -30 +n 7.5 13 -30 +n -7.5 14 -30 +n 7.5 14 -30 +n -7.5 15 -30 +n 7.5 15 -30 +n -7.5 16 -30 +n 7.5 16 -30 +n -7.5 17 -30 +n 7.5 17 -30 +n -7.5 18 -30 +n 7.5 18 -30 +n -7.5 19 -30 +n 7.5 19 -30 +n -7.5 20 -30 +n 7.5 20 -30 +n -7.5 21 -30 +n 7.5 21 -30 +n -7.5 22 -30 +n 7.5 22 -30 +n -7.5 23 -30 +n 7.5 23 -30 +n -7.5 24 -30 +n 7.5 24 -30 +n -7.5 25 -30 +n 7.5 25 -30 +n -7.5 -25 -29 +n -7.5 -24 -29 +n 7.5 -25 -29 +n 7.5 -24 -29 +n -7.5 -23 -29 +n 7.5 -23 -29 +n -7.5 -22 -29 +n 7.5 -22 -29 +n -7.5 -21 -29 +n 7.5 -21 -29 +n -7.5 -20 -29 +n 7.5 -20 -29 +n -7.5 -19 -29 +n 7.5 -19 -29 +n -7.5 -18 -29 +n 7.5 -18 -29 +n -7.5 -17 -29 +n 7.5 -17 -29 +n -7.5 -16 -29 +n 7.5 -16 -29 +n -7.5 -15 -29 +n 7.5 -15 -29 +n -7.5 -14 -29 +n 7.5 -14 -29 +n -7.5 -13 -29 +n 7.5 -13 -29 +n -7.5 -12 -29 +n 7.5 -12 -29 +n -7.5 -11 -29 +n 7.5 -11 -29 +n -7.5 -10 -29 +n 7.5 -10 -29 +n -7.5 -9 -29 +n 7.5 -9 -29 +n -7.5 -8 -29 +n 7.5 -8 -29 +n -7.5 -7 -29 +n 7.5 -7 -29 +n -7.5 -6 -29 +n 7.5 -6 -29 +n -7.5 -5 -29 +n 7.5 -5 -29 +n -7.5 -4 -29 +n 7.5 -4 -29 +n -7.5 -3 -29 +n 7.5 -3 -29 +n -7.5 -2 -29 +n 7.5 -2 -29 +n -7.5 -1 -29 +n 7.5 -1 -29 +n -7.5 0 -29 +n 7.5 0 -29 +n -7.5 1 -29 +n 7.5 1 -29 +n -7.5 2 -29 +n 7.5 2 -29 +n -7.5 3 -29 +n 7.5 3 -29 +n -7.5 4 -29 +n 7.5 4 -29 +n -7.5 5 -29 +n 7.5 5 -29 +n -7.5 6 -29 +n 7.5 6 -29 +n -7.5 7 -29 +n 7.5 7 -29 +n -7.5 8 -29 +n 7.5 8 -29 +n -7.5 9 -29 +n 7.5 9 -29 +n -7.5 10 -29 +n 7.5 10 -29 +n -7.5 11 -29 +n 7.5 11 -29 +n -7.5 12 -29 +n 7.5 12 -29 +n -7.5 13 -29 +n 7.5 13 -29 +n -7.5 14 -29 +n 7.5 14 -29 +n -7.5 15 -29 +n 7.5 15 -29 +n -7.5 16 -29 +n 7.5 16 -29 +n -7.5 17 -29 +n 7.5 17 -29 +n -7.5 18 -29 +n 7.5 18 -29 +n -7.5 19 -29 +n 7.5 19 -29 +n -7.5 20 -29 +n 7.5 20 -29 +n -7.5 21 -29 +n 7.5 21 -29 +n -7.5 22 -29 +n 7.5 22 -29 +n -7.5 23 -29 +n 7.5 23 -29 +n -7.5 24 -29 +n 7.5 24 -29 +n -7.5 25 -29 +n 7.5 25 -29 +n -7.5 -25 -28 +n -7.5 -24 -28 +n 7.5 -25 -28 +n 7.5 -24 -28 +n -7.5 -23 -28 +n 7.5 -23 -28 +n -7.5 -22 -28 +n 7.5 -22 -28 +n -7.5 -21 -28 +n 7.5 -21 -28 +n -7.5 -20 -28 +n 7.5 -20 -28 +n -7.5 -19 -28 +n 7.5 -19 -28 +n -7.5 -18 -28 +n 7.5 -18 -28 +n -7.5 -17 -28 +n 7.5 -17 -28 +n -7.5 -16 -28 +n 7.5 -16 -28 +n -7.5 -15 -28 +n 7.5 -15 -28 +n -7.5 -14 -28 +n 7.5 -14 -28 +n -7.5 -13 -28 +n 7.5 -13 -28 +n -7.5 -12 -28 +n 7.5 -12 -28 +n -7.5 -11 -28 +n 7.5 -11 -28 +n -7.5 -10 -28 +n 7.5 -10 -28 +n -7.5 -9 -28 +n 7.5 -9 -28 +n -7.5 -8 -28 +n 7.5 -8 -28 +n -7.5 -7 -28 +n 7.5 -7 -28 +n -7.5 -6 -28 +n 7.5 -6 -28 +n -7.5 -5 -28 +n 7.5 -5 -28 +n -7.5 -4 -28 +n 7.5 -4 -28 +n -7.5 -3 -28 +n 7.5 -3 -28 +n -7.5 -2 -28 +n 7.5 -2 -28 +n -7.5 -1 -28 +n 7.5 -1 -28 +n -7.5 0 -28 +n 7.5 0 -28 +n -7.5 1 -28 +n 7.5 1 -28 +n -7.5 2 -28 +n 7.5 2 -28 +n -7.5 3 -28 +n 7.5 3 -28 +n -7.5 4 -28 +n 7.5 4 -28 +n -7.5 5 -28 +n 7.5 5 -28 +n -7.5 6 -28 +n 7.5 6 -28 +n -7.5 7 -28 +n 7.5 7 -28 +n -7.5 8 -28 +n 7.5 8 -28 +n -7.5 9 -28 +n 7.5 9 -28 +n -7.5 10 -28 +n 7.5 10 -28 +n -7.5 11 -28 +n 7.5 11 -28 +n -7.5 12 -28 +n 7.5 12 -28 +n -7.5 13 -28 +n 7.5 13 -28 +n -7.5 14 -28 +n 7.5 14 -28 +n -7.5 15 -28 +n 7.5 15 -28 +n -7.5 16 -28 +n 7.5 16 -28 +n -7.5 17 -28 +n 7.5 17 -28 +n -7.5 18 -28 +n 7.5 18 -28 +n -7.5 19 -28 +n 7.5 19 -28 +n -7.5 20 -28 +n 7.5 20 -28 +n -7.5 21 -28 +n 7.5 21 -28 +n -7.5 22 -28 +n 7.5 22 -28 +n -7.5 23 -28 +n 7.5 23 -28 +n -7.5 24 -28 +n 7.5 24 -28 +n -7.5 25 -28 +n 7.5 25 -28 +n -7.5 -25 -27 +n -7.5 -24 -27 +n 7.5 -25 -27 +n 7.5 -24 -27 +n -7.5 -23 -27 +n 7.5 -23 -27 +n -7.5 -22 -27 +n 7.5 -22 -27 +n -7.5 -21 -27 +n 7.5 -21 -27 +n -7.5 -20 -27 +n 7.5 -20 -27 +n -7.5 -19 -27 +n 7.5 -19 -27 +n -7.5 -18 -27 +n 7.5 -18 -27 +n -7.5 -17 -27 +n 7.5 -17 -27 +n -7.5 -16 -27 +n 7.5 -16 -27 +n -7.5 -15 -27 +n 7.5 -15 -27 +n -7.5 -14 -27 +n 7.5 -14 -27 +n -7.5 -13 -27 +n 7.5 -13 -27 +n -7.5 -12 -27 +n 7.5 -12 -27 +n -7.5 -11 -27 +n 7.5 -11 -27 +n -7.5 -10 -27 +n 7.5 -10 -27 +n -7.5 -9 -27 +n 7.5 -9 -27 +n -7.5 -8 -27 +n 7.5 -8 -27 +n -7.5 -7 -27 +n 7.5 -7 -27 +n -7.5 -6 -27 +n 7.5 -6 -27 +n -7.5 -5 -27 +n 7.5 -5 -27 +n -7.5 -4 -27 +n 7.5 -4 -27 +n -7.5 -3 -27 +n 7.5 -3 -27 +n -7.5 -2 -27 +n 7.5 -2 -27 +n -7.5 -1 -27 +n 7.5 -1 -27 +n -7.5 0 -27 +n 7.5 0 -27 +n -7.5 1 -27 +n 7.5 1 -27 +n -7.5 2 -27 +n 7.5 2 -27 +n -7.5 3 -27 +n 7.5 3 -27 +n -7.5 4 -27 +n 7.5 4 -27 +n -7.5 5 -27 +n 7.5 5 -27 +n -7.5 6 -27 +n 7.5 6 -27 +n -7.5 7 -27 +n 7.5 7 -27 +n -7.5 8 -27 +n 7.5 8 -27 +n -7.5 9 -27 +n 7.5 9 -27 +n -7.5 10 -27 +n 7.5 10 -27 +n -7.5 11 -27 +n 7.5 11 -27 +n -7.5 12 -27 +n 7.5 12 -27 +n -7.5 13 -27 +n 7.5 13 -27 +n -7.5 14 -27 +n 7.5 14 -27 +n -7.5 15 -27 +n 7.5 15 -27 +n -7.5 16 -27 +n 7.5 16 -27 +n -7.5 17 -27 +n 7.5 17 -27 +n -7.5 18 -27 +n 7.5 18 -27 +n -7.5 19 -27 +n 7.5 19 -27 +n -7.5 20 -27 +n 7.5 20 -27 +n -7.5 21 -27 +n 7.5 21 -27 +n -7.5 22 -27 +n 7.5 22 -27 +n -7.5 23 -27 +n 7.5 23 -27 +n -7.5 24 -27 +n 7.5 24 -27 +n -7.5 25 -27 +n 7.5 25 -27 +n -7.5 -25 -26 +n -7.5 -24 -26 +n 7.5 -25 -26 +n 7.5 -24 -26 +n -7.5 -23 -26 +n 7.5 -23 -26 +n -7.5 -22 -26 +n 7.5 -22 -26 +n -7.5 -21 -26 +n 7.5 -21 -26 +n -7.5 -20 -26 +n 7.5 -20 -26 +n -7.5 -19 -26 +n 7.5 -19 -26 +n -7.5 -18 -26 +n 7.5 -18 -26 +n -7.5 -17 -26 +n 7.5 -17 -26 +n -7.5 -16 -26 +n 7.5 -16 -26 +n -7.5 -15 -26 +n 7.5 -15 -26 +n -7.5 -14 -26 +n 7.5 -14 -26 +n -7.5 -13 -26 +n 7.5 -13 -26 +n -7.5 -12 -26 +n 7.5 -12 -26 +n -7.5 -11 -26 +n 7.5 -11 -26 +n -7.5 -10 -26 +n 7.5 -10 -26 +n -7.5 -9 -26 +n 7.5 -9 -26 +n -7.5 -8 -26 +n 7.5 -8 -26 +n -7.5 -7 -26 +n 7.5 -7 -26 +n -7.5 -6 -26 +n 7.5 -6 -26 +n -7.5 -5 -26 +n 7.5 -5 -26 +n -7.5 -4 -26 +n 7.5 -4 -26 +n -7.5 -3 -26 +n 7.5 -3 -26 +n -7.5 -2 -26 +n 7.5 -2 -26 +n -7.5 -1 -26 +n 7.5 -1 -26 +n -7.5 0 -26 +n 7.5 0 -26 +n -7.5 1 -26 +n 7.5 1 -26 +n -7.5 2 -26 +n 7.5 2 -26 +n -7.5 3 -26 +n 7.5 3 -26 +n -7.5 4 -26 +n 7.5 4 -26 +n -7.5 5 -26 +n 7.5 5 -26 +n -7.5 6 -26 +n 7.5 6 -26 +n -7.5 7 -26 +n 7.5 7 -26 +n -7.5 8 -26 +n 7.5 8 -26 +n -7.5 9 -26 +n 7.5 9 -26 +n -7.5 10 -26 +n 7.5 10 -26 +n -7.5 11 -26 +n 7.5 11 -26 +n -7.5 12 -26 +n 7.5 12 -26 +n -7.5 13 -26 +n 7.5 13 -26 +n -7.5 14 -26 +n 7.5 14 -26 +n -7.5 15 -26 +n 7.5 15 -26 +n -7.5 16 -26 +n 7.5 16 -26 +n -7.5 17 -26 +n 7.5 17 -26 +n -7.5 18 -26 +n 7.5 18 -26 +n -7.5 19 -26 +n 7.5 19 -26 +n -7.5 20 -26 +n 7.5 20 -26 +n -7.5 21 -26 +n 7.5 21 -26 +n -7.5 22 -26 +n 7.5 22 -26 +n -7.5 23 -26 +n 7.5 23 -26 +n -7.5 24 -26 +n 7.5 24 -26 +n -7.5 25 -26 +n 7.5 25 -26 +n -7.5 -25 -25 +n -7.5 -24 -25 +n 7.5 -25 -25 +n 7.5 -24 -25 +n -7.5 -23 -25 +n 7.5 -23 -25 +n -7.5 -22 -25 +n 7.5 -22 -25 +n -7.5 -21 -25 +n 7.5 -21 -25 +n -7.5 -20 -25 +n 7.5 -20 -25 +n -7.5 -19 -25 +n 7.5 -19 -25 +n -7.5 -18 -25 +n 7.5 -18 -25 +n -7.5 -17 -25 +n 7.5 -17 -25 +n -7.5 -16 -25 +n 7.5 -16 -25 +n -7.5 -15 -25 +n 7.5 -15 -25 +n -7.5 -14 -25 +n 7.5 -14 -25 +n -7.5 -13 -25 +n 7.5 -13 -25 +n -7.5 -12 -25 +n 7.5 -12 -25 +n -7.5 -11 -25 +n 7.5 -11 -25 +n -7.5 -10 -25 +n 7.5 -10 -25 +n -7.5 -9 -25 +n 7.5 -9 -25 +n -7.5 -8 -25 +n 7.5 -8 -25 +n -7.5 -7 -25 +n 7.5 -7 -25 +n -7.5 -6 -25 +n 7.5 -6 -25 +n -7.5 -5 -25 +n 7.5 -5 -25 +n -7.5 -4 -25 +n 7.5 -4 -25 +n -7.5 -3 -25 +n 7.5 -3 -25 +n -7.5 -2 -25 +n 7.5 -2 -25 +n -7.5 -1 -25 +n 7.5 -1 -25 +n -7.5 0 -25 +n 7.5 0 -25 +n -7.5 1 -25 +n 7.5 1 -25 +n -7.5 2 -25 +n 7.5 2 -25 +n -7.5 3 -25 +n 7.5 3 -25 +n -7.5 4 -25 +n 7.5 4 -25 +n -7.5 5 -25 +n 7.5 5 -25 +n -7.5 6 -25 +n 7.5 6 -25 +n -7.5 7 -25 +n 7.5 7 -25 +n -7.5 8 -25 +n 7.5 8 -25 +n -7.5 9 -25 +n 7.5 9 -25 +n -7.5 10 -25 +n 7.5 10 -25 +n -7.5 11 -25 +n 7.5 11 -25 +n -7.5 12 -25 +n 7.5 12 -25 +n -7.5 13 -25 +n 7.5 13 -25 +n -7.5 14 -25 +n 7.5 14 -25 +n -7.5 15 -25 +n 7.5 15 -25 +n -7.5 16 -25 +n 7.5 16 -25 +n -7.5 17 -25 +n 7.5 17 -25 +n -7.5 18 -25 +n 7.5 18 -25 +n -7.5 19 -25 +n 7.5 19 -25 +n -7.5 20 -25 +n 7.5 20 -25 +n -7.5 21 -25 +n 7.5 21 -25 +n -7.5 22 -25 +n 7.5 22 -25 +n -7.5 23 -25 +n 7.5 23 -25 +n -7.5 24 -25 +n 7.5 24 -25 +n -7.5 25 -25 +n 7.5 25 -25 +n -7.5 -25 -24 +n -7.5 -24 -24 +n 7.5 -25 -24 +n 7.5 -24 -24 +n -7.5 -23 -24 +n 7.5 -23 -24 +n -7.5 -22 -24 +n 7.5 -22 -24 +n -7.5 -21 -24 +n 7.5 -21 -24 +n -7.5 -20 -24 +n 7.5 -20 -24 +n -7.5 -19 -24 +n 7.5 -19 -24 +n -7.5 -18 -24 +n 7.5 -18 -24 +n -7.5 -17 -24 +n 7.5 -17 -24 +n -7.5 -16 -24 +n 7.5 -16 -24 +n -7.5 -15 -24 +n 7.5 -15 -24 +n -7.5 -14 -24 +n 7.5 -14 -24 +n -7.5 -13 -24 +n 7.5 -13 -24 +n -7.5 -12 -24 +n 7.5 -12 -24 +n -7.5 -11 -24 +n 7.5 -11 -24 +n -7.5 -10 -24 +n 7.5 -10 -24 +n -7.5 -9 -24 +n 7.5 -9 -24 +n -7.5 -8 -24 +n 7.5 -8 -24 +n -7.5 -7 -24 +n 7.5 -7 -24 +n -7.5 -6 -24 +n 7.5 -6 -24 +n -7.5 -5 -24 +n 7.5 -5 -24 +n -7.5 -4 -24 +n 7.5 -4 -24 +n -7.5 -3 -24 +n 7.5 -3 -24 +n -7.5 -2 -24 +n 7.5 -2 -24 +n -7.5 -1 -24 +n 7.5 -1 -24 +n -7.5 0 -24 +n 7.5 0 -24 +n -7.5 1 -24 +n 7.5 1 -24 +n -7.5 2 -24 +n 7.5 2 -24 +n -7.5 3 -24 +n 7.5 3 -24 +n -7.5 4 -24 +n 7.5 4 -24 +n -7.5 5 -24 +n 7.5 5 -24 +n -7.5 6 -24 +n 7.5 6 -24 +n -7.5 7 -24 +n 7.5 7 -24 +n -7.5 8 -24 +n 7.5 8 -24 +n -7.5 9 -24 +n 7.5 9 -24 +n -7.5 10 -24 +n 7.5 10 -24 +n -7.5 11 -24 +n 7.5 11 -24 +n -7.5 12 -24 +n 7.5 12 -24 +n -7.5 13 -24 +n 7.5 13 -24 +n -7.5 14 -24 +n 7.5 14 -24 +n -7.5 15 -24 +n 7.5 15 -24 +n -7.5 16 -24 +n 7.5 16 -24 +n -7.5 17 -24 +n 7.5 17 -24 +n -7.5 18 -24 +n 7.5 18 -24 +n -7.5 19 -24 +n 7.5 19 -24 +n -7.5 20 -24 +n 7.5 20 -24 +n -7.5 21 -24 +n 7.5 21 -24 +n -7.5 22 -24 +n 7.5 22 -24 +n -7.5 23 -24 +n 7.5 23 -24 +n -7.5 24 -24 +n 7.5 24 -24 +n -7.5 25 -24 +n 7.5 25 -24 +n -7.5 -25 -23 +n -7.5 -24 -23 +n 7.5 -25 -23 +n 7.5 -24 -23 +n -7.5 -23 -23 +n 7.5 -23 -23 +n -7.5 -22 -23 +n 7.5 -22 -23 +n -7.5 -21 -23 +n 7.5 -21 -23 +n -7.5 -20 -23 +n 7.5 -20 -23 +n -7.5 -19 -23 +n 7.5 -19 -23 +n -7.5 -18 -23 +n 7.5 -18 -23 +n -7.5 -17 -23 +n 7.5 -17 -23 +n -7.5 -16 -23 +n 7.5 -16 -23 +n -7.5 -15 -23 +n 7.5 -15 -23 +n -7.5 -14 -23 +n 7.5 -14 -23 +n -7.5 -13 -23 +n 7.5 -13 -23 +n -7.5 -12 -23 +n 7.5 -12 -23 +n -7.5 -11 -23 +n 7.5 -11 -23 +n -7.5 -10 -23 +n 7.5 -10 -23 +n -7.5 -9 -23 +n 7.5 -9 -23 +n -7.5 -8 -23 +n 7.5 -8 -23 +n -7.5 -7 -23 +n 7.5 -7 -23 +n -7.5 -6 -23 +n 7.5 -6 -23 +n -7.5 -5 -23 +n 7.5 -5 -23 +n -7.5 -4 -23 +n 7.5 -4 -23 +n -7.5 -3 -23 +n 7.5 -3 -23 +n -7.5 -2 -23 +n 7.5 -2 -23 +n -7.5 -1 -23 +n 7.5 -1 -23 +n -7.5 0 -23 +n 7.5 0 -23 +n -7.5 1 -23 +n 7.5 1 -23 +n -7.5 2 -23 +n 7.5 2 -23 +n -7.5 3 -23 +n 7.5 3 -23 +n -7.5 4 -23 +n 7.5 4 -23 +n -7.5 5 -23 +n 7.5 5 -23 +n -7.5 6 -23 +n 7.5 6 -23 +n -7.5 7 -23 +n 7.5 7 -23 +n -7.5 8 -23 +n 7.5 8 -23 +n -7.5 9 -23 +n 7.5 9 -23 +n -7.5 10 -23 +n 7.5 10 -23 +n -7.5 11 -23 +n 7.5 11 -23 +n -7.5 12 -23 +n 7.5 12 -23 +n -7.5 13 -23 +n 7.5 13 -23 +n -7.5 14 -23 +n 7.5 14 -23 +n -7.5 15 -23 +n 7.5 15 -23 +n -7.5 16 -23 +n 7.5 16 -23 +n -7.5 17 -23 +n 7.5 17 -23 +n -7.5 18 -23 +n 7.5 18 -23 +n -7.5 19 -23 +n 7.5 19 -23 +n -7.5 20 -23 +n 7.5 20 -23 +n -7.5 21 -23 +n 7.5 21 -23 +n -7.5 22 -23 +n 7.5 22 -23 +n -7.5 23 -23 +n 7.5 23 -23 +n -7.5 24 -23 +n 7.5 24 -23 +n -7.5 25 -23 +n 7.5 25 -23 +n -7.5 -25 -22 +n -7.5 -24 -22 +n 7.5 -25 -22 +n 7.5 -24 -22 +n -7.5 -23 -22 +n 7.5 -23 -22 +n -7.5 -22 -22 +n 7.5 -22 -22 +n -7.5 -21 -22 +n 7.5 -21 -22 +n -7.5 -20 -22 +n 7.5 -20 -22 +n -7.5 -19 -22 +n 7.5 -19 -22 +n -7.5 -18 -22 +n 7.5 -18 -22 +n -7.5 -17 -22 +n 7.5 -17 -22 +n -7.5 -16 -22 +n 7.5 -16 -22 +n -7.5 -15 -22 +n 7.5 -15 -22 +n -7.5 -14 -22 +n 7.5 -14 -22 +n -7.5 -13 -22 +n 7.5 -13 -22 +n -7.5 -12 -22 +n 7.5 -12 -22 +n -7.5 -11 -22 +n 7.5 -11 -22 +n -7.5 -10 -22 +n 7.5 -10 -22 +n -7.5 -9 -22 +n 7.5 -9 -22 +n -7.5 -8 -22 +n 7.5 -8 -22 +n -7.5 -7 -22 +n 7.5 -7 -22 +n -7.5 -6 -22 +n 7.5 -6 -22 +n -7.5 -5 -22 +n 7.5 -5 -22 +n -7.5 -4 -22 +n 7.5 -4 -22 +n -7.5 -3 -22 +n 7.5 -3 -22 +n -7.5 -2 -22 +n 7.5 -2 -22 +n -7.5 -1 -22 +n 7.5 -1 -22 +n -7.5 0 -22 +n 7.5 0 -22 +n -7.5 1 -22 +n 7.5 1 -22 +n -7.5 2 -22 +n 7.5 2 -22 +n -7.5 3 -22 +n 7.5 3 -22 +n -7.5 4 -22 +n 7.5 4 -22 +n -7.5 5 -22 +n 7.5 5 -22 +n -7.5 6 -22 +n 7.5 6 -22 +n -7.5 7 -22 +n 7.5 7 -22 +n -7.5 8 -22 +n 7.5 8 -22 +n -7.5 9 -22 +n 7.5 9 -22 +n -7.5 10 -22 +n 7.5 10 -22 +n -7.5 11 -22 +n 7.5 11 -22 +n -7.5 12 -22 +n 7.5 12 -22 +n -7.5 13 -22 +n 7.5 13 -22 +n -7.5 14 -22 +n 7.5 14 -22 +n -7.5 15 -22 +n 7.5 15 -22 +n -7.5 16 -22 +n 7.5 16 -22 +n -7.5 17 -22 +n 7.5 17 -22 +n -7.5 18 -22 +n 7.5 18 -22 +n -7.5 19 -22 +n 7.5 19 -22 +n -7.5 20 -22 +n 7.5 20 -22 +n -7.5 21 -22 +n 7.5 21 -22 +n -7.5 22 -22 +n 7.5 22 -22 +n -7.5 23 -22 +n 7.5 23 -22 +n -7.5 24 -22 +n 7.5 24 -22 +n -7.5 25 -22 +n 7.5 25 -22 +n -7.5 -25 -21 +n -7.5 -24 -21 +n 7.5 -25 -21 +n 7.5 -24 -21 +n -7.5 -23 -21 +n 7.5 -23 -21 +n -7.5 -22 -21 +n 7.5 -22 -21 +n -7.5 -21 -21 +n 7.5 -21 -21 +n -7.5 -20 -21 +n 7.5 -20 -21 +n -7.5 -19 -21 +n 7.5 -19 -21 +n -7.5 -18 -21 +n 7.5 -18 -21 +n -7.5 -17 -21 +n 7.5 -17 -21 +n -7.5 -16 -21 +n 7.5 -16 -21 +n -7.5 -15 -21 +n 7.5 -15 -21 +n -7.5 -14 -21 +n 7.5 -14 -21 +n -7.5 -13 -21 +n 7.5 -13 -21 +n -7.5 -12 -21 +n 7.5 -12 -21 +n -7.5 -11 -21 +n 7.5 -11 -21 +n -7.5 -10 -21 +n 7.5 -10 -21 +n -7.5 -9 -21 +n 7.5 -9 -21 +n -7.5 -8 -21 +n 7.5 -8 -21 +n -7.5 -7 -21 +n 7.5 -7 -21 +n -7.5 -6 -21 +n 7.5 -6 -21 +n -7.5 -5 -21 +n 7.5 -5 -21 +n -7.5 -4 -21 +n 7.5 -4 -21 +n -7.5 -3 -21 +n 7.5 -3 -21 +n -7.5 -2 -21 +n 7.5 -2 -21 +n -7.5 -1 -21 +n 7.5 -1 -21 +n -7.5 0 -21 +n 7.5 0 -21 +n -7.5 1 -21 +n 7.5 1 -21 +n -7.5 2 -21 +n 7.5 2 -21 +n -7.5 3 -21 +n 7.5 3 -21 +n -7.5 4 -21 +n 7.5 4 -21 +n -7.5 5 -21 +n 7.5 5 -21 +n -7.5 6 -21 +n 7.5 6 -21 +n -7.5 7 -21 +n 7.5 7 -21 +n -7.5 8 -21 +n 7.5 8 -21 +n -7.5 9 -21 +n 7.5 9 -21 +n -7.5 10 -21 +n 7.5 10 -21 +n -7.5 11 -21 +n 7.5 11 -21 +n -7.5 12 -21 +n 7.5 12 -21 +n -7.5 13 -21 +n 7.5 13 -21 +n -7.5 14 -21 +n 7.5 14 -21 +n -7.5 15 -21 +n 7.5 15 -21 +n -7.5 16 -21 +n 7.5 16 -21 +n -7.5 17 -21 +n 7.5 17 -21 +n -7.5 18 -21 +n 7.5 18 -21 +n -7.5 19 -21 +n 7.5 19 -21 +n -7.5 20 -21 +n 7.5 20 -21 +n -7.5 21 -21 +n 7.5 21 -21 +n -7.5 22 -21 +n 7.5 22 -21 +n -7.5 23 -21 +n 7.5 23 -21 +n -7.5 24 -21 +n 7.5 24 -21 +n -7.5 25 -21 +n 7.5 25 -21 +n -7.5 -25 -20 +n -7.5 -24 -20 +n 7.5 -25 -20 +n 7.5 -24 -20 +n -7.5 -23 -20 +n 7.5 -23 -20 +n -7.5 -22 -20 +n 7.5 -22 -20 +n -7.5 -21 -20 +n 7.5 -21 -20 +n -7.5 -20 -20 +n 7.5 -20 -20 +n -7.5 -19 -20 +n 7.5 -19 -20 +n -7.5 -18 -20 +n 7.5 -18 -20 +n -7.5 -17 -20 +n 7.5 -17 -20 +n -7.5 -16 -20 +n 7.5 -16 -20 +n -7.5 -15 -20 +n 7.5 -15 -20 +n -7.5 -14 -20 +n 7.5 -14 -20 +n -7.5 -13 -20 +n 7.5 -13 -20 +n -7.5 -12 -20 +n 7.5 -12 -20 +n -7.5 -11 -20 +n 7.5 -11 -20 +n -7.5 -10 -20 +n 7.5 -10 -20 +n -7.5 -9 -20 +n 7.5 -9 -20 +n -7.5 -8 -20 +n 7.5 -8 -20 +n -7.5 -7 -20 +n 7.5 -7 -20 +n -7.5 -6 -20 +n 7.5 -6 -20 +n -7.5 -5 -20 +n 7.5 -5 -20 +n -7.5 -4 -20 +n 7.5 -4 -20 +n -7.5 -3 -20 +n 7.5 -3 -20 +n -7.5 -2 -20 +n 7.5 -2 -20 +n -7.5 -1 -20 +n 7.5 -1 -20 +n -7.5 0 -20 +n 7.5 0 -20 +n -7.5 1 -20 +n 7.5 1 -20 +n -7.5 2 -20 +n 7.5 2 -20 +n -7.5 3 -20 +n 7.5 3 -20 +n -7.5 4 -20 +n 7.5 4 -20 +n -7.5 5 -20 +n 7.5 5 -20 +n -7.5 6 -20 +n 7.5 6 -20 +n -7.5 7 -20 +n 7.5 7 -20 +n -7.5 8 -20 +n 7.5 8 -20 +n -7.5 9 -20 +n 7.5 9 -20 +n -7.5 10 -20 +n 7.5 10 -20 +n -7.5 11 -20 +n 7.5 11 -20 +n -7.5 12 -20 +n 7.5 12 -20 +n -7.5 13 -20 +n 7.5 13 -20 +n -7.5 14 -20 +n 7.5 14 -20 +n -7.5 15 -20 +n 7.5 15 -20 +n -7.5 16 -20 +n 7.5 16 -20 +n -7.5 17 -20 +n 7.5 17 -20 +n -7.5 18 -20 +n 7.5 18 -20 +n -7.5 19 -20 +n 7.5 19 -20 +n -7.5 20 -20 +n 7.5 20 -20 +n -7.5 21 -20 +n 7.5 21 -20 +n -7.5 22 -20 +n 7.5 22 -20 +n -7.5 23 -20 +n 7.5 23 -20 +n -7.5 24 -20 +n 7.5 24 -20 +n -7.5 25 -20 +n 7.5 25 -20 +n -7.5 -25 -19 +n -7.5 -24 -19 +n 7.5 -25 -19 +n 7.5 -24 -19 +n -7.5 -23 -19 +n 7.5 -23 -19 +n -7.5 -22 -19 +n 7.5 -22 -19 +n -7.5 -21 -19 +n 7.5 -21 -19 +n -7.5 -20 -19 +n 7.5 -20 -19 +n -7.5 -19 -19 +n 7.5 -19 -19 +n -7.5 -18 -19 +n 7.5 -18 -19 +n -7.5 -17 -19 +n 7.5 -17 -19 +n -7.5 -16 -19 +n 7.5 -16 -19 +n -7.5 -15 -19 +n 7.5 -15 -19 +n -7.5 -14 -19 +n 7.5 -14 -19 +n -7.5 -13 -19 +n 7.5 -13 -19 +n -7.5 -12 -19 +n 7.5 -12 -19 +n -7.5 -11 -19 +n 7.5 -11 -19 +n -7.5 -10 -19 +n 7.5 -10 -19 +n -7.5 -9 -19 +n 7.5 -9 -19 +n -7.5 -8 -19 +n 7.5 -8 -19 +n -7.5 -7 -19 +n 7.5 -7 -19 +n -7.5 -6 -19 +n 7.5 -6 -19 +n -7.5 -5 -19 +n 7.5 -5 -19 +n -7.5 -4 -19 +n 7.5 -4 -19 +n -7.5 -3 -19 +n 7.5 -3 -19 +n -7.5 -2 -19 +n 7.5 -2 -19 +n -7.5 -1 -19 +n 7.5 -1 -19 +n -7.5 0 -19 +n 7.5 0 -19 +n -7.5 1 -19 +n 7.5 1 -19 +n -7.5 2 -19 +n 7.5 2 -19 +n -7.5 3 -19 +n 7.5 3 -19 +n -7.5 4 -19 +n 7.5 4 -19 +n -7.5 5 -19 +n 7.5 5 -19 +n -7.5 6 -19 +n 7.5 6 -19 +n -7.5 7 -19 +n 7.5 7 -19 +n -7.5 8 -19 +n 7.5 8 -19 +n -7.5 9 -19 +n 7.5 9 -19 +n -7.5 10 -19 +n 7.5 10 -19 +n -7.5 11 -19 +n 7.5 11 -19 +n -7.5 12 -19 +n 7.5 12 -19 +n -7.5 13 -19 +n 7.5 13 -19 +n -7.5 14 -19 +n 7.5 14 -19 +n -7.5 15 -19 +n 7.5 15 -19 +n -7.5 16 -19 +n 7.5 16 -19 +n -7.5 17 -19 +n 7.5 17 -19 +n -7.5 18 -19 +n 7.5 18 -19 +n -7.5 19 -19 +n 7.5 19 -19 +n -7.5 20 -19 +n 7.5 20 -19 +n -7.5 21 -19 +n 7.5 21 -19 +n -7.5 22 -19 +n 7.5 22 -19 +n -7.5 23 -19 +n 7.5 23 -19 +n -7.5 24 -19 +n 7.5 24 -19 +n -7.5 25 -19 +n 7.5 25 -19 +n -7.5 -25 -18 +n -7.5 -24 -18 +n 7.5 -25 -18 +n 7.5 -24 -18 +n -7.5 -23 -18 +n 7.5 -23 -18 +n -7.5 -22 -18 +n 7.5 -22 -18 +n -7.5 -21 -18 +n 7.5 -21 -18 +n -7.5 -20 -18 +n 7.5 -20 -18 +n -7.5 -19 -18 +n 7.5 -19 -18 +n -7.5 -18 -18 +n 7.5 -18 -18 +n -7.5 -17 -18 +n 7.5 -17 -18 +n -7.5 -16 -18 +n 7.5 -16 -18 +n -7.5 -15 -18 +n 7.5 -15 -18 +n -7.5 -14 -18 +n 7.5 -14 -18 +n -7.5 -13 -18 +n 7.5 -13 -18 +n -7.5 -12 -18 +n 7.5 -12 -18 +n -7.5 -11 -18 +n 7.5 -11 -18 +n -7.5 -10 -18 +n 7.5 -10 -18 +n -7.5 -9 -18 +n 7.5 -9 -18 +n -7.5 -8 -18 +n 7.5 -8 -18 +n -7.5 -7 -18 +n 7.5 -7 -18 +n -7.5 -6 -18 +n 7.5 -6 -18 +n -7.5 -5 -18 +n 7.5 -5 -18 +n -7.5 -4 -18 +n 7.5 -4 -18 +n -7.5 -3 -18 +n 7.5 -3 -18 +n -7.5 -2 -18 +n 7.5 -2 -18 +n -7.5 -1 -18 +n 7.5 -1 -18 +n -7.5 0 -18 +n 7.5 0 -18 +n -7.5 1 -18 +n 7.5 1 -18 +n -7.5 2 -18 +n 7.5 2 -18 +n -7.5 3 -18 +n 7.5 3 -18 +n -7.5 4 -18 +n 7.5 4 -18 +n -7.5 5 -18 +n 7.5 5 -18 +n -7.5 6 -18 +n 7.5 6 -18 +n -7.5 7 -18 +n 7.5 7 -18 +n -7.5 8 -18 +n 7.5 8 -18 +n -7.5 9 -18 +n 7.5 9 -18 +n -7.5 10 -18 +n 7.5 10 -18 +n -7.5 11 -18 +n 7.5 11 -18 +n -7.5 12 -18 +n 7.5 12 -18 +n -7.5 13 -18 +n 7.5 13 -18 +n -7.5 14 -18 +n 7.5 14 -18 +n -7.5 15 -18 +n 7.5 15 -18 +n -7.5 16 -18 +n 7.5 16 -18 +n -7.5 17 -18 +n 7.5 17 -18 +n -7.5 18 -18 +n 7.5 18 -18 +n -7.5 19 -18 +n 7.5 19 -18 +n -7.5 20 -18 +n 7.5 20 -18 +n -7.5 21 -18 +n 7.5 21 -18 +n -7.5 22 -18 +n 7.5 22 -18 +n -7.5 23 -18 +n 7.5 23 -18 +n -7.5 24 -18 +n 7.5 24 -18 +n -7.5 25 -18 +n 7.5 25 -18 +n -7.5 -25 -17 +n -7.5 -24 -17 +n 7.5 -25 -17 +n 7.5 -24 -17 +n -7.5 -23 -17 +n 7.5 -23 -17 +n -7.5 -22 -17 +n 7.5 -22 -17 +n -7.5 -21 -17 +n 7.5 -21 -17 +n -7.5 -20 -17 +n 7.5 -20 -17 +n -7.5 -19 -17 +n 7.5 -19 -17 +n -7.5 -18 -17 +n 7.5 -18 -17 +n -7.5 -17 -17 +n 7.5 -17 -17 +n -7.5 -16 -17 +n 7.5 -16 -17 +n -7.5 -15 -17 +n 7.5 -15 -17 +n -7.5 -14 -17 +n 7.5 -14 -17 +n -7.5 -13 -17 +n 7.5 -13 -17 +n -7.5 -12 -17 +n 7.5 -12 -17 +n -7.5 -11 -17 +n 7.5 -11 -17 +n -7.5 -10 -17 +n 7.5 -10 -17 +n -7.5 -9 -17 +n 7.5 -9 -17 +n -7.5 -8 -17 +n 7.5 -8 -17 +n -7.5 -7 -17 +n 7.5 -7 -17 +n -7.5 -6 -17 +n 7.5 -6 -17 +n -7.5 -5 -17 +n 7.5 -5 -17 +n -7.5 -4 -17 +n 7.5 -4 -17 +n -7.5 -3 -17 +n 7.5 -3 -17 +n -7.5 -2 -17 +n 7.5 -2 -17 +n -7.5 -1 -17 +n 7.5 -1 -17 +n -7.5 0 -17 +n 7.5 0 -17 +n -7.5 1 -17 +n 7.5 1 -17 +n -7.5 2 -17 +n 7.5 2 -17 +n -7.5 3 -17 +n 7.5 3 -17 +n -7.5 4 -17 +n 7.5 4 -17 +n -7.5 5 -17 +n 7.5 5 -17 +n -7.5 6 -17 +n 7.5 6 -17 +n -7.5 7 -17 +n 7.5 7 -17 +n -7.5 8 -17 +n 7.5 8 -17 +n -7.5 9 -17 +n 7.5 9 -17 +n -7.5 10 -17 +n 7.5 10 -17 +n -7.5 11 -17 +n 7.5 11 -17 +n -7.5 12 -17 +n 7.5 12 -17 +n -7.5 13 -17 +n 7.5 13 -17 +n -7.5 14 -17 +n 7.5 14 -17 +n -7.5 15 -17 +n 7.5 15 -17 +n -7.5 16 -17 +n 7.5 16 -17 +n -7.5 17 -17 +n 7.5 17 -17 +n -7.5 18 -17 +n 7.5 18 -17 +n -7.5 19 -17 +n 7.5 19 -17 +n -7.5 20 -17 +n 7.5 20 -17 +n -7.5 21 -17 +n 7.5 21 -17 +n -7.5 22 -17 +n 7.5 22 -17 +n -7.5 23 -17 +n 7.5 23 -17 +n -7.5 24 -17 +n 7.5 24 -17 +n -7.5 25 -17 +n 7.5 25 -17 +n -7.5 -25 -16 +n -7.5 -24 -16 +n 7.5 -25 -16 +n 7.5 -24 -16 +n -7.5 -23 -16 +n 7.5 -23 -16 +n -7.5 -22 -16 +n 7.5 -22 -16 +n -7.5 -21 -16 +n 7.5 -21 -16 +n -7.5 -20 -16 +n 7.5 -20 -16 +n -7.5 -19 -16 +n 7.5 -19 -16 +n -7.5 -18 -16 +n 7.5 -18 -16 +n -7.5 -17 -16 +n 7.5 -17 -16 +n -7.5 -16 -16 +n 7.5 -16 -16 +n -7.5 -15 -16 +n 7.5 -15 -16 +n -7.5 -14 -16 +n 7.5 -14 -16 +n -7.5 -13 -16 +n 7.5 -13 -16 +n -7.5 -12 -16 +n 7.5 -12 -16 +n -7.5 -11 -16 +n 7.5 -11 -16 +n -7.5 -10 -16 +n 7.5 -10 -16 +n -7.5 -9 -16 +n 7.5 -9 -16 +n -7.5 -8 -16 +n 7.5 -8 -16 +n -7.5 -7 -16 +n 7.5 -7 -16 +n -7.5 -6 -16 +n 7.5 -6 -16 +n -7.5 -5 -16 +n 7.5 -5 -16 +n -7.5 -4 -16 +n 7.5 -4 -16 +n -7.5 -3 -16 +n 7.5 -3 -16 +n -7.5 -2 -16 +n 7.5 -2 -16 +n -7.5 -1 -16 +n 7.5 -1 -16 +n -7.5 0 -16 +n 7.5 0 -16 +n -7.5 1 -16 +n 7.5 1 -16 +n -7.5 2 -16 +n 7.5 2 -16 +n -7.5 3 -16 +n 7.5 3 -16 +n -7.5 4 -16 +n 7.5 4 -16 +n -7.5 5 -16 +n 7.5 5 -16 +n -7.5 6 -16 +n 7.5 6 -16 +n -7.5 7 -16 +n 7.5 7 -16 +n -7.5 8 -16 +n 7.5 8 -16 +n -7.5 9 -16 +n 7.5 9 -16 +n -7.5 10 -16 +n 7.5 10 -16 +n -7.5 11 -16 +n 7.5 11 -16 +n -7.5 12 -16 +n 7.5 12 -16 +n -7.5 13 -16 +n 7.5 13 -16 +n -7.5 14 -16 +n 7.5 14 -16 +n -7.5 15 -16 +n 7.5 15 -16 +n -7.5 16 -16 +n 7.5 16 -16 +n -7.5 17 -16 +n 7.5 17 -16 +n -7.5 18 -16 +n 7.5 18 -16 +n -7.5 19 -16 +n 7.5 19 -16 +n -7.5 20 -16 +n 7.5 20 -16 +n -7.5 21 -16 +n 7.5 21 -16 +n -7.5 22 -16 +n 7.5 22 -16 +n -7.5 23 -16 +n 7.5 23 -16 +n -7.5 24 -16 +n 7.5 24 -16 +n -7.5 25 -16 +n 7.5 25 -16 +n -7.5 -25 -15 +n -7.5 -24 -15 +n 7.5 -25 -15 +n 7.5 -24 -15 +n -7.5 -23 -15 +n 7.5 -23 -15 +n -7.5 -22 -15 +n 7.5 -22 -15 +n -7.5 -21 -15 +n 7.5 -21 -15 +n -7.5 -20 -15 +n 7.5 -20 -15 +n -7.5 -19 -15 +n 7.5 -19 -15 +n -7.5 -18 -15 +n 7.5 -18 -15 +n -7.5 -17 -15 +n 7.5 -17 -15 +n -7.5 -16 -15 +n 7.5 -16 -15 +n -7.5 -15 -15 +n 7.5 -15 -15 +n -7.5 -14 -15 +n 7.5 -14 -15 +n -7.5 -13 -15 +n 7.5 -13 -15 +n -7.5 -12 -15 +n 7.5 -12 -15 +n -7.5 -11 -15 +n 7.5 -11 -15 +n -7.5 -10 -15 +n 7.5 -10 -15 +n -7.5 -9 -15 +n 7.5 -9 -15 +n -7.5 -8 -15 +n 7.5 -8 -15 +n -7.5 -7 -15 +n 7.5 -7 -15 +n -7.5 -6 -15 +n 7.5 -6 -15 +n -7.5 -5 -15 +n 7.5 -5 -15 +n -7.5 -4 -15 +n 7.5 -4 -15 +n -7.5 -3 -15 +n 7.5 -3 -15 +n -7.5 -2 -15 +n 7.5 -2 -15 +n -7.5 -1 -15 +n 7.5 -1 -15 +n -7.5 0 -15 +n 7.5 0 -15 +n -7.5 1 -15 +n 7.5 1 -15 +n -7.5 2 -15 +n 7.5 2 -15 +n -7.5 3 -15 +n 7.5 3 -15 +n -7.5 4 -15 +n 7.5 4 -15 +n -7.5 5 -15 +n 7.5 5 -15 +n -7.5 6 -15 +n 7.5 6 -15 +n -7.5 7 -15 +n 7.5 7 -15 +n -7.5 8 -15 +n 7.5 8 -15 +n -7.5 9 -15 +n 7.5 9 -15 +n -7.5 10 -15 +n 7.5 10 -15 +n -7.5 11 -15 +n 7.5 11 -15 +n -7.5 12 -15 +n 7.5 12 -15 +n -7.5 13 -15 +n 7.5 13 -15 +n -7.5 14 -15 +n 7.5 14 -15 +n -7.5 15 -15 +n 7.5 15 -15 +n -7.5 16 -15 +n 7.5 16 -15 +n -7.5 17 -15 +n 7.5 17 -15 +n -7.5 18 -15 +n 7.5 18 -15 +n -7.5 19 -15 +n 7.5 19 -15 +n -7.5 20 -15 +n 7.5 20 -15 +n -7.5 21 -15 +n 7.5 21 -15 +n -7.5 22 -15 +n 7.5 22 -15 +n -7.5 23 -15 +n 7.5 23 -15 +n -7.5 24 -15 +n 7.5 24 -15 +n -7.5 25 -15 +n 7.5 25 -15 +n -7.5 -25 -14 +n -7.5 -24 -14 +n 7.5 -25 -14 +n 7.5 -24 -14 +n -7.5 -23 -14 +n 7.5 -23 -14 +n -7.5 -22 -14 +n 7.5 -22 -14 +n -7.5 -21 -14 +n 7.5 -21 -14 +n -7.5 -20 -14 +n 7.5 -20 -14 +n -7.5 -19 -14 +n 7.5 -19 -14 +n -7.5 -18 -14 +n 7.5 -18 -14 +n -7.5 -17 -14 +n 7.5 -17 -14 +n -7.5 -16 -14 +n 7.5 -16 -14 +n -7.5 -15 -14 +n 7.5 -15 -14 +n -7.5 -14 -14 +n 7.5 -14 -14 +n -7.5 -13 -14 +n 7.5 -13 -14 +n -7.5 -12 -14 +n 7.5 -12 -14 +n -7.5 -11 -14 +n 7.5 -11 -14 +n -7.5 -10 -14 +n 7.5 -10 -14 +n -7.5 -9 -14 +n 7.5 -9 -14 +n -7.5 -8 -14 +n 7.5 -8 -14 +n -7.5 -7 -14 +n 7.5 -7 -14 +n -7.5 -6 -14 +n 7.5 -6 -14 +n -7.5 -5 -14 +n 7.5 -5 -14 +n -7.5 -4 -14 +n 7.5 -4 -14 +n -7.5 -3 -14 +n 7.5 -3 -14 +n -7.5 -2 -14 +n 7.5 -2 -14 +n -7.5 -1 -14 +n 7.5 -1 -14 +n -7.5 0 -14 +n 7.5 0 -14 +n -7.5 1 -14 +n 7.5 1 -14 +n -7.5 2 -14 +n 7.5 2 -14 +n -7.5 3 -14 +n 7.5 3 -14 +n -7.5 4 -14 +n 7.5 4 -14 +n -7.5 5 -14 +n 7.5 5 -14 +n -7.5 6 -14 +n 7.5 6 -14 +n -7.5 7 -14 +n 7.5 7 -14 +n -7.5 8 -14 +n 7.5 8 -14 +n -7.5 9 -14 +n 7.5 9 -14 +n -7.5 10 -14 +n 7.5 10 -14 +n -7.5 11 -14 +n 7.5 11 -14 +n -7.5 12 -14 +n 7.5 12 -14 +n -7.5 13 -14 +n 7.5 13 -14 +n -7.5 14 -14 +n 7.5 14 -14 +n -7.5 15 -14 +n 7.5 15 -14 +n -7.5 16 -14 +n 7.5 16 -14 +n -7.5 17 -14 +n 7.5 17 -14 +n -7.5 18 -14 +n 7.5 18 -14 +n -7.5 19 -14 +n 7.5 19 -14 +n -7.5 20 -14 +n 7.5 20 -14 +n -7.5 21 -14 +n 7.5 21 -14 +n -7.5 22 -14 +n 7.5 22 -14 +n -7.5 23 -14 +n 7.5 23 -14 +n -7.5 24 -14 +n 7.5 24 -14 +n -7.5 25 -14 +n 7.5 25 -14 +n -7.5 -25 -13 +n -7.5 -24 -13 +n 7.5 -25 -13 +n 7.5 -24 -13 +n -7.5 -23 -13 +n 7.5 -23 -13 +n -7.5 -22 -13 +n 7.5 -22 -13 +n -7.5 -21 -13 +n 7.5 -21 -13 +n -7.5 -20 -13 +n 7.5 -20 -13 +n -7.5 -19 -13 +n 7.5 -19 -13 +n -7.5 -18 -13 +n 7.5 -18 -13 +n -7.5 -17 -13 +n 7.5 -17 -13 +n -7.5 -16 -13 +n 7.5 -16 -13 +n -7.5 -15 -13 +n 7.5 -15 -13 +n -7.5 -14 -13 +n 7.5 -14 -13 +n -7.5 -13 -13 +n 7.5 -13 -13 +n -7.5 -12 -13 +n 7.5 -12 -13 +n -7.5 -11 -13 +n 7.5 -11 -13 +n -7.5 -10 -13 +n 7.5 -10 -13 +n -7.5 -9 -13 +n 7.5 -9 -13 +n -7.5 -8 -13 +n 7.5 -8 -13 +n -7.5 -7 -13 +n 7.5 -7 -13 +n -7.5 -6 -13 +n 7.5 -6 -13 +n -7.5 -5 -13 +n 7.5 -5 -13 +n -7.5 -4 -13 +n 7.5 -4 -13 +n -7.5 -3 -13 +n 7.5 -3 -13 +n -7.5 -2 -13 +n 7.5 -2 -13 +n -7.5 -1 -13 +n 7.5 -1 -13 +n -7.5 0 -13 +n 7.5 0 -13 +n -7.5 1 -13 +n 7.5 1 -13 +n -7.5 2 -13 +n 7.5 2 -13 +n -7.5 3 -13 +n 7.5 3 -13 +n -7.5 4 -13 +n 7.5 4 -13 +n -7.5 5 -13 +n 7.5 5 -13 +n -7.5 6 -13 +n 7.5 6 -13 +n -7.5 7 -13 +n 7.5 7 -13 +n -7.5 8 -13 +n 7.5 8 -13 +n -7.5 9 -13 +n 7.5 9 -13 +n -7.5 10 -13 +n 7.5 10 -13 +n -7.5 11 -13 +n 7.5 11 -13 +n -7.5 12 -13 +n 7.5 12 -13 +n -7.5 13 -13 +n 7.5 13 -13 +n -7.5 14 -13 +n 7.5 14 -13 +n -7.5 15 -13 +n 7.5 15 -13 +n -7.5 16 -13 +n 7.5 16 -13 +n -7.5 17 -13 +n 7.5 17 -13 +n -7.5 18 -13 +n 7.5 18 -13 +n -7.5 19 -13 +n 7.5 19 -13 +n -7.5 20 -13 +n 7.5 20 -13 +n -7.5 21 -13 +n 7.5 21 -13 +n -7.5 22 -13 +n 7.5 22 -13 +n -7.5 23 -13 +n 7.5 23 -13 +n -7.5 24 -13 +n 7.5 24 -13 +n -7.5 25 -13 +n 7.5 25 -13 +n -7.5 -25 -12 +n -7.5 -24 -12 +n 7.5 -25 -12 +n 7.5 -24 -12 +n -7.5 -23 -12 +n 7.5 -23 -12 +n -7.5 -22 -12 +n 7.5 -22 -12 +n -7.5 -21 -12 +n 7.5 -21 -12 +n -7.5 -20 -12 +n 7.5 -20 -12 +n -7.5 -19 -12 +n 7.5 -19 -12 +n -7.5 -18 -12 +n 7.5 -18 -12 +n -7.5 -17 -12 +n 7.5 -17 -12 +n -7.5 -16 -12 +n 7.5 -16 -12 +n -7.5 -15 -12 +n 7.5 -15 -12 +n -7.5 -14 -12 +n 7.5 -14 -12 +n -7.5 -13 -12 +n 7.5 -13 -12 +n -7.5 -12 -12 +n 7.5 -12 -12 +n -7.5 -11 -12 +n 7.5 -11 -12 +n -7.5 -10 -12 +n 7.5 -10 -12 +n -7.5 -9 -12 +n 7.5 -9 -12 +n -7.5 -8 -12 +n 7.5 -8 -12 +n -7.5 -7 -12 +n 7.5 -7 -12 +n -7.5 -6 -12 +n 7.5 -6 -12 +n -7.5 -5 -12 +n 7.5 -5 -12 +n -7.5 -4 -12 +n 7.5 -4 -12 +n -7.5 -3 -12 +n 7.5 -3 -12 +n -7.5 -2 -12 +n 7.5 -2 -12 +n -7.5 -1 -12 +n 7.5 -1 -12 +n -7.5 0 -12 +n 7.5 0 -12 +n -7.5 1 -12 +n 7.5 1 -12 +n -7.5 2 -12 +n 7.5 2 -12 +n -7.5 3 -12 +n 7.5 3 -12 +n -7.5 4 -12 +n 7.5 4 -12 +n -7.5 5 -12 +n 7.5 5 -12 +n -7.5 6 -12 +n 7.5 6 -12 +n -7.5 7 -12 +n 7.5 7 -12 +n -7.5 8 -12 +n 7.5 8 -12 +n -7.5 9 -12 +n 7.5 9 -12 +n -7.5 10 -12 +n 7.5 10 -12 +n -7.5 11 -12 +n 7.5 11 -12 +n -7.5 12 -12 +n 7.5 12 -12 +n -7.5 13 -12 +n 7.5 13 -12 +n -7.5 14 -12 +n 7.5 14 -12 +n -7.5 15 -12 +n 7.5 15 -12 +n -7.5 16 -12 +n 7.5 16 -12 +n -7.5 17 -12 +n 7.5 17 -12 +n -7.5 18 -12 +n 7.5 18 -12 +n -7.5 19 -12 +n 7.5 19 -12 +n -7.5 20 -12 +n 7.5 20 -12 +n -7.5 21 -12 +n 7.5 21 -12 +n -7.5 22 -12 +n 7.5 22 -12 +n -7.5 23 -12 +n 7.5 23 -12 +n -7.5 24 -12 +n 7.5 24 -12 +n -7.5 25 -12 +n 7.5 25 -12 +n -7.5 -25 -11 +n -7.5 -24 -11 +n 7.5 -25 -11 +n 7.5 -24 -11 +n -7.5 -23 -11 +n 7.5 -23 -11 +n -7.5 -22 -11 +n 7.5 -22 -11 +n -7.5 -21 -11 +n 7.5 -21 -11 +n -7.5 -20 -11 +n 7.5 -20 -11 +n -7.5 -19 -11 +n 7.5 -19 -11 +n -7.5 -18 -11 +n 7.5 -18 -11 +n -7.5 -17 -11 +n 7.5 -17 -11 +n -7.5 -16 -11 +n 7.5 -16 -11 +n -7.5 -15 -11 +n 7.5 -15 -11 +n -7.5 -14 -11 +n 7.5 -14 -11 +n -7.5 -13 -11 +n 7.5 -13 -11 +n -7.5 -12 -11 +n 7.5 -12 -11 +n -7.5 -11 -11 +n 7.5 -11 -11 +n -7.5 -10 -11 +n 7.5 -10 -11 +n -7.5 -9 -11 +n 7.5 -9 -11 +n -7.5 -8 -11 +n 7.5 -8 -11 +n -7.5 -7 -11 +n 7.5 -7 -11 +n -7.5 -6 -11 +n 7.5 -6 -11 +n -7.5 -5 -11 +n 7.5 -5 -11 +n -7.5 -4 -11 +n 7.5 -4 -11 +n -7.5 -3 -11 +n 7.5 -3 -11 +n -7.5 -2 -11 +n 7.5 -2 -11 +n -7.5 -1 -11 +n 7.5 -1 -11 +n -7.5 0 -11 +n 7.5 0 -11 +n -7.5 1 -11 +n 7.5 1 -11 +n -7.5 2 -11 +n 7.5 2 -11 +n -7.5 3 -11 +n 7.5 3 -11 +n -7.5 4 -11 +n 7.5 4 -11 +n -7.5 5 -11 +n 7.5 5 -11 +n -7.5 6 -11 +n 7.5 6 -11 +n -7.5 7 -11 +n 7.5 7 -11 +n -7.5 8 -11 +n 7.5 8 -11 +n -7.5 9 -11 +n 7.5 9 -11 +n -7.5 10 -11 +n 7.5 10 -11 +n -7.5 11 -11 +n 7.5 11 -11 +n -7.5 12 -11 +n 7.5 12 -11 +n -7.5 13 -11 +n 7.5 13 -11 +n -7.5 14 -11 +n 7.5 14 -11 +n -7.5 15 -11 +n 7.5 15 -11 +n -7.5 16 -11 +n 7.5 16 -11 +n -7.5 17 -11 +n 7.5 17 -11 +n -7.5 18 -11 +n 7.5 18 -11 +n -7.5 19 -11 +n 7.5 19 -11 +n -7.5 20 -11 +n 7.5 20 -11 +n -7.5 21 -11 +n 7.5 21 -11 +n -7.5 22 -11 +n 7.5 22 -11 +n -7.5 23 -11 +n 7.5 23 -11 +n -7.5 24 -11 +n 7.5 24 -11 +n -7.5 25 -11 +n 7.5 25 -11 +n -7.5 -25 -10 +n -7.5 -24 -10 +n 7.5 -25 -10 +n 7.5 -24 -10 +n -7.5 -23 -10 +n 7.5 -23 -10 +n -7.5 -22 -10 +n 7.5 -22 -10 +n -7.5 -21 -10 +n 7.5 -21 -10 +n -7.5 -20 -10 +n 7.5 -20 -10 +n -7.5 -19 -10 +n 7.5 -19 -10 +n -7.5 -18 -10 +n 7.5 -18 -10 +n -7.5 -17 -10 +n 7.5 -17 -10 +n -7.5 -16 -10 +n 7.5 -16 -10 +n -7.5 -15 -10 +n 7.5 -15 -10 +n -7.5 -14 -10 +n 7.5 -14 -10 +n -7.5 -13 -10 +n 7.5 -13 -10 +n -7.5 -12 -10 +n 7.5 -12 -10 +n -7.5 -11 -10 +n 7.5 -11 -10 +n -7.5 -10 -10 +n 7.5 -10 -10 +n -7.5 -9 -10 +n 7.5 -9 -10 +n -7.5 -8 -10 +n 7.5 -8 -10 +n -7.5 -7 -10 +n 7.5 -7 -10 +n -7.5 -6 -10 +n 7.5 -6 -10 +n -7.5 -5 -10 +n 7.5 -5 -10 +n -7.5 -4 -10 +n 7.5 -4 -10 +n -7.5 -3 -10 +n 7.5 -3 -10 +n -7.5 -2 -10 +n 7.5 -2 -10 +n -7.5 -1 -10 +n 7.5 -1 -10 +n -7.5 0 -10 +n 7.5 0 -10 +n -7.5 1 -10 +n 7.5 1 -10 +n -7.5 2 -10 +n 7.5 2 -10 +n -7.5 3 -10 +n 7.5 3 -10 +n -7.5 4 -10 +n 7.5 4 -10 +n -7.5 5 -10 +n 7.5 5 -10 +n -7.5 6 -10 +n 7.5 6 -10 +n -7.5 7 -10 +n 7.5 7 -10 +n -7.5 8 -10 +n 7.5 8 -10 +n -7.5 9 -10 +n 7.5 9 -10 +n -7.5 10 -10 +n 7.5 10 -10 +n -7.5 11 -10 +n 7.5 11 -10 +n -7.5 12 -10 +n 7.5 12 -10 +n -7.5 13 -10 +n 7.5 13 -10 +n -7.5 14 -10 +n 7.5 14 -10 +n -7.5 15 -10 +n 7.5 15 -10 +n -7.5 16 -10 +n 7.5 16 -10 +n -7.5 17 -10 +n 7.5 17 -10 +n -7.5 18 -10 +n 7.5 18 -10 +n -7.5 19 -10 +n 7.5 19 -10 +n -7.5 20 -10 +n 7.5 20 -10 +n -7.5 21 -10 +n 7.5 21 -10 +n -7.5 22 -10 +n 7.5 22 -10 +n -7.5 23 -10 +n 7.5 23 -10 +n -7.5 24 -10 +n 7.5 24 -10 +n -7.5 25 -10 +n 7.5 25 -10 +n -7.5 -25 -9 +n -7.5 -24 -9 +n 7.5 -25 -9 +n 7.5 -24 -9 +n -7.5 -23 -9 +n 7.5 -23 -9 +n -7.5 -22 -9 +n 7.5 -22 -9 +n -7.5 -21 -9 +n 7.5 -21 -9 +n -7.5 -20 -9 +n 7.5 -20 -9 +n -7.5 -19 -9 +n 7.5 -19 -9 +n -7.5 -18 -9 +n 7.5 -18 -9 +n -7.5 -17 -9 +n 7.5 -17 -9 +n -7.5 -16 -9 +n 7.5 -16 -9 +n -7.5 -15 -9 +n 7.5 -15 -9 +n -7.5 -14 -9 +n 7.5 -14 -9 +n -7.5 -13 -9 +n 7.5 -13 -9 +n -7.5 -12 -9 +n 7.5 -12 -9 +n -7.5 -11 -9 +n 7.5 -11 -9 +n -7.5 -10 -9 +n 7.5 -10 -9 +n -7.5 -9 -9 +n 7.5 -9 -9 +n -7.5 -8 -9 +n 7.5 -8 -9 +n -7.5 -7 -9 +n 7.5 -7 -9 +n -7.5 -6 -9 +n 7.5 -6 -9 +n -7.5 -5 -9 +n 7.5 -5 -9 +n -7.5 -4 -9 +n 7.5 -4 -9 +n -7.5 -3 -9 +n 7.5 -3 -9 +n -7.5 -2 -9 +n 7.5 -2 -9 +n -7.5 -1 -9 +n 7.5 -1 -9 +n -7.5 0 -9 +n 7.5 0 -9 +n -7.5 1 -9 +n 7.5 1 -9 +n -7.5 2 -9 +n 7.5 2 -9 +n -7.5 3 -9 +n 7.5 3 -9 +n -7.5 4 -9 +n 7.5 4 -9 +n -7.5 5 -9 +n 7.5 5 -9 +n -7.5 6 -9 +n 7.5 6 -9 +n -7.5 7 -9 +n 7.5 7 -9 +n -7.5 8 -9 +n 7.5 8 -9 +n -7.5 9 -9 +n 7.5 9 -9 +n -7.5 10 -9 +n 7.5 10 -9 +n -7.5 11 -9 +n 7.5 11 -9 +n -7.5 12 -9 +n 7.5 12 -9 +n -7.5 13 -9 +n 7.5 13 -9 +n -7.5 14 -9 +n 7.5 14 -9 +n -7.5 15 -9 +n 7.5 15 -9 +n -7.5 16 -9 +n 7.5 16 -9 +n -7.5 17 -9 +n 7.5 17 -9 +n -7.5 18 -9 +n 7.5 18 -9 +n -7.5 19 -9 +n 7.5 19 -9 +n -7.5 20 -9 +n 7.5 20 -9 +n -7.5 21 -9 +n 7.5 21 -9 +n -7.5 22 -9 +n 7.5 22 -9 +n -7.5 23 -9 +n 7.5 23 -9 +n -7.5 24 -9 +n 7.5 24 -9 +n -7.5 25 -9 +n 7.5 25 -9 +n -7.5 -25 -8 +n -7.5 -24 -8 +n 7.5 -25 -8 +n 7.5 -24 -8 +n -7.5 -23 -8 +n 7.5 -23 -8 +n -7.5 -22 -8 +n 7.5 -22 -8 +n -7.5 -21 -8 +n 7.5 -21 -8 +n -7.5 -20 -8 +n 7.5 -20 -8 +n -7.5 -19 -8 +n 7.5 -19 -8 +n -7.5 -18 -8 +n 7.5 -18 -8 +n -7.5 -17 -8 +n 7.5 -17 -8 +n -7.5 -16 -8 +n 7.5 -16 -8 +n -7.5 -15 -8 +n 7.5 -15 -8 +n -7.5 -14 -8 +n 7.5 -14 -8 +n -7.5 -13 -8 +n 7.5 -13 -8 +n -7.5 -12 -8 +n 7.5 -12 -8 +n -7.5 -11 -8 +n 7.5 -11 -8 +n -7.5 -10 -8 +n 7.5 -10 -8 +n -7.5 -9 -8 +n 7.5 -9 -8 +n -7.5 -8 -8 +n 7.5 -8 -8 +n -7.5 -7 -8 +n 7.5 -7 -8 +n -7.5 -6 -8 +n 7.5 -6 -8 +n -7.5 -5 -8 +n 7.5 -5 -8 +n -7.5 -4 -8 +n 7.5 -4 -8 +n -7.5 -3 -8 +n 7.5 -3 -8 +n -7.5 -2 -8 +n 7.5 -2 -8 +n -7.5 -1 -8 +n 7.5 -1 -8 +n -7.5 0 -8 +n 7.5 0 -8 +n -7.5 1 -8 +n 7.5 1 -8 +n -7.5 2 -8 +n 7.5 2 -8 +n -7.5 3 -8 +n 7.5 3 -8 +n -7.5 4 -8 +n 7.5 4 -8 +n -7.5 5 -8 +n 7.5 5 -8 +n -7.5 6 -8 +n 7.5 6 -8 +n -7.5 7 -8 +n 7.5 7 -8 +n -7.5 8 -8 +n 7.5 8 -8 +n -7.5 9 -8 +n 7.5 9 -8 +n -7.5 10 -8 +n 7.5 10 -8 +n -7.5 11 -8 +n 7.5 11 -8 +n -7.5 12 -8 +n 7.5 12 -8 +n -7.5 13 -8 +n 7.5 13 -8 +n -7.5 14 -8 +n 7.5 14 -8 +n -7.5 15 -8 +n 7.5 15 -8 +n -7.5 16 -8 +n 7.5 16 -8 +n -7.5 17 -8 +n 7.5 17 -8 +n -7.5 18 -8 +n 7.5 18 -8 +n -7.5 19 -8 +n 7.5 19 -8 +n -7.5 20 -8 +n 7.5 20 -8 +n -7.5 21 -8 +n 7.5 21 -8 +n -7.5 22 -8 +n 7.5 22 -8 +n -7.5 23 -8 +n 7.5 23 -8 +n -7.5 24 -8 +n 7.5 24 -8 +n -7.5 25 -8 +n 7.5 25 -8 +n -7.5 -25 -7 +n -7.5 -24 -7 +n 7.5 -25 -7 +n 7.5 -24 -7 +n -7.5 -23 -7 +n 7.5 -23 -7 +n -7.5 -22 -7 +n 7.5 -22 -7 +n -7.5 -21 -7 +n 7.5 -21 -7 +n -7.5 -20 -7 +n 7.5 -20 -7 +n -7.5 -19 -7 +n 7.5 -19 -7 +n -7.5 -18 -7 +n 7.5 -18 -7 +n -7.5 -17 -7 +n 7.5 -17 -7 +n -7.5 -16 -7 +n 7.5 -16 -7 +n -7.5 -15 -7 +n 7.5 -15 -7 +n -7.5 -14 -7 +n 7.5 -14 -7 +n -7.5 -13 -7 +n 7.5 -13 -7 +n -7.5 -12 -7 +n 7.5 -12 -7 +n -7.5 -11 -7 +n 7.5 -11 -7 +n -7.5 -10 -7 +n 7.5 -10 -7 +n -7.5 -9 -7 +n 7.5 -9 -7 +n -7.5 -8 -7 +n 7.5 -8 -7 +n -7.5 -7 -7 +n 7.5 -7 -7 +n -7.5 -6 -7 +n 7.5 -6 -7 +n -7.5 -5 -7 +n 7.5 -5 -7 +n -7.5 -4 -7 +n 7.5 -4 -7 +n -7.5 -3 -7 +n 7.5 -3 -7 +n -7.5 -2 -7 +n 7.5 -2 -7 +n -7.5 -1 -7 +n 7.5 -1 -7 +n -7.5 0 -7 +n 7.5 0 -7 +n -7.5 1 -7 +n 7.5 1 -7 +n -7.5 2 -7 +n 7.5 2 -7 +n -7.5 3 -7 +n 7.5 3 -7 +n -7.5 4 -7 +n 7.5 4 -7 +n -7.5 5 -7 +n 7.5 5 -7 +n -7.5 6 -7 +n 7.5 6 -7 +n -7.5 7 -7 +n 7.5 7 -7 +n -7.5 8 -7 +n 7.5 8 -7 +n -7.5 9 -7 +n 7.5 9 -7 +n -7.5 10 -7 +n 7.5 10 -7 +n -7.5 11 -7 +n 7.5 11 -7 +n -7.5 12 -7 +n 7.5 12 -7 +n -7.5 13 -7 +n 7.5 13 -7 +n -7.5 14 -7 +n 7.5 14 -7 +n -7.5 15 -7 +n 7.5 15 -7 +n -7.5 16 -7 +n 7.5 16 -7 +n -7.5 17 -7 +n 7.5 17 -7 +n -7.5 18 -7 +n 7.5 18 -7 +n -7.5 19 -7 +n 7.5 19 -7 +n -7.5 20 -7 +n 7.5 20 -7 +n -7.5 21 -7 +n 7.5 21 -7 +n -7.5 22 -7 +n 7.5 22 -7 +n -7.5 23 -7 +n 7.5 23 -7 +n -7.5 24 -7 +n 7.5 24 -7 +n -7.5 25 -7 +n 7.5 25 -7 +n -7.5 -25 -6 +n -7.5 -24 -6 +n 7.5 -25 -6 +n 7.5 -24 -6 +n -7.5 -23 -6 +n 7.5 -23 -6 +n -7.5 -22 -6 +n 7.5 -22 -6 +n -7.5 -21 -6 +n 7.5 -21 -6 +n -7.5 -20 -6 +n 7.5 -20 -6 +n -7.5 -19 -6 +n 7.5 -19 -6 +n -7.5 -18 -6 +n 7.5 -18 -6 +n -7.5 -17 -6 +n 7.5 -17 -6 +n -7.5 -16 -6 +n 7.5 -16 -6 +n -7.5 -15 -6 +n 7.5 -15 -6 +n -7.5 -14 -6 +n 7.5 -14 -6 +n -7.5 -13 -6 +n 7.5 -13 -6 +n -7.5 -12 -6 +n 7.5 -12 -6 +n -7.5 -11 -6 +n 7.5 -11 -6 +n -7.5 -10 -6 +n 7.5 -10 -6 +n -7.5 -9 -6 +n 7.5 -9 -6 +n -7.5 -8 -6 +n 7.5 -8 -6 +n -7.5 -7 -6 +n 7.5 -7 -6 +n -7.5 -6 -6 +n 7.5 -6 -6 +n -7.5 -5 -6 +n 7.5 -5 -6 +n -7.5 -4 -6 +n 7.5 -4 -6 +n -7.5 -3 -6 +n 7.5 -3 -6 +n -7.5 -2 -6 +n 7.5 -2 -6 +n -7.5 -1 -6 +n 7.5 -1 -6 +n -7.5 0 -6 +n 7.5 0 -6 +n -7.5 1 -6 +n 7.5 1 -6 +n -7.5 2 -6 +n 7.5 2 -6 +n -7.5 3 -6 +n 7.5 3 -6 +n -7.5 4 -6 +n 7.5 4 -6 +n -7.5 5 -6 +n 7.5 5 -6 +n -7.5 6 -6 +n 7.5 6 -6 +n -7.5 7 -6 +n 7.5 7 -6 +n -7.5 8 -6 +n 7.5 8 -6 +n -7.5 9 -6 +n 7.5 9 -6 +n -7.5 10 -6 +n 7.5 10 -6 +n -7.5 11 -6 +n 7.5 11 -6 +n -7.5 12 -6 +n 7.5 12 -6 +n -7.5 13 -6 +n 7.5 13 -6 +n -7.5 14 -6 +n 7.5 14 -6 +n -7.5 15 -6 +n 7.5 15 -6 +n -7.5 16 -6 +n 7.5 16 -6 +n -7.5 17 -6 +n 7.5 17 -6 +n -7.5 18 -6 +n 7.5 18 -6 +n -7.5 19 -6 +n 7.5 19 -6 +n -7.5 20 -6 +n 7.5 20 -6 +n -7.5 21 -6 +n 7.5 21 -6 +n -7.5 22 -6 +n 7.5 22 -6 +n -7.5 23 -6 +n 7.5 23 -6 +n -7.5 24 -6 +n 7.5 24 -6 +n -7.5 25 -6 +n 7.5 25 -6 +n -7.5 -25 -5 +n -7.5 -24 -5 +n 7.5 -25 -5 +n 7.5 -24 -5 +n -7.5 -23 -5 +n 7.5 -23 -5 +n -7.5 -22 -5 +n 7.5 -22 -5 +n -7.5 -21 -5 +n 7.5 -21 -5 +n -7.5 -20 -5 +n 7.5 -20 -5 +n -7.5 -19 -5 +n 7.5 -19 -5 +n -7.5 -18 -5 +n 7.5 -18 -5 +n -7.5 -17 -5 +n 7.5 -17 -5 +n -7.5 -16 -5 +n 7.5 -16 -5 +n -7.5 -15 -5 +n 7.5 -15 -5 +n -7.5 -14 -5 +n 7.5 -14 -5 +n -7.5 -13 -5 +n 7.5 -13 -5 +n -7.5 -12 -5 +n 7.5 -12 -5 +n -7.5 -11 -5 +n 7.5 -11 -5 +n -7.5 -10 -5 +n 7.5 -10 -5 +n -7.5 -9 -5 +n 7.5 -9 -5 +n -7.5 -8 -5 +n 7.5 -8 -5 +n -7.5 -7 -5 +n 7.5 -7 -5 +n -7.5 -6 -5 +n 7.5 -6 -5 +n -7.5 -5 -5 +n 7.5 -5 -5 +n -7.5 -4 -5 +n 7.5 -4 -5 +n -7.5 -3 -5 +n 7.5 -3 -5 +n -7.5 -2 -5 +n 7.5 -2 -5 +n -7.5 -1 -5 +n 7.5 -1 -5 +n -7.5 0 -5 +n 7.5 0 -5 +n -7.5 1 -5 +n 7.5 1 -5 +n -7.5 2 -5 +n 7.5 2 -5 +n -7.5 3 -5 +n 7.5 3 -5 +n -7.5 4 -5 +n 7.5 4 -5 +n -7.5 5 -5 +n 7.5 5 -5 +n -7.5 6 -5 +n 7.5 6 -5 +n -7.5 7 -5 +n 7.5 7 -5 +n -7.5 8 -5 +n 7.5 8 -5 +n -7.5 9 -5 +n 7.5 9 -5 +n -7.5 10 -5 +n 7.5 10 -5 +n -7.5 11 -5 +n 7.5 11 -5 +n -7.5 12 -5 +n 7.5 12 -5 +n -7.5 13 -5 +n 7.5 13 -5 +n -7.5 14 -5 +n 7.5 14 -5 +n -7.5 15 -5 +n 7.5 15 -5 +n -7.5 16 -5 +n 7.5 16 -5 +n -7.5 17 -5 +n 7.5 17 -5 +n -7.5 18 -5 +n 7.5 18 -5 +n -7.5 19 -5 +n 7.5 19 -5 +n -7.5 20 -5 +n 7.5 20 -5 +n -7.5 21 -5 +n 7.5 21 -5 +n -7.5 22 -5 +n 7.5 22 -5 +n -7.5 23 -5 +n 7.5 23 -5 +n -7.5 24 -5 +n 7.5 24 -5 +n -7.5 25 -5 +n 7.5 25 -5 +n -7.5 -25 -4 +n -7.5 -24 -4 +n 7.5 -25 -4 +n 7.5 -24 -4 +n -7.5 -23 -4 +n 7.5 -23 -4 +n -7.5 -22 -4 +n 7.5 -22 -4 +n -7.5 -21 -4 +n 7.5 -21 -4 +n -7.5 -20 -4 +n 7.5 -20 -4 +n -7.5 -19 -4 +n 7.5 -19 -4 +n -7.5 -18 -4 +n 7.5 -18 -4 +n -7.5 -17 -4 +n 7.5 -17 -4 +n -7.5 -16 -4 +n 7.5 -16 -4 +n -7.5 -15 -4 +n 7.5 -15 -4 +n -7.5 -14 -4 +n 7.5 -14 -4 +n -7.5 -13 -4 +n 7.5 -13 -4 +n -7.5 -12 -4 +n 7.5 -12 -4 +n -7.5 -11 -4 +n 7.5 -11 -4 +n -7.5 -10 -4 +n 7.5 -10 -4 +n -7.5 -9 -4 +n 7.5 -9 -4 +n -7.5 -8 -4 +n 7.5 -8 -4 +n -7.5 -7 -4 +n 7.5 -7 -4 +n -7.5 -6 -4 +n 7.5 -6 -4 +n -7.5 -5 -4 +n 7.5 -5 -4 +n -7.5 -4 -4 +n 7.5 -4 -4 +n -7.5 -3 -4 +n 7.5 -3 -4 +n -7.5 -2 -4 +n 7.5 -2 -4 +n -7.5 -1 -4 +n 7.5 -1 -4 +n -7.5 0 -4 +n 7.5 0 -4 +n -7.5 1 -4 +n 7.5 1 -4 +n -7.5 2 -4 +n 7.5 2 -4 +n -7.5 3 -4 +n 7.5 3 -4 +n -7.5 4 -4 +n 7.5 4 -4 +n -7.5 5 -4 +n 7.5 5 -4 +n -7.5 6 -4 +n 7.5 6 -4 +n -7.5 7 -4 +n 7.5 7 -4 +n -7.5 8 -4 +n 7.5 8 -4 +n -7.5 9 -4 +n 7.5 9 -4 +n -7.5 10 -4 +n 7.5 10 -4 +n -7.5 11 -4 +n 7.5 11 -4 +n -7.5 12 -4 +n 7.5 12 -4 +n -7.5 13 -4 +n 7.5 13 -4 +n -7.5 14 -4 +n 7.5 14 -4 +n -7.5 15 -4 +n 7.5 15 -4 +n -7.5 16 -4 +n 7.5 16 -4 +n -7.5 17 -4 +n 7.5 17 -4 +n -7.5 18 -4 +n 7.5 18 -4 +n -7.5 19 -4 +n 7.5 19 -4 +n -7.5 20 -4 +n 7.5 20 -4 +n -7.5 21 -4 +n 7.5 21 -4 +n -7.5 22 -4 +n 7.5 22 -4 +n -7.5 23 -4 +n 7.5 23 -4 +n -7.5 24 -4 +n 7.5 24 -4 +n -7.5 25 -4 +n 7.5 25 -4 +n -7.5 -25 -3 +n -7.5 -24 -3 +n 7.5 -25 -3 +n 7.5 -24 -3 +n -7.5 -23 -3 +n 7.5 -23 -3 +n -7.5 -22 -3 +n 7.5 -22 -3 +n -7.5 -21 -3 +n 7.5 -21 -3 +n -7.5 -20 -3 +n 7.5 -20 -3 +n -7.5 -19 -3 +n 7.5 -19 -3 +n -7.5 -18 -3 +n 7.5 -18 -3 +n -7.5 -17 -3 +n 7.5 -17 -3 +n -7.5 -16 -3 +n 7.5 -16 -3 +n -7.5 -15 -3 +n 7.5 -15 -3 +n -7.5 -14 -3 +n 7.5 -14 -3 +n -7.5 -13 -3 +n 7.5 -13 -3 +n -7.5 -12 -3 +n 7.5 -12 -3 +n -7.5 -11 -3 +n 7.5 -11 -3 +n -7.5 -10 -3 +n 7.5 -10 -3 +n -7.5 -9 -3 +n 7.5 -9 -3 +n -7.5 -8 -3 +n 7.5 -8 -3 +n -7.5 -7 -3 +n 7.5 -7 -3 +n -7.5 -6 -3 +n 7.5 -6 -3 +n -7.5 -5 -3 +n 7.5 -5 -3 +n -7.5 -4 -3 +n 7.5 -4 -3 +n -7.5 -3 -3 +n 7.5 -3 -3 +n -7.5 -2 -3 +n 7.5 -2 -3 +n -7.5 -1 -3 +n 7.5 -1 -3 +n -7.5 0 -3 +n 7.5 0 -3 +n -7.5 1 -3 +n 7.5 1 -3 +n -7.5 2 -3 +n 7.5 2 -3 +n -7.5 3 -3 +n 7.5 3 -3 +n -7.5 4 -3 +n 7.5 4 -3 +n -7.5 5 -3 +n 7.5 5 -3 +n -7.5 6 -3 +n 7.5 6 -3 +n -7.5 7 -3 +n 7.5 7 -3 +n -7.5 8 -3 +n 7.5 8 -3 +n -7.5 9 -3 +n 7.5 9 -3 +n -7.5 10 -3 +n 7.5 10 -3 +n -7.5 11 -3 +n 7.5 11 -3 +n -7.5 12 -3 +n 7.5 12 -3 +n -7.5 13 -3 +n 7.5 13 -3 +n -7.5 14 -3 +n 7.5 14 -3 +n -7.5 15 -3 +n 7.5 15 -3 +n -7.5 16 -3 +n 7.5 16 -3 +n -7.5 17 -3 +n 7.5 17 -3 +n -7.5 18 -3 +n 7.5 18 -3 +n -7.5 19 -3 +n 7.5 19 -3 +n -7.5 20 -3 +n 7.5 20 -3 +n -7.5 21 -3 +n 7.5 21 -3 +n -7.5 22 -3 +n 7.5 22 -3 +n -7.5 23 -3 +n 7.5 23 -3 +n -7.5 24 -3 +n 7.5 24 -3 +n -7.5 25 -3 +n 7.5 25 -3 +n -7.5 -25 -2 +n -7.5 -24 -2 +n 7.5 -25 -2 +n 7.5 -24 -2 +n -7.5 -23 -2 +n 7.5 -23 -2 +n -7.5 -22 -2 +n 7.5 -22 -2 +n -7.5 -21 -2 +n 7.5 -21 -2 +n -7.5 -20 -2 +n 7.5 -20 -2 +n -7.5 -19 -2 +n 7.5 -19 -2 +n -7.5 -18 -2 +n 7.5 -18 -2 +n -7.5 -17 -2 +n 7.5 -17 -2 +n -7.5 -16 -2 +n 7.5 -16 -2 +n -7.5 -15 -2 +n 7.5 -15 -2 +n -7.5 -14 -2 +n 7.5 -14 -2 +n -7.5 -13 -2 +n 7.5 -13 -2 +n -7.5 -12 -2 +n 7.5 -12 -2 +n -7.5 -11 -2 +n 7.5 -11 -2 +n -7.5 -10 -2 +n 7.5 -10 -2 +n -7.5 -9 -2 +n 7.5 -9 -2 +n -7.5 -8 -2 +n 7.5 -8 -2 +n -7.5 -7 -2 +n 7.5 -7 -2 +n -7.5 -6 -2 +n 7.5 -6 -2 +n -7.5 -5 -2 +n 7.5 -5 -2 +n -7.5 -4 -2 +n 7.5 -4 -2 +n -7.5 -3 -2 +n 7.5 -3 -2 +n -7.5 -2 -2 +n 7.5 -2 -2 +n -7.5 -1 -2 +n 7.5 -1 -2 +n -7.5 0 -2 +n 7.5 0 -2 +n -7.5 1 -2 +n 7.5 1 -2 +n -7.5 2 -2 +n 7.5 2 -2 +n -7.5 3 -2 +n 7.5 3 -2 +n -7.5 4 -2 +n 7.5 4 -2 +n -7.5 5 -2 +n 7.5 5 -2 +n -7.5 6 -2 +n 7.5 6 -2 +n -7.5 7 -2 +n 7.5 7 -2 +n -7.5 8 -2 +n 7.5 8 -2 +n -7.5 9 -2 +n 7.5 9 -2 +n -7.5 10 -2 +n 7.5 10 -2 +n -7.5 11 -2 +n 7.5 11 -2 +n -7.5 12 -2 +n 7.5 12 -2 +n -7.5 13 -2 +n 7.5 13 -2 +n -7.5 14 -2 +n 7.5 14 -2 +n -7.5 15 -2 +n 7.5 15 -2 +n -7.5 16 -2 +n 7.5 16 -2 +n -7.5 17 -2 +n 7.5 17 -2 +n -7.5 18 -2 +n 7.5 18 -2 +n -7.5 19 -2 +n 7.5 19 -2 +n -7.5 20 -2 +n 7.5 20 -2 +n -7.5 21 -2 +n 7.5 21 -2 +n -7.5 22 -2 +n 7.5 22 -2 +n -7.5 23 -2 +n 7.5 23 -2 +n -7.5 24 -2 +n 7.5 24 -2 +n -7.5 25 -2 +n 7.5 25 -2 +n -7.5 -25 -1 +n -7.5 -24 -1 +n 7.5 -25 -1 +n 7.5 -24 -1 +n -7.5 -23 -1 +n 7.5 -23 -1 +n -7.5 -22 -1 +n 7.5 -22 -1 +n -7.5 -21 -1 +n 7.5 -21 -1 +n -7.5 -20 -1 +n 7.5 -20 -1 +n -7.5 -19 -1 +n 7.5 -19 -1 +n -7.5 -18 -1 +n 7.5 -18 -1 +n -7.5 -17 -1 +n 7.5 -17 -1 +n -7.5 -16 -1 +n 7.5 -16 -1 +n -7.5 -15 -1 +n 7.5 -15 -1 +n -7.5 -14 -1 +n 7.5 -14 -1 +n -7.5 -13 -1 +n 7.5 -13 -1 +n -7.5 -12 -1 +n 7.5 -12 -1 +n -7.5 -11 -1 +n 7.5 -11 -1 +n -7.5 -10 -1 +n 7.5 -10 -1 +n -7.5 -9 -1 +n 7.5 -9 -1 +n -7.5 -8 -1 +n 7.5 -8 -1 +n -7.5 -7 -1 +n 7.5 -7 -1 +n -7.5 -6 -1 +n 7.5 -6 -1 +n -7.5 -5 -1 +n 7.5 -5 -1 +n -7.5 -4 -1 +n 7.5 -4 -1 +n -7.5 -3 -1 +n 7.5 -3 -1 +n -7.5 -2 -1 +n 7.5 -2 -1 +n -7.5 -1 -1 +n 7.5 -1 -1 +n -7.5 0 -1 +n 7.5 0 -1 +n -7.5 1 -1 +n 7.5 1 -1 +n -7.5 2 -1 +n 7.5 2 -1 +n -7.5 3 -1 +n 7.5 3 -1 +n -7.5 4 -1 +n 7.5 4 -1 +n -7.5 5 -1 +n 7.5 5 -1 +n -7.5 6 -1 +n 7.5 6 -1 +n -7.5 7 -1 +n 7.5 7 -1 +n -7.5 8 -1 +n 7.5 8 -1 +n -7.5 9 -1 +n 7.5 9 -1 +n -7.5 10 -1 +n 7.5 10 -1 +n -7.5 11 -1 +n 7.5 11 -1 +n -7.5 12 -1 +n 7.5 12 -1 +n -7.5 13 -1 +n 7.5 13 -1 +n -7.5 14 -1 +n 7.5 14 -1 +n -7.5 15 -1 +n 7.5 15 -1 +n -7.5 16 -1 +n 7.5 16 -1 +n -7.5 17 -1 +n 7.5 17 -1 +n -7.5 18 -1 +n 7.5 18 -1 +n -7.5 19 -1 +n 7.5 19 -1 +n -7.5 20 -1 +n 7.5 20 -1 +n -7.5 21 -1 +n 7.5 21 -1 +n -7.5 22 -1 +n 7.5 22 -1 +n -7.5 23 -1 +n 7.5 23 -1 +n -7.5 24 -1 +n 7.5 24 -1 +n -7.5 25 -1 +n 7.5 25 -1 +n -24 -25 -1e-12 +n -24 -24 -1e-12 +n -25 -25 -1e-12 +n -25 -24 -1e-12 +n -23 -25 -1e-12 +n -23 -24 -1e-12 +n -22 -25 -1e-12 +n -22 -24 -1e-12 +n -21 -25 -1e-12 +n -21 -24 -1e-12 +n -20 -25 -1e-12 +n -20 -24 -1e-12 +n -19 -25 -1e-12 +n -19 -24 -1e-12 +n -18 -25 -1e-12 +n -18 -24 -1e-12 +n -17 -25 -1e-12 +n -17 -24 -1e-12 +n -16 -25 -1e-12 +n -16 -24 -1e-12 +n -15 -25 -1e-12 +n -15 -24 -1e-12 +n -14 -25 -1e-12 +n -14 -24 -1e-12 +n -13 -25 -1e-12 +n -13 -24 -1e-12 +n -12 -25 -1e-12 +n -12 -24 -1e-12 +n -11 -25 -1e-12 +n -11 -24 -1e-12 +n -10 -25 -1e-12 +n -10 -24 -1e-12 +n -9 -25 -1e-12 +n -9 -24 -1e-12 +n -8 -25 -1e-12 +n -8 -24 -1e-12 +n 8 -25 -1e-12 +n 8 -24 -1e-12 +n 9 -25 -1e-12 +n 9 -24 -1e-12 +n 10 -25 -1e-12 +n 10 -24 -1e-12 +n 11 -25 -1e-12 +n 11 -24 -1e-12 +n 12 -25 -1e-12 +n 12 -24 -1e-12 +n 13 -25 -1e-12 +n 13 -24 -1e-12 +n 14 -25 -1e-12 +n 14 -24 -1e-12 +n 15 -25 -1e-12 +n 15 -24 -1e-12 +n 16 -25 -1e-12 +n 16 -24 -1e-12 +n 17 -25 -1e-12 +n 17 -24 -1e-12 +n 18 -25 -1e-12 +n 18 -24 -1e-12 +n 19 -25 -1e-12 +n 19 -24 -1e-12 +n 20 -25 -1e-12 +n 20 -24 -1e-12 +n 21 -25 -1e-12 +n 21 -24 -1e-12 +n 22 -25 -1e-12 +n 22 -24 -1e-12 +n 23 -25 -1e-12 +n 23 -24 -1e-12 +n 24 -25 -1e-12 +n 24 -24 -1e-12 +n 25 -25 -1e-12 +n 25 -24 -1e-12 +n -24 -23 -1e-12 +n -25 -23 -1e-12 +n -23 -23 -1e-12 +n -22 -23 -1e-12 +n -21 -23 -1e-12 +n -20 -23 -1e-12 +n -19 -23 -1e-12 +n -18 -23 -1e-12 +n -17 -23 -1e-12 +n -16 -23 -1e-12 +n -15 -23 -1e-12 +n -14 -23 -1e-12 +n -13 -23 -1e-12 +n -12 -23 -1e-12 +n -11 -23 -1e-12 +n -10 -23 -1e-12 +n -9 -23 -1e-12 +n -8 -23 -1e-12 +n 8 -23 -1e-12 +n 9 -23 -1e-12 +n 10 -23 -1e-12 +n 11 -23 -1e-12 +n 12 -23 -1e-12 +n 13 -23 -1e-12 +n 14 -23 -1e-12 +n 15 -23 -1e-12 +n 16 -23 -1e-12 +n 17 -23 -1e-12 +n 18 -23 -1e-12 +n 19 -23 -1e-12 +n 20 -23 -1e-12 +n 21 -23 -1e-12 +n 22 -23 -1e-12 +n 23 -23 -1e-12 +n 24 -23 -1e-12 +n 25 -23 -1e-12 +n -24 -22 -1e-12 +n -25 -22 -1e-12 +n -23 -22 -1e-12 +n -22 -22 -1e-12 +n -21 -22 -1e-12 +n -20 -22 -1e-12 +n -19 -22 -1e-12 +n -18 -22 -1e-12 +n -17 -22 -1e-12 +n -16 -22 -1e-12 +n -15 -22 -1e-12 +n -14 -22 -1e-12 +n -13 -22 -1e-12 +n -12 -22 -1e-12 +n -11 -22 -1e-12 +n -10 -22 -1e-12 +n -9 -22 -1e-12 +n -8 -22 -1e-12 +n 8 -22 -1e-12 +n 9 -22 -1e-12 +n 10 -22 -1e-12 +n 11 -22 -1e-12 +n 12 -22 -1e-12 +n 13 -22 -1e-12 +n 14 -22 -1e-12 +n 15 -22 -1e-12 +n 16 -22 -1e-12 +n 17 -22 -1e-12 +n 18 -22 -1e-12 +n 19 -22 -1e-12 +n 20 -22 -1e-12 +n 21 -22 -1e-12 +n 22 -22 -1e-12 +n 23 -22 -1e-12 +n 24 -22 -1e-12 +n 25 -22 -1e-12 +n -24 -21 -1e-12 +n -25 -21 -1e-12 +n -23 -21 -1e-12 +n -22 -21 -1e-12 +n -21 -21 -1e-12 +n -20 -21 -1e-12 +n -19 -21 -1e-12 +n -18 -21 -1e-12 +n -17 -21 -1e-12 +n -16 -21 -1e-12 +n -15 -21 -1e-12 +n -14 -21 -1e-12 +n -13 -21 -1e-12 +n -12 -21 -1e-12 +n -11 -21 -1e-12 +n -10 -21 -1e-12 +n -9 -21 -1e-12 +n -8 -21 -1e-12 +n 8 -21 -1e-12 +n 9 -21 -1e-12 +n 10 -21 -1e-12 +n 11 -21 -1e-12 +n 12 -21 -1e-12 +n 13 -21 -1e-12 +n 14 -21 -1e-12 +n 15 -21 -1e-12 +n 16 -21 -1e-12 +n 17 -21 -1e-12 +n 18 -21 -1e-12 +n 19 -21 -1e-12 +n 20 -21 -1e-12 +n 21 -21 -1e-12 +n 22 -21 -1e-12 +n 23 -21 -1e-12 +n 24 -21 -1e-12 +n 25 -21 -1e-12 +n -24 -20 -1e-12 +n -25 -20 -1e-12 +n -23 -20 -1e-12 +n -22 -20 -1e-12 +n -21 -20 -1e-12 +n -20 -20 -1e-12 +n -19 -20 -1e-12 +n -18 -20 -1e-12 +n -17 -20 -1e-12 +n -16 -20 -1e-12 +n -15 -20 -1e-12 +n -14 -20 -1e-12 +n -13 -20 -1e-12 +n -12 -20 -1e-12 +n -11 -20 -1e-12 +n -10 -20 -1e-12 +n -9 -20 -1e-12 +n -8 -20 -1e-12 +n 8 -20 -1e-12 +n 9 -20 -1e-12 +n 10 -20 -1e-12 +n 11 -20 -1e-12 +n 12 -20 -1e-12 +n 13 -20 -1e-12 +n 14 -20 -1e-12 +n 15 -20 -1e-12 +n 16 -20 -1e-12 +n 17 -20 -1e-12 +n 18 -20 -1e-12 +n 19 -20 -1e-12 +n 20 -20 -1e-12 +n 21 -20 -1e-12 +n 22 -20 -1e-12 +n 23 -20 -1e-12 +n 24 -20 -1e-12 +n 25 -20 -1e-12 +n -24 -19 -1e-12 +n -25 -19 -1e-12 +n -23 -19 -1e-12 +n -22 -19 -1e-12 +n -21 -19 -1e-12 +n -20 -19 -1e-12 +n -19 -19 -1e-12 +n -18 -19 -1e-12 +n -17 -19 -1e-12 +n -16 -19 -1e-12 +n -15 -19 -1e-12 +n -14 -19 -1e-12 +n -13 -19 -1e-12 +n -12 -19 -1e-12 +n -11 -19 -1e-12 +n -10 -19 -1e-12 +n -9 -19 -1e-12 +n -8 -19 -1e-12 +n 8 -19 -1e-12 +n 9 -19 -1e-12 +n 10 -19 -1e-12 +n 11 -19 -1e-12 +n 12 -19 -1e-12 +n 13 -19 -1e-12 +n 14 -19 -1e-12 +n 15 -19 -1e-12 +n 16 -19 -1e-12 +n 17 -19 -1e-12 +n 18 -19 -1e-12 +n 19 -19 -1e-12 +n 20 -19 -1e-12 +n 21 -19 -1e-12 +n 22 -19 -1e-12 +n 23 -19 -1e-12 +n 24 -19 -1e-12 +n 25 -19 -1e-12 +n -24 -18 -1e-12 +n -25 -18 -1e-12 +n -23 -18 -1e-12 +n -22 -18 -1e-12 +n -21 -18 -1e-12 +n -20 -18 -1e-12 +n -19 -18 -1e-12 +n -18 -18 -1e-12 +n -17 -18 -1e-12 +n -16 -18 -1e-12 +n -15 -18 -1e-12 +n -14 -18 -1e-12 +n -13 -18 -1e-12 +n -12 -18 -1e-12 +n -11 -18 -1e-12 +n -10 -18 -1e-12 +n -9 -18 -1e-12 +n -8 -18 -1e-12 +n 8 -18 -1e-12 +n 9 -18 -1e-12 +n 10 -18 -1e-12 +n 11 -18 -1e-12 +n 12 -18 -1e-12 +n 13 -18 -1e-12 +n 14 -18 -1e-12 +n 15 -18 -1e-12 +n 16 -18 -1e-12 +n 17 -18 -1e-12 +n 18 -18 -1e-12 +n 19 -18 -1e-12 +n 20 -18 -1e-12 +n 21 -18 -1e-12 +n 22 -18 -1e-12 +n 23 -18 -1e-12 +n 24 -18 -1e-12 +n 25 -18 -1e-12 +n -24 -17 -1e-12 +n -25 -17 -1e-12 +n -23 -17 -1e-12 +n -22 -17 -1e-12 +n -21 -17 -1e-12 +n -20 -17 -1e-12 +n -19 -17 -1e-12 +n -18 -17 -1e-12 +n -17 -17 -1e-12 +n -16 -17 -1e-12 +n -15 -17 -1e-12 +n -14 -17 -1e-12 +n -13 -17 -1e-12 +n -12 -17 -1e-12 +n -11 -17 -1e-12 +n -10 -17 -1e-12 +n -9 -17 -1e-12 +n -8 -17 -1e-12 +n 8 -17 -1e-12 +n 9 -17 -1e-12 +n 10 -17 -1e-12 +n 11 -17 -1e-12 +n 12 -17 -1e-12 +n 13 -17 -1e-12 +n 14 -17 -1e-12 +n 15 -17 -1e-12 +n 16 -17 -1e-12 +n 17 -17 -1e-12 +n 18 -17 -1e-12 +n 19 -17 -1e-12 +n 20 -17 -1e-12 +n 21 -17 -1e-12 +n 22 -17 -1e-12 +n 23 -17 -1e-12 +n 24 -17 -1e-12 +n 25 -17 -1e-12 +n -24 -16 -1e-12 +n -25 -16 -1e-12 +n -23 -16 -1e-12 +n -22 -16 -1e-12 +n -21 -16 -1e-12 +n -20 -16 -1e-12 +n -19 -16 -1e-12 +n -18 -16 -1e-12 +n -17 -16 -1e-12 +n -16 -16 -1e-12 +n -15 -16 -1e-12 +n -14 -16 -1e-12 +n -13 -16 -1e-12 +n -12 -16 -1e-12 +n -11 -16 -1e-12 +n -10 -16 -1e-12 +n -9 -16 -1e-12 +n -8 -16 -1e-12 +n 8 -16 -1e-12 +n 9 -16 -1e-12 +n 10 -16 -1e-12 +n 11 -16 -1e-12 +n 12 -16 -1e-12 +n 13 -16 -1e-12 +n 14 -16 -1e-12 +n 15 -16 -1e-12 +n 16 -16 -1e-12 +n 17 -16 -1e-12 +n 18 -16 -1e-12 +n 19 -16 -1e-12 +n 20 -16 -1e-12 +n 21 -16 -1e-12 +n 22 -16 -1e-12 +n 23 -16 -1e-12 +n 24 -16 -1e-12 +n 25 -16 -1e-12 +n -24 -15 -1e-12 +n -25 -15 -1e-12 +n -23 -15 -1e-12 +n -22 -15 -1e-12 +n -21 -15 -1e-12 +n -20 -15 -1e-12 +n -19 -15 -1e-12 +n -18 -15 -1e-12 +n -17 -15 -1e-12 +n -16 -15 -1e-12 +n -15 -15 -1e-12 +n -14 -15 -1e-12 +n -13 -15 -1e-12 +n -12 -15 -1e-12 +n -11 -15 -1e-12 +n -10 -15 -1e-12 +n -9 -15 -1e-12 +n -8 -15 -1e-12 +n 8 -15 -1e-12 +n 9 -15 -1e-12 +n 10 -15 -1e-12 +n 11 -15 -1e-12 +n 12 -15 -1e-12 +n 13 -15 -1e-12 +n 14 -15 -1e-12 +n 15 -15 -1e-12 +n 16 -15 -1e-12 +n 17 -15 -1e-12 +n 18 -15 -1e-12 +n 19 -15 -1e-12 +n 20 -15 -1e-12 +n 21 -15 -1e-12 +n 22 -15 -1e-12 +n 23 -15 -1e-12 +n 24 -15 -1e-12 +n 25 -15 -1e-12 +n -24 -14 -1e-12 +n -25 -14 -1e-12 +n -23 -14 -1e-12 +n -22 -14 -1e-12 +n -21 -14 -1e-12 +n -20 -14 -1e-12 +n -19 -14 -1e-12 +n -18 -14 -1e-12 +n -17 -14 -1e-12 +n -16 -14 -1e-12 +n -15 -14 -1e-12 +n -14 -14 -1e-12 +n -13 -14 -1e-12 +n -12 -14 -1e-12 +n -11 -14 -1e-12 +n -10 -14 -1e-12 +n -9 -14 -1e-12 +n -8 -14 -1e-12 +n 8 -14 -1e-12 +n 9 -14 -1e-12 +n 10 -14 -1e-12 +n 11 -14 -1e-12 +n 12 -14 -1e-12 +n 13 -14 -1e-12 +n 14 -14 -1e-12 +n 15 -14 -1e-12 +n 16 -14 -1e-12 +n 17 -14 -1e-12 +n 18 -14 -1e-12 +n 19 -14 -1e-12 +n 20 -14 -1e-12 +n 21 -14 -1e-12 +n 22 -14 -1e-12 +n 23 -14 -1e-12 +n 24 -14 -1e-12 +n 25 -14 -1e-12 +n -24 -13 -1e-12 +n -25 -13 -1e-12 +n -23 -13 -1e-12 +n -22 -13 -1e-12 +n -21 -13 -1e-12 +n -20 -13 -1e-12 +n -19 -13 -1e-12 +n -18 -13 -1e-12 +n -17 -13 -1e-12 +n -16 -13 -1e-12 +n -15 -13 -1e-12 +n -14 -13 -1e-12 +n -13 -13 -1e-12 +n -12 -13 -1e-12 +n -11 -13 -1e-12 +n -10 -13 -1e-12 +n -9 -13 -1e-12 +n -8 -13 -1e-12 +n 8 -13 -1e-12 +n 9 -13 -1e-12 +n 10 -13 -1e-12 +n 11 -13 -1e-12 +n 12 -13 -1e-12 +n 13 -13 -1e-12 +n 14 -13 -1e-12 +n 15 -13 -1e-12 +n 16 -13 -1e-12 +n 17 -13 -1e-12 +n 18 -13 -1e-12 +n 19 -13 -1e-12 +n 20 -13 -1e-12 +n 21 -13 -1e-12 +n 22 -13 -1e-12 +n 23 -13 -1e-12 +n 24 -13 -1e-12 +n 25 -13 -1e-12 +n -24 -12 -1e-12 +n -25 -12 -1e-12 +n -23 -12 -1e-12 +n -22 -12 -1e-12 +n -21 -12 -1e-12 +n -20 -12 -1e-12 +n -19 -12 -1e-12 +n -18 -12 -1e-12 +n -17 -12 -1e-12 +n -16 -12 -1e-12 +n -15 -12 -1e-12 +n -14 -12 -1e-12 +n -13 -12 -1e-12 +n -12 -12 -1e-12 +n -11 -12 -1e-12 +n -10 -12 -1e-12 +n -9 -12 -1e-12 +n -8 -12 -1e-12 +n 8 -12 -1e-12 +n 9 -12 -1e-12 +n 10 -12 -1e-12 +n 11 -12 -1e-12 +n 12 -12 -1e-12 +n 13 -12 -1e-12 +n 14 -12 -1e-12 +n 15 -12 -1e-12 +n 16 -12 -1e-12 +n 17 -12 -1e-12 +n 18 -12 -1e-12 +n 19 -12 -1e-12 +n 20 -12 -1e-12 +n 21 -12 -1e-12 +n 22 -12 -1e-12 +n 23 -12 -1e-12 +n 24 -12 -1e-12 +n 25 -12 -1e-12 +n -24 -11 -1e-12 +n -25 -11 -1e-12 +n -23 -11 -1e-12 +n -22 -11 -1e-12 +n -21 -11 -1e-12 +n -20 -11 -1e-12 +n -19 -11 -1e-12 +n -18 -11 -1e-12 +n -17 -11 -1e-12 +n -16 -11 -1e-12 +n -15 -11 -1e-12 +n -14 -11 -1e-12 +n -13 -11 -1e-12 +n -12 -11 -1e-12 +n -11 -11 -1e-12 +n -10 -11 -1e-12 +n -9 -11 -1e-12 +n -8 -11 -1e-12 +n 8 -11 -1e-12 +n 9 -11 -1e-12 +n 10 -11 -1e-12 +n 11 -11 -1e-12 +n 12 -11 -1e-12 +n 13 -11 -1e-12 +n 14 -11 -1e-12 +n 15 -11 -1e-12 +n 16 -11 -1e-12 +n 17 -11 -1e-12 +n 18 -11 -1e-12 +n 19 -11 -1e-12 +n 20 -11 -1e-12 +n 21 -11 -1e-12 +n 22 -11 -1e-12 +n 23 -11 -1e-12 +n 24 -11 -1e-12 +n 25 -11 -1e-12 +n -24 -10 -1e-12 +n -25 -10 -1e-12 +n -23 -10 -1e-12 +n -22 -10 -1e-12 +n -21 -10 -1e-12 +n -20 -10 -1e-12 +n -19 -10 -1e-12 +n -18 -10 -1e-12 +n -17 -10 -1e-12 +n -16 -10 -1e-12 +n -15 -10 -1e-12 +n -14 -10 -1e-12 +n -13 -10 -1e-12 +n -12 -10 -1e-12 +n -11 -10 -1e-12 +n -10 -10 -1e-12 +n -9 -10 -1e-12 +n -8 -10 -1e-12 +n 8 -10 -1e-12 +n 9 -10 -1e-12 +n 10 -10 -1e-12 +n 11 -10 -1e-12 +n 12 -10 -1e-12 +n 13 -10 -1e-12 +n 14 -10 -1e-12 +n 15 -10 -1e-12 +n 16 -10 -1e-12 +n 17 -10 -1e-12 +n 18 -10 -1e-12 +n 19 -10 -1e-12 +n 20 -10 -1e-12 +n 21 -10 -1e-12 +n 22 -10 -1e-12 +n 23 -10 -1e-12 +n 24 -10 -1e-12 +n 25 -10 -1e-12 +n -24 -9 -1e-12 +n -25 -9 -1e-12 +n -23 -9 -1e-12 +n -22 -9 -1e-12 +n -21 -9 -1e-12 +n -20 -9 -1e-12 +n -19 -9 -1e-12 +n -18 -9 -1e-12 +n -17 -9 -1e-12 +n -16 -9 -1e-12 +n -15 -9 -1e-12 +n -14 -9 -1e-12 +n -13 -9 -1e-12 +n -12 -9 -1e-12 +n -11 -9 -1e-12 +n -10 -9 -1e-12 +n -9 -9 -1e-12 +n -8 -9 -1e-12 +n 8 -9 -1e-12 +n 9 -9 -1e-12 +n 10 -9 -1e-12 +n 11 -9 -1e-12 +n 12 -9 -1e-12 +n 13 -9 -1e-12 +n 14 -9 -1e-12 +n 15 -9 -1e-12 +n 16 -9 -1e-12 +n 17 -9 -1e-12 +n 18 -9 -1e-12 +n 19 -9 -1e-12 +n 20 -9 -1e-12 +n 21 -9 -1e-12 +n 22 -9 -1e-12 +n 23 -9 -1e-12 +n 24 -9 -1e-12 +n 25 -9 -1e-12 +n -24 -8 -1e-12 +n -25 -8 -1e-12 +n -23 -8 -1e-12 +n -22 -8 -1e-12 +n -21 -8 -1e-12 +n -20 -8 -1e-12 +n -19 -8 -1e-12 +n -18 -8 -1e-12 +n -17 -8 -1e-12 +n -16 -8 -1e-12 +n -15 -8 -1e-12 +n -14 -8 -1e-12 +n -13 -8 -1e-12 +n -12 -8 -1e-12 +n -11 -8 -1e-12 +n -10 -8 -1e-12 +n -9 -8 -1e-12 +n -8 -8 -1e-12 +n 8 -8 -1e-12 +n 9 -8 -1e-12 +n 10 -8 -1e-12 +n 11 -8 -1e-12 +n 12 -8 -1e-12 +n 13 -8 -1e-12 +n 14 -8 -1e-12 +n 15 -8 -1e-12 +n 16 -8 -1e-12 +n 17 -8 -1e-12 +n 18 -8 -1e-12 +n 19 -8 -1e-12 +n 20 -8 -1e-12 +n 21 -8 -1e-12 +n 22 -8 -1e-12 +n 23 -8 -1e-12 +n 24 -8 -1e-12 +n 25 -8 -1e-12 +n -24 -7 -1e-12 +n -25 -7 -1e-12 +n -23 -7 -1e-12 +n -22 -7 -1e-12 +n -21 -7 -1e-12 +n -20 -7 -1e-12 +n -19 -7 -1e-12 +n -18 -7 -1e-12 +n -17 -7 -1e-12 +n -16 -7 -1e-12 +n -15 -7 -1e-12 +n -14 -7 -1e-12 +n -13 -7 -1e-12 +n -12 -7 -1e-12 +n -11 -7 -1e-12 +n -10 -7 -1e-12 +n -9 -7 -1e-12 +n -8 -7 -1e-12 +n 8 -7 -1e-12 +n 9 -7 -1e-12 +n 10 -7 -1e-12 +n 11 -7 -1e-12 +n 12 -7 -1e-12 +n 13 -7 -1e-12 +n 14 -7 -1e-12 +n 15 -7 -1e-12 +n 16 -7 -1e-12 +n 17 -7 -1e-12 +n 18 -7 -1e-12 +n 19 -7 -1e-12 +n 20 -7 -1e-12 +n 21 -7 -1e-12 +n 22 -7 -1e-12 +n 23 -7 -1e-12 +n 24 -7 -1e-12 +n 25 -7 -1e-12 +n -24 -6 -1e-12 +n -25 -6 -1e-12 +n -23 -6 -1e-12 +n -22 -6 -1e-12 +n -21 -6 -1e-12 +n -20 -6 -1e-12 +n -19 -6 -1e-12 +n -18 -6 -1e-12 +n -17 -6 -1e-12 +n -16 -6 -1e-12 +n -15 -6 -1e-12 +n -14 -6 -1e-12 +n -13 -6 -1e-12 +n -12 -6 -1e-12 +n -11 -6 -1e-12 +n -10 -6 -1e-12 +n -9 -6 -1e-12 +n -8 -6 -1e-12 +n 8 -6 -1e-12 +n 9 -6 -1e-12 +n 10 -6 -1e-12 +n 11 -6 -1e-12 +n 12 -6 -1e-12 +n 13 -6 -1e-12 +n 14 -6 -1e-12 +n 15 -6 -1e-12 +n 16 -6 -1e-12 +n 17 -6 -1e-12 +n 18 -6 -1e-12 +n 19 -6 -1e-12 +n 20 -6 -1e-12 +n 21 -6 -1e-12 +n 22 -6 -1e-12 +n 23 -6 -1e-12 +n 24 -6 -1e-12 +n 25 -6 -1e-12 +n -24 -5 -1e-12 +n -25 -5 -1e-12 +n -23 -5 -1e-12 +n -22 -5 -1e-12 +n -21 -5 -1e-12 +n -20 -5 -1e-12 +n -19 -5 -1e-12 +n -18 -5 -1e-12 +n -17 -5 -1e-12 +n -16 -5 -1e-12 +n -15 -5 -1e-12 +n -14 -5 -1e-12 +n -13 -5 -1e-12 +n -12 -5 -1e-12 +n -11 -5 -1e-12 +n -10 -5 -1e-12 +n -9 -5 -1e-12 +n -8 -5 -1e-12 +n 8 -5 -1e-12 +n 9 -5 -1e-12 +n 10 -5 -1e-12 +n 11 -5 -1e-12 +n 12 -5 -1e-12 +n 13 -5 -1e-12 +n 14 -5 -1e-12 +n 15 -5 -1e-12 +n 16 -5 -1e-12 +n 17 -5 -1e-12 +n 18 -5 -1e-12 +n 19 -5 -1e-12 +n 20 -5 -1e-12 +n 21 -5 -1e-12 +n 22 -5 -1e-12 +n 23 -5 -1e-12 +n 24 -5 -1e-12 +n 25 -5 -1e-12 +n -24 -4 -1e-12 +n -25 -4 -1e-12 +n -23 -4 -1e-12 +n -22 -4 -1e-12 +n -21 -4 -1e-12 +n -20 -4 -1e-12 +n -19 -4 -1e-12 +n -18 -4 -1e-12 +n -17 -4 -1e-12 +n -16 -4 -1e-12 +n -15 -4 -1e-12 +n -14 -4 -1e-12 +n -13 -4 -1e-12 +n -12 -4 -1e-12 +n -11 -4 -1e-12 +n -10 -4 -1e-12 +n -9 -4 -1e-12 +n -8 -4 -1e-12 +n 8 -4 -1e-12 +n 9 -4 -1e-12 +n 10 -4 -1e-12 +n 11 -4 -1e-12 +n 12 -4 -1e-12 +n 13 -4 -1e-12 +n 14 -4 -1e-12 +n 15 -4 -1e-12 +n 16 -4 -1e-12 +n 17 -4 -1e-12 +n 18 -4 -1e-12 +n 19 -4 -1e-12 +n 20 -4 -1e-12 +n 21 -4 -1e-12 +n 22 -4 -1e-12 +n 23 -4 -1e-12 +n 24 -4 -1e-12 +n 25 -4 -1e-12 +n -24 -3 -1e-12 +n -25 -3 -1e-12 +n -23 -3 -1e-12 +n -22 -3 -1e-12 +n -21 -3 -1e-12 +n -20 -3 -1e-12 +n -19 -3 -1e-12 +n -18 -3 -1e-12 +n -17 -3 -1e-12 +n -16 -3 -1e-12 +n -15 -3 -1e-12 +n -14 -3 -1e-12 +n -13 -3 -1e-12 +n -12 -3 -1e-12 +n -11 -3 -1e-12 +n -10 -3 -1e-12 +n -9 -3 -1e-12 +n -8 -3 -1e-12 +n 8 -3 -1e-12 +n 9 -3 -1e-12 +n 10 -3 -1e-12 +n 11 -3 -1e-12 +n 12 -3 -1e-12 +n 13 -3 -1e-12 +n 14 -3 -1e-12 +n 15 -3 -1e-12 +n 16 -3 -1e-12 +n 17 -3 -1e-12 +n 18 -3 -1e-12 +n 19 -3 -1e-12 +n 20 -3 -1e-12 +n 21 -3 -1e-12 +n 22 -3 -1e-12 +n 23 -3 -1e-12 +n 24 -3 -1e-12 +n 25 -3 -1e-12 +n -24 -2 -1e-12 +n -25 -2 -1e-12 +n -23 -2 -1e-12 +n -22 -2 -1e-12 +n -21 -2 -1e-12 +n -20 -2 -1e-12 +n -19 -2 -1e-12 +n -18 -2 -1e-12 +n -17 -2 -1e-12 +n -16 -2 -1e-12 +n -15 -2 -1e-12 +n -14 -2 -1e-12 +n -13 -2 -1e-12 +n -12 -2 -1e-12 +n -11 -2 -1e-12 +n -10 -2 -1e-12 +n -9 -2 -1e-12 +n -8 -2 -1e-12 +n 8 -2 -1e-12 +n 9 -2 -1e-12 +n 10 -2 -1e-12 +n 11 -2 -1e-12 +n 12 -2 -1e-12 +n 13 -2 -1e-12 +n 14 -2 -1e-12 +n 15 -2 -1e-12 +n 16 -2 -1e-12 +n 17 -2 -1e-12 +n 18 -2 -1e-12 +n 19 -2 -1e-12 +n 20 -2 -1e-12 +n 21 -2 -1e-12 +n 22 -2 -1e-12 +n 23 -2 -1e-12 +n 24 -2 -1e-12 +n 25 -2 -1e-12 +n -24 -1 -1e-12 +n -25 -1 -1e-12 +n -23 -1 -1e-12 +n -22 -1 -1e-12 +n -21 -1 -1e-12 +n -20 -1 -1e-12 +n -19 -1 -1e-12 +n -18 -1 -1e-12 +n -17 -1 -1e-12 +n -16 -1 -1e-12 +n -15 -1 -1e-12 +n -14 -1 -1e-12 +n -13 -1 -1e-12 +n -12 -1 -1e-12 +n -11 -1 -1e-12 +n -10 -1 -1e-12 +n -9 -1 -1e-12 +n -8 -1 -1e-12 +n 8 -1 -1e-12 +n 9 -1 -1e-12 +n 10 -1 -1e-12 +n 11 -1 -1e-12 +n 12 -1 -1e-12 +n 13 -1 -1e-12 +n 14 -1 -1e-12 +n 15 -1 -1e-12 +n 16 -1 -1e-12 +n 17 -1 -1e-12 +n 18 -1 -1e-12 +n 19 -1 -1e-12 +n 20 -1 -1e-12 +n 21 -1 -1e-12 +n 22 -1 -1e-12 +n 23 -1 -1e-12 +n 24 -1 -1e-12 +n 25 -1 -1e-12 +n -24 0 -1e-12 +n -25 0 -1e-12 +n -23 0 -1e-12 +n -22 0 -1e-12 +n -21 0 -1e-12 +n -20 0 -1e-12 +n -19 0 -1e-12 +n -18 0 -1e-12 +n -17 0 -1e-12 +n -16 0 -1e-12 +n -15 0 -1e-12 +n -14 0 -1e-12 +n -13 0 -1e-12 +n -12 0 -1e-12 +n -11 0 -1e-12 +n -10 0 -1e-12 +n -9 0 -1e-12 +n -8 0 -1e-12 +n 8 0 -1e-12 +n 9 0 -1e-12 +n 10 0 -1e-12 +n 11 0 -1e-12 +n 12 0 -1e-12 +n 13 0 -1e-12 +n 14 0 -1e-12 +n 15 0 -1e-12 +n 16 0 -1e-12 +n 17 0 -1e-12 +n 18 0 -1e-12 +n 19 0 -1e-12 +n 20 0 -1e-12 +n 21 0 -1e-12 +n 22 0 -1e-12 +n 23 0 -1e-12 +n 24 0 -1e-12 +n 25 0 -1e-12 +n -24 1 -1e-12 +n -25 1 -1e-12 +n -23 1 -1e-12 +n -22 1 -1e-12 +n -21 1 -1e-12 +n -20 1 -1e-12 +n -19 1 -1e-12 +n -18 1 -1e-12 +n -17 1 -1e-12 +n -16 1 -1e-12 +n -15 1 -1e-12 +n -14 1 -1e-12 +n -13 1 -1e-12 +n -12 1 -1e-12 +n -11 1 -1e-12 +n -10 1 -1e-12 +n -9 1 -1e-12 +n -8 1 -1e-12 +n 8 1 -1e-12 +n 9 1 -1e-12 +n 10 1 -1e-12 +n 11 1 -1e-12 +n 12 1 -1e-12 +n 13 1 -1e-12 +n 14 1 -1e-12 +n 15 1 -1e-12 +n 16 1 -1e-12 +n 17 1 -1e-12 +n 18 1 -1e-12 +n 19 1 -1e-12 +n 20 1 -1e-12 +n 21 1 -1e-12 +n 22 1 -1e-12 +n 23 1 -1e-12 +n 24 1 -1e-12 +n 25 1 -1e-12 +n -24 2 -1e-12 +n -25 2 -1e-12 +n -23 2 -1e-12 +n -22 2 -1e-12 +n -21 2 -1e-12 +n -20 2 -1e-12 +n -19 2 -1e-12 +n -18 2 -1e-12 +n -17 2 -1e-12 +n -16 2 -1e-12 +n -15 2 -1e-12 +n -14 2 -1e-12 +n -13 2 -1e-12 +n -12 2 -1e-12 +n -11 2 -1e-12 +n -10 2 -1e-12 +n -9 2 -1e-12 +n -8 2 -1e-12 +n 8 2 -1e-12 +n 9 2 -1e-12 +n 10 2 -1e-12 +n 11 2 -1e-12 +n 12 2 -1e-12 +n 13 2 -1e-12 +n 14 2 -1e-12 +n 15 2 -1e-12 +n 16 2 -1e-12 +n 17 2 -1e-12 +n 18 2 -1e-12 +n 19 2 -1e-12 +n 20 2 -1e-12 +n 21 2 -1e-12 +n 22 2 -1e-12 +n 23 2 -1e-12 +n 24 2 -1e-12 +n 25 2 -1e-12 +n -24 3 -1e-12 +n -25 3 -1e-12 +n -23 3 -1e-12 +n -22 3 -1e-12 +n -21 3 -1e-12 +n -20 3 -1e-12 +n -19 3 -1e-12 +n -18 3 -1e-12 +n -17 3 -1e-12 +n -16 3 -1e-12 +n -15 3 -1e-12 +n -14 3 -1e-12 +n -13 3 -1e-12 +n -12 3 -1e-12 +n -11 3 -1e-12 +n -10 3 -1e-12 +n -9 3 -1e-12 +n -8 3 -1e-12 +n 8 3 -1e-12 +n 9 3 -1e-12 +n 10 3 -1e-12 +n 11 3 -1e-12 +n 12 3 -1e-12 +n 13 3 -1e-12 +n 14 3 -1e-12 +n 15 3 -1e-12 +n 16 3 -1e-12 +n 17 3 -1e-12 +n 18 3 -1e-12 +n 19 3 -1e-12 +n 20 3 -1e-12 +n 21 3 -1e-12 +n 22 3 -1e-12 +n 23 3 -1e-12 +n 24 3 -1e-12 +n 25 3 -1e-12 +n -24 4 -1e-12 +n -25 4 -1e-12 +n -23 4 -1e-12 +n -22 4 -1e-12 +n -21 4 -1e-12 +n -20 4 -1e-12 +n -19 4 -1e-12 +n -18 4 -1e-12 +n -17 4 -1e-12 +n -16 4 -1e-12 +n -15 4 -1e-12 +n -14 4 -1e-12 +n -13 4 -1e-12 +n -12 4 -1e-12 +n -11 4 -1e-12 +n -10 4 -1e-12 +n -9 4 -1e-12 +n -8 4 -1e-12 +n 8 4 -1e-12 +n 9 4 -1e-12 +n 10 4 -1e-12 +n 11 4 -1e-12 +n 12 4 -1e-12 +n 13 4 -1e-12 +n 14 4 -1e-12 +n 15 4 -1e-12 +n 16 4 -1e-12 +n 17 4 -1e-12 +n 18 4 -1e-12 +n 19 4 -1e-12 +n 20 4 -1e-12 +n 21 4 -1e-12 +n 22 4 -1e-12 +n 23 4 -1e-12 +n 24 4 -1e-12 +n 25 4 -1e-12 +n -24 5 -1e-12 +n -25 5 -1e-12 +n -23 5 -1e-12 +n -22 5 -1e-12 +n -21 5 -1e-12 +n -20 5 -1e-12 +n -19 5 -1e-12 +n -18 5 -1e-12 +n -17 5 -1e-12 +n -16 5 -1e-12 +n -15 5 -1e-12 +n -14 5 -1e-12 +n -13 5 -1e-12 +n -12 5 -1e-12 +n -11 5 -1e-12 +n -10 5 -1e-12 +n -9 5 -1e-12 +n -8 5 -1e-12 +n 8 5 -1e-12 +n 9 5 -1e-12 +n 10 5 -1e-12 +n 11 5 -1e-12 +n 12 5 -1e-12 +n 13 5 -1e-12 +n 14 5 -1e-12 +n 15 5 -1e-12 +n 16 5 -1e-12 +n 17 5 -1e-12 +n 18 5 -1e-12 +n 19 5 -1e-12 +n 20 5 -1e-12 +n 21 5 -1e-12 +n 22 5 -1e-12 +n 23 5 -1e-12 +n 24 5 -1e-12 +n 25 5 -1e-12 +n -24 6 -1e-12 +n -25 6 -1e-12 +n -23 6 -1e-12 +n -22 6 -1e-12 +n -21 6 -1e-12 +n -20 6 -1e-12 +n -19 6 -1e-12 +n -18 6 -1e-12 +n -17 6 -1e-12 +n -16 6 -1e-12 +n -15 6 -1e-12 +n -14 6 -1e-12 +n -13 6 -1e-12 +n -12 6 -1e-12 +n -11 6 -1e-12 +n -10 6 -1e-12 +n -9 6 -1e-12 +n -8 6 -1e-12 +n 8 6 -1e-12 +n 9 6 -1e-12 +n 10 6 -1e-12 +n 11 6 -1e-12 +n 12 6 -1e-12 +n 13 6 -1e-12 +n 14 6 -1e-12 +n 15 6 -1e-12 +n 16 6 -1e-12 +n 17 6 -1e-12 +n 18 6 -1e-12 +n 19 6 -1e-12 +n 20 6 -1e-12 +n 21 6 -1e-12 +n 22 6 -1e-12 +n 23 6 -1e-12 +n 24 6 -1e-12 +n 25 6 -1e-12 +n -24 7 -1e-12 +n -25 7 -1e-12 +n -23 7 -1e-12 +n -22 7 -1e-12 +n -21 7 -1e-12 +n -20 7 -1e-12 +n -19 7 -1e-12 +n -18 7 -1e-12 +n -17 7 -1e-12 +n -16 7 -1e-12 +n -15 7 -1e-12 +n -14 7 -1e-12 +n -13 7 -1e-12 +n -12 7 -1e-12 +n -11 7 -1e-12 +n -10 7 -1e-12 +n -9 7 -1e-12 +n -8 7 -1e-12 +n 8 7 -1e-12 +n 9 7 -1e-12 +n 10 7 -1e-12 +n 11 7 -1e-12 +n 12 7 -1e-12 +n 13 7 -1e-12 +n 14 7 -1e-12 +n 15 7 -1e-12 +n 16 7 -1e-12 +n 17 7 -1e-12 +n 18 7 -1e-12 +n 19 7 -1e-12 +n 20 7 -1e-12 +n 21 7 -1e-12 +n 22 7 -1e-12 +n 23 7 -1e-12 +n 24 7 -1e-12 +n 25 7 -1e-12 +n -24 8 -1e-12 +n -25 8 -1e-12 +n -23 8 -1e-12 +n -22 8 -1e-12 +n -21 8 -1e-12 +n -20 8 -1e-12 +n -19 8 -1e-12 +n -18 8 -1e-12 +n -17 8 -1e-12 +n -16 8 -1e-12 +n -15 8 -1e-12 +n -14 8 -1e-12 +n -13 8 -1e-12 +n -12 8 -1e-12 +n -11 8 -1e-12 +n -10 8 -1e-12 +n -9 8 -1e-12 +n -8 8 -1e-12 +n 8 8 -1e-12 +n 9 8 -1e-12 +n 10 8 -1e-12 +n 11 8 -1e-12 +n 12 8 -1e-12 +n 13 8 -1e-12 +n 14 8 -1e-12 +n 15 8 -1e-12 +n 16 8 -1e-12 +n 17 8 -1e-12 +n 18 8 -1e-12 +n 19 8 -1e-12 +n 20 8 -1e-12 +n 21 8 -1e-12 +n 22 8 -1e-12 +n 23 8 -1e-12 +n 24 8 -1e-12 +n 25 8 -1e-12 +n -24 9 -1e-12 +n -25 9 -1e-12 +n -23 9 -1e-12 +n -22 9 -1e-12 +n -21 9 -1e-12 +n -20 9 -1e-12 +n -19 9 -1e-12 +n -18 9 -1e-12 +n -17 9 -1e-12 +n -16 9 -1e-12 +n -15 9 -1e-12 +n -14 9 -1e-12 +n -13 9 -1e-12 +n -12 9 -1e-12 +n -11 9 -1e-12 +n -10 9 -1e-12 +n -9 9 -1e-12 +n -8 9 -1e-12 +n 8 9 -1e-12 +n 9 9 -1e-12 +n 10 9 -1e-12 +n 11 9 -1e-12 +n 12 9 -1e-12 +n 13 9 -1e-12 +n 14 9 -1e-12 +n 15 9 -1e-12 +n 16 9 -1e-12 +n 17 9 -1e-12 +n 18 9 -1e-12 +n 19 9 -1e-12 +n 20 9 -1e-12 +n 21 9 -1e-12 +n 22 9 -1e-12 +n 23 9 -1e-12 +n 24 9 -1e-12 +n 25 9 -1e-12 +n -24 10 -1e-12 +n -25 10 -1e-12 +n -23 10 -1e-12 +n -22 10 -1e-12 +n -21 10 -1e-12 +n -20 10 -1e-12 +n -19 10 -1e-12 +n -18 10 -1e-12 +n -17 10 -1e-12 +n -16 10 -1e-12 +n -15 10 -1e-12 +n -14 10 -1e-12 +n -13 10 -1e-12 +n -12 10 -1e-12 +n -11 10 -1e-12 +n -10 10 -1e-12 +n -9 10 -1e-12 +n -8 10 -1e-12 +n 8 10 -1e-12 +n 9 10 -1e-12 +n 10 10 -1e-12 +n 11 10 -1e-12 +n 12 10 -1e-12 +n 13 10 -1e-12 +n 14 10 -1e-12 +n 15 10 -1e-12 +n 16 10 -1e-12 +n 17 10 -1e-12 +n 18 10 -1e-12 +n 19 10 -1e-12 +n 20 10 -1e-12 +n 21 10 -1e-12 +n 22 10 -1e-12 +n 23 10 -1e-12 +n 24 10 -1e-12 +n 25 10 -1e-12 +n -24 11 -1e-12 +n -25 11 -1e-12 +n -23 11 -1e-12 +n -22 11 -1e-12 +n -21 11 -1e-12 +n -20 11 -1e-12 +n -19 11 -1e-12 +n -18 11 -1e-12 +n -17 11 -1e-12 +n -16 11 -1e-12 +n -15 11 -1e-12 +n -14 11 -1e-12 +n -13 11 -1e-12 +n -12 11 -1e-12 +n -11 11 -1e-12 +n -10 11 -1e-12 +n -9 11 -1e-12 +n -8 11 -1e-12 +n 8 11 -1e-12 +n 9 11 -1e-12 +n 10 11 -1e-12 +n 11 11 -1e-12 +n 12 11 -1e-12 +n 13 11 -1e-12 +n 14 11 -1e-12 +n 15 11 -1e-12 +n 16 11 -1e-12 +n 17 11 -1e-12 +n 18 11 -1e-12 +n 19 11 -1e-12 +n 20 11 -1e-12 +n 21 11 -1e-12 +n 22 11 -1e-12 +n 23 11 -1e-12 +n 24 11 -1e-12 +n 25 11 -1e-12 +n -24 12 -1e-12 +n -25 12 -1e-12 +n -23 12 -1e-12 +n -22 12 -1e-12 +n -21 12 -1e-12 +n -20 12 -1e-12 +n -19 12 -1e-12 +n -18 12 -1e-12 +n -17 12 -1e-12 +n -16 12 -1e-12 +n -15 12 -1e-12 +n -14 12 -1e-12 +n -13 12 -1e-12 +n -12 12 -1e-12 +n -11 12 -1e-12 +n -10 12 -1e-12 +n -9 12 -1e-12 +n -8 12 -1e-12 +n 8 12 -1e-12 +n 9 12 -1e-12 +n 10 12 -1e-12 +n 11 12 -1e-12 +n 12 12 -1e-12 +n 13 12 -1e-12 +n 14 12 -1e-12 +n 15 12 -1e-12 +n 16 12 -1e-12 +n 17 12 -1e-12 +n 18 12 -1e-12 +n 19 12 -1e-12 +n 20 12 -1e-12 +n 21 12 -1e-12 +n 22 12 -1e-12 +n 23 12 -1e-12 +n 24 12 -1e-12 +n 25 12 -1e-12 +n -24 13 -1e-12 +n -25 13 -1e-12 +n -23 13 -1e-12 +n -22 13 -1e-12 +n -21 13 -1e-12 +n -20 13 -1e-12 +n -19 13 -1e-12 +n -18 13 -1e-12 +n -17 13 -1e-12 +n -16 13 -1e-12 +n -15 13 -1e-12 +n -14 13 -1e-12 +n -13 13 -1e-12 +n -12 13 -1e-12 +n -11 13 -1e-12 +n -10 13 -1e-12 +n -9 13 -1e-12 +n -8 13 -1e-12 +n 8 13 -1e-12 +n 9 13 -1e-12 +n 10 13 -1e-12 +n 11 13 -1e-12 +n 12 13 -1e-12 +n 13 13 -1e-12 +n 14 13 -1e-12 +n 15 13 -1e-12 +n 16 13 -1e-12 +n 17 13 -1e-12 +n 18 13 -1e-12 +n 19 13 -1e-12 +n 20 13 -1e-12 +n 21 13 -1e-12 +n 22 13 -1e-12 +n 23 13 -1e-12 +n 24 13 -1e-12 +n 25 13 -1e-12 +n -24 14 -1e-12 +n -25 14 -1e-12 +n -23 14 -1e-12 +n -22 14 -1e-12 +n -21 14 -1e-12 +n -20 14 -1e-12 +n -19 14 -1e-12 +n -18 14 -1e-12 +n -17 14 -1e-12 +n -16 14 -1e-12 +n -15 14 -1e-12 +n -14 14 -1e-12 +n -13 14 -1e-12 +n -12 14 -1e-12 +n -11 14 -1e-12 +n -10 14 -1e-12 +n -9 14 -1e-12 +n -8 14 -1e-12 +n 8 14 -1e-12 +n 9 14 -1e-12 +n 10 14 -1e-12 +n 11 14 -1e-12 +n 12 14 -1e-12 +n 13 14 -1e-12 +n 14 14 -1e-12 +n 15 14 -1e-12 +n 16 14 -1e-12 +n 17 14 -1e-12 +n 18 14 -1e-12 +n 19 14 -1e-12 +n 20 14 -1e-12 +n 21 14 -1e-12 +n 22 14 -1e-12 +n 23 14 -1e-12 +n 24 14 -1e-12 +n 25 14 -1e-12 +n -24 15 -1e-12 +n -25 15 -1e-12 +n -23 15 -1e-12 +n -22 15 -1e-12 +n -21 15 -1e-12 +n -20 15 -1e-12 +n -19 15 -1e-12 +n -18 15 -1e-12 +n -17 15 -1e-12 +n -16 15 -1e-12 +n -15 15 -1e-12 +n -14 15 -1e-12 +n -13 15 -1e-12 +n -12 15 -1e-12 +n -11 15 -1e-12 +n -10 15 -1e-12 +n -9 15 -1e-12 +n -8 15 -1e-12 +n 8 15 -1e-12 +n 9 15 -1e-12 +n 10 15 -1e-12 +n 11 15 -1e-12 +n 12 15 -1e-12 +n 13 15 -1e-12 +n 14 15 -1e-12 +n 15 15 -1e-12 +n 16 15 -1e-12 +n 17 15 -1e-12 +n 18 15 -1e-12 +n 19 15 -1e-12 +n 20 15 -1e-12 +n 21 15 -1e-12 +n 22 15 -1e-12 +n 23 15 -1e-12 +n 24 15 -1e-12 +n 25 15 -1e-12 +n -24 16 -1e-12 +n -25 16 -1e-12 +n -23 16 -1e-12 +n -22 16 -1e-12 +n -21 16 -1e-12 +n -20 16 -1e-12 +n -19 16 -1e-12 +n -18 16 -1e-12 +n -17 16 -1e-12 +n -16 16 -1e-12 +n -15 16 -1e-12 +n -14 16 -1e-12 +n -13 16 -1e-12 +n -12 16 -1e-12 +n -11 16 -1e-12 +n -10 16 -1e-12 +n -9 16 -1e-12 +n -8 16 -1e-12 +n 8 16 -1e-12 +n 9 16 -1e-12 +n 10 16 -1e-12 +n 11 16 -1e-12 +n 12 16 -1e-12 +n 13 16 -1e-12 +n 14 16 -1e-12 +n 15 16 -1e-12 +n 16 16 -1e-12 +n 17 16 -1e-12 +n 18 16 -1e-12 +n 19 16 -1e-12 +n 20 16 -1e-12 +n 21 16 -1e-12 +n 22 16 -1e-12 +n 23 16 -1e-12 +n 24 16 -1e-12 +n 25 16 -1e-12 +n -24 17 -1e-12 +n -25 17 -1e-12 +n -23 17 -1e-12 +n -22 17 -1e-12 +n -21 17 -1e-12 +n -20 17 -1e-12 +n -19 17 -1e-12 +n -18 17 -1e-12 +n -17 17 -1e-12 +n -16 17 -1e-12 +n -15 17 -1e-12 +n -14 17 -1e-12 +n -13 17 -1e-12 +n -12 17 -1e-12 +n -11 17 -1e-12 +n -10 17 -1e-12 +n -9 17 -1e-12 +n -8 17 -1e-12 +n 8 17 -1e-12 +n 9 17 -1e-12 +n 10 17 -1e-12 +n 11 17 -1e-12 +n 12 17 -1e-12 +n 13 17 -1e-12 +n 14 17 -1e-12 +n 15 17 -1e-12 +n 16 17 -1e-12 +n 17 17 -1e-12 +n 18 17 -1e-12 +n 19 17 -1e-12 +n 20 17 -1e-12 +n 21 17 -1e-12 +n 22 17 -1e-12 +n 23 17 -1e-12 +n 24 17 -1e-12 +n 25 17 -1e-12 +n -24 18 -1e-12 +n -25 18 -1e-12 +n -23 18 -1e-12 +n -22 18 -1e-12 +n -21 18 -1e-12 +n -20 18 -1e-12 +n -19 18 -1e-12 +n -18 18 -1e-12 +n -17 18 -1e-12 +n -16 18 -1e-12 +n -15 18 -1e-12 +n -14 18 -1e-12 +n -13 18 -1e-12 +n -12 18 -1e-12 +n -11 18 -1e-12 +n -10 18 -1e-12 +n -9 18 -1e-12 +n -8 18 -1e-12 +n 8 18 -1e-12 +n 9 18 -1e-12 +n 10 18 -1e-12 +n 11 18 -1e-12 +n 12 18 -1e-12 +n 13 18 -1e-12 +n 14 18 -1e-12 +n 15 18 -1e-12 +n 16 18 -1e-12 +n 17 18 -1e-12 +n 18 18 -1e-12 +n 19 18 -1e-12 +n 20 18 -1e-12 +n 21 18 -1e-12 +n 22 18 -1e-12 +n 23 18 -1e-12 +n 24 18 -1e-12 +n 25 18 -1e-12 +n -24 19 -1e-12 +n -25 19 -1e-12 +n -23 19 -1e-12 +n -22 19 -1e-12 +n -21 19 -1e-12 +n -20 19 -1e-12 +n -19 19 -1e-12 +n -18 19 -1e-12 +n -17 19 -1e-12 +n -16 19 -1e-12 +n -15 19 -1e-12 +n -14 19 -1e-12 +n -13 19 -1e-12 +n -12 19 -1e-12 +n -11 19 -1e-12 +n -10 19 -1e-12 +n -9 19 -1e-12 +n -8 19 -1e-12 +n 8 19 -1e-12 +n 9 19 -1e-12 +n 10 19 -1e-12 +n 11 19 -1e-12 +n 12 19 -1e-12 +n 13 19 -1e-12 +n 14 19 -1e-12 +n 15 19 -1e-12 +n 16 19 -1e-12 +n 17 19 -1e-12 +n 18 19 -1e-12 +n 19 19 -1e-12 +n 20 19 -1e-12 +n 21 19 -1e-12 +n 22 19 -1e-12 +n 23 19 -1e-12 +n 24 19 -1e-12 +n 25 19 -1e-12 +n -24 20 -1e-12 +n -25 20 -1e-12 +n -23 20 -1e-12 +n -22 20 -1e-12 +n -21 20 -1e-12 +n -20 20 -1e-12 +n -19 20 -1e-12 +n -18 20 -1e-12 +n -17 20 -1e-12 +n -16 20 -1e-12 +n -15 20 -1e-12 +n -14 20 -1e-12 +n -13 20 -1e-12 +n -12 20 -1e-12 +n -11 20 -1e-12 +n -10 20 -1e-12 +n -9 20 -1e-12 +n -8 20 -1e-12 +n 8 20 -1e-12 +n 9 20 -1e-12 +n 10 20 -1e-12 +n 11 20 -1e-12 +n 12 20 -1e-12 +n 13 20 -1e-12 +n 14 20 -1e-12 +n 15 20 -1e-12 +n 16 20 -1e-12 +n 17 20 -1e-12 +n 18 20 -1e-12 +n 19 20 -1e-12 +n 20 20 -1e-12 +n 21 20 -1e-12 +n 22 20 -1e-12 +n 23 20 -1e-12 +n 24 20 -1e-12 +n 25 20 -1e-12 +n -24 21 -1e-12 +n -25 21 -1e-12 +n -23 21 -1e-12 +n -22 21 -1e-12 +n -21 21 -1e-12 +n -20 21 -1e-12 +n -19 21 -1e-12 +n -18 21 -1e-12 +n -17 21 -1e-12 +n -16 21 -1e-12 +n -15 21 -1e-12 +n -14 21 -1e-12 +n -13 21 -1e-12 +n -12 21 -1e-12 +n -11 21 -1e-12 +n -10 21 -1e-12 +n -9 21 -1e-12 +n -8 21 -1e-12 +n 8 21 -1e-12 +n 9 21 -1e-12 +n 10 21 -1e-12 +n 11 21 -1e-12 +n 12 21 -1e-12 +n 13 21 -1e-12 +n 14 21 -1e-12 +n 15 21 -1e-12 +n 16 21 -1e-12 +n 17 21 -1e-12 +n 18 21 -1e-12 +n 19 21 -1e-12 +n 20 21 -1e-12 +n 21 21 -1e-12 +n 22 21 -1e-12 +n 23 21 -1e-12 +n 24 21 -1e-12 +n 25 21 -1e-12 +n -24 22 -1e-12 +n -25 22 -1e-12 +n -23 22 -1e-12 +n -22 22 -1e-12 +n -21 22 -1e-12 +n -20 22 -1e-12 +n -19 22 -1e-12 +n -18 22 -1e-12 +n -17 22 -1e-12 +n -16 22 -1e-12 +n -15 22 -1e-12 +n -14 22 -1e-12 +n -13 22 -1e-12 +n -12 22 -1e-12 +n -11 22 -1e-12 +n -10 22 -1e-12 +n -9 22 -1e-12 +n -8 22 -1e-12 +n 8 22 -1e-12 +n 9 22 -1e-12 +n 10 22 -1e-12 +n 11 22 -1e-12 +n 12 22 -1e-12 +n 13 22 -1e-12 +n 14 22 -1e-12 +n 15 22 -1e-12 +n 16 22 -1e-12 +n 17 22 -1e-12 +n 18 22 -1e-12 +n 19 22 -1e-12 +n 20 22 -1e-12 +n 21 22 -1e-12 +n 22 22 -1e-12 +n 23 22 -1e-12 +n 24 22 -1e-12 +n 25 22 -1e-12 +n -24 23 -1e-12 +n -25 23 -1e-12 +n -23 23 -1e-12 +n -22 23 -1e-12 +n -21 23 -1e-12 +n -20 23 -1e-12 +n -19 23 -1e-12 +n -18 23 -1e-12 +n -17 23 -1e-12 +n -16 23 -1e-12 +n -15 23 -1e-12 +n -14 23 -1e-12 +n -13 23 -1e-12 +n -12 23 -1e-12 +n -11 23 -1e-12 +n -10 23 -1e-12 +n -9 23 -1e-12 +n -8 23 -1e-12 +n 8 23 -1e-12 +n 9 23 -1e-12 +n 10 23 -1e-12 +n 11 23 -1e-12 +n 12 23 -1e-12 +n 13 23 -1e-12 +n 14 23 -1e-12 +n 15 23 -1e-12 +n 16 23 -1e-12 +n 17 23 -1e-12 +n 18 23 -1e-12 +n 19 23 -1e-12 +n 20 23 -1e-12 +n 21 23 -1e-12 +n 22 23 -1e-12 +n 23 23 -1e-12 +n 24 23 -1e-12 +n 25 23 -1e-12 +n -24 24 -1e-12 +n -25 24 -1e-12 +n -23 24 -1e-12 +n -22 24 -1e-12 +n -21 24 -1e-12 +n -20 24 -1e-12 +n -19 24 -1e-12 +n -18 24 -1e-12 +n -17 24 -1e-12 +n -16 24 -1e-12 +n -15 24 -1e-12 +n -14 24 -1e-12 +n -13 24 -1e-12 +n -12 24 -1e-12 +n -11 24 -1e-12 +n -10 24 -1e-12 +n -9 24 -1e-12 +n -8 24 -1e-12 +n 8 24 -1e-12 +n 9 24 -1e-12 +n 10 24 -1e-12 +n 11 24 -1e-12 +n 12 24 -1e-12 +n 13 24 -1e-12 +n 14 24 -1e-12 +n 15 24 -1e-12 +n 16 24 -1e-12 +n 17 24 -1e-12 +n 18 24 -1e-12 +n 19 24 -1e-12 +n 20 24 -1e-12 +n 21 24 -1e-12 +n 22 24 -1e-12 +n 23 24 -1e-12 +n 24 24 -1e-12 +n 25 24 -1e-12 +n -24 25 -1e-12 +n -25 25 -1e-12 +n -23 25 -1e-12 +n -22 25 -1e-12 +n -21 25 -1e-12 +n -20 25 -1e-12 +n -19 25 -1e-12 +n -18 25 -1e-12 +n -17 25 -1e-12 +n -16 25 -1e-12 +n -15 25 -1e-12 +n -14 25 -1e-12 +n -13 25 -1e-12 +n -12 25 -1e-12 +n -11 25 -1e-12 +n -10 25 -1e-12 +n -9 25 -1e-12 +n -8 25 -1e-12 +n 8 25 -1e-12 +n 9 25 -1e-12 +n 10 25 -1e-12 +n 11 25 -1e-12 +n 12 25 -1e-12 +n 13 25 -1e-12 +n 14 25 -1e-12 +n 15 25 -1e-12 +n 16 25 -1e-12 +n 17 25 -1e-12 +n 18 25 -1e-12 +n 19 25 -1e-12 +n 20 25 -1e-12 +n 21 25 -1e-12 +n 22 25 -1e-12 +n 23 25 -1e-12 +n 24 25 -1e-12 +n 25 25 -1e-12 +t 2 3 1 +t 3 0 1 +t 4 5 2 +t 5 3 2 +t 6 7 4 +t 7 5 4 +t 8 9 6 +t 9 7 6 +t 10 11 8 +t 11 9 8 +t 12 13 10 +t 13 11 10 +t 14 15 12 +t 15 13 12 +t 16 17 14 +t 17 15 14 +t 18 19 16 +t 19 17 16 +t 20 21 18 +t 21 19 18 +t 22 23 20 +t 23 21 20 +t 24 25 22 +t 25 23 22 +t 26 27 24 +t 27 25 24 +t 28 29 26 +t 29 27 26 +t 3 31 0 +t 31 30 0 +t 5 32 3 +t 32 31 3 +t 7 33 5 +t 33 32 5 +t 9 34 7 +t 34 33 7 +t 11 35 9 +t 35 34 9 +t 13 36 11 +t 36 35 11 +t 15 37 13 +t 37 36 13 +t 17 38 15 +t 38 37 15 +t 19 39 17 +t 39 38 17 +t 21 40 19 +t 40 39 19 +t 23 41 21 +t 41 40 21 +t 25 42 23 +t 42 41 23 +t 27 43 25 +t 43 42 25 +t 29 44 27 +t 44 43 27 +t 31 46 30 +t 46 45 30 +t 32 47 31 +t 47 46 31 +t 33 48 32 +t 48 47 32 +t 34 49 33 +t 49 48 33 +t 35 50 34 +t 50 49 34 +t 36 51 35 +t 51 50 35 +t 37 52 36 +t 52 51 36 +t 38 53 37 +t 53 52 37 +t 39 54 38 +t 54 53 38 +t 40 55 39 +t 55 54 39 +t 41 56 40 +t 56 55 40 +t 42 57 41 +t 57 56 41 +t 43 58 42 +t 58 57 42 +t 44 59 43 +t 59 58 43 +t 46 61 45 +t 61 60 45 +t 47 62 46 +t 62 61 46 +t 48 63 47 +t 63 62 47 +t 49 64 48 +t 64 63 48 +t 50 65 49 +t 65 64 49 +t 51 66 50 +t 66 65 50 +t 52 67 51 +t 67 66 51 +t 53 68 52 +t 68 67 52 +t 54 69 53 +t 69 68 53 +t 55 70 54 +t 70 69 54 +t 56 71 55 +t 71 70 55 +t 57 72 56 +t 72 71 56 +t 58 73 57 +t 73 72 57 +t 59 74 58 +t 74 73 58 +t 61 76 60 +t 76 75 60 +t 62 77 61 +t 77 76 61 +t 63 78 62 +t 78 77 62 +t 64 79 63 +t 79 78 63 +t 65 80 64 +t 80 79 64 +t 66 81 65 +t 81 80 65 +t 67 82 66 +t 82 81 66 +t 68 83 67 +t 83 82 67 +t 69 84 68 +t 84 83 68 +t 70 85 69 +t 85 84 69 +t 71 86 70 +t 86 85 70 +t 72 87 71 +t 87 86 71 +t 73 88 72 +t 88 87 72 +t 74 89 73 +t 89 88 73 +t 76 91 75 +t 91 90 75 +t 77 92 76 +t 92 91 76 +t 78 93 77 +t 93 92 77 +t 79 94 78 +t 94 93 78 +t 80 95 79 +t 95 94 79 +t 81 96 80 +t 96 95 80 +t 82 97 81 +t 97 96 81 +t 83 98 82 +t 98 97 82 +t 84 99 83 +t 99 98 83 +t 85 100 84 +t 100 99 84 +t 86 101 85 +t 101 100 85 +t 87 102 86 +t 102 101 86 +t 88 103 87 +t 103 102 87 +t 89 104 88 +t 104 103 88 +t 91 106 90 +t 106 105 90 +t 92 107 91 +t 107 106 91 +t 93 108 92 +t 108 107 92 +t 94 109 93 +t 109 108 93 +t 95 110 94 +t 110 109 94 +t 96 111 95 +t 111 110 95 +t 97 112 96 +t 112 111 96 +t 98 113 97 +t 113 112 97 +t 99 114 98 +t 114 113 98 +t 100 115 99 +t 115 114 99 +t 101 116 100 +t 116 115 100 +t 102 117 101 +t 117 116 101 +t 103 118 102 +t 118 117 102 +t 104 119 103 +t 119 118 103 +t 106 121 105 +t 121 120 105 +t 107 122 106 +t 122 121 106 +t 108 123 107 +t 123 122 107 +t 109 124 108 +t 124 123 108 +t 110 125 109 +t 125 124 109 +t 111 126 110 +t 126 125 110 +t 112 127 111 +t 127 126 111 +t 113 128 112 +t 128 127 112 +t 114 129 113 +t 129 128 113 +t 115 130 114 +t 130 129 114 +t 116 131 115 +t 131 130 115 +t 117 132 116 +t 132 131 116 +t 118 133 117 +t 133 132 117 +t 119 134 118 +t 134 133 118 +t 121 136 120 +t 136 135 120 +t 122 137 121 +t 137 136 121 +t 123 138 122 +t 138 137 122 +t 124 139 123 +t 139 138 123 +t 125 140 124 +t 140 139 124 +t 126 141 125 +t 141 140 125 +t 127 142 126 +t 142 141 126 +t 128 143 127 +t 143 142 127 +t 129 144 128 +t 144 143 128 +t 130 145 129 +t 145 144 129 +t 131 146 130 +t 146 145 130 +t 132 147 131 +t 147 146 131 +t 133 148 132 +t 148 147 132 +t 134 149 133 +t 149 148 133 +t 136 151 135 +t 151 150 135 +t 137 152 136 +t 152 151 136 +t 138 153 137 +t 153 152 137 +t 139 154 138 +t 154 153 138 +t 140 155 139 +t 155 154 139 +t 141 156 140 +t 156 155 140 +t 142 157 141 +t 157 156 141 +t 143 158 142 +t 158 157 142 +t 144 159 143 +t 159 158 143 +t 145 160 144 +t 160 159 144 +t 146 161 145 +t 161 160 145 +t 147 162 146 +t 162 161 146 +t 148 163 147 +t 163 162 147 +t 149 164 148 +t 164 163 148 +t 151 166 150 +t 166 165 150 +t 152 167 151 +t 167 166 151 +t 153 168 152 +t 168 167 152 +t 154 169 153 +t 169 168 153 +t 155 170 154 +t 170 169 154 +t 156 171 155 +t 171 170 155 +t 157 172 156 +t 172 171 156 +t 158 173 157 +t 173 172 157 +t 159 174 158 +t 174 173 158 +t 160 175 159 +t 175 174 159 +t 161 176 160 +t 176 175 160 +t 162 177 161 +t 177 176 161 +t 163 178 162 +t 178 177 162 +t 164 179 163 +t 179 178 163 +t 166 181 165 +t 181 180 165 +t 167 182 166 +t 182 181 166 +t 168 183 167 +t 183 182 167 +t 169 184 168 +t 184 183 168 +t 170 185 169 +t 185 184 169 +t 171 186 170 +t 186 185 170 +t 172 187 171 +t 187 186 171 +t 173 188 172 +t 188 187 172 +t 174 189 173 +t 189 188 173 +t 175 190 174 +t 190 189 174 +t 176 191 175 +t 191 190 175 +t 177 192 176 +t 192 191 176 +t 178 193 177 +t 193 192 177 +t 179 194 178 +t 194 193 178 +t 181 196 180 +t 196 195 180 +t 182 197 181 +t 197 196 181 +t 183 198 182 +t 198 197 182 +t 184 199 183 +t 199 198 183 +t 185 200 184 +t 200 199 184 +t 186 201 185 +t 201 200 185 +t 187 202 186 +t 202 201 186 +t 188 203 187 +t 203 202 187 +t 189 204 188 +t 204 203 188 +t 190 205 189 +t 205 204 189 +t 191 206 190 +t 206 205 190 +t 192 207 191 +t 207 206 191 +t 193 208 192 +t 208 207 192 +t 194 209 193 +t 209 208 193 +t 196 211 195 +t 211 210 195 +t 197 212 196 +t 212 211 196 +t 198 213 197 +t 213 212 197 +t 199 214 198 +t 214 213 198 +t 200 215 199 +t 215 214 199 +t 201 216 200 +t 216 215 200 +t 202 217 201 +t 217 216 201 +t 203 218 202 +t 218 217 202 +t 204 219 203 +t 219 218 203 +t 205 220 204 +t 220 219 204 +t 206 221 205 +t 221 220 205 +t 207 222 206 +t 222 221 206 +t 208 223 207 +t 223 222 207 +t 209 224 208 +t 224 223 208 +t 211 226 210 +t 226 225 210 +t 212 227 211 +t 227 226 211 +t 213 228 212 +t 228 227 212 +t 214 229 213 +t 229 228 213 +t 215 230 214 +t 230 229 214 +t 216 231 215 +t 231 230 215 +t 217 232 216 +t 232 231 216 +t 218 233 217 +t 233 232 217 +t 219 234 218 +t 234 233 218 +t 220 235 219 +t 235 234 219 +t 221 236 220 +t 236 235 220 +t 222 237 221 +t 237 236 221 +t 223 238 222 +t 238 237 222 +t 224 239 223 +t 239 238 223 +t 226 241 225 +t 241 240 225 +t 227 242 226 +t 242 241 226 +t 228 243 227 +t 243 242 227 +t 229 244 228 +t 244 243 228 +t 230 245 229 +t 245 244 229 +t 231 246 230 +t 246 245 230 +t 232 247 231 +t 247 246 231 +t 233 248 232 +t 248 247 232 +t 234 249 233 +t 249 248 233 +t 235 250 234 +t 250 249 234 +t 236 251 235 +t 251 250 235 +t 237 252 236 +t 252 251 236 +t 238 253 237 +t 253 252 237 +t 239 254 238 +t 254 253 238 +t 241 256 240 +t 256 255 240 +t 242 257 241 +t 257 256 241 +t 243 258 242 +t 258 257 242 +t 244 259 243 +t 259 258 243 +t 245 260 244 +t 260 259 244 +t 246 261 245 +t 261 260 245 +t 247 262 246 +t 262 261 246 +t 248 263 247 +t 263 262 247 +t 249 264 248 +t 264 263 248 +t 250 265 249 +t 265 264 249 +t 251 266 250 +t 266 265 250 +t 252 267 251 +t 267 266 251 +t 253 268 252 +t 268 267 252 +t 254 269 253 +t 269 268 253 +t 256 271 255 +t 271 270 255 +t 257 272 256 +t 272 271 256 +t 258 273 257 +t 273 272 257 +t 259 274 258 +t 274 273 258 +t 260 275 259 +t 275 274 259 +t 261 276 260 +t 276 275 260 +t 262 277 261 +t 277 276 261 +t 263 278 262 +t 278 277 262 +t 264 279 263 +t 279 278 263 +t 265 280 264 +t 280 279 264 +t 266 281 265 +t 281 280 265 +t 267 282 266 +t 282 281 266 +t 268 283 267 +t 283 282 267 +t 269 284 268 +t 284 283 268 +t 271 286 270 +t 286 285 270 +t 272 287 271 +t 287 286 271 +t 273 288 272 +t 288 287 272 +t 274 289 273 +t 289 288 273 +t 275 290 274 +t 290 289 274 +t 276 291 275 +t 291 290 275 +t 277 292 276 +t 292 291 276 +t 278 293 277 +t 293 292 277 +t 279 294 278 +t 294 293 278 +t 280 295 279 +t 295 294 279 +t 281 296 280 +t 296 295 280 +t 282 297 281 +t 297 296 281 +t 283 298 282 +t 298 297 282 +t 284 299 283 +t 299 298 283 +t 286 301 285 +t 301 300 285 +t 287 302 286 +t 302 301 286 +t 288 303 287 +t 303 302 287 +t 289 304 288 +t 304 303 288 +t 290 305 289 +t 305 304 289 +t 291 306 290 +t 306 305 290 +t 292 307 291 +t 307 306 291 +t 293 308 292 +t 308 307 292 +t 294 309 293 +t 309 308 293 +t 295 310 294 +t 310 309 294 +t 296 311 295 +t 311 310 295 +t 297 312 296 +t 312 311 296 +t 298 313 297 +t 313 312 297 +t 299 314 298 +t 314 313 298 +t 301 316 300 +t 316 315 300 +t 302 317 301 +t 317 316 301 +t 303 318 302 +t 318 317 302 +t 304 319 303 +t 319 318 303 +t 305 320 304 +t 320 319 304 +t 306 321 305 +t 321 320 305 +t 307 322 306 +t 322 321 306 +t 308 323 307 +t 323 322 307 +t 309 324 308 +t 324 323 308 +t 310 325 309 +t 325 324 309 +t 311 326 310 +t 326 325 310 +t 312 327 311 +t 327 326 311 +t 313 328 312 +t 328 327 312 +t 314 329 313 +t 329 328 313 +t 316 331 315 +t 331 330 315 +t 317 332 316 +t 332 331 316 +t 318 333 317 +t 333 332 317 +t 319 334 318 +t 334 333 318 +t 320 335 319 +t 335 334 319 +t 321 336 320 +t 336 335 320 +t 322 337 321 +t 337 336 321 +t 323 338 322 +t 338 337 322 +t 324 339 323 +t 339 338 323 +t 325 340 324 +t 340 339 324 +t 326 341 325 +t 341 340 325 +t 327 342 326 +t 342 341 326 +t 328 343 327 +t 343 342 327 +t 329 344 328 +t 344 343 328 +t 331 346 330 +t 346 345 330 +t 332 347 331 +t 347 346 331 +t 333 348 332 +t 348 347 332 +t 334 349 333 +t 349 348 333 +t 335 350 334 +t 350 349 334 +t 336 351 335 +t 351 350 335 +t 337 352 336 +t 352 351 336 +t 338 353 337 +t 353 352 337 +t 339 354 338 +t 354 353 338 +t 340 355 339 +t 355 354 339 +t 341 356 340 +t 356 355 340 +t 342 357 341 +t 357 356 341 +t 343 358 342 +t 358 357 342 +t 344 359 343 +t 359 358 343 +t 346 361 345 +t 361 360 345 +t 347 362 346 +t 362 361 346 +t 348 363 347 +t 363 362 347 +t 349 364 348 +t 364 363 348 +t 350 365 349 +t 365 364 349 +t 351 366 350 +t 366 365 350 +t 352 367 351 +t 367 366 351 +t 353 368 352 +t 368 367 352 +t 354 369 353 +t 369 368 353 +t 355 370 354 +t 370 369 354 +t 356 371 355 +t 371 370 355 +t 357 372 356 +t 372 371 356 +t 358 373 357 +t 373 372 357 +t 359 374 358 +t 374 373 358 +t 361 376 360 +t 376 375 360 +t 362 377 361 +t 377 376 361 +t 363 378 362 +t 378 377 362 +t 364 379 363 +t 379 378 363 +t 365 380 364 +t 380 379 364 +t 366 381 365 +t 381 380 365 +t 367 382 366 +t 382 381 366 +t 368 383 367 +t 383 382 367 +t 369 384 368 +t 384 383 368 +t 370 385 369 +t 385 384 369 +t 371 386 370 +t 386 385 370 +t 372 387 371 +t 387 386 371 +t 373 388 372 +t 388 387 372 +t 374 389 373 +t 389 388 373 +t 376 391 375 +t 391 390 375 +t 377 392 376 +t 392 391 376 +t 378 393 377 +t 393 392 377 +t 379 394 378 +t 394 393 378 +t 380 395 379 +t 395 394 379 +t 381 396 380 +t 396 395 380 +t 382 397 381 +t 397 396 381 +t 383 398 382 +t 398 397 382 +t 384 399 383 +t 399 398 383 +t 385 400 384 +t 400 399 384 +t 386 401 385 +t 401 400 385 +t 387 402 386 +t 402 401 386 +t 388 403 387 +t 403 402 387 +t 389 404 388 +t 404 403 388 +t 391 406 390 +t 406 405 390 +t 392 407 391 +t 407 406 391 +t 393 408 392 +t 408 407 392 +t 394 409 393 +t 409 408 393 +t 395 410 394 +t 410 409 394 +t 396 411 395 +t 411 410 395 +t 397 412 396 +t 412 411 396 +t 398 413 397 +t 413 412 397 +t 399 414 398 +t 414 413 398 +t 400 415 399 +t 415 414 399 +t 401 416 400 +t 416 415 400 +t 402 417 401 +t 417 416 401 +t 403 418 402 +t 418 417 402 +t 404 419 403 +t 419 418 403 +t 406 421 405 +t 421 420 405 +t 407 422 406 +t 422 421 406 +t 408 423 407 +t 423 422 407 +t 409 424 408 +t 424 423 408 +t 410 425 409 +t 425 424 409 +t 411 426 410 +t 426 425 410 +t 412 427 411 +t 427 426 411 +t 413 428 412 +t 428 427 412 +t 414 429 413 +t 429 428 413 +t 415 430 414 +t 430 429 414 +t 416 431 415 +t 431 430 415 +t 417 432 416 +t 432 431 416 +t 418 433 417 +t 433 432 417 +t 419 434 418 +t 434 433 418 +t 421 436 420 +t 436 435 420 +t 422 437 421 +t 437 436 421 +t 423 438 422 +t 438 437 422 +t 424 439 423 +t 439 438 423 +t 425 440 424 +t 440 439 424 +t 426 441 425 +t 441 440 425 +t 427 442 426 +t 442 441 426 +t 428 443 427 +t 443 442 427 +t 429 444 428 +t 444 443 428 +t 430 445 429 +t 445 444 429 +t 431 446 430 +t 446 445 430 +t 432 447 431 +t 447 446 431 +t 433 448 432 +t 448 447 432 +t 434 449 433 +t 449 448 433 +t 436 451 435 +t 451 450 435 +t 437 452 436 +t 452 451 436 +t 438 453 437 +t 453 452 437 +t 439 454 438 +t 454 453 438 +t 440 455 439 +t 455 454 439 +t 441 456 440 +t 456 455 440 +t 442 457 441 +t 457 456 441 +t 443 458 442 +t 458 457 442 +t 444 459 443 +t 459 458 443 +t 445 460 444 +t 460 459 444 +t 446 461 445 +t 461 460 445 +t 447 462 446 +t 462 461 446 +t 448 463 447 +t 463 462 447 +t 449 464 448 +t 464 463 448 +t 451 466 450 +t 466 465 450 +t 452 467 451 +t 467 466 451 +t 453 468 452 +t 468 467 452 +t 454 469 453 +t 469 468 453 +t 455 470 454 +t 470 469 454 +t 456 471 455 +t 471 470 455 +t 457 472 456 +t 472 471 456 +t 458 473 457 +t 473 472 457 +t 459 474 458 +t 474 473 458 +t 460 475 459 +t 475 474 459 +t 461 476 460 +t 476 475 460 +t 462 477 461 +t 477 476 461 +t 463 478 462 +t 478 477 462 +t 464 479 463 +t 479 478 463 +t 466 481 465 +t 481 480 465 +t 467 482 466 +t 482 481 466 +t 468 483 467 +t 483 482 467 +t 469 484 468 +t 484 483 468 +t 470 485 469 +t 485 484 469 +t 471 486 470 +t 486 485 470 +t 472 487 471 +t 487 486 471 +t 473 488 472 +t 488 487 472 +t 474 489 473 +t 489 488 473 +t 475 490 474 +t 490 489 474 +t 476 491 475 +t 491 490 475 +t 477 492 476 +t 492 491 476 +t 478 493 477 +t 493 492 477 +t 479 494 478 +t 494 493 478 +t 481 496 480 +t 496 495 480 +t 482 497 481 +t 497 496 481 +t 483 498 482 +t 498 497 482 +t 484 499 483 +t 499 498 483 +t 485 500 484 +t 500 499 484 +t 486 501 485 +t 501 500 485 +t 487 502 486 +t 502 501 486 +t 488 503 487 +t 503 502 487 +t 489 504 488 +t 504 503 488 +t 490 505 489 +t 505 504 489 +t 491 506 490 +t 506 505 490 +t 492 507 491 +t 507 506 491 +t 493 508 492 +t 508 507 492 +t 494 509 493 +t 509 508 493 +t 496 511 495 +t 511 510 495 +t 497 512 496 +t 512 511 496 +t 498 513 497 +t 513 512 497 +t 499 514 498 +t 514 513 498 +t 500 515 499 +t 515 514 499 +t 501 516 500 +t 516 515 500 +t 502 517 501 +t 517 516 501 +t 503 518 502 +t 518 517 502 +t 504 519 503 +t 519 518 503 +t 505 520 504 +t 520 519 504 +t 506 521 505 +t 521 520 505 +t 507 522 506 +t 522 521 506 +t 508 523 507 +t 523 522 507 +t 509 524 508 +t 524 523 508 +t 511 526 510 +t 526 525 510 +t 512 527 511 +t 527 526 511 +t 513 528 512 +t 528 527 512 +t 514 529 513 +t 529 528 513 +t 515 530 514 +t 530 529 514 +t 516 531 515 +t 531 530 515 +t 517 532 516 +t 532 531 516 +t 518 533 517 +t 533 532 517 +t 519 534 518 +t 534 533 518 +t 520 535 519 +t 535 534 519 +t 521 536 520 +t 536 535 520 +t 522 537 521 +t 537 536 521 +t 523 538 522 +t 538 537 522 +t 524 539 523 +t 539 538 523 +t 526 541 525 +t 541 540 525 +t 527 542 526 +t 542 541 526 +t 528 543 527 +t 543 542 527 +t 529 544 528 +t 544 543 528 +t 530 545 529 +t 545 544 529 +t 531 546 530 +t 546 545 530 +t 532 547 531 +t 547 546 531 +t 533 548 532 +t 548 547 532 +t 534 549 533 +t 549 548 533 +t 535 550 534 +t 550 549 534 +t 536 551 535 +t 551 550 535 +t 537 552 536 +t 552 551 536 +t 538 553 537 +t 553 552 537 +t 539 554 538 +t 554 553 538 +t 541 556 540 +t 556 555 540 +t 542 557 541 +t 557 556 541 +t 543 558 542 +t 558 557 542 +t 544 559 543 +t 559 558 543 +t 545 560 544 +t 560 559 544 +t 546 561 545 +t 561 560 545 +t 547 562 546 +t 562 561 546 +t 548 563 547 +t 563 562 547 +t 549 564 548 +t 564 563 548 +t 550 565 549 +t 565 564 549 +t 551 566 550 +t 566 565 550 +t 552 567 551 +t 567 566 551 +t 553 568 552 +t 568 567 552 +t 554 569 553 +t 569 568 553 +t 556 571 555 +t 571 570 555 +t 557 572 556 +t 572 571 556 +t 558 573 557 +t 573 572 557 +t 559 574 558 +t 574 573 558 +t 560 575 559 +t 575 574 559 +t 561 576 560 +t 576 575 560 +t 562 577 561 +t 577 576 561 +t 563 578 562 +t 578 577 562 +t 564 579 563 +t 579 578 563 +t 565 580 564 +t 580 579 564 +t 566 581 565 +t 581 580 565 +t 567 582 566 +t 582 581 566 +t 568 583 567 +t 583 582 567 +t 569 584 568 +t 584 583 568 +t 571 586 570 +t 586 585 570 +t 572 587 571 +t 587 586 571 +t 573 588 572 +t 588 587 572 +t 574 589 573 +t 589 588 573 +t 575 590 574 +t 590 589 574 +t 576 591 575 +t 591 590 575 +t 577 592 576 +t 592 591 576 +t 578 593 577 +t 593 592 577 +t 579 594 578 +t 594 593 578 +t 580 595 579 +t 595 594 579 +t 581 596 580 +t 596 595 580 +t 582 597 581 +t 597 596 581 +t 583 598 582 +t 598 597 582 +t 584 599 583 +t 599 598 583 +t 586 601 585 +t 601 600 585 +t 587 602 586 +t 602 601 586 +t 588 603 587 +t 603 602 587 +t 589 604 588 +t 604 603 588 +t 590 605 589 +t 605 604 589 +t 591 606 590 +t 606 605 590 +t 592 607 591 +t 607 606 591 +t 593 608 592 +t 608 607 592 +t 594 609 593 +t 609 608 593 +t 595 610 594 +t 610 609 594 +t 596 611 595 +t 611 610 595 +t 597 612 596 +t 612 611 596 +t 598 613 597 +t 613 612 597 +t 599 614 598 +t 614 613 598 +t 601 616 600 +t 616 615 600 +t 602 617 601 +t 617 616 601 +t 603 618 602 +t 618 617 602 +t 604 619 603 +t 619 618 603 +t 605 620 604 +t 620 619 604 +t 606 621 605 +t 621 620 605 +t 607 622 606 +t 622 621 606 +t 608 623 607 +t 623 622 607 +t 609 624 608 +t 624 623 608 +t 610 625 609 +t 625 624 609 +t 611 626 610 +t 626 625 610 +t 612 627 611 +t 627 626 611 +t 613 628 612 +t 628 627 612 +t 614 629 613 +t 629 628 613 +t 616 631 615 +t 631 630 615 +t 617 632 616 +t 632 631 616 +t 618 633 617 +t 633 632 617 +t 619 634 618 +t 634 633 618 +t 620 635 619 +t 635 634 619 +t 621 636 620 +t 636 635 620 +t 622 637 621 +t 637 636 621 +t 623 638 622 +t 638 637 622 +t 624 639 623 +t 639 638 623 +t 625 640 624 +t 640 639 624 +t 626 641 625 +t 641 640 625 +t 627 642 626 +t 642 641 626 +t 628 643 627 +t 643 642 627 +t 629 644 628 +t 644 643 628 +t 631 646 630 +t 646 645 630 +t 632 647 631 +t 647 646 631 +t 633 648 632 +t 648 647 632 +t 634 649 633 +t 649 648 633 +t 635 650 634 +t 650 649 634 +t 636 651 635 +t 651 650 635 +t 637 652 636 +t 652 651 636 +t 638 653 637 +t 653 652 637 +t 639 654 638 +t 654 653 638 +t 640 655 639 +t 655 654 639 +t 641 656 640 +t 656 655 640 +t 642 657 641 +t 657 656 641 +t 643 658 642 +t 658 657 642 +t 644 659 643 +t 659 658 643 +t 646 661 645 +t 661 660 645 +t 647 662 646 +t 662 661 646 +t 648 663 647 +t 663 662 647 +t 649 664 648 +t 664 663 648 +t 650 665 649 +t 665 664 649 +t 651 666 650 +t 666 665 650 +t 652 667 651 +t 667 666 651 +t 653 668 652 +t 668 667 652 +t 654 669 653 +t 669 668 653 +t 655 670 654 +t 670 669 654 +t 656 671 655 +t 671 670 655 +t 657 672 656 +t 672 671 656 +t 658 673 657 +t 673 672 657 +t 659 674 658 +t 674 673 658 +t 661 676 660 +t 676 675 660 +t 662 677 661 +t 677 676 661 +t 663 678 662 +t 678 677 662 +t 664 679 663 +t 679 678 663 +t 665 680 664 +t 680 679 664 +t 666 681 665 +t 681 680 665 +t 667 682 666 +t 682 681 666 +t 668 683 667 +t 683 682 667 +t 669 684 668 +t 684 683 668 +t 670 685 669 +t 685 684 669 +t 671 686 670 +t 686 685 670 +t 672 687 671 +t 687 686 671 +t 673 688 672 +t 688 687 672 +t 674 689 673 +t 689 688 673 +t 676 691 675 +t 691 690 675 +t 677 692 676 +t 692 691 676 +t 678 693 677 +t 693 692 677 +t 679 694 678 +t 694 693 678 +t 680 695 679 +t 695 694 679 +t 681 696 680 +t 696 695 680 +t 682 697 681 +t 697 696 681 +t 683 698 682 +t 698 697 682 +t 684 699 683 +t 699 698 683 +t 685 700 684 +t 700 699 684 +t 686 701 685 +t 701 700 685 +t 687 702 686 +t 702 701 686 +t 688 703 687 +t 703 702 687 +t 689 704 688 +t 704 703 688 +t 691 706 690 +t 706 705 690 +t 692 707 691 +t 707 706 691 +t 693 708 692 +t 708 707 692 +t 694 709 693 +t 709 708 693 +t 695 710 694 +t 710 709 694 +t 696 711 695 +t 711 710 695 +t 697 712 696 +t 712 711 696 +t 698 713 697 +t 713 712 697 +t 699 714 698 +t 714 713 698 +t 700 715 699 +t 715 714 699 +t 701 716 700 +t 716 715 700 +t 702 717 701 +t 717 716 701 +t 703 718 702 +t 718 717 702 +t 704 719 703 +t 719 718 703 +t 706 721 705 +t 721 720 705 +t 707 722 706 +t 722 721 706 +t 708 723 707 +t 723 722 707 +t 709 724 708 +t 724 723 708 +t 710 725 709 +t 725 724 709 +t 711 726 710 +t 726 725 710 +t 712 727 711 +t 727 726 711 +t 713 728 712 +t 728 727 712 +t 714 729 713 +t 729 728 713 +t 715 730 714 +t 730 729 714 +t 716 731 715 +t 731 730 715 +t 717 732 716 +t 732 731 716 +t 718 733 717 +t 733 732 717 +t 719 734 718 +t 734 733 718 +t 721 736 720 +t 736 735 720 +t 722 737 721 +t 737 736 721 +t 723 738 722 +t 738 737 722 +t 724 739 723 +t 739 738 723 +t 725 740 724 +t 740 739 724 +t 726 741 725 +t 741 740 725 +t 727 742 726 +t 742 741 726 +t 728 743 727 +t 743 742 727 +t 729 744 728 +t 744 743 728 +t 730 745 729 +t 745 744 729 +t 731 746 730 +t 746 745 730 +t 732 747 731 +t 747 746 731 +t 733 748 732 +t 748 747 732 +t 734 749 733 +t 749 748 733 +t 736 751 735 +t 751 750 735 +t 737 752 736 +t 752 751 736 +t 738 753 737 +t 753 752 737 +t 739 754 738 +t 754 753 738 +t 740 755 739 +t 755 754 739 +t 741 756 740 +t 756 755 740 +t 742 757 741 +t 757 756 741 +t 743 758 742 +t 758 757 742 +t 744 759 743 +t 759 758 743 +t 745 760 744 +t 760 759 744 +t 746 761 745 +t 761 760 745 +t 747 762 746 +t 762 761 746 +t 748 763 747 +t 763 762 747 +t 749 764 748 +t 764 763 748 +t 1 0 765 +t 765 0 766 +t 28 767 29 +t 767 768 29 +t 0 30 766 +t 766 30 769 +t 29 768 44 +t 768 770 44 +t 30 45 769 +t 769 45 771 +t 44 770 59 +t 770 772 59 +t 45 60 771 +t 771 60 773 +t 59 772 74 +t 772 774 74 +t 60 75 773 +t 773 75 775 +t 74 774 89 +t 774 776 89 +t 75 90 775 +t 775 90 777 +t 89 776 104 +t 776 778 104 +t 90 105 777 +t 777 105 779 +t 104 778 119 +t 778 780 119 +t 105 120 779 +t 779 120 781 +t 119 780 134 +t 780 782 134 +t 120 135 781 +t 781 135 783 +t 134 782 149 +t 782 784 149 +t 135 150 783 +t 783 150 785 +t 149 784 164 +t 784 786 164 +t 150 165 785 +t 785 165 787 +t 164 786 179 +t 786 788 179 +t 165 180 787 +t 787 180 789 +t 179 788 194 +t 788 790 194 +t 180 195 789 +t 789 195 791 +t 194 790 209 +t 790 792 209 +t 195 210 791 +t 791 210 793 +t 209 792 224 +t 792 794 224 +t 210 225 793 +t 793 225 795 +t 224 794 239 +t 794 796 239 +t 225 240 795 +t 795 240 797 +t 239 796 254 +t 796 798 254 +t 240 255 797 +t 797 255 799 +t 254 798 269 +t 798 800 269 +t 255 270 799 +t 799 270 801 +t 269 800 284 +t 800 802 284 +t 270 285 801 +t 801 285 803 +t 284 802 299 +t 802 804 299 +t 285 300 803 +t 803 300 805 +t 299 804 314 +t 804 806 314 +t 300 315 805 +t 805 315 807 +t 314 806 329 +t 806 808 329 +t 315 330 807 +t 807 330 809 +t 329 808 344 +t 808 810 344 +t 330 345 809 +t 809 345 811 +t 344 810 359 +t 810 812 359 +t 345 360 811 +t 811 360 813 +t 359 812 374 +t 812 814 374 +t 360 375 813 +t 813 375 815 +t 374 814 389 +t 814 816 389 +t 375 390 815 +t 815 390 817 +t 389 816 404 +t 816 818 404 +t 390 405 817 +t 817 405 819 +t 404 818 419 +t 818 820 419 +t 405 420 819 +t 819 420 821 +t 419 820 434 +t 820 822 434 +t 420 435 821 +t 821 435 823 +t 434 822 449 +t 822 824 449 +t 435 450 823 +t 823 450 825 +t 449 824 464 +t 824 826 464 +t 450 465 825 +t 825 465 827 +t 464 826 479 +t 826 828 479 +t 465 480 827 +t 827 480 829 +t 479 828 494 +t 828 830 494 +t 480 495 829 +t 829 495 831 +t 494 830 509 +t 830 832 509 +t 495 510 831 +t 831 510 833 +t 509 832 524 +t 832 834 524 +t 510 525 833 +t 833 525 835 +t 524 834 539 +t 834 836 539 +t 525 540 835 +t 835 540 837 +t 539 836 554 +t 836 838 554 +t 540 555 837 +t 837 555 839 +t 554 838 569 +t 838 840 569 +t 555 570 839 +t 839 570 841 +t 569 840 584 +t 840 842 584 +t 570 585 841 +t 841 585 843 +t 584 842 599 +t 842 844 599 +t 585 600 843 +t 843 600 845 +t 599 844 614 +t 844 846 614 +t 600 615 845 +t 845 615 847 +t 614 846 629 +t 846 848 629 +t 615 630 847 +t 847 630 849 +t 629 848 644 +t 848 850 644 +t 630 645 849 +t 849 645 851 +t 644 850 659 +t 850 852 659 +t 645 660 851 +t 851 660 853 +t 659 852 674 +t 852 854 674 +t 660 675 853 +t 853 675 855 +t 674 854 689 +t 854 856 689 +t 675 690 855 +t 855 690 857 +t 689 856 704 +t 856 858 704 +t 690 705 857 +t 857 705 859 +t 704 858 719 +t 858 860 719 +t 705 720 859 +t 859 720 861 +t 719 860 734 +t 860 862 734 +t 720 735 861 +t 861 735 863 +t 734 862 749 +t 862 864 749 +t 735 750 863 +t 863 750 865 +t 749 864 764 +t 864 866 764 +t 765 766 867 +t 867 766 868 +t 767 869 768 +t 869 870 768 +t 766 769 868 +t 868 769 871 +t 768 870 770 +t 870 872 770 +t 769 771 871 +t 871 771 873 +t 770 872 772 +t 872 874 772 +t 771 773 873 +t 873 773 875 +t 772 874 774 +t 874 876 774 +t 773 775 875 +t 875 775 877 +t 774 876 776 +t 876 878 776 +t 775 777 877 +t 877 777 879 +t 776 878 778 +t 878 880 778 +t 777 779 879 +t 879 779 881 +t 778 880 780 +t 880 882 780 +t 779 781 881 +t 881 781 883 +t 780 882 782 +t 882 884 782 +t 781 783 883 +t 883 783 885 +t 782 884 784 +t 884 886 784 +t 783 785 885 +t 885 785 887 +t 784 886 786 +t 886 888 786 +t 785 787 887 +t 887 787 889 +t 786 888 788 +t 888 890 788 +t 787 789 889 +t 889 789 891 +t 788 890 790 +t 890 892 790 +t 789 791 891 +t 891 791 893 +t 790 892 792 +t 892 894 792 +t 791 793 893 +t 893 793 895 +t 792 894 794 +t 894 896 794 +t 793 795 895 +t 895 795 897 +t 794 896 796 +t 896 898 796 +t 795 797 897 +t 897 797 899 +t 796 898 798 +t 898 900 798 +t 797 799 899 +t 899 799 901 +t 798 900 800 +t 900 902 800 +t 799 801 901 +t 901 801 903 +t 800 902 802 +t 902 904 802 +t 801 803 903 +t 903 803 905 +t 802 904 804 +t 904 906 804 +t 803 805 905 +t 905 805 907 +t 804 906 806 +t 906 908 806 +t 805 807 907 +t 907 807 909 +t 806 908 808 +t 908 910 808 +t 807 809 909 +t 909 809 911 +t 808 910 810 +t 910 912 810 +t 809 811 911 +t 911 811 913 +t 810 912 812 +t 912 914 812 +t 811 813 913 +t 913 813 915 +t 812 914 814 +t 914 916 814 +t 813 815 915 +t 915 815 917 +t 814 916 816 +t 916 918 816 +t 815 817 917 +t 917 817 919 +t 816 918 818 +t 918 920 818 +t 817 819 919 +t 919 819 921 +t 818 920 820 +t 920 922 820 +t 819 821 921 +t 921 821 923 +t 820 922 822 +t 922 924 822 +t 821 823 923 +t 923 823 925 +t 822 924 824 +t 924 926 824 +t 823 825 925 +t 925 825 927 +t 824 926 826 +t 926 928 826 +t 825 827 927 +t 927 827 929 +t 826 928 828 +t 928 930 828 +t 827 829 929 +t 929 829 931 +t 828 930 830 +t 930 932 830 +t 829 831 931 +t 931 831 933 +t 830 932 832 +t 932 934 832 +t 831 833 933 +t 933 833 935 +t 832 934 834 +t 934 936 834 +t 833 835 935 +t 935 835 937 +t 834 936 836 +t 936 938 836 +t 835 837 937 +t 937 837 939 +t 836 938 838 +t 938 940 838 +t 837 839 939 +t 939 839 941 +t 838 940 840 +t 940 942 840 +t 839 841 941 +t 941 841 943 +t 840 942 842 +t 942 944 842 +t 841 843 943 +t 943 843 945 +t 842 944 844 +t 944 946 844 +t 843 845 945 +t 945 845 947 +t 844 946 846 +t 946 948 846 +t 845 847 947 +t 947 847 949 +t 846 948 848 +t 948 950 848 +t 847 849 949 +t 949 849 951 +t 848 950 850 +t 950 952 850 +t 849 851 951 +t 951 851 953 +t 850 952 852 +t 952 954 852 +t 851 853 953 +t 953 853 955 +t 852 954 854 +t 954 956 854 +t 853 855 955 +t 955 855 957 +t 854 956 856 +t 956 958 856 +t 855 857 957 +t 957 857 959 +t 856 958 858 +t 958 960 858 +t 857 859 959 +t 959 859 961 +t 858 960 860 +t 960 962 860 +t 859 861 961 +t 961 861 963 +t 860 962 862 +t 962 964 862 +t 861 863 963 +t 963 863 965 +t 862 964 864 +t 964 966 864 +t 863 865 965 +t 965 865 967 +t 864 966 866 +t 966 968 866 +t 867 868 969 +t 969 868 970 +t 869 971 870 +t 971 972 870 +t 868 871 970 +t 970 871 973 +t 870 972 872 +t 972 974 872 +t 871 873 973 +t 973 873 975 +t 872 974 874 +t 974 976 874 +t 873 875 975 +t 975 875 977 +t 874 976 876 +t 976 978 876 +t 875 877 977 +t 977 877 979 +t 876 978 878 +t 978 980 878 +t 877 879 979 +t 979 879 981 +t 878 980 880 +t 980 982 880 +t 879 881 981 +t 981 881 983 +t 880 982 882 +t 982 984 882 +t 881 883 983 +t 983 883 985 +t 882 984 884 +t 984 986 884 +t 883 885 985 +t 985 885 987 +t 884 986 886 +t 986 988 886 +t 885 887 987 +t 987 887 989 +t 886 988 888 +t 988 990 888 +t 887 889 989 +t 989 889 991 +t 888 990 890 +t 990 992 890 +t 889 891 991 +t 991 891 993 +t 890 992 892 +t 992 994 892 +t 891 893 993 +t 993 893 995 +t 892 994 894 +t 994 996 894 +t 893 895 995 +t 995 895 997 +t 894 996 896 +t 996 998 896 +t 895 897 997 +t 997 897 999 +t 896 998 898 +t 998 1000 898 +t 897 899 999 +t 999 899 1001 +t 898 1000 900 +t 1000 1002 900 +t 899 901 1001 +t 1001 901 1003 +t 900 1002 902 +t 1002 1004 902 +t 901 903 1003 +t 1003 903 1005 +t 902 1004 904 +t 1004 1006 904 +t 903 905 1005 +t 1005 905 1007 +t 904 1006 906 +t 1006 1008 906 +t 905 907 1007 +t 1007 907 1009 +t 906 1008 908 +t 1008 1010 908 +t 907 909 1009 +t 1009 909 1011 +t 908 1010 910 +t 1010 1012 910 +t 909 911 1011 +t 1011 911 1013 +t 910 1012 912 +t 1012 1014 912 +t 911 913 1013 +t 1013 913 1015 +t 912 1014 914 +t 1014 1016 914 +t 913 915 1015 +t 1015 915 1017 +t 914 1016 916 +t 1016 1018 916 +t 915 917 1017 +t 1017 917 1019 +t 916 1018 918 +t 1018 1020 918 +t 917 919 1019 +t 1019 919 1021 +t 918 1020 920 +t 1020 1022 920 +t 919 921 1021 +t 1021 921 1023 +t 920 1022 922 +t 1022 1024 922 +t 921 923 1023 +t 1023 923 1025 +t 922 1024 924 +t 1024 1026 924 +t 923 925 1025 +t 1025 925 1027 +t 924 1026 926 +t 1026 1028 926 +t 925 927 1027 +t 1027 927 1029 +t 926 1028 928 +t 1028 1030 928 +t 927 929 1029 +t 1029 929 1031 +t 928 1030 930 +t 1030 1032 930 +t 929 931 1031 +t 1031 931 1033 +t 930 1032 932 +t 1032 1034 932 +t 931 933 1033 +t 1033 933 1035 +t 932 1034 934 +t 1034 1036 934 +t 933 935 1035 +t 1035 935 1037 +t 934 1036 936 +t 1036 1038 936 +t 935 937 1037 +t 1037 937 1039 +t 936 1038 938 +t 1038 1040 938 +t 937 939 1039 +t 1039 939 1041 +t 938 1040 940 +t 1040 1042 940 +t 939 941 1041 +t 1041 941 1043 +t 940 1042 942 +t 1042 1044 942 +t 941 943 1043 +t 1043 943 1045 +t 942 1044 944 +t 1044 1046 944 +t 943 945 1045 +t 1045 945 1047 +t 944 1046 946 +t 1046 1048 946 +t 945 947 1047 +t 1047 947 1049 +t 946 1048 948 +t 1048 1050 948 +t 947 949 1049 +t 1049 949 1051 +t 948 1050 950 +t 1050 1052 950 +t 949 951 1051 +t 1051 951 1053 +t 950 1052 952 +t 1052 1054 952 +t 951 953 1053 +t 1053 953 1055 +t 952 1054 954 +t 1054 1056 954 +t 953 955 1055 +t 1055 955 1057 +t 954 1056 956 +t 1056 1058 956 +t 955 957 1057 +t 1057 957 1059 +t 956 1058 958 +t 1058 1060 958 +t 957 959 1059 +t 1059 959 1061 +t 958 1060 960 +t 1060 1062 960 +t 959 961 1061 +t 1061 961 1063 +t 960 1062 962 +t 1062 1064 962 +t 961 963 1063 +t 1063 963 1065 +t 962 1064 964 +t 1064 1066 964 +t 963 965 1065 +t 1065 965 1067 +t 964 1066 966 +t 1066 1068 966 +t 965 967 1067 +t 1067 967 1069 +t 966 1068 968 +t 1068 1070 968 +t 969 970 1071 +t 1071 970 1072 +t 971 1073 972 +t 1073 1074 972 +t 970 973 1072 +t 1072 973 1075 +t 972 1074 974 +t 1074 1076 974 +t 973 975 1075 +t 1075 975 1077 +t 974 1076 976 +t 1076 1078 976 +t 975 977 1077 +t 1077 977 1079 +t 976 1078 978 +t 1078 1080 978 +t 977 979 1079 +t 1079 979 1081 +t 978 1080 980 +t 1080 1082 980 +t 979 981 1081 +t 1081 981 1083 +t 980 1082 982 +t 1082 1084 982 +t 981 983 1083 +t 1083 983 1085 +t 982 1084 984 +t 1084 1086 984 +t 983 985 1085 +t 1085 985 1087 +t 984 1086 986 +t 1086 1088 986 +t 985 987 1087 +t 1087 987 1089 +t 986 1088 988 +t 1088 1090 988 +t 987 989 1089 +t 1089 989 1091 +t 988 1090 990 +t 1090 1092 990 +t 989 991 1091 +t 1091 991 1093 +t 990 1092 992 +t 1092 1094 992 +t 991 993 1093 +t 1093 993 1095 +t 992 1094 994 +t 1094 1096 994 +t 993 995 1095 +t 1095 995 1097 +t 994 1096 996 +t 1096 1098 996 +t 995 997 1097 +t 1097 997 1099 +t 996 1098 998 +t 1098 1100 998 +t 997 999 1099 +t 1099 999 1101 +t 998 1100 1000 +t 1100 1102 1000 +t 999 1001 1101 +t 1101 1001 1103 +t 1000 1102 1002 +t 1102 1104 1002 +t 1001 1003 1103 +t 1103 1003 1105 +t 1002 1104 1004 +t 1104 1106 1004 +t 1003 1005 1105 +t 1105 1005 1107 +t 1004 1106 1006 +t 1106 1108 1006 +t 1005 1007 1107 +t 1107 1007 1109 +t 1006 1108 1008 +t 1108 1110 1008 +t 1007 1009 1109 +t 1109 1009 1111 +t 1008 1110 1010 +t 1110 1112 1010 +t 1009 1011 1111 +t 1111 1011 1113 +t 1010 1112 1012 +t 1112 1114 1012 +t 1011 1013 1113 +t 1113 1013 1115 +t 1012 1114 1014 +t 1114 1116 1014 +t 1013 1015 1115 +t 1115 1015 1117 +t 1014 1116 1016 +t 1116 1118 1016 +t 1015 1017 1117 +t 1117 1017 1119 +t 1016 1118 1018 +t 1118 1120 1018 +t 1017 1019 1119 +t 1119 1019 1121 +t 1018 1120 1020 +t 1120 1122 1020 +t 1019 1021 1121 +t 1121 1021 1123 +t 1020 1122 1022 +t 1122 1124 1022 +t 1021 1023 1123 +t 1123 1023 1125 +t 1022 1124 1024 +t 1124 1126 1024 +t 1023 1025 1125 +t 1125 1025 1127 +t 1024 1126 1026 +t 1126 1128 1026 +t 1025 1027 1127 +t 1127 1027 1129 +t 1026 1128 1028 +t 1128 1130 1028 +t 1027 1029 1129 +t 1129 1029 1131 +t 1028 1130 1030 +t 1130 1132 1030 +t 1029 1031 1131 +t 1131 1031 1133 +t 1030 1132 1032 +t 1132 1134 1032 +t 1031 1033 1133 +t 1133 1033 1135 +t 1032 1134 1034 +t 1134 1136 1034 +t 1033 1035 1135 +t 1135 1035 1137 +t 1034 1136 1036 +t 1136 1138 1036 +t 1035 1037 1137 +t 1137 1037 1139 +t 1036 1138 1038 +t 1138 1140 1038 +t 1037 1039 1139 +t 1139 1039 1141 +t 1038 1140 1040 +t 1140 1142 1040 +t 1039 1041 1141 +t 1141 1041 1143 +t 1040 1142 1042 +t 1142 1144 1042 +t 1041 1043 1143 +t 1143 1043 1145 +t 1042 1144 1044 +t 1144 1146 1044 +t 1043 1045 1145 +t 1145 1045 1147 +t 1044 1146 1046 +t 1146 1148 1046 +t 1045 1047 1147 +t 1147 1047 1149 +t 1046 1148 1048 +t 1148 1150 1048 +t 1047 1049 1149 +t 1149 1049 1151 +t 1048 1150 1050 +t 1150 1152 1050 +t 1049 1051 1151 +t 1151 1051 1153 +t 1050 1152 1052 +t 1152 1154 1052 +t 1051 1053 1153 +t 1153 1053 1155 +t 1052 1154 1054 +t 1154 1156 1054 +t 1053 1055 1155 +t 1155 1055 1157 +t 1054 1156 1056 +t 1156 1158 1056 +t 1055 1057 1157 +t 1157 1057 1159 +t 1056 1158 1058 +t 1158 1160 1058 +t 1057 1059 1159 +t 1159 1059 1161 +t 1058 1160 1060 +t 1160 1162 1060 +t 1059 1061 1161 +t 1161 1061 1163 +t 1060 1162 1062 +t 1162 1164 1062 +t 1061 1063 1163 +t 1163 1063 1165 +t 1062 1164 1064 +t 1164 1166 1064 +t 1063 1065 1165 +t 1165 1065 1167 +t 1064 1166 1066 +t 1166 1168 1066 +t 1065 1067 1167 +t 1167 1067 1169 +t 1066 1168 1068 +t 1168 1170 1068 +t 1067 1069 1169 +t 1169 1069 1171 +t 1068 1170 1070 +t 1170 1172 1070 +t 1071 1072 1173 +t 1173 1072 1174 +t 1073 1175 1074 +t 1175 1176 1074 +t 1072 1075 1174 +t 1174 1075 1177 +t 1074 1176 1076 +t 1176 1178 1076 +t 1075 1077 1177 +t 1177 1077 1179 +t 1076 1178 1078 +t 1178 1180 1078 +t 1077 1079 1179 +t 1179 1079 1181 +t 1078 1180 1080 +t 1180 1182 1080 +t 1079 1081 1181 +t 1181 1081 1183 +t 1080 1182 1082 +t 1182 1184 1082 +t 1081 1083 1183 +t 1183 1083 1185 +t 1082 1184 1084 +t 1184 1186 1084 +t 1083 1085 1185 +t 1185 1085 1187 +t 1084 1186 1086 +t 1186 1188 1086 +t 1085 1087 1187 +t 1187 1087 1189 +t 1086 1188 1088 +t 1188 1190 1088 +t 1087 1089 1189 +t 1189 1089 1191 +t 1088 1190 1090 +t 1190 1192 1090 +t 1089 1091 1191 +t 1191 1091 1193 +t 1090 1192 1092 +t 1192 1194 1092 +t 1091 1093 1193 +t 1193 1093 1195 +t 1092 1194 1094 +t 1194 1196 1094 +t 1093 1095 1195 +t 1195 1095 1197 +t 1094 1196 1096 +t 1196 1198 1096 +t 1095 1097 1197 +t 1197 1097 1199 +t 1096 1198 1098 +t 1198 1200 1098 +t 1097 1099 1199 +t 1199 1099 1201 +t 1098 1200 1100 +t 1200 1202 1100 +t 1099 1101 1201 +t 1201 1101 1203 +t 1100 1202 1102 +t 1202 1204 1102 +t 1101 1103 1203 +t 1203 1103 1205 +t 1102 1204 1104 +t 1204 1206 1104 +t 1103 1105 1205 +t 1205 1105 1207 +t 1104 1206 1106 +t 1206 1208 1106 +t 1105 1107 1207 +t 1207 1107 1209 +t 1106 1208 1108 +t 1208 1210 1108 +t 1107 1109 1209 +t 1209 1109 1211 +t 1108 1210 1110 +t 1210 1212 1110 +t 1109 1111 1211 +t 1211 1111 1213 +t 1110 1212 1112 +t 1212 1214 1112 +t 1111 1113 1213 +t 1213 1113 1215 +t 1112 1214 1114 +t 1214 1216 1114 +t 1113 1115 1215 +t 1215 1115 1217 +t 1114 1216 1116 +t 1216 1218 1116 +t 1115 1117 1217 +t 1217 1117 1219 +t 1116 1218 1118 +t 1218 1220 1118 +t 1117 1119 1219 +t 1219 1119 1221 +t 1118 1220 1120 +t 1220 1222 1120 +t 1119 1121 1221 +t 1221 1121 1223 +t 1120 1222 1122 +t 1222 1224 1122 +t 1121 1123 1223 +t 1223 1123 1225 +t 1122 1224 1124 +t 1224 1226 1124 +t 1123 1125 1225 +t 1225 1125 1227 +t 1124 1226 1126 +t 1226 1228 1126 +t 1125 1127 1227 +t 1227 1127 1229 +t 1126 1228 1128 +t 1228 1230 1128 +t 1127 1129 1229 +t 1229 1129 1231 +t 1128 1230 1130 +t 1230 1232 1130 +t 1129 1131 1231 +t 1231 1131 1233 +t 1130 1232 1132 +t 1232 1234 1132 +t 1131 1133 1233 +t 1233 1133 1235 +t 1132 1234 1134 +t 1234 1236 1134 +t 1133 1135 1235 +t 1235 1135 1237 +t 1134 1236 1136 +t 1236 1238 1136 +t 1135 1137 1237 +t 1237 1137 1239 +t 1136 1238 1138 +t 1238 1240 1138 +t 1137 1139 1239 +t 1239 1139 1241 +t 1138 1240 1140 +t 1240 1242 1140 +t 1139 1141 1241 +t 1241 1141 1243 +t 1140 1242 1142 +t 1242 1244 1142 +t 1141 1143 1243 +t 1243 1143 1245 +t 1142 1244 1144 +t 1244 1246 1144 +t 1143 1145 1245 +t 1245 1145 1247 +t 1144 1246 1146 +t 1246 1248 1146 +t 1145 1147 1247 +t 1247 1147 1249 +t 1146 1248 1148 +t 1248 1250 1148 +t 1147 1149 1249 +t 1249 1149 1251 +t 1148 1250 1150 +t 1250 1252 1150 +t 1149 1151 1251 +t 1251 1151 1253 +t 1150 1252 1152 +t 1252 1254 1152 +t 1151 1153 1253 +t 1253 1153 1255 +t 1152 1254 1154 +t 1254 1256 1154 +t 1153 1155 1255 +t 1255 1155 1257 +t 1154 1256 1156 +t 1256 1258 1156 +t 1155 1157 1257 +t 1257 1157 1259 +t 1156 1258 1158 +t 1258 1260 1158 +t 1157 1159 1259 +t 1259 1159 1261 +t 1158 1260 1160 +t 1260 1262 1160 +t 1159 1161 1261 +t 1261 1161 1263 +t 1160 1262 1162 +t 1262 1264 1162 +t 1161 1163 1263 +t 1263 1163 1265 +t 1162 1264 1164 +t 1264 1266 1164 +t 1163 1165 1265 +t 1265 1165 1267 +t 1164 1266 1166 +t 1266 1268 1166 +t 1165 1167 1267 +t 1267 1167 1269 +t 1166 1268 1168 +t 1268 1270 1168 +t 1167 1169 1269 +t 1269 1169 1271 +t 1168 1270 1170 +t 1270 1272 1170 +t 1169 1171 1271 +t 1271 1171 1273 +t 1170 1272 1172 +t 1272 1274 1172 +t 1173 1174 1275 +t 1275 1174 1276 +t 1175 1277 1176 +t 1277 1278 1176 +t 1174 1177 1276 +t 1276 1177 1279 +t 1176 1278 1178 +t 1278 1280 1178 +t 1177 1179 1279 +t 1279 1179 1281 +t 1178 1280 1180 +t 1280 1282 1180 +t 1179 1181 1281 +t 1281 1181 1283 +t 1180 1282 1182 +t 1282 1284 1182 +t 1181 1183 1283 +t 1283 1183 1285 +t 1182 1284 1184 +t 1284 1286 1184 +t 1183 1185 1285 +t 1285 1185 1287 +t 1184 1286 1186 +t 1286 1288 1186 +t 1185 1187 1287 +t 1287 1187 1289 +t 1186 1288 1188 +t 1288 1290 1188 +t 1187 1189 1289 +t 1289 1189 1291 +t 1188 1290 1190 +t 1290 1292 1190 +t 1189 1191 1291 +t 1291 1191 1293 +t 1190 1292 1192 +t 1292 1294 1192 +t 1191 1193 1293 +t 1293 1193 1295 +t 1192 1294 1194 +t 1294 1296 1194 +t 1193 1195 1295 +t 1295 1195 1297 +t 1194 1296 1196 +t 1296 1298 1196 +t 1195 1197 1297 +t 1297 1197 1299 +t 1196 1298 1198 +t 1298 1300 1198 +t 1197 1199 1299 +t 1299 1199 1301 +t 1198 1300 1200 +t 1300 1302 1200 +t 1199 1201 1301 +t 1301 1201 1303 +t 1200 1302 1202 +t 1302 1304 1202 +t 1201 1203 1303 +t 1303 1203 1305 +t 1202 1304 1204 +t 1304 1306 1204 +t 1203 1205 1305 +t 1305 1205 1307 +t 1204 1306 1206 +t 1306 1308 1206 +t 1205 1207 1307 +t 1307 1207 1309 +t 1206 1308 1208 +t 1308 1310 1208 +t 1207 1209 1309 +t 1309 1209 1311 +t 1208 1310 1210 +t 1310 1312 1210 +t 1209 1211 1311 +t 1311 1211 1313 +t 1210 1312 1212 +t 1312 1314 1212 +t 1211 1213 1313 +t 1313 1213 1315 +t 1212 1314 1214 +t 1314 1316 1214 +t 1213 1215 1315 +t 1315 1215 1317 +t 1214 1316 1216 +t 1316 1318 1216 +t 1215 1217 1317 +t 1317 1217 1319 +t 1216 1318 1218 +t 1318 1320 1218 +t 1217 1219 1319 +t 1319 1219 1321 +t 1218 1320 1220 +t 1320 1322 1220 +t 1219 1221 1321 +t 1321 1221 1323 +t 1220 1322 1222 +t 1322 1324 1222 +t 1221 1223 1323 +t 1323 1223 1325 +t 1222 1324 1224 +t 1324 1326 1224 +t 1223 1225 1325 +t 1325 1225 1327 +t 1224 1326 1226 +t 1326 1328 1226 +t 1225 1227 1327 +t 1327 1227 1329 +t 1226 1328 1228 +t 1328 1330 1228 +t 1227 1229 1329 +t 1329 1229 1331 +t 1228 1330 1230 +t 1330 1332 1230 +t 1229 1231 1331 +t 1331 1231 1333 +t 1230 1332 1232 +t 1332 1334 1232 +t 1231 1233 1333 +t 1333 1233 1335 +t 1232 1334 1234 +t 1334 1336 1234 +t 1233 1235 1335 +t 1335 1235 1337 +t 1234 1336 1236 +t 1336 1338 1236 +t 1235 1237 1337 +t 1337 1237 1339 +t 1236 1338 1238 +t 1338 1340 1238 +t 1237 1239 1339 +t 1339 1239 1341 +t 1238 1340 1240 +t 1340 1342 1240 +t 1239 1241 1341 +t 1341 1241 1343 +t 1240 1342 1242 +t 1342 1344 1242 +t 1241 1243 1343 +t 1343 1243 1345 +t 1242 1344 1244 +t 1344 1346 1244 +t 1243 1245 1345 +t 1345 1245 1347 +t 1244 1346 1246 +t 1346 1348 1246 +t 1245 1247 1347 +t 1347 1247 1349 +t 1246 1348 1248 +t 1348 1350 1248 +t 1247 1249 1349 +t 1349 1249 1351 +t 1248 1350 1250 +t 1350 1352 1250 +t 1249 1251 1351 +t 1351 1251 1353 +t 1250 1352 1252 +t 1352 1354 1252 +t 1251 1253 1353 +t 1353 1253 1355 +t 1252 1354 1254 +t 1354 1356 1254 +t 1253 1255 1355 +t 1355 1255 1357 +t 1254 1356 1256 +t 1356 1358 1256 +t 1255 1257 1357 +t 1357 1257 1359 +t 1256 1358 1258 +t 1358 1360 1258 +t 1257 1259 1359 +t 1359 1259 1361 +t 1258 1360 1260 +t 1360 1362 1260 +t 1259 1261 1361 +t 1361 1261 1363 +t 1260 1362 1262 +t 1362 1364 1262 +t 1261 1263 1363 +t 1363 1263 1365 +t 1262 1364 1264 +t 1364 1366 1264 +t 1263 1265 1365 +t 1365 1265 1367 +t 1264 1366 1266 +t 1366 1368 1266 +t 1265 1267 1367 +t 1367 1267 1369 +t 1266 1368 1268 +t 1368 1370 1268 +t 1267 1269 1369 +t 1369 1269 1371 +t 1268 1370 1270 +t 1370 1372 1270 +t 1269 1271 1371 +t 1371 1271 1373 +t 1270 1372 1272 +t 1372 1374 1272 +t 1271 1273 1373 +t 1373 1273 1375 +t 1272 1374 1274 +t 1374 1376 1274 +t 1275 1276 1377 +t 1377 1276 1378 +t 1277 1379 1278 +t 1379 1380 1278 +t 1276 1279 1378 +t 1378 1279 1381 +t 1278 1380 1280 +t 1380 1382 1280 +t 1279 1281 1381 +t 1381 1281 1383 +t 1280 1382 1282 +t 1382 1384 1282 +t 1281 1283 1383 +t 1383 1283 1385 +t 1282 1384 1284 +t 1384 1386 1284 +t 1283 1285 1385 +t 1385 1285 1387 +t 1284 1386 1286 +t 1386 1388 1286 +t 1285 1287 1387 +t 1387 1287 1389 +t 1286 1388 1288 +t 1388 1390 1288 +t 1287 1289 1389 +t 1389 1289 1391 +t 1288 1390 1290 +t 1390 1392 1290 +t 1289 1291 1391 +t 1391 1291 1393 +t 1290 1392 1292 +t 1392 1394 1292 +t 1291 1293 1393 +t 1393 1293 1395 +t 1292 1394 1294 +t 1394 1396 1294 +t 1293 1295 1395 +t 1395 1295 1397 +t 1294 1396 1296 +t 1396 1398 1296 +t 1295 1297 1397 +t 1397 1297 1399 +t 1296 1398 1298 +t 1398 1400 1298 +t 1297 1299 1399 +t 1399 1299 1401 +t 1298 1400 1300 +t 1400 1402 1300 +t 1299 1301 1401 +t 1401 1301 1403 +t 1300 1402 1302 +t 1402 1404 1302 +t 1301 1303 1403 +t 1403 1303 1405 +t 1302 1404 1304 +t 1404 1406 1304 +t 1303 1305 1405 +t 1405 1305 1407 +t 1304 1406 1306 +t 1406 1408 1306 +t 1305 1307 1407 +t 1407 1307 1409 +t 1306 1408 1308 +t 1408 1410 1308 +t 1307 1309 1409 +t 1409 1309 1411 +t 1308 1410 1310 +t 1410 1412 1310 +t 1309 1311 1411 +t 1411 1311 1413 +t 1310 1412 1312 +t 1412 1414 1312 +t 1311 1313 1413 +t 1413 1313 1415 +t 1312 1414 1314 +t 1414 1416 1314 +t 1313 1315 1415 +t 1415 1315 1417 +t 1314 1416 1316 +t 1416 1418 1316 +t 1315 1317 1417 +t 1417 1317 1419 +t 1316 1418 1318 +t 1418 1420 1318 +t 1317 1319 1419 +t 1419 1319 1421 +t 1318 1420 1320 +t 1420 1422 1320 +t 1319 1321 1421 +t 1421 1321 1423 +t 1320 1422 1322 +t 1422 1424 1322 +t 1321 1323 1423 +t 1423 1323 1425 +t 1322 1424 1324 +t 1424 1426 1324 +t 1323 1325 1425 +t 1425 1325 1427 +t 1324 1426 1326 +t 1426 1428 1326 +t 1325 1327 1427 +t 1427 1327 1429 +t 1326 1428 1328 +t 1428 1430 1328 +t 1327 1329 1429 +t 1429 1329 1431 +t 1328 1430 1330 +t 1430 1432 1330 +t 1329 1331 1431 +t 1431 1331 1433 +t 1330 1432 1332 +t 1432 1434 1332 +t 1331 1333 1433 +t 1433 1333 1435 +t 1332 1434 1334 +t 1434 1436 1334 +t 1333 1335 1435 +t 1435 1335 1437 +t 1334 1436 1336 +t 1436 1438 1336 +t 1335 1337 1437 +t 1437 1337 1439 +t 1336 1438 1338 +t 1438 1440 1338 +t 1337 1339 1439 +t 1439 1339 1441 +t 1338 1440 1340 +t 1440 1442 1340 +t 1339 1341 1441 +t 1441 1341 1443 +t 1340 1442 1342 +t 1442 1444 1342 +t 1341 1343 1443 +t 1443 1343 1445 +t 1342 1444 1344 +t 1444 1446 1344 +t 1343 1345 1445 +t 1445 1345 1447 +t 1344 1446 1346 +t 1446 1448 1346 +t 1345 1347 1447 +t 1447 1347 1449 +t 1346 1448 1348 +t 1448 1450 1348 +t 1347 1349 1449 +t 1449 1349 1451 +t 1348 1450 1350 +t 1450 1452 1350 +t 1349 1351 1451 +t 1451 1351 1453 +t 1350 1452 1352 +t 1452 1454 1352 +t 1351 1353 1453 +t 1453 1353 1455 +t 1352 1454 1354 +t 1454 1456 1354 +t 1353 1355 1455 +t 1455 1355 1457 +t 1354 1456 1356 +t 1456 1458 1356 +t 1355 1357 1457 +t 1457 1357 1459 +t 1356 1458 1358 +t 1458 1460 1358 +t 1357 1359 1459 +t 1459 1359 1461 +t 1358 1460 1360 +t 1460 1462 1360 +t 1359 1361 1461 +t 1461 1361 1463 +t 1360 1462 1362 +t 1462 1464 1362 +t 1361 1363 1463 +t 1463 1363 1465 +t 1362 1464 1364 +t 1464 1466 1364 +t 1363 1365 1465 +t 1465 1365 1467 +t 1364 1466 1366 +t 1466 1468 1366 +t 1365 1367 1467 +t 1467 1367 1469 +t 1366 1468 1368 +t 1468 1470 1368 +t 1367 1369 1469 +t 1469 1369 1471 +t 1368 1470 1370 +t 1470 1472 1370 +t 1369 1371 1471 +t 1471 1371 1473 +t 1370 1472 1372 +t 1472 1474 1372 +t 1371 1373 1473 +t 1473 1373 1475 +t 1372 1474 1374 +t 1474 1476 1374 +t 1373 1375 1475 +t 1475 1375 1477 +t 1374 1476 1376 +t 1476 1478 1376 +t 1377 1378 1479 +t 1479 1378 1480 +t 1379 1481 1380 +t 1481 1482 1380 +t 1378 1381 1480 +t 1480 1381 1483 +t 1380 1482 1382 +t 1482 1484 1382 +t 1381 1383 1483 +t 1483 1383 1485 +t 1382 1484 1384 +t 1484 1486 1384 +t 1383 1385 1485 +t 1485 1385 1487 +t 1384 1486 1386 +t 1486 1488 1386 +t 1385 1387 1487 +t 1487 1387 1489 +t 1386 1488 1388 +t 1488 1490 1388 +t 1387 1389 1489 +t 1489 1389 1491 +t 1388 1490 1390 +t 1490 1492 1390 +t 1389 1391 1491 +t 1491 1391 1493 +t 1390 1492 1392 +t 1492 1494 1392 +t 1391 1393 1493 +t 1493 1393 1495 +t 1392 1494 1394 +t 1494 1496 1394 +t 1393 1395 1495 +t 1495 1395 1497 +t 1394 1496 1396 +t 1496 1498 1396 +t 1395 1397 1497 +t 1497 1397 1499 +t 1396 1498 1398 +t 1498 1500 1398 +t 1397 1399 1499 +t 1499 1399 1501 +t 1398 1500 1400 +t 1500 1502 1400 +t 1399 1401 1501 +t 1501 1401 1503 +t 1400 1502 1402 +t 1502 1504 1402 +t 1401 1403 1503 +t 1503 1403 1505 +t 1402 1504 1404 +t 1504 1506 1404 +t 1403 1405 1505 +t 1505 1405 1507 +t 1404 1506 1406 +t 1506 1508 1406 +t 1405 1407 1507 +t 1507 1407 1509 +t 1406 1508 1408 +t 1508 1510 1408 +t 1407 1409 1509 +t 1509 1409 1511 +t 1408 1510 1410 +t 1510 1512 1410 +t 1409 1411 1511 +t 1511 1411 1513 +t 1410 1512 1412 +t 1512 1514 1412 +t 1411 1413 1513 +t 1513 1413 1515 +t 1412 1514 1414 +t 1514 1516 1414 +t 1413 1415 1515 +t 1515 1415 1517 +t 1414 1516 1416 +t 1516 1518 1416 +t 1415 1417 1517 +t 1517 1417 1519 +t 1416 1518 1418 +t 1518 1520 1418 +t 1417 1419 1519 +t 1519 1419 1521 +t 1418 1520 1420 +t 1520 1522 1420 +t 1419 1421 1521 +t 1521 1421 1523 +t 1420 1522 1422 +t 1522 1524 1422 +t 1421 1423 1523 +t 1523 1423 1525 +t 1422 1524 1424 +t 1524 1526 1424 +t 1423 1425 1525 +t 1525 1425 1527 +t 1424 1526 1426 +t 1526 1528 1426 +t 1425 1427 1527 +t 1527 1427 1529 +t 1426 1528 1428 +t 1528 1530 1428 +t 1427 1429 1529 +t 1529 1429 1531 +t 1428 1530 1430 +t 1530 1532 1430 +t 1429 1431 1531 +t 1531 1431 1533 +t 1430 1532 1432 +t 1532 1534 1432 +t 1431 1433 1533 +t 1533 1433 1535 +t 1432 1534 1434 +t 1534 1536 1434 +t 1433 1435 1535 +t 1535 1435 1537 +t 1434 1536 1436 +t 1536 1538 1436 +t 1435 1437 1537 +t 1537 1437 1539 +t 1436 1538 1438 +t 1538 1540 1438 +t 1437 1439 1539 +t 1539 1439 1541 +t 1438 1540 1440 +t 1540 1542 1440 +t 1439 1441 1541 +t 1541 1441 1543 +t 1440 1542 1442 +t 1542 1544 1442 +t 1441 1443 1543 +t 1543 1443 1545 +t 1442 1544 1444 +t 1544 1546 1444 +t 1443 1445 1545 +t 1545 1445 1547 +t 1444 1546 1446 +t 1546 1548 1446 +t 1445 1447 1547 +t 1547 1447 1549 +t 1446 1548 1448 +t 1548 1550 1448 +t 1447 1449 1549 +t 1549 1449 1551 +t 1448 1550 1450 +t 1550 1552 1450 +t 1449 1451 1551 +t 1551 1451 1553 +t 1450 1552 1452 +t 1552 1554 1452 +t 1451 1453 1553 +t 1553 1453 1555 +t 1452 1554 1454 +t 1554 1556 1454 +t 1453 1455 1555 +t 1555 1455 1557 +t 1454 1556 1456 +t 1556 1558 1456 +t 1455 1457 1557 +t 1557 1457 1559 +t 1456 1558 1458 +t 1558 1560 1458 +t 1457 1459 1559 +t 1559 1459 1561 +t 1458 1560 1460 +t 1560 1562 1460 +t 1459 1461 1561 +t 1561 1461 1563 +t 1460 1562 1462 +t 1562 1564 1462 +t 1461 1463 1563 +t 1563 1463 1565 +t 1462 1564 1464 +t 1564 1566 1464 +t 1463 1465 1565 +t 1565 1465 1567 +t 1464 1566 1466 +t 1566 1568 1466 +t 1465 1467 1567 +t 1567 1467 1569 +t 1466 1568 1468 +t 1568 1570 1468 +t 1467 1469 1569 +t 1569 1469 1571 +t 1468 1570 1470 +t 1570 1572 1470 +t 1469 1471 1571 +t 1571 1471 1573 +t 1470 1572 1472 +t 1572 1574 1472 +t 1471 1473 1573 +t 1573 1473 1575 +t 1472 1574 1474 +t 1574 1576 1474 +t 1473 1475 1575 +t 1575 1475 1577 +t 1474 1576 1476 +t 1576 1578 1476 +t 1475 1477 1577 +t 1577 1477 1579 +t 1476 1578 1478 +t 1578 1580 1478 +t 1479 1480 1581 +t 1581 1480 1582 +t 1481 1583 1482 +t 1583 1584 1482 +t 1480 1483 1582 +t 1582 1483 1585 +t 1482 1584 1484 +t 1584 1586 1484 +t 1483 1485 1585 +t 1585 1485 1587 +t 1484 1586 1486 +t 1586 1588 1486 +t 1485 1487 1587 +t 1587 1487 1589 +t 1486 1588 1488 +t 1588 1590 1488 +t 1487 1489 1589 +t 1589 1489 1591 +t 1488 1590 1490 +t 1590 1592 1490 +t 1489 1491 1591 +t 1591 1491 1593 +t 1490 1592 1492 +t 1592 1594 1492 +t 1491 1493 1593 +t 1593 1493 1595 +t 1492 1594 1494 +t 1594 1596 1494 +t 1493 1495 1595 +t 1595 1495 1597 +t 1494 1596 1496 +t 1596 1598 1496 +t 1495 1497 1597 +t 1597 1497 1599 +t 1496 1598 1498 +t 1598 1600 1498 +t 1497 1499 1599 +t 1599 1499 1601 +t 1498 1600 1500 +t 1600 1602 1500 +t 1499 1501 1601 +t 1601 1501 1603 +t 1500 1602 1502 +t 1602 1604 1502 +t 1501 1503 1603 +t 1603 1503 1605 +t 1502 1604 1504 +t 1604 1606 1504 +t 1503 1505 1605 +t 1605 1505 1607 +t 1504 1606 1506 +t 1606 1608 1506 +t 1505 1507 1607 +t 1607 1507 1609 +t 1506 1608 1508 +t 1608 1610 1508 +t 1507 1509 1609 +t 1609 1509 1611 +t 1508 1610 1510 +t 1610 1612 1510 +t 1509 1511 1611 +t 1611 1511 1613 +t 1510 1612 1512 +t 1612 1614 1512 +t 1511 1513 1613 +t 1613 1513 1615 +t 1512 1614 1514 +t 1614 1616 1514 +t 1513 1515 1615 +t 1615 1515 1617 +t 1514 1616 1516 +t 1616 1618 1516 +t 1515 1517 1617 +t 1617 1517 1619 +t 1516 1618 1518 +t 1618 1620 1518 +t 1517 1519 1619 +t 1619 1519 1621 +t 1518 1620 1520 +t 1620 1622 1520 +t 1519 1521 1621 +t 1621 1521 1623 +t 1520 1622 1522 +t 1622 1624 1522 +t 1521 1523 1623 +t 1623 1523 1625 +t 1522 1624 1524 +t 1624 1626 1524 +t 1523 1525 1625 +t 1625 1525 1627 +t 1524 1626 1526 +t 1626 1628 1526 +t 1525 1527 1627 +t 1627 1527 1629 +t 1526 1628 1528 +t 1628 1630 1528 +t 1527 1529 1629 +t 1629 1529 1631 +t 1528 1630 1530 +t 1630 1632 1530 +t 1529 1531 1631 +t 1631 1531 1633 +t 1530 1632 1532 +t 1632 1634 1532 +t 1531 1533 1633 +t 1633 1533 1635 +t 1532 1634 1534 +t 1634 1636 1534 +t 1533 1535 1635 +t 1635 1535 1637 +t 1534 1636 1536 +t 1636 1638 1536 +t 1535 1537 1637 +t 1637 1537 1639 +t 1536 1638 1538 +t 1638 1640 1538 +t 1537 1539 1639 +t 1639 1539 1641 +t 1538 1640 1540 +t 1640 1642 1540 +t 1539 1541 1641 +t 1641 1541 1643 +t 1540 1642 1542 +t 1642 1644 1542 +t 1541 1543 1643 +t 1643 1543 1645 +t 1542 1644 1544 +t 1644 1646 1544 +t 1543 1545 1645 +t 1645 1545 1647 +t 1544 1646 1546 +t 1646 1648 1546 +t 1545 1547 1647 +t 1647 1547 1649 +t 1546 1648 1548 +t 1648 1650 1548 +t 1547 1549 1649 +t 1649 1549 1651 +t 1548 1650 1550 +t 1650 1652 1550 +t 1549 1551 1651 +t 1651 1551 1653 +t 1550 1652 1552 +t 1652 1654 1552 +t 1551 1553 1653 +t 1653 1553 1655 +t 1552 1654 1554 +t 1654 1656 1554 +t 1553 1555 1655 +t 1655 1555 1657 +t 1554 1656 1556 +t 1656 1658 1556 +t 1555 1557 1657 +t 1657 1557 1659 +t 1556 1658 1558 +t 1658 1660 1558 +t 1557 1559 1659 +t 1659 1559 1661 +t 1558 1660 1560 +t 1660 1662 1560 +t 1559 1561 1661 +t 1661 1561 1663 +t 1560 1662 1562 +t 1662 1664 1562 +t 1561 1563 1663 +t 1663 1563 1665 +t 1562 1664 1564 +t 1664 1666 1564 +t 1563 1565 1665 +t 1665 1565 1667 +t 1564 1666 1566 +t 1666 1668 1566 +t 1565 1567 1667 +t 1667 1567 1669 +t 1566 1668 1568 +t 1668 1670 1568 +t 1567 1569 1669 +t 1669 1569 1671 +t 1568 1670 1570 +t 1670 1672 1570 +t 1569 1571 1671 +t 1671 1571 1673 +t 1570 1672 1572 +t 1672 1674 1572 +t 1571 1573 1673 +t 1673 1573 1675 +t 1572 1674 1574 +t 1674 1676 1574 +t 1573 1575 1675 +t 1675 1575 1677 +t 1574 1676 1576 +t 1676 1678 1576 +t 1575 1577 1677 +t 1677 1577 1679 +t 1576 1678 1578 +t 1678 1680 1578 +t 1577 1579 1679 +t 1679 1579 1681 +t 1578 1680 1580 +t 1680 1682 1580 +t 1581 1582 1683 +t 1683 1582 1684 +t 1583 1685 1584 +t 1685 1686 1584 +t 1582 1585 1684 +t 1684 1585 1687 +t 1584 1686 1586 +t 1686 1688 1586 +t 1585 1587 1687 +t 1687 1587 1689 +t 1586 1688 1588 +t 1688 1690 1588 +t 1587 1589 1689 +t 1689 1589 1691 +t 1588 1690 1590 +t 1690 1692 1590 +t 1589 1591 1691 +t 1691 1591 1693 +t 1590 1692 1592 +t 1692 1694 1592 +t 1591 1593 1693 +t 1693 1593 1695 +t 1592 1694 1594 +t 1694 1696 1594 +t 1593 1595 1695 +t 1695 1595 1697 +t 1594 1696 1596 +t 1696 1698 1596 +t 1595 1597 1697 +t 1697 1597 1699 +t 1596 1698 1598 +t 1698 1700 1598 +t 1597 1599 1699 +t 1699 1599 1701 +t 1598 1700 1600 +t 1700 1702 1600 +t 1599 1601 1701 +t 1701 1601 1703 +t 1600 1702 1602 +t 1702 1704 1602 +t 1601 1603 1703 +t 1703 1603 1705 +t 1602 1704 1604 +t 1704 1706 1604 +t 1603 1605 1705 +t 1705 1605 1707 +t 1604 1706 1606 +t 1706 1708 1606 +t 1605 1607 1707 +t 1707 1607 1709 +t 1606 1708 1608 +t 1708 1710 1608 +t 1607 1609 1709 +t 1709 1609 1711 +t 1608 1710 1610 +t 1710 1712 1610 +t 1609 1611 1711 +t 1711 1611 1713 +t 1610 1712 1612 +t 1712 1714 1612 +t 1611 1613 1713 +t 1713 1613 1715 +t 1612 1714 1614 +t 1714 1716 1614 +t 1613 1615 1715 +t 1715 1615 1717 +t 1614 1716 1616 +t 1716 1718 1616 +t 1615 1617 1717 +t 1717 1617 1719 +t 1616 1718 1618 +t 1718 1720 1618 +t 1617 1619 1719 +t 1719 1619 1721 +t 1618 1720 1620 +t 1720 1722 1620 +t 1619 1621 1721 +t 1721 1621 1723 +t 1620 1722 1622 +t 1722 1724 1622 +t 1621 1623 1723 +t 1723 1623 1725 +t 1622 1724 1624 +t 1724 1726 1624 +t 1623 1625 1725 +t 1725 1625 1727 +t 1624 1726 1626 +t 1726 1728 1626 +t 1625 1627 1727 +t 1727 1627 1729 +t 1626 1728 1628 +t 1728 1730 1628 +t 1627 1629 1729 +t 1729 1629 1731 +t 1628 1730 1630 +t 1730 1732 1630 +t 1629 1631 1731 +t 1731 1631 1733 +t 1630 1732 1632 +t 1732 1734 1632 +t 1631 1633 1733 +t 1733 1633 1735 +t 1632 1734 1634 +t 1734 1736 1634 +t 1633 1635 1735 +t 1735 1635 1737 +t 1634 1736 1636 +t 1736 1738 1636 +t 1635 1637 1737 +t 1737 1637 1739 +t 1636 1738 1638 +t 1738 1740 1638 +t 1637 1639 1739 +t 1739 1639 1741 +t 1638 1740 1640 +t 1740 1742 1640 +t 1639 1641 1741 +t 1741 1641 1743 +t 1640 1742 1642 +t 1742 1744 1642 +t 1641 1643 1743 +t 1743 1643 1745 +t 1642 1744 1644 +t 1744 1746 1644 +t 1643 1645 1745 +t 1745 1645 1747 +t 1644 1746 1646 +t 1746 1748 1646 +t 1645 1647 1747 +t 1747 1647 1749 +t 1646 1748 1648 +t 1748 1750 1648 +t 1647 1649 1749 +t 1749 1649 1751 +t 1648 1750 1650 +t 1750 1752 1650 +t 1649 1651 1751 +t 1751 1651 1753 +t 1650 1752 1652 +t 1752 1754 1652 +t 1651 1653 1753 +t 1753 1653 1755 +t 1652 1754 1654 +t 1754 1756 1654 +t 1653 1655 1755 +t 1755 1655 1757 +t 1654 1756 1656 +t 1756 1758 1656 +t 1655 1657 1757 +t 1757 1657 1759 +t 1656 1758 1658 +t 1758 1760 1658 +t 1657 1659 1759 +t 1759 1659 1761 +t 1658 1760 1660 +t 1760 1762 1660 +t 1659 1661 1761 +t 1761 1661 1763 +t 1660 1762 1662 +t 1762 1764 1662 +t 1661 1663 1763 +t 1763 1663 1765 +t 1662 1764 1664 +t 1764 1766 1664 +t 1663 1665 1765 +t 1765 1665 1767 +t 1664 1766 1666 +t 1766 1768 1666 +t 1665 1667 1767 +t 1767 1667 1769 +t 1666 1768 1668 +t 1768 1770 1668 +t 1667 1669 1769 +t 1769 1669 1771 +t 1668 1770 1670 +t 1770 1772 1670 +t 1669 1671 1771 +t 1771 1671 1773 +t 1670 1772 1672 +t 1772 1774 1672 +t 1671 1673 1773 +t 1773 1673 1775 +t 1672 1774 1674 +t 1774 1776 1674 +t 1673 1675 1775 +t 1775 1675 1777 +t 1674 1776 1676 +t 1776 1778 1676 +t 1675 1677 1777 +t 1777 1677 1779 +t 1676 1778 1678 +t 1778 1780 1678 +t 1677 1679 1779 +t 1779 1679 1781 +t 1678 1780 1680 +t 1780 1782 1680 +t 1679 1681 1781 +t 1781 1681 1783 +t 1680 1782 1682 +t 1782 1784 1682 +t 1683 1684 1785 +t 1785 1684 1786 +t 1685 1787 1686 +t 1787 1788 1686 +t 1684 1687 1786 +t 1786 1687 1789 +t 1686 1788 1688 +t 1788 1790 1688 +t 1687 1689 1789 +t 1789 1689 1791 +t 1688 1790 1690 +t 1790 1792 1690 +t 1689 1691 1791 +t 1791 1691 1793 +t 1690 1792 1692 +t 1792 1794 1692 +t 1691 1693 1793 +t 1793 1693 1795 +t 1692 1794 1694 +t 1794 1796 1694 +t 1693 1695 1795 +t 1795 1695 1797 +t 1694 1796 1696 +t 1796 1798 1696 +t 1695 1697 1797 +t 1797 1697 1799 +t 1696 1798 1698 +t 1798 1800 1698 +t 1697 1699 1799 +t 1799 1699 1801 +t 1698 1800 1700 +t 1800 1802 1700 +t 1699 1701 1801 +t 1801 1701 1803 +t 1700 1802 1702 +t 1802 1804 1702 +t 1701 1703 1803 +t 1803 1703 1805 +t 1702 1804 1704 +t 1804 1806 1704 +t 1703 1705 1805 +t 1805 1705 1807 +t 1704 1806 1706 +t 1806 1808 1706 +t 1705 1707 1807 +t 1807 1707 1809 +t 1706 1808 1708 +t 1808 1810 1708 +t 1707 1709 1809 +t 1809 1709 1811 +t 1708 1810 1710 +t 1810 1812 1710 +t 1709 1711 1811 +t 1811 1711 1813 +t 1710 1812 1712 +t 1812 1814 1712 +t 1711 1713 1813 +t 1813 1713 1815 +t 1712 1814 1714 +t 1814 1816 1714 +t 1713 1715 1815 +t 1815 1715 1817 +t 1714 1816 1716 +t 1816 1818 1716 +t 1715 1717 1817 +t 1817 1717 1819 +t 1716 1818 1718 +t 1818 1820 1718 +t 1717 1719 1819 +t 1819 1719 1821 +t 1718 1820 1720 +t 1820 1822 1720 +t 1719 1721 1821 +t 1821 1721 1823 +t 1720 1822 1722 +t 1822 1824 1722 +t 1721 1723 1823 +t 1823 1723 1825 +t 1722 1824 1724 +t 1824 1826 1724 +t 1723 1725 1825 +t 1825 1725 1827 +t 1724 1826 1726 +t 1826 1828 1726 +t 1725 1727 1827 +t 1827 1727 1829 +t 1726 1828 1728 +t 1828 1830 1728 +t 1727 1729 1829 +t 1829 1729 1831 +t 1728 1830 1730 +t 1830 1832 1730 +t 1729 1731 1831 +t 1831 1731 1833 +t 1730 1832 1732 +t 1832 1834 1732 +t 1731 1733 1833 +t 1833 1733 1835 +t 1732 1834 1734 +t 1834 1836 1734 +t 1733 1735 1835 +t 1835 1735 1837 +t 1734 1836 1736 +t 1836 1838 1736 +t 1735 1737 1837 +t 1837 1737 1839 +t 1736 1838 1738 +t 1838 1840 1738 +t 1737 1739 1839 +t 1839 1739 1841 +t 1738 1840 1740 +t 1840 1842 1740 +t 1739 1741 1841 +t 1841 1741 1843 +t 1740 1842 1742 +t 1842 1844 1742 +t 1741 1743 1843 +t 1843 1743 1845 +t 1742 1844 1744 +t 1844 1846 1744 +t 1743 1745 1845 +t 1845 1745 1847 +t 1744 1846 1746 +t 1846 1848 1746 +t 1745 1747 1847 +t 1847 1747 1849 +t 1746 1848 1748 +t 1848 1850 1748 +t 1747 1749 1849 +t 1849 1749 1851 +t 1748 1850 1750 +t 1850 1852 1750 +t 1749 1751 1851 +t 1851 1751 1853 +t 1750 1852 1752 +t 1852 1854 1752 +t 1751 1753 1853 +t 1853 1753 1855 +t 1752 1854 1754 +t 1854 1856 1754 +t 1753 1755 1855 +t 1855 1755 1857 +t 1754 1856 1756 +t 1856 1858 1756 +t 1755 1757 1857 +t 1857 1757 1859 +t 1756 1858 1758 +t 1858 1860 1758 +t 1757 1759 1859 +t 1859 1759 1861 +t 1758 1860 1760 +t 1860 1862 1760 +t 1759 1761 1861 +t 1861 1761 1863 +t 1760 1862 1762 +t 1862 1864 1762 +t 1761 1763 1863 +t 1863 1763 1865 +t 1762 1864 1764 +t 1864 1866 1764 +t 1763 1765 1865 +t 1865 1765 1867 +t 1764 1866 1766 +t 1866 1868 1766 +t 1765 1767 1867 +t 1867 1767 1869 +t 1766 1868 1768 +t 1868 1870 1768 +t 1767 1769 1869 +t 1869 1769 1871 +t 1768 1870 1770 +t 1870 1872 1770 +t 1769 1771 1871 +t 1871 1771 1873 +t 1770 1872 1772 +t 1872 1874 1772 +t 1771 1773 1873 +t 1873 1773 1875 +t 1772 1874 1774 +t 1874 1876 1774 +t 1773 1775 1875 +t 1875 1775 1877 +t 1774 1876 1776 +t 1876 1878 1776 +t 1775 1777 1877 +t 1877 1777 1879 +t 1776 1878 1778 +t 1878 1880 1778 +t 1777 1779 1879 +t 1879 1779 1881 +t 1778 1880 1780 +t 1880 1882 1780 +t 1779 1781 1881 +t 1881 1781 1883 +t 1780 1882 1782 +t 1882 1884 1782 +t 1781 1783 1883 +t 1883 1783 1885 +t 1782 1884 1784 +t 1884 1886 1784 +t 1785 1786 1887 +t 1887 1786 1888 +t 1787 1889 1788 +t 1889 1890 1788 +t 1786 1789 1888 +t 1888 1789 1891 +t 1788 1890 1790 +t 1890 1892 1790 +t 1789 1791 1891 +t 1891 1791 1893 +t 1790 1892 1792 +t 1892 1894 1792 +t 1791 1793 1893 +t 1893 1793 1895 +t 1792 1894 1794 +t 1894 1896 1794 +t 1793 1795 1895 +t 1895 1795 1897 +t 1794 1896 1796 +t 1896 1898 1796 +t 1795 1797 1897 +t 1897 1797 1899 +t 1796 1898 1798 +t 1898 1900 1798 +t 1797 1799 1899 +t 1899 1799 1901 +t 1798 1900 1800 +t 1900 1902 1800 +t 1799 1801 1901 +t 1901 1801 1903 +t 1800 1902 1802 +t 1902 1904 1802 +t 1801 1803 1903 +t 1903 1803 1905 +t 1802 1904 1804 +t 1904 1906 1804 +t 1803 1805 1905 +t 1905 1805 1907 +t 1804 1906 1806 +t 1906 1908 1806 +t 1805 1807 1907 +t 1907 1807 1909 +t 1806 1908 1808 +t 1908 1910 1808 +t 1807 1809 1909 +t 1909 1809 1911 +t 1808 1910 1810 +t 1910 1912 1810 +t 1809 1811 1911 +t 1911 1811 1913 +t 1810 1912 1812 +t 1912 1914 1812 +t 1811 1813 1913 +t 1913 1813 1915 +t 1812 1914 1814 +t 1914 1916 1814 +t 1813 1815 1915 +t 1915 1815 1917 +t 1814 1916 1816 +t 1916 1918 1816 +t 1815 1817 1917 +t 1917 1817 1919 +t 1816 1918 1818 +t 1918 1920 1818 +t 1817 1819 1919 +t 1919 1819 1921 +t 1818 1920 1820 +t 1920 1922 1820 +t 1819 1821 1921 +t 1921 1821 1923 +t 1820 1922 1822 +t 1922 1924 1822 +t 1821 1823 1923 +t 1923 1823 1925 +t 1822 1924 1824 +t 1924 1926 1824 +t 1823 1825 1925 +t 1925 1825 1927 +t 1824 1926 1826 +t 1926 1928 1826 +t 1825 1827 1927 +t 1927 1827 1929 +t 1826 1928 1828 +t 1928 1930 1828 +t 1827 1829 1929 +t 1929 1829 1931 +t 1828 1930 1830 +t 1930 1932 1830 +t 1829 1831 1931 +t 1931 1831 1933 +t 1830 1932 1832 +t 1932 1934 1832 +t 1831 1833 1933 +t 1933 1833 1935 +t 1832 1934 1834 +t 1934 1936 1834 +t 1833 1835 1935 +t 1935 1835 1937 +t 1834 1936 1836 +t 1936 1938 1836 +t 1835 1837 1937 +t 1937 1837 1939 +t 1836 1938 1838 +t 1938 1940 1838 +t 1837 1839 1939 +t 1939 1839 1941 +t 1838 1940 1840 +t 1940 1942 1840 +t 1839 1841 1941 +t 1941 1841 1943 +t 1840 1942 1842 +t 1942 1944 1842 +t 1841 1843 1943 +t 1943 1843 1945 +t 1842 1944 1844 +t 1944 1946 1844 +t 1843 1845 1945 +t 1945 1845 1947 +t 1844 1946 1846 +t 1946 1948 1846 +t 1845 1847 1947 +t 1947 1847 1949 +t 1846 1948 1848 +t 1948 1950 1848 +t 1847 1849 1949 +t 1949 1849 1951 +t 1848 1950 1850 +t 1950 1952 1850 +t 1849 1851 1951 +t 1951 1851 1953 +t 1850 1952 1852 +t 1952 1954 1852 +t 1851 1853 1953 +t 1953 1853 1955 +t 1852 1954 1854 +t 1954 1956 1854 +t 1853 1855 1955 +t 1955 1855 1957 +t 1854 1956 1856 +t 1956 1958 1856 +t 1855 1857 1957 +t 1957 1857 1959 +t 1856 1958 1858 +t 1958 1960 1858 +t 1857 1859 1959 +t 1959 1859 1961 +t 1858 1960 1860 +t 1960 1962 1860 +t 1859 1861 1961 +t 1961 1861 1963 +t 1860 1962 1862 +t 1962 1964 1862 +t 1861 1863 1963 +t 1963 1863 1965 +t 1862 1964 1864 +t 1964 1966 1864 +t 1863 1865 1965 +t 1965 1865 1967 +t 1864 1966 1866 +t 1966 1968 1866 +t 1865 1867 1967 +t 1967 1867 1969 +t 1866 1968 1868 +t 1968 1970 1868 +t 1867 1869 1969 +t 1969 1869 1971 +t 1868 1970 1870 +t 1970 1972 1870 +t 1869 1871 1971 +t 1971 1871 1973 +t 1870 1972 1872 +t 1972 1974 1872 +t 1871 1873 1973 +t 1973 1873 1975 +t 1872 1974 1874 +t 1974 1976 1874 +t 1873 1875 1975 +t 1975 1875 1977 +t 1874 1976 1876 +t 1976 1978 1876 +t 1875 1877 1977 +t 1977 1877 1979 +t 1876 1978 1878 +t 1978 1980 1878 +t 1877 1879 1979 +t 1979 1879 1981 +t 1878 1980 1880 +t 1980 1982 1880 +t 1879 1881 1981 +t 1981 1881 1983 +t 1880 1982 1882 +t 1982 1984 1882 +t 1881 1883 1983 +t 1983 1883 1985 +t 1882 1984 1884 +t 1984 1986 1884 +t 1883 1885 1985 +t 1985 1885 1987 +t 1884 1986 1886 +t 1986 1988 1886 +t 1887 1888 1989 +t 1989 1888 1990 +t 1889 1991 1890 +t 1991 1992 1890 +t 1888 1891 1990 +t 1990 1891 1993 +t 1890 1992 1892 +t 1992 1994 1892 +t 1891 1893 1993 +t 1993 1893 1995 +t 1892 1994 1894 +t 1994 1996 1894 +t 1893 1895 1995 +t 1995 1895 1997 +t 1894 1996 1896 +t 1996 1998 1896 +t 1895 1897 1997 +t 1997 1897 1999 +t 1896 1998 1898 +t 1998 2000 1898 +t 1897 1899 1999 +t 1999 1899 2001 +t 1898 2000 1900 +t 2000 2002 1900 +t 1899 1901 2001 +t 2001 1901 2003 +t 1900 2002 1902 +t 2002 2004 1902 +t 1901 1903 2003 +t 2003 1903 2005 +t 1902 2004 1904 +t 2004 2006 1904 +t 1903 1905 2005 +t 2005 1905 2007 +t 1904 2006 1906 +t 2006 2008 1906 +t 1905 1907 2007 +t 2007 1907 2009 +t 1906 2008 1908 +t 2008 2010 1908 +t 1907 1909 2009 +t 2009 1909 2011 +t 1908 2010 1910 +t 2010 2012 1910 +t 1909 1911 2011 +t 2011 1911 2013 +t 1910 2012 1912 +t 2012 2014 1912 +t 1911 1913 2013 +t 2013 1913 2015 +t 1912 2014 1914 +t 2014 2016 1914 +t 1913 1915 2015 +t 2015 1915 2017 +t 1914 2016 1916 +t 2016 2018 1916 +t 1915 1917 2017 +t 2017 1917 2019 +t 1916 2018 1918 +t 2018 2020 1918 +t 1917 1919 2019 +t 2019 1919 2021 +t 1918 2020 1920 +t 2020 2022 1920 +t 1919 1921 2021 +t 2021 1921 2023 +t 1920 2022 1922 +t 2022 2024 1922 +t 1921 1923 2023 +t 2023 1923 2025 +t 1922 2024 1924 +t 2024 2026 1924 +t 1923 1925 2025 +t 2025 1925 2027 +t 1924 2026 1926 +t 2026 2028 1926 +t 1925 1927 2027 +t 2027 1927 2029 +t 1926 2028 1928 +t 2028 2030 1928 +t 1927 1929 2029 +t 2029 1929 2031 +t 1928 2030 1930 +t 2030 2032 1930 +t 1929 1931 2031 +t 2031 1931 2033 +t 1930 2032 1932 +t 2032 2034 1932 +t 1931 1933 2033 +t 2033 1933 2035 +t 1932 2034 1934 +t 2034 2036 1934 +t 1933 1935 2035 +t 2035 1935 2037 +t 1934 2036 1936 +t 2036 2038 1936 +t 1935 1937 2037 +t 2037 1937 2039 +t 1936 2038 1938 +t 2038 2040 1938 +t 1937 1939 2039 +t 2039 1939 2041 +t 1938 2040 1940 +t 2040 2042 1940 +t 1939 1941 2041 +t 2041 1941 2043 +t 1940 2042 1942 +t 2042 2044 1942 +t 1941 1943 2043 +t 2043 1943 2045 +t 1942 2044 1944 +t 2044 2046 1944 +t 1943 1945 2045 +t 2045 1945 2047 +t 1944 2046 1946 +t 2046 2048 1946 +t 1945 1947 2047 +t 2047 1947 2049 +t 1946 2048 1948 +t 2048 2050 1948 +t 1947 1949 2049 +t 2049 1949 2051 +t 1948 2050 1950 +t 2050 2052 1950 +t 1949 1951 2051 +t 2051 1951 2053 +t 1950 2052 1952 +t 2052 2054 1952 +t 1951 1953 2053 +t 2053 1953 2055 +t 1952 2054 1954 +t 2054 2056 1954 +t 1953 1955 2055 +t 2055 1955 2057 +t 1954 2056 1956 +t 2056 2058 1956 +t 1955 1957 2057 +t 2057 1957 2059 +t 1956 2058 1958 +t 2058 2060 1958 +t 1957 1959 2059 +t 2059 1959 2061 +t 1958 2060 1960 +t 2060 2062 1960 +t 1959 1961 2061 +t 2061 1961 2063 +t 1960 2062 1962 +t 2062 2064 1962 +t 1961 1963 2063 +t 2063 1963 2065 +t 1962 2064 1964 +t 2064 2066 1964 +t 1963 1965 2065 +t 2065 1965 2067 +t 1964 2066 1966 +t 2066 2068 1966 +t 1965 1967 2067 +t 2067 1967 2069 +t 1966 2068 1968 +t 2068 2070 1968 +t 1967 1969 2069 +t 2069 1969 2071 +t 1968 2070 1970 +t 2070 2072 1970 +t 1969 1971 2071 +t 2071 1971 2073 +t 1970 2072 1972 +t 2072 2074 1972 +t 1971 1973 2073 +t 2073 1973 2075 +t 1972 2074 1974 +t 2074 2076 1974 +t 1973 1975 2075 +t 2075 1975 2077 +t 1974 2076 1976 +t 2076 2078 1976 +t 1975 1977 2077 +t 2077 1977 2079 +t 1976 2078 1978 +t 2078 2080 1978 +t 1977 1979 2079 +t 2079 1979 2081 +t 1978 2080 1980 +t 2080 2082 1980 +t 1979 1981 2081 +t 2081 1981 2083 +t 1980 2082 1982 +t 2082 2084 1982 +t 1981 1983 2083 +t 2083 1983 2085 +t 1982 2084 1984 +t 2084 2086 1984 +t 1983 1985 2085 +t 2085 1985 2087 +t 1984 2086 1986 +t 2086 2088 1986 +t 1985 1987 2087 +t 2087 1987 2089 +t 1986 2088 1988 +t 2088 2090 1988 +t 1989 1990 2091 +t 2091 1990 2092 +t 1991 2093 1992 +t 2093 2094 1992 +t 1990 1993 2092 +t 2092 1993 2095 +t 1992 2094 1994 +t 2094 2096 1994 +t 1993 1995 2095 +t 2095 1995 2097 +t 1994 2096 1996 +t 2096 2098 1996 +t 1995 1997 2097 +t 2097 1997 2099 +t 1996 2098 1998 +t 2098 2100 1998 +t 1997 1999 2099 +t 2099 1999 2101 +t 1998 2100 2000 +t 2100 2102 2000 +t 1999 2001 2101 +t 2101 2001 2103 +t 2000 2102 2002 +t 2102 2104 2002 +t 2001 2003 2103 +t 2103 2003 2105 +t 2002 2104 2004 +t 2104 2106 2004 +t 2003 2005 2105 +t 2105 2005 2107 +t 2004 2106 2006 +t 2106 2108 2006 +t 2005 2007 2107 +t 2107 2007 2109 +t 2006 2108 2008 +t 2108 2110 2008 +t 2007 2009 2109 +t 2109 2009 2111 +t 2008 2110 2010 +t 2110 2112 2010 +t 2009 2011 2111 +t 2111 2011 2113 +t 2010 2112 2012 +t 2112 2114 2012 +t 2011 2013 2113 +t 2113 2013 2115 +t 2012 2114 2014 +t 2114 2116 2014 +t 2013 2015 2115 +t 2115 2015 2117 +t 2014 2116 2016 +t 2116 2118 2016 +t 2015 2017 2117 +t 2117 2017 2119 +t 2016 2118 2018 +t 2118 2120 2018 +t 2017 2019 2119 +t 2119 2019 2121 +t 2018 2120 2020 +t 2120 2122 2020 +t 2019 2021 2121 +t 2121 2021 2123 +t 2020 2122 2022 +t 2122 2124 2022 +t 2021 2023 2123 +t 2123 2023 2125 +t 2022 2124 2024 +t 2124 2126 2024 +t 2023 2025 2125 +t 2125 2025 2127 +t 2024 2126 2026 +t 2126 2128 2026 +t 2025 2027 2127 +t 2127 2027 2129 +t 2026 2128 2028 +t 2128 2130 2028 +t 2027 2029 2129 +t 2129 2029 2131 +t 2028 2130 2030 +t 2130 2132 2030 +t 2029 2031 2131 +t 2131 2031 2133 +t 2030 2132 2032 +t 2132 2134 2032 +t 2031 2033 2133 +t 2133 2033 2135 +t 2032 2134 2034 +t 2134 2136 2034 +t 2033 2035 2135 +t 2135 2035 2137 +t 2034 2136 2036 +t 2136 2138 2036 +t 2035 2037 2137 +t 2137 2037 2139 +t 2036 2138 2038 +t 2138 2140 2038 +t 2037 2039 2139 +t 2139 2039 2141 +t 2038 2140 2040 +t 2140 2142 2040 +t 2039 2041 2141 +t 2141 2041 2143 +t 2040 2142 2042 +t 2142 2144 2042 +t 2041 2043 2143 +t 2143 2043 2145 +t 2042 2144 2044 +t 2144 2146 2044 +t 2043 2045 2145 +t 2145 2045 2147 +t 2044 2146 2046 +t 2146 2148 2046 +t 2045 2047 2147 +t 2147 2047 2149 +t 2046 2148 2048 +t 2148 2150 2048 +t 2047 2049 2149 +t 2149 2049 2151 +t 2048 2150 2050 +t 2150 2152 2050 +t 2049 2051 2151 +t 2151 2051 2153 +t 2050 2152 2052 +t 2152 2154 2052 +t 2051 2053 2153 +t 2153 2053 2155 +t 2052 2154 2054 +t 2154 2156 2054 +t 2053 2055 2155 +t 2155 2055 2157 +t 2054 2156 2056 +t 2156 2158 2056 +t 2055 2057 2157 +t 2157 2057 2159 +t 2056 2158 2058 +t 2158 2160 2058 +t 2057 2059 2159 +t 2159 2059 2161 +t 2058 2160 2060 +t 2160 2162 2060 +t 2059 2061 2161 +t 2161 2061 2163 +t 2060 2162 2062 +t 2162 2164 2062 +t 2061 2063 2163 +t 2163 2063 2165 +t 2062 2164 2064 +t 2164 2166 2064 +t 2063 2065 2165 +t 2165 2065 2167 +t 2064 2166 2066 +t 2166 2168 2066 +t 2065 2067 2167 +t 2167 2067 2169 +t 2066 2168 2068 +t 2168 2170 2068 +t 2067 2069 2169 +t 2169 2069 2171 +t 2068 2170 2070 +t 2170 2172 2070 +t 2069 2071 2171 +t 2171 2071 2173 +t 2070 2172 2072 +t 2172 2174 2072 +t 2071 2073 2173 +t 2173 2073 2175 +t 2072 2174 2074 +t 2174 2176 2074 +t 2073 2075 2175 +t 2175 2075 2177 +t 2074 2176 2076 +t 2176 2178 2076 +t 2075 2077 2177 +t 2177 2077 2179 +t 2076 2178 2078 +t 2178 2180 2078 +t 2077 2079 2179 +t 2179 2079 2181 +t 2078 2180 2080 +t 2180 2182 2080 +t 2079 2081 2181 +t 2181 2081 2183 +t 2080 2182 2082 +t 2182 2184 2082 +t 2081 2083 2183 +t 2183 2083 2185 +t 2082 2184 2084 +t 2184 2186 2084 +t 2083 2085 2185 +t 2185 2085 2187 +t 2084 2186 2086 +t 2186 2188 2086 +t 2085 2087 2187 +t 2187 2087 2189 +t 2086 2188 2088 +t 2188 2190 2088 +t 2087 2089 2189 +t 2189 2089 2191 +t 2088 2190 2090 +t 2190 2192 2090 +t 2091 2092 2193 +t 2193 2092 2194 +t 2093 2195 2094 +t 2195 2196 2094 +t 2092 2095 2194 +t 2194 2095 2197 +t 2094 2196 2096 +t 2196 2198 2096 +t 2095 2097 2197 +t 2197 2097 2199 +t 2096 2198 2098 +t 2198 2200 2098 +t 2097 2099 2199 +t 2199 2099 2201 +t 2098 2200 2100 +t 2200 2202 2100 +t 2099 2101 2201 +t 2201 2101 2203 +t 2100 2202 2102 +t 2202 2204 2102 +t 2101 2103 2203 +t 2203 2103 2205 +t 2102 2204 2104 +t 2204 2206 2104 +t 2103 2105 2205 +t 2205 2105 2207 +t 2104 2206 2106 +t 2206 2208 2106 +t 2105 2107 2207 +t 2207 2107 2209 +t 2106 2208 2108 +t 2208 2210 2108 +t 2107 2109 2209 +t 2209 2109 2211 +t 2108 2210 2110 +t 2210 2212 2110 +t 2109 2111 2211 +t 2211 2111 2213 +t 2110 2212 2112 +t 2212 2214 2112 +t 2111 2113 2213 +t 2213 2113 2215 +t 2112 2214 2114 +t 2214 2216 2114 +t 2113 2115 2215 +t 2215 2115 2217 +t 2114 2216 2116 +t 2216 2218 2116 +t 2115 2117 2217 +t 2217 2117 2219 +t 2116 2218 2118 +t 2218 2220 2118 +t 2117 2119 2219 +t 2219 2119 2221 +t 2118 2220 2120 +t 2220 2222 2120 +t 2119 2121 2221 +t 2221 2121 2223 +t 2120 2222 2122 +t 2222 2224 2122 +t 2121 2123 2223 +t 2223 2123 2225 +t 2122 2224 2124 +t 2224 2226 2124 +t 2123 2125 2225 +t 2225 2125 2227 +t 2124 2226 2126 +t 2226 2228 2126 +t 2125 2127 2227 +t 2227 2127 2229 +t 2126 2228 2128 +t 2228 2230 2128 +t 2127 2129 2229 +t 2229 2129 2231 +t 2128 2230 2130 +t 2230 2232 2130 +t 2129 2131 2231 +t 2231 2131 2233 +t 2130 2232 2132 +t 2232 2234 2132 +t 2131 2133 2233 +t 2233 2133 2235 +t 2132 2234 2134 +t 2234 2236 2134 +t 2133 2135 2235 +t 2235 2135 2237 +t 2134 2236 2136 +t 2236 2238 2136 +t 2135 2137 2237 +t 2237 2137 2239 +t 2136 2238 2138 +t 2238 2240 2138 +t 2137 2139 2239 +t 2239 2139 2241 +t 2138 2240 2140 +t 2240 2242 2140 +t 2139 2141 2241 +t 2241 2141 2243 +t 2140 2242 2142 +t 2242 2244 2142 +t 2141 2143 2243 +t 2243 2143 2245 +t 2142 2244 2144 +t 2244 2246 2144 +t 2143 2145 2245 +t 2245 2145 2247 +t 2144 2246 2146 +t 2246 2248 2146 +t 2145 2147 2247 +t 2247 2147 2249 +t 2146 2248 2148 +t 2248 2250 2148 +t 2147 2149 2249 +t 2249 2149 2251 +t 2148 2250 2150 +t 2250 2252 2150 +t 2149 2151 2251 +t 2251 2151 2253 +t 2150 2252 2152 +t 2252 2254 2152 +t 2151 2153 2253 +t 2253 2153 2255 +t 2152 2254 2154 +t 2254 2256 2154 +t 2153 2155 2255 +t 2255 2155 2257 +t 2154 2256 2156 +t 2256 2258 2156 +t 2155 2157 2257 +t 2257 2157 2259 +t 2156 2258 2158 +t 2258 2260 2158 +t 2157 2159 2259 +t 2259 2159 2261 +t 2158 2260 2160 +t 2260 2262 2160 +t 2159 2161 2261 +t 2261 2161 2263 +t 2160 2262 2162 +t 2262 2264 2162 +t 2161 2163 2263 +t 2263 2163 2265 +t 2162 2264 2164 +t 2264 2266 2164 +t 2163 2165 2265 +t 2265 2165 2267 +t 2164 2266 2166 +t 2266 2268 2166 +t 2165 2167 2267 +t 2267 2167 2269 +t 2166 2268 2168 +t 2268 2270 2168 +t 2167 2169 2269 +t 2269 2169 2271 +t 2168 2270 2170 +t 2270 2272 2170 +t 2169 2171 2271 +t 2271 2171 2273 +t 2170 2272 2172 +t 2272 2274 2172 +t 2171 2173 2273 +t 2273 2173 2275 +t 2172 2274 2174 +t 2274 2276 2174 +t 2173 2175 2275 +t 2275 2175 2277 +t 2174 2276 2176 +t 2276 2278 2176 +t 2175 2177 2277 +t 2277 2177 2279 +t 2176 2278 2178 +t 2278 2280 2178 +t 2177 2179 2279 +t 2279 2179 2281 +t 2178 2280 2180 +t 2280 2282 2180 +t 2179 2181 2281 +t 2281 2181 2283 +t 2180 2282 2182 +t 2282 2284 2182 +t 2181 2183 2283 +t 2283 2183 2285 +t 2182 2284 2184 +t 2284 2286 2184 +t 2183 2185 2285 +t 2285 2185 2287 +t 2184 2286 2186 +t 2286 2288 2186 +t 2185 2187 2287 +t 2287 2187 2289 +t 2186 2288 2188 +t 2288 2290 2188 +t 2187 2189 2289 +t 2289 2189 2291 +t 2188 2290 2190 +t 2290 2292 2190 +t 2189 2191 2291 +t 2291 2191 2293 +t 2190 2292 2192 +t 2292 2294 2192 +t 2193 2194 2295 +t 2295 2194 2296 +t 2195 2297 2196 +t 2297 2298 2196 +t 2194 2197 2296 +t 2296 2197 2299 +t 2196 2298 2198 +t 2298 2300 2198 +t 2197 2199 2299 +t 2299 2199 2301 +t 2198 2300 2200 +t 2300 2302 2200 +t 2199 2201 2301 +t 2301 2201 2303 +t 2200 2302 2202 +t 2302 2304 2202 +t 2201 2203 2303 +t 2303 2203 2305 +t 2202 2304 2204 +t 2304 2306 2204 +t 2203 2205 2305 +t 2305 2205 2307 +t 2204 2306 2206 +t 2306 2308 2206 +t 2205 2207 2307 +t 2307 2207 2309 +t 2206 2308 2208 +t 2308 2310 2208 +t 2207 2209 2309 +t 2309 2209 2311 +t 2208 2310 2210 +t 2310 2312 2210 +t 2209 2211 2311 +t 2311 2211 2313 +t 2210 2312 2212 +t 2312 2314 2212 +t 2211 2213 2313 +t 2313 2213 2315 +t 2212 2314 2214 +t 2314 2316 2214 +t 2213 2215 2315 +t 2315 2215 2317 +t 2214 2316 2216 +t 2316 2318 2216 +t 2215 2217 2317 +t 2317 2217 2319 +t 2216 2318 2218 +t 2318 2320 2218 +t 2217 2219 2319 +t 2319 2219 2321 +t 2218 2320 2220 +t 2320 2322 2220 +t 2219 2221 2321 +t 2321 2221 2323 +t 2220 2322 2222 +t 2322 2324 2222 +t 2221 2223 2323 +t 2323 2223 2325 +t 2222 2324 2224 +t 2324 2326 2224 +t 2223 2225 2325 +t 2325 2225 2327 +t 2224 2326 2226 +t 2326 2328 2226 +t 2225 2227 2327 +t 2327 2227 2329 +t 2226 2328 2228 +t 2328 2330 2228 +t 2227 2229 2329 +t 2329 2229 2331 +t 2228 2330 2230 +t 2330 2332 2230 +t 2229 2231 2331 +t 2331 2231 2333 +t 2230 2332 2232 +t 2332 2334 2232 +t 2231 2233 2333 +t 2333 2233 2335 +t 2232 2334 2234 +t 2334 2336 2234 +t 2233 2235 2335 +t 2335 2235 2337 +t 2234 2336 2236 +t 2336 2338 2236 +t 2235 2237 2337 +t 2337 2237 2339 +t 2236 2338 2238 +t 2338 2340 2238 +t 2237 2239 2339 +t 2339 2239 2341 +t 2238 2340 2240 +t 2340 2342 2240 +t 2239 2241 2341 +t 2341 2241 2343 +t 2240 2342 2242 +t 2342 2344 2242 +t 2241 2243 2343 +t 2343 2243 2345 +t 2242 2344 2244 +t 2344 2346 2244 +t 2243 2245 2345 +t 2345 2245 2347 +t 2244 2346 2246 +t 2346 2348 2246 +t 2245 2247 2347 +t 2347 2247 2349 +t 2246 2348 2248 +t 2348 2350 2248 +t 2247 2249 2349 +t 2349 2249 2351 +t 2248 2350 2250 +t 2350 2352 2250 +t 2249 2251 2351 +t 2351 2251 2353 +t 2250 2352 2252 +t 2352 2354 2252 +t 2251 2253 2353 +t 2353 2253 2355 +t 2252 2354 2254 +t 2354 2356 2254 +t 2253 2255 2355 +t 2355 2255 2357 +t 2254 2356 2256 +t 2356 2358 2256 +t 2255 2257 2357 +t 2357 2257 2359 +t 2256 2358 2258 +t 2358 2360 2258 +t 2257 2259 2359 +t 2359 2259 2361 +t 2258 2360 2260 +t 2360 2362 2260 +t 2259 2261 2361 +t 2361 2261 2363 +t 2260 2362 2262 +t 2362 2364 2262 +t 2261 2263 2363 +t 2363 2263 2365 +t 2262 2364 2264 +t 2364 2366 2264 +t 2263 2265 2365 +t 2365 2265 2367 +t 2264 2366 2266 +t 2366 2368 2266 +t 2265 2267 2367 +t 2367 2267 2369 +t 2266 2368 2268 +t 2368 2370 2268 +t 2267 2269 2369 +t 2369 2269 2371 +t 2268 2370 2270 +t 2370 2372 2270 +t 2269 2271 2371 +t 2371 2271 2373 +t 2270 2372 2272 +t 2372 2374 2272 +t 2271 2273 2373 +t 2373 2273 2375 +t 2272 2374 2274 +t 2374 2376 2274 +t 2273 2275 2375 +t 2375 2275 2377 +t 2274 2376 2276 +t 2376 2378 2276 +t 2275 2277 2377 +t 2377 2277 2379 +t 2276 2378 2278 +t 2378 2380 2278 +t 2277 2279 2379 +t 2379 2279 2381 +t 2278 2380 2280 +t 2380 2382 2280 +t 2279 2281 2381 +t 2381 2281 2383 +t 2280 2382 2282 +t 2382 2384 2282 +t 2281 2283 2383 +t 2383 2283 2385 +t 2282 2384 2284 +t 2384 2386 2284 +t 2283 2285 2385 +t 2385 2285 2387 +t 2284 2386 2286 +t 2386 2388 2286 +t 2285 2287 2387 +t 2387 2287 2389 +t 2286 2388 2288 +t 2388 2390 2288 +t 2287 2289 2389 +t 2389 2289 2391 +t 2288 2390 2290 +t 2390 2392 2290 +t 2289 2291 2391 +t 2391 2291 2393 +t 2290 2392 2292 +t 2392 2394 2292 +t 2291 2293 2393 +t 2393 2293 2395 +t 2292 2394 2294 +t 2394 2396 2294 +t 2295 2296 2397 +t 2397 2296 2398 +t 2297 2399 2298 +t 2399 2400 2298 +t 2296 2299 2398 +t 2398 2299 2401 +t 2298 2400 2300 +t 2400 2402 2300 +t 2299 2301 2401 +t 2401 2301 2403 +t 2300 2402 2302 +t 2402 2404 2302 +t 2301 2303 2403 +t 2403 2303 2405 +t 2302 2404 2304 +t 2404 2406 2304 +t 2303 2305 2405 +t 2405 2305 2407 +t 2304 2406 2306 +t 2406 2408 2306 +t 2305 2307 2407 +t 2407 2307 2409 +t 2306 2408 2308 +t 2408 2410 2308 +t 2307 2309 2409 +t 2409 2309 2411 +t 2308 2410 2310 +t 2410 2412 2310 +t 2309 2311 2411 +t 2411 2311 2413 +t 2310 2412 2312 +t 2412 2414 2312 +t 2311 2313 2413 +t 2413 2313 2415 +t 2312 2414 2314 +t 2414 2416 2314 +t 2313 2315 2415 +t 2415 2315 2417 +t 2314 2416 2316 +t 2416 2418 2316 +t 2315 2317 2417 +t 2417 2317 2419 +t 2316 2418 2318 +t 2418 2420 2318 +t 2317 2319 2419 +t 2419 2319 2421 +t 2318 2420 2320 +t 2420 2422 2320 +t 2319 2321 2421 +t 2421 2321 2423 +t 2320 2422 2322 +t 2422 2424 2322 +t 2321 2323 2423 +t 2423 2323 2425 +t 2322 2424 2324 +t 2424 2426 2324 +t 2323 2325 2425 +t 2425 2325 2427 +t 2324 2426 2326 +t 2426 2428 2326 +t 2325 2327 2427 +t 2427 2327 2429 +t 2326 2428 2328 +t 2428 2430 2328 +t 2327 2329 2429 +t 2429 2329 2431 +t 2328 2430 2330 +t 2430 2432 2330 +t 2329 2331 2431 +t 2431 2331 2433 +t 2330 2432 2332 +t 2432 2434 2332 +t 2331 2333 2433 +t 2433 2333 2435 +t 2332 2434 2334 +t 2434 2436 2334 +t 2333 2335 2435 +t 2435 2335 2437 +t 2334 2436 2336 +t 2436 2438 2336 +t 2335 2337 2437 +t 2437 2337 2439 +t 2336 2438 2338 +t 2438 2440 2338 +t 2337 2339 2439 +t 2439 2339 2441 +t 2338 2440 2340 +t 2440 2442 2340 +t 2339 2341 2441 +t 2441 2341 2443 +t 2340 2442 2342 +t 2442 2444 2342 +t 2341 2343 2443 +t 2443 2343 2445 +t 2342 2444 2344 +t 2444 2446 2344 +t 2343 2345 2445 +t 2445 2345 2447 +t 2344 2446 2346 +t 2446 2448 2346 +t 2345 2347 2447 +t 2447 2347 2449 +t 2346 2448 2348 +t 2448 2450 2348 +t 2347 2349 2449 +t 2449 2349 2451 +t 2348 2450 2350 +t 2450 2452 2350 +t 2349 2351 2451 +t 2451 2351 2453 +t 2350 2452 2352 +t 2452 2454 2352 +t 2351 2353 2453 +t 2453 2353 2455 +t 2352 2454 2354 +t 2454 2456 2354 +t 2353 2355 2455 +t 2455 2355 2457 +t 2354 2456 2356 +t 2456 2458 2356 +t 2355 2357 2457 +t 2457 2357 2459 +t 2356 2458 2358 +t 2458 2460 2358 +t 2357 2359 2459 +t 2459 2359 2461 +t 2358 2460 2360 +t 2460 2462 2360 +t 2359 2361 2461 +t 2461 2361 2463 +t 2360 2462 2362 +t 2462 2464 2362 +t 2361 2363 2463 +t 2463 2363 2465 +t 2362 2464 2364 +t 2464 2466 2364 +t 2363 2365 2465 +t 2465 2365 2467 +t 2364 2466 2366 +t 2466 2468 2366 +t 2365 2367 2467 +t 2467 2367 2469 +t 2366 2468 2368 +t 2468 2470 2368 +t 2367 2369 2469 +t 2469 2369 2471 +t 2368 2470 2370 +t 2470 2472 2370 +t 2369 2371 2471 +t 2471 2371 2473 +t 2370 2472 2372 +t 2472 2474 2372 +t 2371 2373 2473 +t 2473 2373 2475 +t 2372 2474 2374 +t 2474 2476 2374 +t 2373 2375 2475 +t 2475 2375 2477 +t 2374 2476 2376 +t 2476 2478 2376 +t 2375 2377 2477 +t 2477 2377 2479 +t 2376 2478 2378 +t 2478 2480 2378 +t 2377 2379 2479 +t 2479 2379 2481 +t 2378 2480 2380 +t 2480 2482 2380 +t 2379 2381 2481 +t 2481 2381 2483 +t 2380 2482 2382 +t 2482 2484 2382 +t 2381 2383 2483 +t 2483 2383 2485 +t 2382 2484 2384 +t 2484 2486 2384 +t 2383 2385 2485 +t 2485 2385 2487 +t 2384 2486 2386 +t 2486 2488 2386 +t 2385 2387 2487 +t 2487 2387 2489 +t 2386 2488 2388 +t 2488 2490 2388 +t 2387 2389 2489 +t 2489 2389 2491 +t 2388 2490 2390 +t 2490 2492 2390 +t 2389 2391 2491 +t 2491 2391 2493 +t 2390 2492 2392 +t 2492 2494 2392 +t 2391 2393 2493 +t 2493 2393 2495 +t 2392 2494 2394 +t 2494 2496 2394 +t 2393 2395 2495 +t 2495 2395 2497 +t 2394 2496 2396 +t 2496 2498 2396 +t 2397 2398 2499 +t 2499 2398 2500 +t 2399 2501 2400 +t 2501 2502 2400 +t 2398 2401 2500 +t 2500 2401 2503 +t 2400 2502 2402 +t 2502 2504 2402 +t 2401 2403 2503 +t 2503 2403 2505 +t 2402 2504 2404 +t 2504 2506 2404 +t 2403 2405 2505 +t 2505 2405 2507 +t 2404 2506 2406 +t 2506 2508 2406 +t 2405 2407 2507 +t 2507 2407 2509 +t 2406 2508 2408 +t 2508 2510 2408 +t 2407 2409 2509 +t 2509 2409 2511 +t 2408 2510 2410 +t 2510 2512 2410 +t 2409 2411 2511 +t 2511 2411 2513 +t 2410 2512 2412 +t 2512 2514 2412 +t 2411 2413 2513 +t 2513 2413 2515 +t 2412 2514 2414 +t 2514 2516 2414 +t 2413 2415 2515 +t 2515 2415 2517 +t 2414 2516 2416 +t 2516 2518 2416 +t 2415 2417 2517 +t 2517 2417 2519 +t 2416 2518 2418 +t 2518 2520 2418 +t 2417 2419 2519 +t 2519 2419 2521 +t 2418 2520 2420 +t 2520 2522 2420 +t 2419 2421 2521 +t 2521 2421 2523 +t 2420 2522 2422 +t 2522 2524 2422 +t 2421 2423 2523 +t 2523 2423 2525 +t 2422 2524 2424 +t 2524 2526 2424 +t 2423 2425 2525 +t 2525 2425 2527 +t 2424 2526 2426 +t 2526 2528 2426 +t 2425 2427 2527 +t 2527 2427 2529 +t 2426 2528 2428 +t 2528 2530 2428 +t 2427 2429 2529 +t 2529 2429 2531 +t 2428 2530 2430 +t 2530 2532 2430 +t 2429 2431 2531 +t 2531 2431 2533 +t 2430 2532 2432 +t 2532 2534 2432 +t 2431 2433 2533 +t 2533 2433 2535 +t 2432 2534 2434 +t 2534 2536 2434 +t 2433 2435 2535 +t 2535 2435 2537 +t 2434 2536 2436 +t 2536 2538 2436 +t 2435 2437 2537 +t 2537 2437 2539 +t 2436 2538 2438 +t 2538 2540 2438 +t 2437 2439 2539 +t 2539 2439 2541 +t 2438 2540 2440 +t 2540 2542 2440 +t 2439 2441 2541 +t 2541 2441 2543 +t 2440 2542 2442 +t 2542 2544 2442 +t 2441 2443 2543 +t 2543 2443 2545 +t 2442 2544 2444 +t 2544 2546 2444 +t 2443 2445 2545 +t 2545 2445 2547 +t 2444 2546 2446 +t 2546 2548 2446 +t 2445 2447 2547 +t 2547 2447 2549 +t 2446 2548 2448 +t 2548 2550 2448 +t 2447 2449 2549 +t 2549 2449 2551 +t 2448 2550 2450 +t 2550 2552 2450 +t 2449 2451 2551 +t 2551 2451 2553 +t 2450 2552 2452 +t 2552 2554 2452 +t 2451 2453 2553 +t 2553 2453 2555 +t 2452 2554 2454 +t 2554 2556 2454 +t 2453 2455 2555 +t 2555 2455 2557 +t 2454 2556 2456 +t 2556 2558 2456 +t 2455 2457 2557 +t 2557 2457 2559 +t 2456 2558 2458 +t 2558 2560 2458 +t 2457 2459 2559 +t 2559 2459 2561 +t 2458 2560 2460 +t 2560 2562 2460 +t 2459 2461 2561 +t 2561 2461 2563 +t 2460 2562 2462 +t 2562 2564 2462 +t 2461 2463 2563 +t 2563 2463 2565 +t 2462 2564 2464 +t 2564 2566 2464 +t 2463 2465 2565 +t 2565 2465 2567 +t 2464 2566 2466 +t 2566 2568 2466 +t 2465 2467 2567 +t 2567 2467 2569 +t 2466 2568 2468 +t 2568 2570 2468 +t 2467 2469 2569 +t 2569 2469 2571 +t 2468 2570 2470 +t 2570 2572 2470 +t 2469 2471 2571 +t 2571 2471 2573 +t 2470 2572 2472 +t 2572 2574 2472 +t 2471 2473 2573 +t 2573 2473 2575 +t 2472 2574 2474 +t 2574 2576 2474 +t 2473 2475 2575 +t 2575 2475 2577 +t 2474 2576 2476 +t 2576 2578 2476 +t 2475 2477 2577 +t 2577 2477 2579 +t 2476 2578 2478 +t 2578 2580 2478 +t 2477 2479 2579 +t 2579 2479 2581 +t 2478 2580 2480 +t 2580 2582 2480 +t 2479 2481 2581 +t 2581 2481 2583 +t 2480 2582 2482 +t 2582 2584 2482 +t 2481 2483 2583 +t 2583 2483 2585 +t 2482 2584 2484 +t 2584 2586 2484 +t 2483 2485 2585 +t 2585 2485 2587 +t 2484 2586 2486 +t 2586 2588 2486 +t 2485 2487 2587 +t 2587 2487 2589 +t 2486 2588 2488 +t 2588 2590 2488 +t 2487 2489 2589 +t 2589 2489 2591 +t 2488 2590 2490 +t 2590 2592 2490 +t 2489 2491 2591 +t 2591 2491 2593 +t 2490 2592 2492 +t 2592 2594 2492 +t 2491 2493 2593 +t 2593 2493 2595 +t 2492 2594 2494 +t 2594 2596 2494 +t 2493 2495 2595 +t 2595 2495 2597 +t 2494 2596 2496 +t 2596 2598 2496 +t 2495 2497 2597 +t 2597 2497 2599 +t 2496 2598 2498 +t 2598 2600 2498 +t 2499 2500 2601 +t 2601 2500 2602 +t 2501 2603 2502 +t 2603 2604 2502 +t 2500 2503 2602 +t 2602 2503 2605 +t 2502 2604 2504 +t 2604 2606 2504 +t 2503 2505 2605 +t 2605 2505 2607 +t 2504 2606 2506 +t 2606 2608 2506 +t 2505 2507 2607 +t 2607 2507 2609 +t 2506 2608 2508 +t 2608 2610 2508 +t 2507 2509 2609 +t 2609 2509 2611 +t 2508 2610 2510 +t 2610 2612 2510 +t 2509 2511 2611 +t 2611 2511 2613 +t 2510 2612 2512 +t 2612 2614 2512 +t 2511 2513 2613 +t 2613 2513 2615 +t 2512 2614 2514 +t 2614 2616 2514 +t 2513 2515 2615 +t 2615 2515 2617 +t 2514 2616 2516 +t 2616 2618 2516 +t 2515 2517 2617 +t 2617 2517 2619 +t 2516 2618 2518 +t 2618 2620 2518 +t 2517 2519 2619 +t 2619 2519 2621 +t 2518 2620 2520 +t 2620 2622 2520 +t 2519 2521 2621 +t 2621 2521 2623 +t 2520 2622 2522 +t 2622 2624 2522 +t 2521 2523 2623 +t 2623 2523 2625 +t 2522 2624 2524 +t 2624 2626 2524 +t 2523 2525 2625 +t 2625 2525 2627 +t 2524 2626 2526 +t 2626 2628 2526 +t 2525 2527 2627 +t 2627 2527 2629 +t 2526 2628 2528 +t 2628 2630 2528 +t 2527 2529 2629 +t 2629 2529 2631 +t 2528 2630 2530 +t 2630 2632 2530 +t 2529 2531 2631 +t 2631 2531 2633 +t 2530 2632 2532 +t 2632 2634 2532 +t 2531 2533 2633 +t 2633 2533 2635 +t 2532 2634 2534 +t 2634 2636 2534 +t 2533 2535 2635 +t 2635 2535 2637 +t 2534 2636 2536 +t 2636 2638 2536 +t 2535 2537 2637 +t 2637 2537 2639 +t 2536 2638 2538 +t 2638 2640 2538 +t 2537 2539 2639 +t 2639 2539 2641 +t 2538 2640 2540 +t 2640 2642 2540 +t 2539 2541 2641 +t 2641 2541 2643 +t 2540 2642 2542 +t 2642 2644 2542 +t 2541 2543 2643 +t 2643 2543 2645 +t 2542 2644 2544 +t 2644 2646 2544 +t 2543 2545 2645 +t 2645 2545 2647 +t 2544 2646 2546 +t 2646 2648 2546 +t 2545 2547 2647 +t 2647 2547 2649 +t 2546 2648 2548 +t 2648 2650 2548 +t 2547 2549 2649 +t 2649 2549 2651 +t 2548 2650 2550 +t 2650 2652 2550 +t 2549 2551 2651 +t 2651 2551 2653 +t 2550 2652 2552 +t 2652 2654 2552 +t 2551 2553 2653 +t 2653 2553 2655 +t 2552 2654 2554 +t 2654 2656 2554 +t 2553 2555 2655 +t 2655 2555 2657 +t 2554 2656 2556 +t 2656 2658 2556 +t 2555 2557 2657 +t 2657 2557 2659 +t 2556 2658 2558 +t 2658 2660 2558 +t 2557 2559 2659 +t 2659 2559 2661 +t 2558 2660 2560 +t 2660 2662 2560 +t 2559 2561 2661 +t 2661 2561 2663 +t 2560 2662 2562 +t 2662 2664 2562 +t 2561 2563 2663 +t 2663 2563 2665 +t 2562 2664 2564 +t 2664 2666 2564 +t 2563 2565 2665 +t 2665 2565 2667 +t 2564 2666 2566 +t 2666 2668 2566 +t 2565 2567 2667 +t 2667 2567 2669 +t 2566 2668 2568 +t 2668 2670 2568 +t 2567 2569 2669 +t 2669 2569 2671 +t 2568 2670 2570 +t 2670 2672 2570 +t 2569 2571 2671 +t 2671 2571 2673 +t 2570 2672 2572 +t 2672 2674 2572 +t 2571 2573 2673 +t 2673 2573 2675 +t 2572 2674 2574 +t 2674 2676 2574 +t 2573 2575 2675 +t 2675 2575 2677 +t 2574 2676 2576 +t 2676 2678 2576 +t 2575 2577 2677 +t 2677 2577 2679 +t 2576 2678 2578 +t 2678 2680 2578 +t 2577 2579 2679 +t 2679 2579 2681 +t 2578 2680 2580 +t 2680 2682 2580 +t 2579 2581 2681 +t 2681 2581 2683 +t 2580 2682 2582 +t 2682 2684 2582 +t 2581 2583 2683 +t 2683 2583 2685 +t 2582 2684 2584 +t 2684 2686 2584 +t 2583 2585 2685 +t 2685 2585 2687 +t 2584 2686 2586 +t 2686 2688 2586 +t 2585 2587 2687 +t 2687 2587 2689 +t 2586 2688 2588 +t 2688 2690 2588 +t 2587 2589 2689 +t 2689 2589 2691 +t 2588 2690 2590 +t 2690 2692 2590 +t 2589 2591 2691 +t 2691 2591 2693 +t 2590 2692 2592 +t 2692 2694 2592 +t 2591 2593 2693 +t 2693 2593 2695 +t 2592 2694 2594 +t 2694 2696 2594 +t 2593 2595 2695 +t 2695 2595 2697 +t 2594 2696 2596 +t 2696 2698 2596 +t 2595 2597 2697 +t 2697 2597 2699 +t 2596 2698 2598 +t 2698 2700 2598 +t 2597 2599 2699 +t 2699 2599 2701 +t 2598 2700 2600 +t 2700 2702 2600 +t 2601 2602 2703 +t 2703 2602 2704 +t 2603 2705 2604 +t 2705 2706 2604 +t 2602 2605 2704 +t 2704 2605 2707 +t 2604 2706 2606 +t 2706 2708 2606 +t 2605 2607 2707 +t 2707 2607 2709 +t 2606 2708 2608 +t 2708 2710 2608 +t 2607 2609 2709 +t 2709 2609 2711 +t 2608 2710 2610 +t 2710 2712 2610 +t 2609 2611 2711 +t 2711 2611 2713 +t 2610 2712 2612 +t 2712 2714 2612 +t 2611 2613 2713 +t 2713 2613 2715 +t 2612 2714 2614 +t 2714 2716 2614 +t 2613 2615 2715 +t 2715 2615 2717 +t 2614 2716 2616 +t 2716 2718 2616 +t 2615 2617 2717 +t 2717 2617 2719 +t 2616 2718 2618 +t 2718 2720 2618 +t 2617 2619 2719 +t 2719 2619 2721 +t 2618 2720 2620 +t 2720 2722 2620 +t 2619 2621 2721 +t 2721 2621 2723 +t 2620 2722 2622 +t 2722 2724 2622 +t 2621 2623 2723 +t 2723 2623 2725 +t 2622 2724 2624 +t 2724 2726 2624 +t 2623 2625 2725 +t 2725 2625 2727 +t 2624 2726 2626 +t 2726 2728 2626 +t 2625 2627 2727 +t 2727 2627 2729 +t 2626 2728 2628 +t 2728 2730 2628 +t 2627 2629 2729 +t 2729 2629 2731 +t 2628 2730 2630 +t 2730 2732 2630 +t 2629 2631 2731 +t 2731 2631 2733 +t 2630 2732 2632 +t 2732 2734 2632 +t 2631 2633 2733 +t 2733 2633 2735 +t 2632 2734 2634 +t 2734 2736 2634 +t 2633 2635 2735 +t 2735 2635 2737 +t 2634 2736 2636 +t 2736 2738 2636 +t 2635 2637 2737 +t 2737 2637 2739 +t 2636 2738 2638 +t 2738 2740 2638 +t 2637 2639 2739 +t 2739 2639 2741 +t 2638 2740 2640 +t 2740 2742 2640 +t 2639 2641 2741 +t 2741 2641 2743 +t 2640 2742 2642 +t 2742 2744 2642 +t 2641 2643 2743 +t 2743 2643 2745 +t 2642 2744 2644 +t 2744 2746 2644 +t 2643 2645 2745 +t 2745 2645 2747 +t 2644 2746 2646 +t 2746 2748 2646 +t 2645 2647 2747 +t 2747 2647 2749 +t 2646 2748 2648 +t 2748 2750 2648 +t 2647 2649 2749 +t 2749 2649 2751 +t 2648 2750 2650 +t 2750 2752 2650 +t 2649 2651 2751 +t 2751 2651 2753 +t 2650 2752 2652 +t 2752 2754 2652 +t 2651 2653 2753 +t 2753 2653 2755 +t 2652 2754 2654 +t 2754 2756 2654 +t 2653 2655 2755 +t 2755 2655 2757 +t 2654 2756 2656 +t 2756 2758 2656 +t 2655 2657 2757 +t 2757 2657 2759 +t 2656 2758 2658 +t 2758 2760 2658 +t 2657 2659 2759 +t 2759 2659 2761 +t 2658 2760 2660 +t 2760 2762 2660 +t 2659 2661 2761 +t 2761 2661 2763 +t 2660 2762 2662 +t 2762 2764 2662 +t 2661 2663 2763 +t 2763 2663 2765 +t 2662 2764 2664 +t 2764 2766 2664 +t 2663 2665 2765 +t 2765 2665 2767 +t 2664 2766 2666 +t 2766 2768 2666 +t 2665 2667 2767 +t 2767 2667 2769 +t 2666 2768 2668 +t 2768 2770 2668 +t 2667 2669 2769 +t 2769 2669 2771 +t 2668 2770 2670 +t 2770 2772 2670 +t 2669 2671 2771 +t 2771 2671 2773 +t 2670 2772 2672 +t 2772 2774 2672 +t 2671 2673 2773 +t 2773 2673 2775 +t 2672 2774 2674 +t 2774 2776 2674 +t 2673 2675 2775 +t 2775 2675 2777 +t 2674 2776 2676 +t 2776 2778 2676 +t 2675 2677 2777 +t 2777 2677 2779 +t 2676 2778 2678 +t 2778 2780 2678 +t 2677 2679 2779 +t 2779 2679 2781 +t 2678 2780 2680 +t 2780 2782 2680 +t 2679 2681 2781 +t 2781 2681 2783 +t 2680 2782 2682 +t 2782 2784 2682 +t 2681 2683 2783 +t 2783 2683 2785 +t 2682 2784 2684 +t 2784 2786 2684 +t 2683 2685 2785 +t 2785 2685 2787 +t 2684 2786 2686 +t 2786 2788 2686 +t 2685 2687 2787 +t 2787 2687 2789 +t 2686 2788 2688 +t 2788 2790 2688 +t 2687 2689 2789 +t 2789 2689 2791 +t 2688 2790 2690 +t 2790 2792 2690 +t 2689 2691 2791 +t 2791 2691 2793 +t 2690 2792 2692 +t 2792 2794 2692 +t 2691 2693 2793 +t 2793 2693 2795 +t 2692 2794 2694 +t 2794 2796 2694 +t 2693 2695 2795 +t 2795 2695 2797 +t 2694 2796 2696 +t 2796 2798 2696 +t 2695 2697 2797 +t 2797 2697 2799 +t 2696 2798 2698 +t 2798 2800 2698 +t 2697 2699 2799 +t 2799 2699 2801 +t 2698 2800 2700 +t 2800 2802 2700 +t 2699 2701 2801 +t 2801 2701 2803 +t 2700 2802 2702 +t 2802 2804 2702 +t 2703 2704 2805 +t 2805 2704 2806 +t 2705 2807 2706 +t 2807 2808 2706 +t 2704 2707 2806 +t 2806 2707 2809 +t 2706 2808 2708 +t 2808 2810 2708 +t 2707 2709 2809 +t 2809 2709 2811 +t 2708 2810 2710 +t 2810 2812 2710 +t 2709 2711 2811 +t 2811 2711 2813 +t 2710 2812 2712 +t 2812 2814 2712 +t 2711 2713 2813 +t 2813 2713 2815 +t 2712 2814 2714 +t 2814 2816 2714 +t 2713 2715 2815 +t 2815 2715 2817 +t 2714 2816 2716 +t 2816 2818 2716 +t 2715 2717 2817 +t 2817 2717 2819 +t 2716 2818 2718 +t 2818 2820 2718 +t 2717 2719 2819 +t 2819 2719 2821 +t 2718 2820 2720 +t 2820 2822 2720 +t 2719 2721 2821 +t 2821 2721 2823 +t 2720 2822 2722 +t 2822 2824 2722 +t 2721 2723 2823 +t 2823 2723 2825 +t 2722 2824 2724 +t 2824 2826 2724 +t 2723 2725 2825 +t 2825 2725 2827 +t 2724 2826 2726 +t 2826 2828 2726 +t 2725 2727 2827 +t 2827 2727 2829 +t 2726 2828 2728 +t 2828 2830 2728 +t 2727 2729 2829 +t 2829 2729 2831 +t 2728 2830 2730 +t 2830 2832 2730 +t 2729 2731 2831 +t 2831 2731 2833 +t 2730 2832 2732 +t 2832 2834 2732 +t 2731 2733 2833 +t 2833 2733 2835 +t 2732 2834 2734 +t 2834 2836 2734 +t 2733 2735 2835 +t 2835 2735 2837 +t 2734 2836 2736 +t 2836 2838 2736 +t 2735 2737 2837 +t 2837 2737 2839 +t 2736 2838 2738 +t 2838 2840 2738 +t 2737 2739 2839 +t 2839 2739 2841 +t 2738 2840 2740 +t 2840 2842 2740 +t 2739 2741 2841 +t 2841 2741 2843 +t 2740 2842 2742 +t 2842 2844 2742 +t 2741 2743 2843 +t 2843 2743 2845 +t 2742 2844 2744 +t 2844 2846 2744 +t 2743 2745 2845 +t 2845 2745 2847 +t 2744 2846 2746 +t 2846 2848 2746 +t 2745 2747 2847 +t 2847 2747 2849 +t 2746 2848 2748 +t 2848 2850 2748 +t 2747 2749 2849 +t 2849 2749 2851 +t 2748 2850 2750 +t 2850 2852 2750 +t 2749 2751 2851 +t 2851 2751 2853 +t 2750 2852 2752 +t 2852 2854 2752 +t 2751 2753 2853 +t 2853 2753 2855 +t 2752 2854 2754 +t 2854 2856 2754 +t 2753 2755 2855 +t 2855 2755 2857 +t 2754 2856 2756 +t 2856 2858 2756 +t 2755 2757 2857 +t 2857 2757 2859 +t 2756 2858 2758 +t 2858 2860 2758 +t 2757 2759 2859 +t 2859 2759 2861 +t 2758 2860 2760 +t 2860 2862 2760 +t 2759 2761 2861 +t 2861 2761 2863 +t 2760 2862 2762 +t 2862 2864 2762 +t 2761 2763 2863 +t 2863 2763 2865 +t 2762 2864 2764 +t 2864 2866 2764 +t 2763 2765 2865 +t 2865 2765 2867 +t 2764 2866 2766 +t 2866 2868 2766 +t 2765 2767 2867 +t 2867 2767 2869 +t 2766 2868 2768 +t 2868 2870 2768 +t 2767 2769 2869 +t 2869 2769 2871 +t 2768 2870 2770 +t 2870 2872 2770 +t 2769 2771 2871 +t 2871 2771 2873 +t 2770 2872 2772 +t 2872 2874 2772 +t 2771 2773 2873 +t 2873 2773 2875 +t 2772 2874 2774 +t 2874 2876 2774 +t 2773 2775 2875 +t 2875 2775 2877 +t 2774 2876 2776 +t 2876 2878 2776 +t 2775 2777 2877 +t 2877 2777 2879 +t 2776 2878 2778 +t 2878 2880 2778 +t 2777 2779 2879 +t 2879 2779 2881 +t 2778 2880 2780 +t 2880 2882 2780 +t 2779 2781 2881 +t 2881 2781 2883 +t 2780 2882 2782 +t 2882 2884 2782 +t 2781 2783 2883 +t 2883 2783 2885 +t 2782 2884 2784 +t 2884 2886 2784 +t 2783 2785 2885 +t 2885 2785 2887 +t 2784 2886 2786 +t 2886 2888 2786 +t 2785 2787 2887 +t 2887 2787 2889 +t 2786 2888 2788 +t 2888 2890 2788 +t 2787 2789 2889 +t 2889 2789 2891 +t 2788 2890 2790 +t 2890 2892 2790 +t 2789 2791 2891 +t 2891 2791 2893 +t 2790 2892 2792 +t 2892 2894 2792 +t 2791 2793 2893 +t 2893 2793 2895 +t 2792 2894 2794 +t 2894 2896 2794 +t 2793 2795 2895 +t 2895 2795 2897 +t 2794 2896 2796 +t 2896 2898 2796 +t 2795 2797 2897 +t 2897 2797 2899 +t 2796 2898 2798 +t 2898 2900 2798 +t 2797 2799 2899 +t 2899 2799 2901 +t 2798 2900 2800 +t 2900 2902 2800 +t 2799 2801 2901 +t 2901 2801 2903 +t 2800 2902 2802 +t 2902 2904 2802 +t 2801 2803 2903 +t 2903 2803 2905 +t 2802 2904 2804 +t 2904 2906 2804 +t 2805 2806 2907 +t 2907 2806 2908 +t 2807 2909 2808 +t 2909 2910 2808 +t 2806 2809 2908 +t 2908 2809 2911 +t 2808 2910 2810 +t 2910 2912 2810 +t 2809 2811 2911 +t 2911 2811 2913 +t 2810 2912 2812 +t 2912 2914 2812 +t 2811 2813 2913 +t 2913 2813 2915 +t 2812 2914 2814 +t 2914 2916 2814 +t 2813 2815 2915 +t 2915 2815 2917 +t 2814 2916 2816 +t 2916 2918 2816 +t 2815 2817 2917 +t 2917 2817 2919 +t 2816 2918 2818 +t 2918 2920 2818 +t 2817 2819 2919 +t 2919 2819 2921 +t 2818 2920 2820 +t 2920 2922 2820 +t 2819 2821 2921 +t 2921 2821 2923 +t 2820 2922 2822 +t 2922 2924 2822 +t 2821 2823 2923 +t 2923 2823 2925 +t 2822 2924 2824 +t 2924 2926 2824 +t 2823 2825 2925 +t 2925 2825 2927 +t 2824 2926 2826 +t 2926 2928 2826 +t 2825 2827 2927 +t 2927 2827 2929 +t 2826 2928 2828 +t 2928 2930 2828 +t 2827 2829 2929 +t 2929 2829 2931 +t 2828 2930 2830 +t 2930 2932 2830 +t 2829 2831 2931 +t 2931 2831 2933 +t 2830 2932 2832 +t 2932 2934 2832 +t 2831 2833 2933 +t 2933 2833 2935 +t 2832 2934 2834 +t 2934 2936 2834 +t 2833 2835 2935 +t 2935 2835 2937 +t 2834 2936 2836 +t 2936 2938 2836 +t 2835 2837 2937 +t 2937 2837 2939 +t 2836 2938 2838 +t 2938 2940 2838 +t 2837 2839 2939 +t 2939 2839 2941 +t 2838 2940 2840 +t 2940 2942 2840 +t 2839 2841 2941 +t 2941 2841 2943 +t 2840 2942 2842 +t 2942 2944 2842 +t 2841 2843 2943 +t 2943 2843 2945 +t 2842 2944 2844 +t 2944 2946 2844 +t 2843 2845 2945 +t 2945 2845 2947 +t 2844 2946 2846 +t 2946 2948 2846 +t 2845 2847 2947 +t 2947 2847 2949 +t 2846 2948 2848 +t 2948 2950 2848 +t 2847 2849 2949 +t 2949 2849 2951 +t 2848 2950 2850 +t 2950 2952 2850 +t 2849 2851 2951 +t 2951 2851 2953 +t 2850 2952 2852 +t 2952 2954 2852 +t 2851 2853 2953 +t 2953 2853 2955 +t 2852 2954 2854 +t 2954 2956 2854 +t 2853 2855 2955 +t 2955 2855 2957 +t 2854 2956 2856 +t 2956 2958 2856 +t 2855 2857 2957 +t 2957 2857 2959 +t 2856 2958 2858 +t 2958 2960 2858 +t 2857 2859 2959 +t 2959 2859 2961 +t 2858 2960 2860 +t 2960 2962 2860 +t 2859 2861 2961 +t 2961 2861 2963 +t 2860 2962 2862 +t 2962 2964 2862 +t 2861 2863 2963 +t 2963 2863 2965 +t 2862 2964 2864 +t 2964 2966 2864 +t 2863 2865 2965 +t 2965 2865 2967 +t 2864 2966 2866 +t 2966 2968 2866 +t 2865 2867 2967 +t 2967 2867 2969 +t 2866 2968 2868 +t 2968 2970 2868 +t 2867 2869 2969 +t 2969 2869 2971 +t 2868 2970 2870 +t 2970 2972 2870 +t 2869 2871 2971 +t 2971 2871 2973 +t 2870 2972 2872 +t 2972 2974 2872 +t 2871 2873 2973 +t 2973 2873 2975 +t 2872 2974 2874 +t 2974 2976 2874 +t 2873 2875 2975 +t 2975 2875 2977 +t 2874 2976 2876 +t 2976 2978 2876 +t 2875 2877 2977 +t 2977 2877 2979 +t 2876 2978 2878 +t 2978 2980 2878 +t 2877 2879 2979 +t 2979 2879 2981 +t 2878 2980 2880 +t 2980 2982 2880 +t 2879 2881 2981 +t 2981 2881 2983 +t 2880 2982 2882 +t 2982 2984 2882 +t 2881 2883 2983 +t 2983 2883 2985 +t 2882 2984 2884 +t 2984 2986 2884 +t 2883 2885 2985 +t 2985 2885 2987 +t 2884 2986 2886 +t 2986 2988 2886 +t 2885 2887 2987 +t 2987 2887 2989 +t 2886 2988 2888 +t 2988 2990 2888 +t 2887 2889 2989 +t 2989 2889 2991 +t 2888 2990 2890 +t 2990 2992 2890 +t 2889 2891 2991 +t 2991 2891 2993 +t 2890 2992 2892 +t 2992 2994 2892 +t 2891 2893 2993 +t 2993 2893 2995 +t 2892 2994 2894 +t 2994 2996 2894 +t 2893 2895 2995 +t 2995 2895 2997 +t 2894 2996 2896 +t 2996 2998 2896 +t 2895 2897 2997 +t 2997 2897 2999 +t 2896 2998 2898 +t 2998 3000 2898 +t 2897 2899 2999 +t 2999 2899 3001 +t 2898 3000 2900 +t 3000 3002 2900 +t 2899 2901 3001 +t 3001 2901 3003 +t 2900 3002 2902 +t 3002 3004 2902 +t 2901 2903 3003 +t 3003 2903 3005 +t 2902 3004 2904 +t 3004 3006 2904 +t 2903 2905 3005 +t 3005 2905 3007 +t 2904 3006 2906 +t 3006 3008 2906 +t 2907 2908 3009 +t 3009 2908 3010 +t 2909 3011 2910 +t 3011 3012 2910 +t 2908 2911 3010 +t 3010 2911 3013 +t 2910 3012 2912 +t 3012 3014 2912 +t 2911 2913 3013 +t 3013 2913 3015 +t 2912 3014 2914 +t 3014 3016 2914 +t 2913 2915 3015 +t 3015 2915 3017 +t 2914 3016 2916 +t 3016 3018 2916 +t 2915 2917 3017 +t 3017 2917 3019 +t 2916 3018 2918 +t 3018 3020 2918 +t 2917 2919 3019 +t 3019 2919 3021 +t 2918 3020 2920 +t 3020 3022 2920 +t 2919 2921 3021 +t 3021 2921 3023 +t 2920 3022 2922 +t 3022 3024 2922 +t 2921 2923 3023 +t 3023 2923 3025 +t 2922 3024 2924 +t 3024 3026 2924 +t 2923 2925 3025 +t 3025 2925 3027 +t 2924 3026 2926 +t 3026 3028 2926 +t 2925 2927 3027 +t 3027 2927 3029 +t 2926 3028 2928 +t 3028 3030 2928 +t 2927 2929 3029 +t 3029 2929 3031 +t 2928 3030 2930 +t 3030 3032 2930 +t 2929 2931 3031 +t 3031 2931 3033 +t 2930 3032 2932 +t 3032 3034 2932 +t 2931 2933 3033 +t 3033 2933 3035 +t 2932 3034 2934 +t 3034 3036 2934 +t 2933 2935 3035 +t 3035 2935 3037 +t 2934 3036 2936 +t 3036 3038 2936 +t 2935 2937 3037 +t 3037 2937 3039 +t 2936 3038 2938 +t 3038 3040 2938 +t 2937 2939 3039 +t 3039 2939 3041 +t 2938 3040 2940 +t 3040 3042 2940 +t 2939 2941 3041 +t 3041 2941 3043 +t 2940 3042 2942 +t 3042 3044 2942 +t 2941 2943 3043 +t 3043 2943 3045 +t 2942 3044 2944 +t 3044 3046 2944 +t 2943 2945 3045 +t 3045 2945 3047 +t 2944 3046 2946 +t 3046 3048 2946 +t 2945 2947 3047 +t 3047 2947 3049 +t 2946 3048 2948 +t 3048 3050 2948 +t 2947 2949 3049 +t 3049 2949 3051 +t 2948 3050 2950 +t 3050 3052 2950 +t 2949 2951 3051 +t 3051 2951 3053 +t 2950 3052 2952 +t 3052 3054 2952 +t 2951 2953 3053 +t 3053 2953 3055 +t 2952 3054 2954 +t 3054 3056 2954 +t 2953 2955 3055 +t 3055 2955 3057 +t 2954 3056 2956 +t 3056 3058 2956 +t 2955 2957 3057 +t 3057 2957 3059 +t 2956 3058 2958 +t 3058 3060 2958 +t 2957 2959 3059 +t 3059 2959 3061 +t 2958 3060 2960 +t 3060 3062 2960 +t 2959 2961 3061 +t 3061 2961 3063 +t 2960 3062 2962 +t 3062 3064 2962 +t 2961 2963 3063 +t 3063 2963 3065 +t 2962 3064 2964 +t 3064 3066 2964 +t 2963 2965 3065 +t 3065 2965 3067 +t 2964 3066 2966 +t 3066 3068 2966 +t 2965 2967 3067 +t 3067 2967 3069 +t 2966 3068 2968 +t 3068 3070 2968 +t 2967 2969 3069 +t 3069 2969 3071 +t 2968 3070 2970 +t 3070 3072 2970 +t 2969 2971 3071 +t 3071 2971 3073 +t 2970 3072 2972 +t 3072 3074 2972 +t 2971 2973 3073 +t 3073 2973 3075 +t 2972 3074 2974 +t 3074 3076 2974 +t 2973 2975 3075 +t 3075 2975 3077 +t 2974 3076 2976 +t 3076 3078 2976 +t 2975 2977 3077 +t 3077 2977 3079 +t 2976 3078 2978 +t 3078 3080 2978 +t 2977 2979 3079 +t 3079 2979 3081 +t 2978 3080 2980 +t 3080 3082 2980 +t 2979 2981 3081 +t 3081 2981 3083 +t 2980 3082 2982 +t 3082 3084 2982 +t 2981 2983 3083 +t 3083 2983 3085 +t 2982 3084 2984 +t 3084 3086 2984 +t 2983 2985 3085 +t 3085 2985 3087 +t 2984 3086 2986 +t 3086 3088 2986 +t 2985 2987 3087 +t 3087 2987 3089 +t 2986 3088 2988 +t 3088 3090 2988 +t 2987 2989 3089 +t 3089 2989 3091 +t 2988 3090 2990 +t 3090 3092 2990 +t 2989 2991 3091 +t 3091 2991 3093 +t 2990 3092 2992 +t 3092 3094 2992 +t 2991 2993 3093 +t 3093 2993 3095 +t 2992 3094 2994 +t 3094 3096 2994 +t 2993 2995 3095 +t 3095 2995 3097 +t 2994 3096 2996 +t 3096 3098 2996 +t 2995 2997 3097 +t 3097 2997 3099 +t 2996 3098 2998 +t 3098 3100 2998 +t 2997 2999 3099 +t 3099 2999 3101 +t 2998 3100 3000 +t 3100 3102 3000 +t 2999 3001 3101 +t 3101 3001 3103 +t 3000 3102 3002 +t 3102 3104 3002 +t 3001 3003 3103 +t 3103 3003 3105 +t 3002 3104 3004 +t 3104 3106 3004 +t 3003 3005 3105 +t 3105 3005 3107 +t 3004 3106 3006 +t 3106 3108 3006 +t 3005 3007 3107 +t 3107 3007 3109 +t 3006 3108 3008 +t 3108 3110 3008 +t 3009 3010 3111 +t 3111 3010 3112 +t 3011 3113 3012 +t 3113 3114 3012 +t 3010 3013 3112 +t 3112 3013 3115 +t 3012 3114 3014 +t 3114 3116 3014 +t 3013 3015 3115 +t 3115 3015 3117 +t 3014 3116 3016 +t 3116 3118 3016 +t 3015 3017 3117 +t 3117 3017 3119 +t 3016 3118 3018 +t 3118 3120 3018 +t 3017 3019 3119 +t 3119 3019 3121 +t 3018 3120 3020 +t 3120 3122 3020 +t 3019 3021 3121 +t 3121 3021 3123 +t 3020 3122 3022 +t 3122 3124 3022 +t 3021 3023 3123 +t 3123 3023 3125 +t 3022 3124 3024 +t 3124 3126 3024 +t 3023 3025 3125 +t 3125 3025 3127 +t 3024 3126 3026 +t 3126 3128 3026 +t 3025 3027 3127 +t 3127 3027 3129 +t 3026 3128 3028 +t 3128 3130 3028 +t 3027 3029 3129 +t 3129 3029 3131 +t 3028 3130 3030 +t 3130 3132 3030 +t 3029 3031 3131 +t 3131 3031 3133 +t 3030 3132 3032 +t 3132 3134 3032 +t 3031 3033 3133 +t 3133 3033 3135 +t 3032 3134 3034 +t 3134 3136 3034 +t 3033 3035 3135 +t 3135 3035 3137 +t 3034 3136 3036 +t 3136 3138 3036 +t 3035 3037 3137 +t 3137 3037 3139 +t 3036 3138 3038 +t 3138 3140 3038 +t 3037 3039 3139 +t 3139 3039 3141 +t 3038 3140 3040 +t 3140 3142 3040 +t 3039 3041 3141 +t 3141 3041 3143 +t 3040 3142 3042 +t 3142 3144 3042 +t 3041 3043 3143 +t 3143 3043 3145 +t 3042 3144 3044 +t 3144 3146 3044 +t 3043 3045 3145 +t 3145 3045 3147 +t 3044 3146 3046 +t 3146 3148 3046 +t 3045 3047 3147 +t 3147 3047 3149 +t 3046 3148 3048 +t 3148 3150 3048 +t 3047 3049 3149 +t 3149 3049 3151 +t 3048 3150 3050 +t 3150 3152 3050 +t 3049 3051 3151 +t 3151 3051 3153 +t 3050 3152 3052 +t 3152 3154 3052 +t 3051 3053 3153 +t 3153 3053 3155 +t 3052 3154 3054 +t 3154 3156 3054 +t 3053 3055 3155 +t 3155 3055 3157 +t 3054 3156 3056 +t 3156 3158 3056 +t 3055 3057 3157 +t 3157 3057 3159 +t 3056 3158 3058 +t 3158 3160 3058 +t 3057 3059 3159 +t 3159 3059 3161 +t 3058 3160 3060 +t 3160 3162 3060 +t 3059 3061 3161 +t 3161 3061 3163 +t 3060 3162 3062 +t 3162 3164 3062 +t 3061 3063 3163 +t 3163 3063 3165 +t 3062 3164 3064 +t 3164 3166 3064 +t 3063 3065 3165 +t 3165 3065 3167 +t 3064 3166 3066 +t 3166 3168 3066 +t 3065 3067 3167 +t 3167 3067 3169 +t 3066 3168 3068 +t 3168 3170 3068 +t 3067 3069 3169 +t 3169 3069 3171 +t 3068 3170 3070 +t 3170 3172 3070 +t 3069 3071 3171 +t 3171 3071 3173 +t 3070 3172 3072 +t 3172 3174 3072 +t 3071 3073 3173 +t 3173 3073 3175 +t 3072 3174 3074 +t 3174 3176 3074 +t 3073 3075 3175 +t 3175 3075 3177 +t 3074 3176 3076 +t 3176 3178 3076 +t 3075 3077 3177 +t 3177 3077 3179 +t 3076 3178 3078 +t 3178 3180 3078 +t 3077 3079 3179 +t 3179 3079 3181 +t 3078 3180 3080 +t 3180 3182 3080 +t 3079 3081 3181 +t 3181 3081 3183 +t 3080 3182 3082 +t 3182 3184 3082 +t 3081 3083 3183 +t 3183 3083 3185 +t 3082 3184 3084 +t 3184 3186 3084 +t 3083 3085 3185 +t 3185 3085 3187 +t 3084 3186 3086 +t 3186 3188 3086 +t 3085 3087 3187 +t 3187 3087 3189 +t 3086 3188 3088 +t 3188 3190 3088 +t 3087 3089 3189 +t 3189 3089 3191 +t 3088 3190 3090 +t 3190 3192 3090 +t 3089 3091 3191 +t 3191 3091 3193 +t 3090 3192 3092 +t 3192 3194 3092 +t 3091 3093 3193 +t 3193 3093 3195 +t 3092 3194 3094 +t 3194 3196 3094 +t 3093 3095 3195 +t 3195 3095 3197 +t 3094 3196 3096 +t 3196 3198 3096 +t 3095 3097 3197 +t 3197 3097 3199 +t 3096 3198 3098 +t 3198 3200 3098 +t 3097 3099 3199 +t 3199 3099 3201 +t 3098 3200 3100 +t 3200 3202 3100 +t 3099 3101 3201 +t 3201 3101 3203 +t 3100 3202 3102 +t 3202 3204 3102 +t 3101 3103 3203 +t 3203 3103 3205 +t 3102 3204 3104 +t 3204 3206 3104 +t 3103 3105 3205 +t 3205 3105 3207 +t 3104 3206 3106 +t 3206 3208 3106 +t 3105 3107 3207 +t 3207 3107 3209 +t 3106 3208 3108 +t 3208 3210 3108 +t 3107 3109 3209 +t 3209 3109 3211 +t 3108 3210 3110 +t 3210 3212 3110 +t 3111 3112 3213 +t 3213 3112 3214 +t 3113 3215 3114 +t 3215 3216 3114 +t 3112 3115 3214 +t 3214 3115 3217 +t 3114 3216 3116 +t 3216 3218 3116 +t 3115 3117 3217 +t 3217 3117 3219 +t 3116 3218 3118 +t 3218 3220 3118 +t 3117 3119 3219 +t 3219 3119 3221 +t 3118 3220 3120 +t 3220 3222 3120 +t 3119 3121 3221 +t 3221 3121 3223 +t 3120 3222 3122 +t 3222 3224 3122 +t 3121 3123 3223 +t 3223 3123 3225 +t 3122 3224 3124 +t 3224 3226 3124 +t 3123 3125 3225 +t 3225 3125 3227 +t 3124 3226 3126 +t 3226 3228 3126 +t 3125 3127 3227 +t 3227 3127 3229 +t 3126 3228 3128 +t 3228 3230 3128 +t 3127 3129 3229 +t 3229 3129 3231 +t 3128 3230 3130 +t 3230 3232 3130 +t 3129 3131 3231 +t 3231 3131 3233 +t 3130 3232 3132 +t 3232 3234 3132 +t 3131 3133 3233 +t 3233 3133 3235 +t 3132 3234 3134 +t 3234 3236 3134 +t 3133 3135 3235 +t 3235 3135 3237 +t 3134 3236 3136 +t 3236 3238 3136 +t 3135 3137 3237 +t 3237 3137 3239 +t 3136 3238 3138 +t 3238 3240 3138 +t 3137 3139 3239 +t 3239 3139 3241 +t 3138 3240 3140 +t 3240 3242 3140 +t 3139 3141 3241 +t 3241 3141 3243 +t 3140 3242 3142 +t 3242 3244 3142 +t 3141 3143 3243 +t 3243 3143 3245 +t 3142 3244 3144 +t 3244 3246 3144 +t 3143 3145 3245 +t 3245 3145 3247 +t 3144 3246 3146 +t 3246 3248 3146 +t 3145 3147 3247 +t 3247 3147 3249 +t 3146 3248 3148 +t 3248 3250 3148 +t 3147 3149 3249 +t 3249 3149 3251 +t 3148 3250 3150 +t 3250 3252 3150 +t 3149 3151 3251 +t 3251 3151 3253 +t 3150 3252 3152 +t 3252 3254 3152 +t 3151 3153 3253 +t 3253 3153 3255 +t 3152 3254 3154 +t 3254 3256 3154 +t 3153 3155 3255 +t 3255 3155 3257 +t 3154 3256 3156 +t 3256 3258 3156 +t 3155 3157 3257 +t 3257 3157 3259 +t 3156 3258 3158 +t 3258 3260 3158 +t 3157 3159 3259 +t 3259 3159 3261 +t 3158 3260 3160 +t 3260 3262 3160 +t 3159 3161 3261 +t 3261 3161 3263 +t 3160 3262 3162 +t 3262 3264 3162 +t 3161 3163 3263 +t 3263 3163 3265 +t 3162 3264 3164 +t 3264 3266 3164 +t 3163 3165 3265 +t 3265 3165 3267 +t 3164 3266 3166 +t 3266 3268 3166 +t 3165 3167 3267 +t 3267 3167 3269 +t 3166 3268 3168 +t 3268 3270 3168 +t 3167 3169 3269 +t 3269 3169 3271 +t 3168 3270 3170 +t 3270 3272 3170 +t 3169 3171 3271 +t 3271 3171 3273 +t 3170 3272 3172 +t 3272 3274 3172 +t 3171 3173 3273 +t 3273 3173 3275 +t 3172 3274 3174 +t 3274 3276 3174 +t 3173 3175 3275 +t 3275 3175 3277 +t 3174 3276 3176 +t 3276 3278 3176 +t 3175 3177 3277 +t 3277 3177 3279 +t 3176 3278 3178 +t 3278 3280 3178 +t 3177 3179 3279 +t 3279 3179 3281 +t 3178 3280 3180 +t 3280 3282 3180 +t 3179 3181 3281 +t 3281 3181 3283 +t 3180 3282 3182 +t 3282 3284 3182 +t 3181 3183 3283 +t 3283 3183 3285 +t 3182 3284 3184 +t 3284 3286 3184 +t 3183 3185 3285 +t 3285 3185 3287 +t 3184 3286 3186 +t 3286 3288 3186 +t 3185 3187 3287 +t 3287 3187 3289 +t 3186 3288 3188 +t 3288 3290 3188 +t 3187 3189 3289 +t 3289 3189 3291 +t 3188 3290 3190 +t 3290 3292 3190 +t 3189 3191 3291 +t 3291 3191 3293 +t 3190 3292 3192 +t 3292 3294 3192 +t 3191 3193 3293 +t 3293 3193 3295 +t 3192 3294 3194 +t 3294 3296 3194 +t 3193 3195 3295 +t 3295 3195 3297 +t 3194 3296 3196 +t 3296 3298 3196 +t 3195 3197 3297 +t 3297 3197 3299 +t 3196 3298 3198 +t 3298 3300 3198 +t 3197 3199 3299 +t 3299 3199 3301 +t 3198 3300 3200 +t 3300 3302 3200 +t 3199 3201 3301 +t 3301 3201 3303 +t 3200 3302 3202 +t 3302 3304 3202 +t 3201 3203 3303 +t 3303 3203 3305 +t 3202 3304 3204 +t 3304 3306 3204 +t 3203 3205 3305 +t 3305 3205 3307 +t 3204 3306 3206 +t 3306 3308 3206 +t 3205 3207 3307 +t 3307 3207 3309 +t 3206 3308 3208 +t 3308 3310 3208 +t 3207 3209 3309 +t 3309 3209 3311 +t 3208 3310 3210 +t 3310 3312 3210 +t 3209 3211 3311 +t 3311 3211 3313 +t 3210 3312 3212 +t 3312 3314 3212 +t 3213 3214 3315 +t 3315 3214 3316 +t 3215 3317 3216 +t 3317 3318 3216 +t 3214 3217 3316 +t 3316 3217 3319 +t 3216 3318 3218 +t 3318 3320 3218 +t 3217 3219 3319 +t 3319 3219 3321 +t 3218 3320 3220 +t 3320 3322 3220 +t 3219 3221 3321 +t 3321 3221 3323 +t 3220 3322 3222 +t 3322 3324 3222 +t 3221 3223 3323 +t 3323 3223 3325 +t 3222 3324 3224 +t 3324 3326 3224 +t 3223 3225 3325 +t 3325 3225 3327 +t 3224 3326 3226 +t 3326 3328 3226 +t 3225 3227 3327 +t 3327 3227 3329 +t 3226 3328 3228 +t 3328 3330 3228 +t 3227 3229 3329 +t 3329 3229 3331 +t 3228 3330 3230 +t 3330 3332 3230 +t 3229 3231 3331 +t 3331 3231 3333 +t 3230 3332 3232 +t 3332 3334 3232 +t 3231 3233 3333 +t 3333 3233 3335 +t 3232 3334 3234 +t 3334 3336 3234 +t 3233 3235 3335 +t 3335 3235 3337 +t 3234 3336 3236 +t 3336 3338 3236 +t 3235 3237 3337 +t 3337 3237 3339 +t 3236 3338 3238 +t 3338 3340 3238 +t 3237 3239 3339 +t 3339 3239 3341 +t 3238 3340 3240 +t 3340 3342 3240 +t 3239 3241 3341 +t 3341 3241 3343 +t 3240 3342 3242 +t 3342 3344 3242 +t 3241 3243 3343 +t 3343 3243 3345 +t 3242 3344 3244 +t 3344 3346 3244 +t 3243 3245 3345 +t 3345 3245 3347 +t 3244 3346 3246 +t 3346 3348 3246 +t 3245 3247 3347 +t 3347 3247 3349 +t 3246 3348 3248 +t 3348 3350 3248 +t 3247 3249 3349 +t 3349 3249 3351 +t 3248 3350 3250 +t 3350 3352 3250 +t 3249 3251 3351 +t 3351 3251 3353 +t 3250 3352 3252 +t 3352 3354 3252 +t 3251 3253 3353 +t 3353 3253 3355 +t 3252 3354 3254 +t 3354 3356 3254 +t 3253 3255 3355 +t 3355 3255 3357 +t 3254 3356 3256 +t 3356 3358 3256 +t 3255 3257 3357 +t 3357 3257 3359 +t 3256 3358 3258 +t 3358 3360 3258 +t 3257 3259 3359 +t 3359 3259 3361 +t 3258 3360 3260 +t 3360 3362 3260 +t 3259 3261 3361 +t 3361 3261 3363 +t 3260 3362 3262 +t 3362 3364 3262 +t 3261 3263 3363 +t 3363 3263 3365 +t 3262 3364 3264 +t 3364 3366 3264 +t 3263 3265 3365 +t 3365 3265 3367 +t 3264 3366 3266 +t 3366 3368 3266 +t 3265 3267 3367 +t 3367 3267 3369 +t 3266 3368 3268 +t 3368 3370 3268 +t 3267 3269 3369 +t 3369 3269 3371 +t 3268 3370 3270 +t 3370 3372 3270 +t 3269 3271 3371 +t 3371 3271 3373 +t 3270 3372 3272 +t 3372 3374 3272 +t 3271 3273 3373 +t 3373 3273 3375 +t 3272 3374 3274 +t 3374 3376 3274 +t 3273 3275 3375 +t 3375 3275 3377 +t 3274 3376 3276 +t 3376 3378 3276 +t 3275 3277 3377 +t 3377 3277 3379 +t 3276 3378 3278 +t 3378 3380 3278 +t 3277 3279 3379 +t 3379 3279 3381 +t 3278 3380 3280 +t 3380 3382 3280 +t 3279 3281 3381 +t 3381 3281 3383 +t 3280 3382 3282 +t 3382 3384 3282 +t 3281 3283 3383 +t 3383 3283 3385 +t 3282 3384 3284 +t 3384 3386 3284 +t 3283 3285 3385 +t 3385 3285 3387 +t 3284 3386 3286 +t 3386 3388 3286 +t 3285 3287 3387 +t 3387 3287 3389 +t 3286 3388 3288 +t 3388 3390 3288 +t 3287 3289 3389 +t 3389 3289 3391 +t 3288 3390 3290 +t 3390 3392 3290 +t 3289 3291 3391 +t 3391 3291 3393 +t 3290 3392 3292 +t 3392 3394 3292 +t 3291 3293 3393 +t 3393 3293 3395 +t 3292 3394 3294 +t 3394 3396 3294 +t 3293 3295 3395 +t 3395 3295 3397 +t 3294 3396 3296 +t 3396 3398 3296 +t 3295 3297 3397 +t 3397 3297 3399 +t 3296 3398 3298 +t 3398 3400 3298 +t 3297 3299 3399 +t 3399 3299 3401 +t 3298 3400 3300 +t 3400 3402 3300 +t 3299 3301 3401 +t 3401 3301 3403 +t 3300 3402 3302 +t 3402 3404 3302 +t 3301 3303 3403 +t 3403 3303 3405 +t 3302 3404 3304 +t 3404 3406 3304 +t 3303 3305 3405 +t 3405 3305 3407 +t 3304 3406 3306 +t 3406 3408 3306 +t 3305 3307 3407 +t 3407 3307 3409 +t 3306 3408 3308 +t 3408 3410 3308 +t 3307 3309 3409 +t 3409 3309 3411 +t 3308 3410 3310 +t 3410 3412 3310 +t 3309 3311 3411 +t 3411 3311 3413 +t 3310 3412 3312 +t 3412 3414 3312 +t 3311 3313 3413 +t 3413 3313 3415 +t 3312 3414 3314 +t 3414 3416 3314 +t 3315 3316 3417 +t 3417 3316 3418 +t 3317 3419 3318 +t 3419 3420 3318 +t 3316 3319 3418 +t 3418 3319 3421 +t 3318 3420 3320 +t 3420 3422 3320 +t 3319 3321 3421 +t 3421 3321 3423 +t 3320 3422 3322 +t 3422 3424 3322 +t 3321 3323 3423 +t 3423 3323 3425 +t 3322 3424 3324 +t 3424 3426 3324 +t 3323 3325 3425 +t 3425 3325 3427 +t 3324 3426 3326 +t 3426 3428 3326 +t 3325 3327 3427 +t 3427 3327 3429 +t 3326 3428 3328 +t 3428 3430 3328 +t 3327 3329 3429 +t 3429 3329 3431 +t 3328 3430 3330 +t 3430 3432 3330 +t 3329 3331 3431 +t 3431 3331 3433 +t 3330 3432 3332 +t 3432 3434 3332 +t 3331 3333 3433 +t 3433 3333 3435 +t 3332 3434 3334 +t 3434 3436 3334 +t 3333 3335 3435 +t 3435 3335 3437 +t 3334 3436 3336 +t 3436 3438 3336 +t 3335 3337 3437 +t 3437 3337 3439 +t 3336 3438 3338 +t 3438 3440 3338 +t 3337 3339 3439 +t 3439 3339 3441 +t 3338 3440 3340 +t 3440 3442 3340 +t 3339 3341 3441 +t 3441 3341 3443 +t 3340 3442 3342 +t 3442 3444 3342 +t 3341 3343 3443 +t 3443 3343 3445 +t 3342 3444 3344 +t 3444 3446 3344 +t 3343 3345 3445 +t 3445 3345 3447 +t 3344 3446 3346 +t 3446 3448 3346 +t 3345 3347 3447 +t 3447 3347 3449 +t 3346 3448 3348 +t 3448 3450 3348 +t 3347 3349 3449 +t 3449 3349 3451 +t 3348 3450 3350 +t 3450 3452 3350 +t 3349 3351 3451 +t 3451 3351 3453 +t 3350 3452 3352 +t 3452 3454 3352 +t 3351 3353 3453 +t 3453 3353 3455 +t 3352 3454 3354 +t 3454 3456 3354 +t 3353 3355 3455 +t 3455 3355 3457 +t 3354 3456 3356 +t 3456 3458 3356 +t 3355 3357 3457 +t 3457 3357 3459 +t 3356 3458 3358 +t 3458 3460 3358 +t 3357 3359 3459 +t 3459 3359 3461 +t 3358 3460 3360 +t 3460 3462 3360 +t 3359 3361 3461 +t 3461 3361 3463 +t 3360 3462 3362 +t 3462 3464 3362 +t 3361 3363 3463 +t 3463 3363 3465 +t 3362 3464 3364 +t 3464 3466 3364 +t 3363 3365 3465 +t 3465 3365 3467 +t 3364 3466 3366 +t 3466 3468 3366 +t 3365 3367 3467 +t 3467 3367 3469 +t 3366 3468 3368 +t 3468 3470 3368 +t 3367 3369 3469 +t 3469 3369 3471 +t 3368 3470 3370 +t 3470 3472 3370 +t 3369 3371 3471 +t 3471 3371 3473 +t 3370 3472 3372 +t 3472 3474 3372 +t 3371 3373 3473 +t 3473 3373 3475 +t 3372 3474 3374 +t 3474 3476 3374 +t 3373 3375 3475 +t 3475 3375 3477 +t 3374 3476 3376 +t 3476 3478 3376 +t 3375 3377 3477 +t 3477 3377 3479 +t 3376 3478 3378 +t 3478 3480 3378 +t 3377 3379 3479 +t 3479 3379 3481 +t 3378 3480 3380 +t 3480 3482 3380 +t 3379 3381 3481 +t 3481 3381 3483 +t 3380 3482 3382 +t 3482 3484 3382 +t 3381 3383 3483 +t 3483 3383 3485 +t 3382 3484 3384 +t 3484 3486 3384 +t 3383 3385 3485 +t 3485 3385 3487 +t 3384 3486 3386 +t 3486 3488 3386 +t 3385 3387 3487 +t 3487 3387 3489 +t 3386 3488 3388 +t 3488 3490 3388 +t 3387 3389 3489 +t 3489 3389 3491 +t 3388 3490 3390 +t 3490 3492 3390 +t 3389 3391 3491 +t 3491 3391 3493 +t 3390 3492 3392 +t 3492 3494 3392 +t 3391 3393 3493 +t 3493 3393 3495 +t 3392 3494 3394 +t 3494 3496 3394 +t 3393 3395 3495 +t 3495 3395 3497 +t 3394 3496 3396 +t 3496 3498 3396 +t 3395 3397 3497 +t 3497 3397 3499 +t 3396 3498 3398 +t 3498 3500 3398 +t 3397 3399 3499 +t 3499 3399 3501 +t 3398 3500 3400 +t 3500 3502 3400 +t 3399 3401 3501 +t 3501 3401 3503 +t 3400 3502 3402 +t 3502 3504 3402 +t 3401 3403 3503 +t 3503 3403 3505 +t 3402 3504 3404 +t 3504 3506 3404 +t 3403 3405 3505 +t 3505 3405 3507 +t 3404 3506 3406 +t 3506 3508 3406 +t 3405 3407 3507 +t 3507 3407 3509 +t 3406 3508 3408 +t 3508 3510 3408 +t 3407 3409 3509 +t 3509 3409 3511 +t 3408 3510 3410 +t 3510 3512 3410 +t 3409 3411 3511 +t 3511 3411 3513 +t 3410 3512 3412 +t 3512 3514 3412 +t 3411 3413 3513 +t 3513 3413 3515 +t 3412 3514 3414 +t 3514 3516 3414 +t 3413 3415 3515 +t 3515 3415 3517 +t 3414 3516 3416 +t 3516 3518 3416 +t 3417 3418 3519 +t 3519 3418 3520 +t 3419 3521 3420 +t 3521 3522 3420 +t 3418 3421 3520 +t 3520 3421 3523 +t 3420 3522 3422 +t 3522 3524 3422 +t 3421 3423 3523 +t 3523 3423 3525 +t 3422 3524 3424 +t 3524 3526 3424 +t 3423 3425 3525 +t 3525 3425 3527 +t 3424 3526 3426 +t 3526 3528 3426 +t 3425 3427 3527 +t 3527 3427 3529 +t 3426 3528 3428 +t 3528 3530 3428 +t 3427 3429 3529 +t 3529 3429 3531 +t 3428 3530 3430 +t 3530 3532 3430 +t 3429 3431 3531 +t 3531 3431 3533 +t 3430 3532 3432 +t 3532 3534 3432 +t 3431 3433 3533 +t 3533 3433 3535 +t 3432 3534 3434 +t 3534 3536 3434 +t 3433 3435 3535 +t 3535 3435 3537 +t 3434 3536 3436 +t 3536 3538 3436 +t 3435 3437 3537 +t 3537 3437 3539 +t 3436 3538 3438 +t 3538 3540 3438 +t 3437 3439 3539 +t 3539 3439 3541 +t 3438 3540 3440 +t 3540 3542 3440 +t 3439 3441 3541 +t 3541 3441 3543 +t 3440 3542 3442 +t 3542 3544 3442 +t 3441 3443 3543 +t 3543 3443 3545 +t 3442 3544 3444 +t 3544 3546 3444 +t 3443 3445 3545 +t 3545 3445 3547 +t 3444 3546 3446 +t 3546 3548 3446 +t 3445 3447 3547 +t 3547 3447 3549 +t 3446 3548 3448 +t 3548 3550 3448 +t 3447 3449 3549 +t 3549 3449 3551 +t 3448 3550 3450 +t 3550 3552 3450 +t 3449 3451 3551 +t 3551 3451 3553 +t 3450 3552 3452 +t 3552 3554 3452 +t 3451 3453 3553 +t 3553 3453 3555 +t 3452 3554 3454 +t 3554 3556 3454 +t 3453 3455 3555 +t 3555 3455 3557 +t 3454 3556 3456 +t 3556 3558 3456 +t 3455 3457 3557 +t 3557 3457 3559 +t 3456 3558 3458 +t 3558 3560 3458 +t 3457 3459 3559 +t 3559 3459 3561 +t 3458 3560 3460 +t 3560 3562 3460 +t 3459 3461 3561 +t 3561 3461 3563 +t 3460 3562 3462 +t 3562 3564 3462 +t 3461 3463 3563 +t 3563 3463 3565 +t 3462 3564 3464 +t 3564 3566 3464 +t 3463 3465 3565 +t 3565 3465 3567 +t 3464 3566 3466 +t 3566 3568 3466 +t 3465 3467 3567 +t 3567 3467 3569 +t 3466 3568 3468 +t 3568 3570 3468 +t 3467 3469 3569 +t 3569 3469 3571 +t 3468 3570 3470 +t 3570 3572 3470 +t 3469 3471 3571 +t 3571 3471 3573 +t 3470 3572 3472 +t 3572 3574 3472 +t 3471 3473 3573 +t 3573 3473 3575 +t 3472 3574 3474 +t 3574 3576 3474 +t 3473 3475 3575 +t 3575 3475 3577 +t 3474 3576 3476 +t 3576 3578 3476 +t 3475 3477 3577 +t 3577 3477 3579 +t 3476 3578 3478 +t 3578 3580 3478 +t 3477 3479 3579 +t 3579 3479 3581 +t 3478 3580 3480 +t 3580 3582 3480 +t 3479 3481 3581 +t 3581 3481 3583 +t 3480 3582 3482 +t 3582 3584 3482 +t 3481 3483 3583 +t 3583 3483 3585 +t 3482 3584 3484 +t 3584 3586 3484 +t 3483 3485 3585 +t 3585 3485 3587 +t 3484 3586 3486 +t 3586 3588 3486 +t 3485 3487 3587 +t 3587 3487 3589 +t 3486 3588 3488 +t 3588 3590 3488 +t 3487 3489 3589 +t 3589 3489 3591 +t 3488 3590 3490 +t 3590 3592 3490 +t 3489 3491 3591 +t 3591 3491 3593 +t 3490 3592 3492 +t 3592 3594 3492 +t 3491 3493 3593 +t 3593 3493 3595 +t 3492 3594 3494 +t 3594 3596 3494 +t 3493 3495 3595 +t 3595 3495 3597 +t 3494 3596 3496 +t 3596 3598 3496 +t 3495 3497 3597 +t 3597 3497 3599 +t 3496 3598 3498 +t 3598 3600 3498 +t 3497 3499 3599 +t 3599 3499 3601 +t 3498 3600 3500 +t 3600 3602 3500 +t 3499 3501 3601 +t 3601 3501 3603 +t 3500 3602 3502 +t 3602 3604 3502 +t 3501 3503 3603 +t 3603 3503 3605 +t 3502 3604 3504 +t 3604 3606 3504 +t 3503 3505 3605 +t 3605 3505 3607 +t 3504 3606 3506 +t 3606 3608 3506 +t 3505 3507 3607 +t 3607 3507 3609 +t 3506 3608 3508 +t 3608 3610 3508 +t 3507 3509 3609 +t 3609 3509 3611 +t 3508 3610 3510 +t 3610 3612 3510 +t 3509 3511 3611 +t 3611 3511 3613 +t 3510 3612 3512 +t 3612 3614 3512 +t 3511 3513 3613 +t 3613 3513 3615 +t 3512 3614 3514 +t 3614 3616 3514 +t 3513 3515 3615 +t 3615 3515 3617 +t 3514 3616 3516 +t 3616 3618 3516 +t 3515 3517 3617 +t 3617 3517 3619 +t 3516 3618 3518 +t 3618 3620 3518 +t 3519 3520 3621 +t 3621 3520 3622 +t 3521 3623 3522 +t 3623 3624 3522 +t 3520 3523 3622 +t 3622 3523 3625 +t 3522 3624 3524 +t 3624 3626 3524 +t 3523 3525 3625 +t 3625 3525 3627 +t 3524 3626 3526 +t 3626 3628 3526 +t 3525 3527 3627 +t 3627 3527 3629 +t 3526 3628 3528 +t 3628 3630 3528 +t 3527 3529 3629 +t 3629 3529 3631 +t 3528 3630 3530 +t 3630 3632 3530 +t 3529 3531 3631 +t 3631 3531 3633 +t 3530 3632 3532 +t 3632 3634 3532 +t 3531 3533 3633 +t 3633 3533 3635 +t 3532 3634 3534 +t 3634 3636 3534 +t 3533 3535 3635 +t 3635 3535 3637 +t 3534 3636 3536 +t 3636 3638 3536 +t 3535 3537 3637 +t 3637 3537 3639 +t 3536 3638 3538 +t 3638 3640 3538 +t 3537 3539 3639 +t 3639 3539 3641 +t 3538 3640 3540 +t 3640 3642 3540 +t 3539 3541 3641 +t 3641 3541 3643 +t 3540 3642 3542 +t 3642 3644 3542 +t 3541 3543 3643 +t 3643 3543 3645 +t 3542 3644 3544 +t 3644 3646 3544 +t 3543 3545 3645 +t 3645 3545 3647 +t 3544 3646 3546 +t 3646 3648 3546 +t 3545 3547 3647 +t 3647 3547 3649 +t 3546 3648 3548 +t 3648 3650 3548 +t 3547 3549 3649 +t 3649 3549 3651 +t 3548 3650 3550 +t 3650 3652 3550 +t 3549 3551 3651 +t 3651 3551 3653 +t 3550 3652 3552 +t 3652 3654 3552 +t 3551 3553 3653 +t 3653 3553 3655 +t 3552 3654 3554 +t 3654 3656 3554 +t 3553 3555 3655 +t 3655 3555 3657 +t 3554 3656 3556 +t 3656 3658 3556 +t 3555 3557 3657 +t 3657 3557 3659 +t 3556 3658 3558 +t 3658 3660 3558 +t 3557 3559 3659 +t 3659 3559 3661 +t 3558 3660 3560 +t 3660 3662 3560 +t 3559 3561 3661 +t 3661 3561 3663 +t 3560 3662 3562 +t 3662 3664 3562 +t 3561 3563 3663 +t 3663 3563 3665 +t 3562 3664 3564 +t 3664 3666 3564 +t 3563 3565 3665 +t 3665 3565 3667 +t 3564 3666 3566 +t 3666 3668 3566 +t 3565 3567 3667 +t 3667 3567 3669 +t 3566 3668 3568 +t 3668 3670 3568 +t 3567 3569 3669 +t 3669 3569 3671 +t 3568 3670 3570 +t 3670 3672 3570 +t 3569 3571 3671 +t 3671 3571 3673 +t 3570 3672 3572 +t 3672 3674 3572 +t 3571 3573 3673 +t 3673 3573 3675 +t 3572 3674 3574 +t 3674 3676 3574 +t 3573 3575 3675 +t 3675 3575 3677 +t 3574 3676 3576 +t 3676 3678 3576 +t 3575 3577 3677 +t 3677 3577 3679 +t 3576 3678 3578 +t 3678 3680 3578 +t 3577 3579 3679 +t 3679 3579 3681 +t 3578 3680 3580 +t 3680 3682 3580 +t 3579 3581 3681 +t 3681 3581 3683 +t 3580 3682 3582 +t 3682 3684 3582 +t 3581 3583 3683 +t 3683 3583 3685 +t 3582 3684 3584 +t 3684 3686 3584 +t 3583 3585 3685 +t 3685 3585 3687 +t 3584 3686 3586 +t 3686 3688 3586 +t 3585 3587 3687 +t 3687 3587 3689 +t 3586 3688 3588 +t 3688 3690 3588 +t 3587 3589 3689 +t 3689 3589 3691 +t 3588 3690 3590 +t 3690 3692 3590 +t 3589 3591 3691 +t 3691 3591 3693 +t 3590 3692 3592 +t 3692 3694 3592 +t 3591 3593 3693 +t 3693 3593 3695 +t 3592 3694 3594 +t 3694 3696 3594 +t 3593 3595 3695 +t 3695 3595 3697 +t 3594 3696 3596 +t 3696 3698 3596 +t 3595 3597 3697 +t 3697 3597 3699 +t 3596 3698 3598 +t 3698 3700 3598 +t 3597 3599 3699 +t 3699 3599 3701 +t 3598 3700 3600 +t 3700 3702 3600 +t 3599 3601 3701 +t 3701 3601 3703 +t 3600 3702 3602 +t 3702 3704 3602 +t 3601 3603 3703 +t 3703 3603 3705 +t 3602 3704 3604 +t 3704 3706 3604 +t 3603 3605 3705 +t 3705 3605 3707 +t 3604 3706 3606 +t 3706 3708 3606 +t 3605 3607 3707 +t 3707 3607 3709 +t 3606 3708 3608 +t 3708 3710 3608 +t 3607 3609 3709 +t 3709 3609 3711 +t 3608 3710 3610 +t 3710 3712 3610 +t 3609 3611 3711 +t 3711 3611 3713 +t 3610 3712 3612 +t 3712 3714 3612 +t 3611 3613 3713 +t 3713 3613 3715 +t 3612 3714 3614 +t 3714 3716 3614 +t 3613 3615 3715 +t 3715 3615 3717 +t 3614 3716 3616 +t 3716 3718 3616 +t 3615 3617 3717 +t 3717 3617 3719 +t 3616 3718 3618 +t 3718 3720 3618 +t 3617 3619 3719 +t 3719 3619 3721 +t 3618 3720 3620 +t 3720 3722 3620 +t 3621 3622 3723 +t 3723 3622 3724 +t 3623 3725 3624 +t 3725 3726 3624 +t 3622 3625 3724 +t 3724 3625 3727 +t 3624 3726 3626 +t 3726 3728 3626 +t 3625 3627 3727 +t 3727 3627 3729 +t 3626 3728 3628 +t 3728 3730 3628 +t 3627 3629 3729 +t 3729 3629 3731 +t 3628 3730 3630 +t 3730 3732 3630 +t 3629 3631 3731 +t 3731 3631 3733 +t 3630 3732 3632 +t 3732 3734 3632 +t 3631 3633 3733 +t 3733 3633 3735 +t 3632 3734 3634 +t 3734 3736 3634 +t 3633 3635 3735 +t 3735 3635 3737 +t 3634 3736 3636 +t 3736 3738 3636 +t 3635 3637 3737 +t 3737 3637 3739 +t 3636 3738 3638 +t 3738 3740 3638 +t 3637 3639 3739 +t 3739 3639 3741 +t 3638 3740 3640 +t 3740 3742 3640 +t 3639 3641 3741 +t 3741 3641 3743 +t 3640 3742 3642 +t 3742 3744 3642 +t 3641 3643 3743 +t 3743 3643 3745 +t 3642 3744 3644 +t 3744 3746 3644 +t 3643 3645 3745 +t 3745 3645 3747 +t 3644 3746 3646 +t 3746 3748 3646 +t 3645 3647 3747 +t 3747 3647 3749 +t 3646 3748 3648 +t 3748 3750 3648 +t 3647 3649 3749 +t 3749 3649 3751 +t 3648 3750 3650 +t 3750 3752 3650 +t 3649 3651 3751 +t 3751 3651 3753 +t 3650 3752 3652 +t 3752 3754 3652 +t 3651 3653 3753 +t 3753 3653 3755 +t 3652 3754 3654 +t 3754 3756 3654 +t 3653 3655 3755 +t 3755 3655 3757 +t 3654 3756 3656 +t 3756 3758 3656 +t 3655 3657 3757 +t 3757 3657 3759 +t 3656 3758 3658 +t 3758 3760 3658 +t 3657 3659 3759 +t 3759 3659 3761 +t 3658 3760 3660 +t 3760 3762 3660 +t 3659 3661 3761 +t 3761 3661 3763 +t 3660 3762 3662 +t 3762 3764 3662 +t 3661 3663 3763 +t 3763 3663 3765 +t 3662 3764 3664 +t 3764 3766 3664 +t 3663 3665 3765 +t 3765 3665 3767 +t 3664 3766 3666 +t 3766 3768 3666 +t 3665 3667 3767 +t 3767 3667 3769 +t 3666 3768 3668 +t 3768 3770 3668 +t 3667 3669 3769 +t 3769 3669 3771 +t 3668 3770 3670 +t 3770 3772 3670 +t 3669 3671 3771 +t 3771 3671 3773 +t 3670 3772 3672 +t 3772 3774 3672 +t 3671 3673 3773 +t 3773 3673 3775 +t 3672 3774 3674 +t 3774 3776 3674 +t 3673 3675 3775 +t 3775 3675 3777 +t 3674 3776 3676 +t 3776 3778 3676 +t 3675 3677 3777 +t 3777 3677 3779 +t 3676 3778 3678 +t 3778 3780 3678 +t 3677 3679 3779 +t 3779 3679 3781 +t 3678 3780 3680 +t 3780 3782 3680 +t 3679 3681 3781 +t 3781 3681 3783 +t 3680 3782 3682 +t 3782 3784 3682 +t 3681 3683 3783 +t 3783 3683 3785 +t 3682 3784 3684 +t 3784 3786 3684 +t 3683 3685 3785 +t 3785 3685 3787 +t 3684 3786 3686 +t 3786 3788 3686 +t 3685 3687 3787 +t 3787 3687 3789 +t 3686 3788 3688 +t 3788 3790 3688 +t 3687 3689 3789 +t 3789 3689 3791 +t 3688 3790 3690 +t 3790 3792 3690 +t 3689 3691 3791 +t 3791 3691 3793 +t 3690 3792 3692 +t 3792 3794 3692 +t 3691 3693 3793 +t 3793 3693 3795 +t 3692 3794 3694 +t 3794 3796 3694 +t 3693 3695 3795 +t 3795 3695 3797 +t 3694 3796 3696 +t 3796 3798 3696 +t 3695 3697 3797 +t 3797 3697 3799 +t 3696 3798 3698 +t 3798 3800 3698 +t 3697 3699 3799 +t 3799 3699 3801 +t 3698 3800 3700 +t 3800 3802 3700 +t 3699 3701 3801 +t 3801 3701 3803 +t 3700 3802 3702 +t 3802 3804 3702 +t 3701 3703 3803 +t 3803 3703 3805 +t 3702 3804 3704 +t 3804 3806 3704 +t 3703 3705 3805 +t 3805 3705 3807 +t 3704 3806 3706 +t 3806 3808 3706 +t 3705 3707 3807 +t 3807 3707 3809 +t 3706 3808 3708 +t 3808 3810 3708 +t 3707 3709 3809 +t 3809 3709 3811 +t 3708 3810 3710 +t 3810 3812 3710 +t 3709 3711 3811 +t 3811 3711 3813 +t 3710 3812 3712 +t 3812 3814 3712 +t 3711 3713 3813 +t 3813 3713 3815 +t 3712 3814 3714 +t 3814 3816 3714 +t 3713 3715 3815 +t 3815 3715 3817 +t 3714 3816 3716 +t 3816 3818 3716 +t 3715 3717 3817 +t 3817 3717 3819 +t 3716 3818 3718 +t 3818 3820 3718 +t 3717 3719 3819 +t 3819 3719 3821 +t 3718 3820 3720 +t 3820 3822 3720 +t 3719 3721 3821 +t 3821 3721 3823 +t 3720 3822 3722 +t 3822 3824 3722 +t 3723 3724 3825 +t 3825 3724 3826 +t 3725 3827 3726 +t 3827 3828 3726 +t 3724 3727 3826 +t 3826 3727 3829 +t 3726 3828 3728 +t 3828 3830 3728 +t 3727 3729 3829 +t 3829 3729 3831 +t 3728 3830 3730 +t 3830 3832 3730 +t 3729 3731 3831 +t 3831 3731 3833 +t 3730 3832 3732 +t 3832 3834 3732 +t 3731 3733 3833 +t 3833 3733 3835 +t 3732 3834 3734 +t 3834 3836 3734 +t 3733 3735 3835 +t 3835 3735 3837 +t 3734 3836 3736 +t 3836 3838 3736 +t 3735 3737 3837 +t 3837 3737 3839 +t 3736 3838 3738 +t 3838 3840 3738 +t 3737 3739 3839 +t 3839 3739 3841 +t 3738 3840 3740 +t 3840 3842 3740 +t 3739 3741 3841 +t 3841 3741 3843 +t 3740 3842 3742 +t 3842 3844 3742 +t 3741 3743 3843 +t 3843 3743 3845 +t 3742 3844 3744 +t 3844 3846 3744 +t 3743 3745 3845 +t 3845 3745 3847 +t 3744 3846 3746 +t 3846 3848 3746 +t 3745 3747 3847 +t 3847 3747 3849 +t 3746 3848 3748 +t 3848 3850 3748 +t 3747 3749 3849 +t 3849 3749 3851 +t 3748 3850 3750 +t 3850 3852 3750 +t 3749 3751 3851 +t 3851 3751 3853 +t 3750 3852 3752 +t 3852 3854 3752 +t 3751 3753 3853 +t 3853 3753 3855 +t 3752 3854 3754 +t 3854 3856 3754 +t 3753 3755 3855 +t 3855 3755 3857 +t 3754 3856 3756 +t 3856 3858 3756 +t 3755 3757 3857 +t 3857 3757 3859 +t 3756 3858 3758 +t 3858 3860 3758 +t 3757 3759 3859 +t 3859 3759 3861 +t 3758 3860 3760 +t 3860 3862 3760 +t 3759 3761 3861 +t 3861 3761 3863 +t 3760 3862 3762 +t 3862 3864 3762 +t 3761 3763 3863 +t 3863 3763 3865 +t 3762 3864 3764 +t 3864 3866 3764 +t 3763 3765 3865 +t 3865 3765 3867 +t 3764 3866 3766 +t 3866 3868 3766 +t 3765 3767 3867 +t 3867 3767 3869 +t 3766 3868 3768 +t 3868 3870 3768 +t 3767 3769 3869 +t 3869 3769 3871 +t 3768 3870 3770 +t 3870 3872 3770 +t 3769 3771 3871 +t 3871 3771 3873 +t 3770 3872 3772 +t 3872 3874 3772 +t 3771 3773 3873 +t 3873 3773 3875 +t 3772 3874 3774 +t 3874 3876 3774 +t 3773 3775 3875 +t 3875 3775 3877 +t 3774 3876 3776 +t 3876 3878 3776 +t 3775 3777 3877 +t 3877 3777 3879 +t 3776 3878 3778 +t 3878 3880 3778 +t 3777 3779 3879 +t 3879 3779 3881 +t 3778 3880 3780 +t 3880 3882 3780 +t 3779 3781 3881 +t 3881 3781 3883 +t 3780 3882 3782 +t 3882 3884 3782 +t 3781 3783 3883 +t 3883 3783 3885 +t 3782 3884 3784 +t 3884 3886 3784 +t 3783 3785 3885 +t 3885 3785 3887 +t 3784 3886 3786 +t 3886 3888 3786 +t 3785 3787 3887 +t 3887 3787 3889 +t 3786 3888 3788 +t 3888 3890 3788 +t 3787 3789 3889 +t 3889 3789 3891 +t 3788 3890 3790 +t 3890 3892 3790 +t 3789 3791 3891 +t 3891 3791 3893 +t 3790 3892 3792 +t 3892 3894 3792 +t 3791 3793 3893 +t 3893 3793 3895 +t 3792 3894 3794 +t 3894 3896 3794 +t 3793 3795 3895 +t 3895 3795 3897 +t 3794 3896 3796 +t 3896 3898 3796 +t 3795 3797 3897 +t 3897 3797 3899 +t 3796 3898 3798 +t 3898 3900 3798 +t 3797 3799 3899 +t 3899 3799 3901 +t 3798 3900 3800 +t 3900 3902 3800 +t 3799 3801 3901 +t 3901 3801 3903 +t 3800 3902 3802 +t 3902 3904 3802 +t 3801 3803 3903 +t 3903 3803 3905 +t 3802 3904 3804 +t 3904 3906 3804 +t 3803 3805 3905 +t 3905 3805 3907 +t 3804 3906 3806 +t 3906 3908 3806 +t 3805 3807 3907 +t 3907 3807 3909 +t 3806 3908 3808 +t 3908 3910 3808 +t 3807 3809 3909 +t 3909 3809 3911 +t 3808 3910 3810 +t 3910 3912 3810 +t 3809 3811 3911 +t 3911 3811 3913 +t 3810 3912 3812 +t 3912 3914 3812 +t 3811 3813 3913 +t 3913 3813 3915 +t 3812 3914 3814 +t 3914 3916 3814 +t 3813 3815 3915 +t 3915 3815 3917 +t 3814 3916 3816 +t 3916 3918 3816 +t 3815 3817 3917 +t 3917 3817 3919 +t 3816 3918 3818 +t 3918 3920 3818 +t 3817 3819 3919 +t 3919 3819 3921 +t 3818 3920 3820 +t 3920 3922 3820 +t 3819 3821 3921 +t 3921 3821 3923 +t 3820 3922 3822 +t 3922 3924 3822 +t 3821 3823 3923 +t 3923 3823 3925 +t 3822 3924 3824 +t 3924 3926 3824 +t 3825 3826 3927 +t 3927 3826 3928 +t 3827 3929 3828 +t 3929 3930 3828 +t 3826 3829 3928 +t 3928 3829 3931 +t 3828 3930 3830 +t 3930 3932 3830 +t 3829 3831 3931 +t 3931 3831 3933 +t 3830 3932 3832 +t 3932 3934 3832 +t 3831 3833 3933 +t 3933 3833 3935 +t 3832 3934 3834 +t 3934 3936 3834 +t 3833 3835 3935 +t 3935 3835 3937 +t 3834 3936 3836 +t 3936 3938 3836 +t 3835 3837 3937 +t 3937 3837 3939 +t 3836 3938 3838 +t 3938 3940 3838 +t 3837 3839 3939 +t 3939 3839 3941 +t 3838 3940 3840 +t 3940 3942 3840 +t 3839 3841 3941 +t 3941 3841 3943 +t 3840 3942 3842 +t 3942 3944 3842 +t 3841 3843 3943 +t 3943 3843 3945 +t 3842 3944 3844 +t 3944 3946 3844 +t 3843 3845 3945 +t 3945 3845 3947 +t 3844 3946 3846 +t 3946 3948 3846 +t 3845 3847 3947 +t 3947 3847 3949 +t 3846 3948 3848 +t 3948 3950 3848 +t 3847 3849 3949 +t 3949 3849 3951 +t 3848 3950 3850 +t 3950 3952 3850 +t 3849 3851 3951 +t 3951 3851 3953 +t 3850 3952 3852 +t 3952 3954 3852 +t 3851 3853 3953 +t 3953 3853 3955 +t 3852 3954 3854 +t 3954 3956 3854 +t 3853 3855 3955 +t 3955 3855 3957 +t 3854 3956 3856 +t 3956 3958 3856 +t 3855 3857 3957 +t 3957 3857 3959 +t 3856 3958 3858 +t 3958 3960 3858 +t 3857 3859 3959 +t 3959 3859 3961 +t 3858 3960 3860 +t 3960 3962 3860 +t 3859 3861 3961 +t 3961 3861 3963 +t 3860 3962 3862 +t 3962 3964 3862 +t 3861 3863 3963 +t 3963 3863 3965 +t 3862 3964 3864 +t 3964 3966 3864 +t 3863 3865 3965 +t 3965 3865 3967 +t 3864 3966 3866 +t 3966 3968 3866 +t 3865 3867 3967 +t 3967 3867 3969 +t 3866 3968 3868 +t 3968 3970 3868 +t 3867 3869 3969 +t 3969 3869 3971 +t 3868 3970 3870 +t 3970 3972 3870 +t 3869 3871 3971 +t 3971 3871 3973 +t 3870 3972 3872 +t 3972 3974 3872 +t 3871 3873 3973 +t 3973 3873 3975 +t 3872 3974 3874 +t 3974 3976 3874 +t 3873 3875 3975 +t 3975 3875 3977 +t 3874 3976 3876 +t 3976 3978 3876 +t 3875 3877 3977 +t 3977 3877 3979 +t 3876 3978 3878 +t 3978 3980 3878 +t 3877 3879 3979 +t 3979 3879 3981 +t 3878 3980 3880 +t 3980 3982 3880 +t 3879 3881 3981 +t 3981 3881 3983 +t 3880 3982 3882 +t 3982 3984 3882 +t 3881 3883 3983 +t 3983 3883 3985 +t 3882 3984 3884 +t 3984 3986 3884 +t 3883 3885 3985 +t 3985 3885 3987 +t 3884 3986 3886 +t 3986 3988 3886 +t 3885 3887 3987 +t 3987 3887 3989 +t 3886 3988 3888 +t 3988 3990 3888 +t 3887 3889 3989 +t 3989 3889 3991 +t 3888 3990 3890 +t 3990 3992 3890 +t 3889 3891 3991 +t 3991 3891 3993 +t 3890 3992 3892 +t 3992 3994 3892 +t 3891 3893 3993 +t 3993 3893 3995 +t 3892 3994 3894 +t 3994 3996 3894 +t 3893 3895 3995 +t 3995 3895 3997 +t 3894 3996 3896 +t 3996 3998 3896 +t 3895 3897 3997 +t 3997 3897 3999 +t 3896 3998 3898 +t 3998 4000 3898 +t 3897 3899 3999 +t 3999 3899 4001 +t 3898 4000 3900 +t 4000 4002 3900 +t 3899 3901 4001 +t 4001 3901 4003 +t 3900 4002 3902 +t 4002 4004 3902 +t 3901 3903 4003 +t 4003 3903 4005 +t 3902 4004 3904 +t 4004 4006 3904 +t 3903 3905 4005 +t 4005 3905 4007 +t 3904 4006 3906 +t 4006 4008 3906 +t 3905 3907 4007 +t 4007 3907 4009 +t 3906 4008 3908 +t 4008 4010 3908 +t 3907 3909 4009 +t 4009 3909 4011 +t 3908 4010 3910 +t 4010 4012 3910 +t 3909 3911 4011 +t 4011 3911 4013 +t 3910 4012 3912 +t 4012 4014 3912 +t 3911 3913 4013 +t 4013 3913 4015 +t 3912 4014 3914 +t 4014 4016 3914 +t 3913 3915 4015 +t 4015 3915 4017 +t 3914 4016 3916 +t 4016 4018 3916 +t 3915 3917 4017 +t 4017 3917 4019 +t 3916 4018 3918 +t 4018 4020 3918 +t 3917 3919 4019 +t 4019 3919 4021 +t 3918 4020 3920 +t 4020 4022 3920 +t 3919 3921 4021 +t 4021 3921 4023 +t 3920 4022 3922 +t 4022 4024 3922 +t 3921 3923 4023 +t 4023 3923 4025 +t 3922 4024 3924 +t 4024 4026 3924 +t 3923 3925 4025 +t 4025 3925 4027 +t 3924 4026 3926 +t 4026 4028 3926 +t 3927 3928 4029 +t 4029 3928 4030 +t 3929 4031 3930 +t 4031 4032 3930 +t 3928 3931 4030 +t 4030 3931 4033 +t 3930 4032 3932 +t 4032 4034 3932 +t 3931 3933 4033 +t 4033 3933 4035 +t 3932 4034 3934 +t 4034 4036 3934 +t 3933 3935 4035 +t 4035 3935 4037 +t 3934 4036 3936 +t 4036 4038 3936 +t 3935 3937 4037 +t 4037 3937 4039 +t 3936 4038 3938 +t 4038 4040 3938 +t 3937 3939 4039 +t 4039 3939 4041 +t 3938 4040 3940 +t 4040 4042 3940 +t 3939 3941 4041 +t 4041 3941 4043 +t 3940 4042 3942 +t 4042 4044 3942 +t 3941 3943 4043 +t 4043 3943 4045 +t 3942 4044 3944 +t 4044 4046 3944 +t 3943 3945 4045 +t 4045 3945 4047 +t 3944 4046 3946 +t 4046 4048 3946 +t 3945 3947 4047 +t 4047 3947 4049 +t 3946 4048 3948 +t 4048 4050 3948 +t 3947 3949 4049 +t 4049 3949 4051 +t 3948 4050 3950 +t 4050 4052 3950 +t 3949 3951 4051 +t 4051 3951 4053 +t 3950 4052 3952 +t 4052 4054 3952 +t 3951 3953 4053 +t 4053 3953 4055 +t 3952 4054 3954 +t 4054 4056 3954 +t 3953 3955 4055 +t 4055 3955 4057 +t 3954 4056 3956 +t 4056 4058 3956 +t 3955 3957 4057 +t 4057 3957 4059 +t 3956 4058 3958 +t 4058 4060 3958 +t 3957 3959 4059 +t 4059 3959 4061 +t 3958 4060 3960 +t 4060 4062 3960 +t 3959 3961 4061 +t 4061 3961 4063 +t 3960 4062 3962 +t 4062 4064 3962 +t 3961 3963 4063 +t 4063 3963 4065 +t 3962 4064 3964 +t 4064 4066 3964 +t 3963 3965 4065 +t 4065 3965 4067 +t 3964 4066 3966 +t 4066 4068 3966 +t 3965 3967 4067 +t 4067 3967 4069 +t 3966 4068 3968 +t 4068 4070 3968 +t 3967 3969 4069 +t 4069 3969 4071 +t 3968 4070 3970 +t 4070 4072 3970 +t 3969 3971 4071 +t 4071 3971 4073 +t 3970 4072 3972 +t 4072 4074 3972 +t 3971 3973 4073 +t 4073 3973 4075 +t 3972 4074 3974 +t 4074 4076 3974 +t 3973 3975 4075 +t 4075 3975 4077 +t 3974 4076 3976 +t 4076 4078 3976 +t 3975 3977 4077 +t 4077 3977 4079 +t 3976 4078 3978 +t 4078 4080 3978 +t 3977 3979 4079 +t 4079 3979 4081 +t 3978 4080 3980 +t 4080 4082 3980 +t 3979 3981 4081 +t 4081 3981 4083 +t 3980 4082 3982 +t 4082 4084 3982 +t 3981 3983 4083 +t 4083 3983 4085 +t 3982 4084 3984 +t 4084 4086 3984 +t 3983 3985 4085 +t 4085 3985 4087 +t 3984 4086 3986 +t 4086 4088 3986 +t 3985 3987 4087 +t 4087 3987 4089 +t 3986 4088 3988 +t 4088 4090 3988 +t 3987 3989 4089 +t 4089 3989 4091 +t 3988 4090 3990 +t 4090 4092 3990 +t 3989 3991 4091 +t 4091 3991 4093 +t 3990 4092 3992 +t 4092 4094 3992 +t 3991 3993 4093 +t 4093 3993 4095 +t 3992 4094 3994 +t 4094 4096 3994 +t 3993 3995 4095 +t 4095 3995 4097 +t 3994 4096 3996 +t 4096 4098 3996 +t 3995 3997 4097 +t 4097 3997 4099 +t 3996 4098 3998 +t 4098 4100 3998 +t 3997 3999 4099 +t 4099 3999 4101 +t 3998 4100 4000 +t 4100 4102 4000 +t 3999 4001 4101 +t 4101 4001 4103 +t 4000 4102 4002 +t 4102 4104 4002 +t 4001 4003 4103 +t 4103 4003 4105 +t 4002 4104 4004 +t 4104 4106 4004 +t 4003 4005 4105 +t 4105 4005 4107 +t 4004 4106 4006 +t 4106 4108 4006 +t 4005 4007 4107 +t 4107 4007 4109 +t 4006 4108 4008 +t 4108 4110 4008 +t 4007 4009 4109 +t 4109 4009 4111 +t 4008 4110 4010 +t 4110 4112 4010 +t 4009 4011 4111 +t 4111 4011 4113 +t 4010 4112 4012 +t 4112 4114 4012 +t 4011 4013 4113 +t 4113 4013 4115 +t 4012 4114 4014 +t 4114 4116 4014 +t 4013 4015 4115 +t 4115 4015 4117 +t 4014 4116 4016 +t 4116 4118 4016 +t 4015 4017 4117 +t 4117 4017 4119 +t 4016 4118 4018 +t 4118 4120 4018 +t 4017 4019 4119 +t 4119 4019 4121 +t 4018 4120 4020 +t 4120 4122 4020 +t 4019 4021 4121 +t 4121 4021 4123 +t 4020 4122 4022 +t 4122 4124 4022 +t 4021 4023 4123 +t 4123 4023 4125 +t 4022 4124 4024 +t 4124 4126 4024 +t 4023 4025 4125 +t 4125 4025 4127 +t 4024 4126 4026 +t 4126 4128 4026 +t 4025 4027 4127 +t 4127 4027 4129 +t 4026 4128 4028 +t 4128 4130 4028 +t 4029 4030 4131 +t 4131 4030 4132 +t 4031 4133 4032 +t 4133 4134 4032 +t 4030 4033 4132 +t 4132 4033 4135 +t 4032 4134 4034 +t 4134 4136 4034 +t 4033 4035 4135 +t 4135 4035 4137 +t 4034 4136 4036 +t 4136 4138 4036 +t 4035 4037 4137 +t 4137 4037 4139 +t 4036 4138 4038 +t 4138 4140 4038 +t 4037 4039 4139 +t 4139 4039 4141 +t 4038 4140 4040 +t 4140 4142 4040 +t 4039 4041 4141 +t 4141 4041 4143 +t 4040 4142 4042 +t 4142 4144 4042 +t 4041 4043 4143 +t 4143 4043 4145 +t 4042 4144 4044 +t 4144 4146 4044 +t 4043 4045 4145 +t 4145 4045 4147 +t 4044 4146 4046 +t 4146 4148 4046 +t 4045 4047 4147 +t 4147 4047 4149 +t 4046 4148 4048 +t 4148 4150 4048 +t 4047 4049 4149 +t 4149 4049 4151 +t 4048 4150 4050 +t 4150 4152 4050 +t 4049 4051 4151 +t 4151 4051 4153 +t 4050 4152 4052 +t 4152 4154 4052 +t 4051 4053 4153 +t 4153 4053 4155 +t 4052 4154 4054 +t 4154 4156 4054 +t 4053 4055 4155 +t 4155 4055 4157 +t 4054 4156 4056 +t 4156 4158 4056 +t 4055 4057 4157 +t 4157 4057 4159 +t 4056 4158 4058 +t 4158 4160 4058 +t 4057 4059 4159 +t 4159 4059 4161 +t 4058 4160 4060 +t 4160 4162 4060 +t 4059 4061 4161 +t 4161 4061 4163 +t 4060 4162 4062 +t 4162 4164 4062 +t 4061 4063 4163 +t 4163 4063 4165 +t 4062 4164 4064 +t 4164 4166 4064 +t 4063 4065 4165 +t 4165 4065 4167 +t 4064 4166 4066 +t 4166 4168 4066 +t 4065 4067 4167 +t 4167 4067 4169 +t 4066 4168 4068 +t 4168 4170 4068 +t 4067 4069 4169 +t 4169 4069 4171 +t 4068 4170 4070 +t 4170 4172 4070 +t 4069 4071 4171 +t 4171 4071 4173 +t 4070 4172 4072 +t 4172 4174 4072 +t 4071 4073 4173 +t 4173 4073 4175 +t 4072 4174 4074 +t 4174 4176 4074 +t 4073 4075 4175 +t 4175 4075 4177 +t 4074 4176 4076 +t 4176 4178 4076 +t 4075 4077 4177 +t 4177 4077 4179 +t 4076 4178 4078 +t 4178 4180 4078 +t 4077 4079 4179 +t 4179 4079 4181 +t 4078 4180 4080 +t 4180 4182 4080 +t 4079 4081 4181 +t 4181 4081 4183 +t 4080 4182 4082 +t 4182 4184 4082 +t 4081 4083 4183 +t 4183 4083 4185 +t 4082 4184 4084 +t 4184 4186 4084 +t 4083 4085 4185 +t 4185 4085 4187 +t 4084 4186 4086 +t 4186 4188 4086 +t 4085 4087 4187 +t 4187 4087 4189 +t 4086 4188 4088 +t 4188 4190 4088 +t 4087 4089 4189 +t 4189 4089 4191 +t 4088 4190 4090 +t 4190 4192 4090 +t 4089 4091 4191 +t 4191 4091 4193 +t 4090 4192 4092 +t 4192 4194 4092 +t 4091 4093 4193 +t 4193 4093 4195 +t 4092 4194 4094 +t 4194 4196 4094 +t 4093 4095 4195 +t 4195 4095 4197 +t 4094 4196 4096 +t 4196 4198 4096 +t 4095 4097 4197 +t 4197 4097 4199 +t 4096 4198 4098 +t 4198 4200 4098 +t 4097 4099 4199 +t 4199 4099 4201 +t 4098 4200 4100 +t 4200 4202 4100 +t 4099 4101 4201 +t 4201 4101 4203 +t 4100 4202 4102 +t 4202 4204 4102 +t 4101 4103 4203 +t 4203 4103 4205 +t 4102 4204 4104 +t 4204 4206 4104 +t 4103 4105 4205 +t 4205 4105 4207 +t 4104 4206 4106 +t 4206 4208 4106 +t 4105 4107 4207 +t 4207 4107 4209 +t 4106 4208 4108 +t 4208 4210 4108 +t 4107 4109 4209 +t 4209 4109 4211 +t 4108 4210 4110 +t 4210 4212 4110 +t 4109 4111 4211 +t 4211 4111 4213 +t 4110 4212 4112 +t 4212 4214 4112 +t 4111 4113 4213 +t 4213 4113 4215 +t 4112 4214 4114 +t 4214 4216 4114 +t 4113 4115 4215 +t 4215 4115 4217 +t 4114 4216 4116 +t 4216 4218 4116 +t 4115 4117 4217 +t 4217 4117 4219 +t 4116 4218 4118 +t 4218 4220 4118 +t 4117 4119 4219 +t 4219 4119 4221 +t 4118 4220 4120 +t 4220 4222 4120 +t 4119 4121 4221 +t 4221 4121 4223 +t 4120 4222 4122 +t 4222 4224 4122 +t 4121 4123 4223 +t 4223 4123 4225 +t 4122 4224 4124 +t 4224 4226 4124 +t 4123 4125 4225 +t 4225 4125 4227 +t 4124 4226 4126 +t 4226 4228 4126 +t 4125 4127 4227 +t 4227 4127 4229 +t 4126 4228 4128 +t 4228 4230 4128 +t 4127 4129 4229 +t 4229 4129 4231 +t 4128 4230 4130 +t 4230 4232 4130 +t 4131 4132 4233 +t 4233 4132 4234 +t 4133 4235 4134 +t 4235 4236 4134 +t 4132 4135 4234 +t 4234 4135 4237 +t 4134 4236 4136 +t 4236 4238 4136 +t 4135 4137 4237 +t 4237 4137 4239 +t 4136 4238 4138 +t 4238 4240 4138 +t 4137 4139 4239 +t 4239 4139 4241 +t 4138 4240 4140 +t 4240 4242 4140 +t 4139 4141 4241 +t 4241 4141 4243 +t 4140 4242 4142 +t 4242 4244 4142 +t 4141 4143 4243 +t 4243 4143 4245 +t 4142 4244 4144 +t 4244 4246 4144 +t 4143 4145 4245 +t 4245 4145 4247 +t 4144 4246 4146 +t 4246 4248 4146 +t 4145 4147 4247 +t 4247 4147 4249 +t 4146 4248 4148 +t 4248 4250 4148 +t 4147 4149 4249 +t 4249 4149 4251 +t 4148 4250 4150 +t 4250 4252 4150 +t 4149 4151 4251 +t 4251 4151 4253 +t 4150 4252 4152 +t 4252 4254 4152 +t 4151 4153 4253 +t 4253 4153 4255 +t 4152 4254 4154 +t 4254 4256 4154 +t 4153 4155 4255 +t 4255 4155 4257 +t 4154 4256 4156 +t 4256 4258 4156 +t 4155 4157 4257 +t 4257 4157 4259 +t 4156 4258 4158 +t 4258 4260 4158 +t 4157 4159 4259 +t 4259 4159 4261 +t 4158 4260 4160 +t 4260 4262 4160 +t 4159 4161 4261 +t 4261 4161 4263 +t 4160 4262 4162 +t 4262 4264 4162 +t 4161 4163 4263 +t 4263 4163 4265 +t 4162 4264 4164 +t 4264 4266 4164 +t 4163 4165 4265 +t 4265 4165 4267 +t 4164 4266 4166 +t 4266 4268 4166 +t 4165 4167 4267 +t 4267 4167 4269 +t 4166 4268 4168 +t 4268 4270 4168 +t 4167 4169 4269 +t 4269 4169 4271 +t 4168 4270 4170 +t 4270 4272 4170 +t 4169 4171 4271 +t 4271 4171 4273 +t 4170 4272 4172 +t 4272 4274 4172 +t 4171 4173 4273 +t 4273 4173 4275 +t 4172 4274 4174 +t 4274 4276 4174 +t 4173 4175 4275 +t 4275 4175 4277 +t 4174 4276 4176 +t 4276 4278 4176 +t 4175 4177 4277 +t 4277 4177 4279 +t 4176 4278 4178 +t 4278 4280 4178 +t 4177 4179 4279 +t 4279 4179 4281 +t 4178 4280 4180 +t 4280 4282 4180 +t 4179 4181 4281 +t 4281 4181 4283 +t 4180 4282 4182 +t 4282 4284 4182 +t 4181 4183 4283 +t 4283 4183 4285 +t 4182 4284 4184 +t 4284 4286 4184 +t 4183 4185 4285 +t 4285 4185 4287 +t 4184 4286 4186 +t 4286 4288 4186 +t 4185 4187 4287 +t 4287 4187 4289 +t 4186 4288 4188 +t 4288 4290 4188 +t 4187 4189 4289 +t 4289 4189 4291 +t 4188 4290 4190 +t 4290 4292 4190 +t 4189 4191 4291 +t 4291 4191 4293 +t 4190 4292 4192 +t 4292 4294 4192 +t 4191 4193 4293 +t 4293 4193 4295 +t 4192 4294 4194 +t 4294 4296 4194 +t 4193 4195 4295 +t 4295 4195 4297 +t 4194 4296 4196 +t 4296 4298 4196 +t 4195 4197 4297 +t 4297 4197 4299 +t 4196 4298 4198 +t 4298 4300 4198 +t 4197 4199 4299 +t 4299 4199 4301 +t 4198 4300 4200 +t 4300 4302 4200 +t 4199 4201 4301 +t 4301 4201 4303 +t 4200 4302 4202 +t 4302 4304 4202 +t 4201 4203 4303 +t 4303 4203 4305 +t 4202 4304 4204 +t 4304 4306 4204 +t 4203 4205 4305 +t 4305 4205 4307 +t 4204 4306 4206 +t 4306 4308 4206 +t 4205 4207 4307 +t 4307 4207 4309 +t 4206 4308 4208 +t 4308 4310 4208 +t 4207 4209 4309 +t 4309 4209 4311 +t 4208 4310 4210 +t 4310 4312 4210 +t 4209 4211 4311 +t 4311 4211 4313 +t 4210 4312 4212 +t 4312 4314 4212 +t 4211 4213 4313 +t 4313 4213 4315 +t 4212 4314 4214 +t 4314 4316 4214 +t 4213 4215 4315 +t 4315 4215 4317 +t 4214 4316 4216 +t 4316 4318 4216 +t 4215 4217 4317 +t 4317 4217 4319 +t 4216 4318 4218 +t 4318 4320 4218 +t 4217 4219 4319 +t 4319 4219 4321 +t 4218 4320 4220 +t 4320 4322 4220 +t 4219 4221 4321 +t 4321 4221 4323 +t 4220 4322 4222 +t 4322 4324 4222 +t 4221 4223 4323 +t 4323 4223 4325 +t 4222 4324 4224 +t 4324 4326 4224 +t 4223 4225 4325 +t 4325 4225 4327 +t 4224 4326 4226 +t 4326 4328 4226 +t 4225 4227 4327 +t 4327 4227 4329 +t 4226 4328 4228 +t 4328 4330 4228 +t 4227 4229 4329 +t 4329 4229 4331 +t 4228 4330 4230 +t 4330 4332 4230 +t 4229 4231 4331 +t 4331 4231 4333 +t 4230 4332 4232 +t 4332 4334 4232 +t 4233 4234 4335 +t 4335 4234 4336 +t 4235 4337 4236 +t 4337 4338 4236 +t 4234 4237 4336 +t 4336 4237 4339 +t 4236 4338 4238 +t 4338 4340 4238 +t 4237 4239 4339 +t 4339 4239 4341 +t 4238 4340 4240 +t 4340 4342 4240 +t 4239 4241 4341 +t 4341 4241 4343 +t 4240 4342 4242 +t 4342 4344 4242 +t 4241 4243 4343 +t 4343 4243 4345 +t 4242 4344 4244 +t 4344 4346 4244 +t 4243 4245 4345 +t 4345 4245 4347 +t 4244 4346 4246 +t 4346 4348 4246 +t 4245 4247 4347 +t 4347 4247 4349 +t 4246 4348 4248 +t 4348 4350 4248 +t 4247 4249 4349 +t 4349 4249 4351 +t 4248 4350 4250 +t 4350 4352 4250 +t 4249 4251 4351 +t 4351 4251 4353 +t 4250 4352 4252 +t 4352 4354 4252 +t 4251 4253 4353 +t 4353 4253 4355 +t 4252 4354 4254 +t 4354 4356 4254 +t 4253 4255 4355 +t 4355 4255 4357 +t 4254 4356 4256 +t 4356 4358 4256 +t 4255 4257 4357 +t 4357 4257 4359 +t 4256 4358 4258 +t 4358 4360 4258 +t 4257 4259 4359 +t 4359 4259 4361 +t 4258 4360 4260 +t 4360 4362 4260 +t 4259 4261 4361 +t 4361 4261 4363 +t 4260 4362 4262 +t 4362 4364 4262 +t 4261 4263 4363 +t 4363 4263 4365 +t 4262 4364 4264 +t 4364 4366 4264 +t 4263 4265 4365 +t 4365 4265 4367 +t 4264 4366 4266 +t 4366 4368 4266 +t 4265 4267 4367 +t 4367 4267 4369 +t 4266 4368 4268 +t 4368 4370 4268 +t 4267 4269 4369 +t 4369 4269 4371 +t 4268 4370 4270 +t 4370 4372 4270 +t 4269 4271 4371 +t 4371 4271 4373 +t 4270 4372 4272 +t 4372 4374 4272 +t 4271 4273 4373 +t 4373 4273 4375 +t 4272 4374 4274 +t 4374 4376 4274 +t 4273 4275 4375 +t 4375 4275 4377 +t 4274 4376 4276 +t 4376 4378 4276 +t 4275 4277 4377 +t 4377 4277 4379 +t 4276 4378 4278 +t 4378 4380 4278 +t 4277 4279 4379 +t 4379 4279 4381 +t 4278 4380 4280 +t 4380 4382 4280 +t 4279 4281 4381 +t 4381 4281 4383 +t 4280 4382 4282 +t 4382 4384 4282 +t 4281 4283 4383 +t 4383 4283 4385 +t 4282 4384 4284 +t 4384 4386 4284 +t 4283 4285 4385 +t 4385 4285 4387 +t 4284 4386 4286 +t 4386 4388 4286 +t 4285 4287 4387 +t 4387 4287 4389 +t 4286 4388 4288 +t 4388 4390 4288 +t 4287 4289 4389 +t 4389 4289 4391 +t 4288 4390 4290 +t 4390 4392 4290 +t 4289 4291 4391 +t 4391 4291 4393 +t 4290 4392 4292 +t 4392 4394 4292 +t 4291 4293 4393 +t 4393 4293 4395 +t 4292 4394 4294 +t 4394 4396 4294 +t 4293 4295 4395 +t 4395 4295 4397 +t 4294 4396 4296 +t 4396 4398 4296 +t 4295 4297 4397 +t 4397 4297 4399 +t 4296 4398 4298 +t 4398 4400 4298 +t 4297 4299 4399 +t 4399 4299 4401 +t 4298 4400 4300 +t 4400 4402 4300 +t 4299 4301 4401 +t 4401 4301 4403 +t 4300 4402 4302 +t 4402 4404 4302 +t 4301 4303 4403 +t 4403 4303 4405 +t 4302 4404 4304 +t 4404 4406 4304 +t 4303 4305 4405 +t 4405 4305 4407 +t 4304 4406 4306 +t 4406 4408 4306 +t 4305 4307 4407 +t 4407 4307 4409 +t 4306 4408 4308 +t 4408 4410 4308 +t 4307 4309 4409 +t 4409 4309 4411 +t 4308 4410 4310 +t 4410 4412 4310 +t 4309 4311 4411 +t 4411 4311 4413 +t 4310 4412 4312 +t 4412 4414 4312 +t 4311 4313 4413 +t 4413 4313 4415 +t 4312 4414 4314 +t 4414 4416 4314 +t 4313 4315 4415 +t 4415 4315 4417 +t 4314 4416 4316 +t 4416 4418 4316 +t 4315 4317 4417 +t 4417 4317 4419 +t 4316 4418 4318 +t 4418 4420 4318 +t 4317 4319 4419 +t 4419 4319 4421 +t 4318 4420 4320 +t 4420 4422 4320 +t 4319 4321 4421 +t 4421 4321 4423 +t 4320 4422 4322 +t 4422 4424 4322 +t 4321 4323 4423 +t 4423 4323 4425 +t 4322 4424 4324 +t 4424 4426 4324 +t 4323 4325 4425 +t 4425 4325 4427 +t 4324 4426 4326 +t 4426 4428 4326 +t 4325 4327 4427 +t 4427 4327 4429 +t 4326 4428 4328 +t 4428 4430 4328 +t 4327 4329 4429 +t 4429 4329 4431 +t 4328 4430 4330 +t 4430 4432 4330 +t 4329 4331 4431 +t 4431 4331 4433 +t 4330 4432 4332 +t 4432 4434 4332 +t 4331 4333 4433 +t 4433 4333 4435 +t 4332 4434 4334 +t 4434 4436 4334 +t 4335 4336 4437 +t 4437 4336 4438 +t 4337 4439 4338 +t 4439 4440 4338 +t 4336 4339 4438 +t 4438 4339 4441 +t 4338 4440 4340 +t 4440 4442 4340 +t 4339 4341 4441 +t 4441 4341 4443 +t 4340 4442 4342 +t 4442 4444 4342 +t 4341 4343 4443 +t 4443 4343 4445 +t 4342 4444 4344 +t 4444 4446 4344 +t 4343 4345 4445 +t 4445 4345 4447 +t 4344 4446 4346 +t 4446 4448 4346 +t 4345 4347 4447 +t 4447 4347 4449 +t 4346 4448 4348 +t 4448 4450 4348 +t 4347 4349 4449 +t 4449 4349 4451 +t 4348 4450 4350 +t 4450 4452 4350 +t 4349 4351 4451 +t 4451 4351 4453 +t 4350 4452 4352 +t 4452 4454 4352 +t 4351 4353 4453 +t 4453 4353 4455 +t 4352 4454 4354 +t 4454 4456 4354 +t 4353 4355 4455 +t 4455 4355 4457 +t 4354 4456 4356 +t 4456 4458 4356 +t 4355 4357 4457 +t 4457 4357 4459 +t 4356 4458 4358 +t 4458 4460 4358 +t 4357 4359 4459 +t 4459 4359 4461 +t 4358 4460 4360 +t 4460 4462 4360 +t 4359 4361 4461 +t 4461 4361 4463 +t 4360 4462 4362 +t 4462 4464 4362 +t 4361 4363 4463 +t 4463 4363 4465 +t 4362 4464 4364 +t 4464 4466 4364 +t 4363 4365 4465 +t 4465 4365 4467 +t 4364 4466 4366 +t 4466 4468 4366 +t 4365 4367 4467 +t 4467 4367 4469 +t 4366 4468 4368 +t 4468 4470 4368 +t 4367 4369 4469 +t 4469 4369 4471 +t 4368 4470 4370 +t 4470 4472 4370 +t 4369 4371 4471 +t 4471 4371 4473 +t 4370 4472 4372 +t 4472 4474 4372 +t 4371 4373 4473 +t 4473 4373 4475 +t 4372 4474 4374 +t 4474 4476 4374 +t 4373 4375 4475 +t 4475 4375 4477 +t 4374 4476 4376 +t 4476 4478 4376 +t 4375 4377 4477 +t 4477 4377 4479 +t 4376 4478 4378 +t 4478 4480 4378 +t 4377 4379 4479 +t 4479 4379 4481 +t 4378 4480 4380 +t 4480 4482 4380 +t 4379 4381 4481 +t 4481 4381 4483 +t 4380 4482 4382 +t 4482 4484 4382 +t 4381 4383 4483 +t 4483 4383 4485 +t 4382 4484 4384 +t 4484 4486 4384 +t 4383 4385 4485 +t 4485 4385 4487 +t 4384 4486 4386 +t 4486 4488 4386 +t 4385 4387 4487 +t 4487 4387 4489 +t 4386 4488 4388 +t 4488 4490 4388 +t 4387 4389 4489 +t 4489 4389 4491 +t 4388 4490 4390 +t 4490 4492 4390 +t 4389 4391 4491 +t 4491 4391 4493 +t 4390 4492 4392 +t 4492 4494 4392 +t 4391 4393 4493 +t 4493 4393 4495 +t 4392 4494 4394 +t 4494 4496 4394 +t 4393 4395 4495 +t 4495 4395 4497 +t 4394 4496 4396 +t 4496 4498 4396 +t 4395 4397 4497 +t 4497 4397 4499 +t 4396 4498 4398 +t 4498 4500 4398 +t 4397 4399 4499 +t 4499 4399 4501 +t 4398 4500 4400 +t 4500 4502 4400 +t 4399 4401 4501 +t 4501 4401 4503 +t 4400 4502 4402 +t 4502 4504 4402 +t 4401 4403 4503 +t 4503 4403 4505 +t 4402 4504 4404 +t 4504 4506 4404 +t 4403 4405 4505 +t 4505 4405 4507 +t 4404 4506 4406 +t 4506 4508 4406 +t 4405 4407 4507 +t 4507 4407 4509 +t 4406 4508 4408 +t 4508 4510 4408 +t 4407 4409 4509 +t 4509 4409 4511 +t 4408 4510 4410 +t 4510 4512 4410 +t 4409 4411 4511 +t 4511 4411 4513 +t 4410 4512 4412 +t 4512 4514 4412 +t 4411 4413 4513 +t 4513 4413 4515 +t 4412 4514 4414 +t 4514 4516 4414 +t 4413 4415 4515 +t 4515 4415 4517 +t 4414 4516 4416 +t 4516 4518 4416 +t 4415 4417 4517 +t 4517 4417 4519 +t 4416 4518 4418 +t 4518 4520 4418 +t 4417 4419 4519 +t 4519 4419 4521 +t 4418 4520 4420 +t 4520 4522 4420 +t 4419 4421 4521 +t 4521 4421 4523 +t 4420 4522 4422 +t 4522 4524 4422 +t 4421 4423 4523 +t 4523 4423 4525 +t 4422 4524 4424 +t 4524 4526 4424 +t 4423 4425 4525 +t 4525 4425 4527 +t 4424 4526 4426 +t 4526 4528 4426 +t 4425 4427 4527 +t 4527 4427 4529 +t 4426 4528 4428 +t 4528 4530 4428 +t 4427 4429 4529 +t 4529 4429 4531 +t 4428 4530 4430 +t 4530 4532 4430 +t 4429 4431 4531 +t 4531 4431 4533 +t 4430 4532 4432 +t 4532 4534 4432 +t 4431 4433 4533 +t 4533 4433 4535 +t 4432 4534 4434 +t 4534 4536 4434 +t 4433 4435 4535 +t 4535 4435 4537 +t 4434 4536 4436 +t 4536 4538 4436 +t 4437 4438 4539 +t 4539 4438 4540 +t 4439 4541 4440 +t 4541 4542 4440 +t 4438 4441 4540 +t 4540 4441 4543 +t 4440 4542 4442 +t 4542 4544 4442 +t 4441 4443 4543 +t 4543 4443 4545 +t 4442 4544 4444 +t 4544 4546 4444 +t 4443 4445 4545 +t 4545 4445 4547 +t 4444 4546 4446 +t 4546 4548 4446 +t 4445 4447 4547 +t 4547 4447 4549 +t 4446 4548 4448 +t 4548 4550 4448 +t 4447 4449 4549 +t 4549 4449 4551 +t 4448 4550 4450 +t 4550 4552 4450 +t 4449 4451 4551 +t 4551 4451 4553 +t 4450 4552 4452 +t 4552 4554 4452 +t 4451 4453 4553 +t 4553 4453 4555 +t 4452 4554 4454 +t 4554 4556 4454 +t 4453 4455 4555 +t 4555 4455 4557 +t 4454 4556 4456 +t 4556 4558 4456 +t 4455 4457 4557 +t 4557 4457 4559 +t 4456 4558 4458 +t 4558 4560 4458 +t 4457 4459 4559 +t 4559 4459 4561 +t 4458 4560 4460 +t 4560 4562 4460 +t 4459 4461 4561 +t 4561 4461 4563 +t 4460 4562 4462 +t 4562 4564 4462 +t 4461 4463 4563 +t 4563 4463 4565 +t 4462 4564 4464 +t 4564 4566 4464 +t 4463 4465 4565 +t 4565 4465 4567 +t 4464 4566 4466 +t 4566 4568 4466 +t 4465 4467 4567 +t 4567 4467 4569 +t 4466 4568 4468 +t 4568 4570 4468 +t 4467 4469 4569 +t 4569 4469 4571 +t 4468 4570 4470 +t 4570 4572 4470 +t 4469 4471 4571 +t 4571 4471 4573 +t 4470 4572 4472 +t 4572 4574 4472 +t 4471 4473 4573 +t 4573 4473 4575 +t 4472 4574 4474 +t 4574 4576 4474 +t 4473 4475 4575 +t 4575 4475 4577 +t 4474 4576 4476 +t 4576 4578 4476 +t 4475 4477 4577 +t 4577 4477 4579 +t 4476 4578 4478 +t 4578 4580 4478 +t 4477 4479 4579 +t 4579 4479 4581 +t 4478 4580 4480 +t 4580 4582 4480 +t 4479 4481 4581 +t 4581 4481 4583 +t 4480 4582 4482 +t 4582 4584 4482 +t 4481 4483 4583 +t 4583 4483 4585 +t 4482 4584 4484 +t 4584 4586 4484 +t 4483 4485 4585 +t 4585 4485 4587 +t 4484 4586 4486 +t 4586 4588 4486 +t 4485 4487 4587 +t 4587 4487 4589 +t 4486 4588 4488 +t 4588 4590 4488 +t 4487 4489 4589 +t 4589 4489 4591 +t 4488 4590 4490 +t 4590 4592 4490 +t 4489 4491 4591 +t 4591 4491 4593 +t 4490 4592 4492 +t 4592 4594 4492 +t 4491 4493 4593 +t 4593 4493 4595 +t 4492 4594 4494 +t 4594 4596 4494 +t 4493 4495 4595 +t 4595 4495 4597 +t 4494 4596 4496 +t 4596 4598 4496 +t 4495 4497 4597 +t 4597 4497 4599 +t 4496 4598 4498 +t 4598 4600 4498 +t 4497 4499 4599 +t 4599 4499 4601 +t 4498 4600 4500 +t 4600 4602 4500 +t 4499 4501 4601 +t 4601 4501 4603 +t 4500 4602 4502 +t 4602 4604 4502 +t 4501 4503 4603 +t 4603 4503 4605 +t 4502 4604 4504 +t 4604 4606 4504 +t 4503 4505 4605 +t 4605 4505 4607 +t 4504 4606 4506 +t 4606 4608 4506 +t 4505 4507 4607 +t 4607 4507 4609 +t 4506 4608 4508 +t 4608 4610 4508 +t 4507 4509 4609 +t 4609 4509 4611 +t 4508 4610 4510 +t 4610 4612 4510 +t 4509 4511 4611 +t 4611 4511 4613 +t 4510 4612 4512 +t 4612 4614 4512 +t 4511 4513 4613 +t 4613 4513 4615 +t 4512 4614 4514 +t 4614 4616 4514 +t 4513 4515 4615 +t 4615 4515 4617 +t 4514 4616 4516 +t 4616 4618 4516 +t 4515 4517 4617 +t 4617 4517 4619 +t 4516 4618 4518 +t 4618 4620 4518 +t 4517 4519 4619 +t 4619 4519 4621 +t 4518 4620 4520 +t 4620 4622 4520 +t 4519 4521 4621 +t 4621 4521 4623 +t 4520 4622 4522 +t 4622 4624 4522 +t 4521 4523 4623 +t 4623 4523 4625 +t 4522 4624 4524 +t 4624 4626 4524 +t 4523 4525 4625 +t 4625 4525 4627 +t 4524 4626 4526 +t 4626 4628 4526 +t 4525 4527 4627 +t 4627 4527 4629 +t 4526 4628 4528 +t 4628 4630 4528 +t 4527 4529 4629 +t 4629 4529 4631 +t 4528 4630 4530 +t 4630 4632 4530 +t 4529 4531 4631 +t 4631 4531 4633 +t 4530 4632 4532 +t 4632 4634 4532 +t 4531 4533 4633 +t 4633 4533 4635 +t 4532 4634 4534 +t 4634 4636 4534 +t 4533 4535 4635 +t 4635 4535 4637 +t 4534 4636 4536 +t 4636 4638 4536 +t 4535 4537 4637 +t 4637 4537 4639 +t 4536 4638 4538 +t 4638 4640 4538 +t 4539 4540 4641 +t 4641 4540 4642 +t 4541 4643 4542 +t 4643 4644 4542 +t 4540 4543 4642 +t 4642 4543 4645 +t 4542 4644 4544 +t 4644 4646 4544 +t 4543 4545 4645 +t 4645 4545 4647 +t 4544 4646 4546 +t 4646 4648 4546 +t 4545 4547 4647 +t 4647 4547 4649 +t 4546 4648 4548 +t 4648 4650 4548 +t 4547 4549 4649 +t 4649 4549 4651 +t 4548 4650 4550 +t 4650 4652 4550 +t 4549 4551 4651 +t 4651 4551 4653 +t 4550 4652 4552 +t 4652 4654 4552 +t 4551 4553 4653 +t 4653 4553 4655 +t 4552 4654 4554 +t 4654 4656 4554 +t 4553 4555 4655 +t 4655 4555 4657 +t 4554 4656 4556 +t 4656 4658 4556 +t 4555 4557 4657 +t 4657 4557 4659 +t 4556 4658 4558 +t 4658 4660 4558 +t 4557 4559 4659 +t 4659 4559 4661 +t 4558 4660 4560 +t 4660 4662 4560 +t 4559 4561 4661 +t 4661 4561 4663 +t 4560 4662 4562 +t 4662 4664 4562 +t 4561 4563 4663 +t 4663 4563 4665 +t 4562 4664 4564 +t 4664 4666 4564 +t 4563 4565 4665 +t 4665 4565 4667 +t 4564 4666 4566 +t 4666 4668 4566 +t 4565 4567 4667 +t 4667 4567 4669 +t 4566 4668 4568 +t 4668 4670 4568 +t 4567 4569 4669 +t 4669 4569 4671 +t 4568 4670 4570 +t 4670 4672 4570 +t 4569 4571 4671 +t 4671 4571 4673 +t 4570 4672 4572 +t 4672 4674 4572 +t 4571 4573 4673 +t 4673 4573 4675 +t 4572 4674 4574 +t 4674 4676 4574 +t 4573 4575 4675 +t 4675 4575 4677 +t 4574 4676 4576 +t 4676 4678 4576 +t 4575 4577 4677 +t 4677 4577 4679 +t 4576 4678 4578 +t 4678 4680 4578 +t 4577 4579 4679 +t 4679 4579 4681 +t 4578 4680 4580 +t 4680 4682 4580 +t 4579 4581 4681 +t 4681 4581 4683 +t 4580 4682 4582 +t 4682 4684 4582 +t 4581 4583 4683 +t 4683 4583 4685 +t 4582 4684 4584 +t 4684 4686 4584 +t 4583 4585 4685 +t 4685 4585 4687 +t 4584 4686 4586 +t 4686 4688 4586 +t 4585 4587 4687 +t 4687 4587 4689 +t 4586 4688 4588 +t 4688 4690 4588 +t 4587 4589 4689 +t 4689 4589 4691 +t 4588 4690 4590 +t 4690 4692 4590 +t 4589 4591 4691 +t 4691 4591 4693 +t 4590 4692 4592 +t 4692 4694 4592 +t 4591 4593 4693 +t 4693 4593 4695 +t 4592 4694 4594 +t 4694 4696 4594 +t 4593 4595 4695 +t 4695 4595 4697 +t 4594 4696 4596 +t 4696 4698 4596 +t 4595 4597 4697 +t 4697 4597 4699 +t 4596 4698 4598 +t 4698 4700 4598 +t 4597 4599 4699 +t 4699 4599 4701 +t 4598 4700 4600 +t 4700 4702 4600 +t 4599 4601 4701 +t 4701 4601 4703 +t 4600 4702 4602 +t 4702 4704 4602 +t 4601 4603 4703 +t 4703 4603 4705 +t 4602 4704 4604 +t 4704 4706 4604 +t 4603 4605 4705 +t 4705 4605 4707 +t 4604 4706 4606 +t 4706 4708 4606 +t 4605 4607 4707 +t 4707 4607 4709 +t 4606 4708 4608 +t 4708 4710 4608 +t 4607 4609 4709 +t 4709 4609 4711 +t 4608 4710 4610 +t 4710 4712 4610 +t 4609 4611 4711 +t 4711 4611 4713 +t 4610 4712 4612 +t 4712 4714 4612 +t 4611 4613 4713 +t 4713 4613 4715 +t 4612 4714 4614 +t 4714 4716 4614 +t 4613 4615 4715 +t 4715 4615 4717 +t 4614 4716 4616 +t 4716 4718 4616 +t 4615 4617 4717 +t 4717 4617 4719 +t 4616 4718 4618 +t 4718 4720 4618 +t 4617 4619 4719 +t 4719 4619 4721 +t 4618 4720 4620 +t 4720 4722 4620 +t 4619 4621 4721 +t 4721 4621 4723 +t 4620 4722 4622 +t 4722 4724 4622 +t 4621 4623 4723 +t 4723 4623 4725 +t 4622 4724 4624 +t 4724 4726 4624 +t 4623 4625 4725 +t 4725 4625 4727 +t 4624 4726 4626 +t 4726 4728 4626 +t 4625 4627 4727 +t 4727 4627 4729 +t 4626 4728 4628 +t 4728 4730 4628 +t 4627 4629 4729 +t 4729 4629 4731 +t 4628 4730 4630 +t 4730 4732 4630 +t 4629 4631 4731 +t 4731 4631 4733 +t 4630 4732 4632 +t 4732 4734 4632 +t 4631 4633 4733 +t 4733 4633 4735 +t 4632 4734 4634 +t 4734 4736 4634 +t 4633 4635 4735 +t 4735 4635 4737 +t 4634 4736 4636 +t 4736 4738 4636 +t 4635 4637 4737 +t 4737 4637 4739 +t 4636 4738 4638 +t 4738 4740 4638 +t 4637 4639 4739 +t 4739 4639 4741 +t 4638 4740 4640 +t 4740 4742 4640 +t 4743 4744 4745 +t 4744 4746 4745 +t 4747 4748 4743 +t 4748 4744 4743 +t 4749 4750 4747 +t 4750 4748 4747 +t 4751 4752 4749 +t 4752 4750 4749 +t 4753 4754 4751 +t 4754 4752 4751 +t 4755 4756 4753 +t 4756 4754 4753 +t 4757 4758 4755 +t 4758 4756 4755 +t 4759 4760 4757 +t 4760 4758 4757 +t 4761 4762 4759 +t 4762 4760 4759 +t 4763 4764 4761 +t 4764 4762 4761 +t 4765 4766 4763 +t 4766 4764 4763 +t 4767 4768 4765 +t 4768 4766 4765 +t 4769 4770 4767 +t 4770 4768 4767 +t 4771 4772 4769 +t 4772 4770 4769 +t 4773 4774 4771 +t 4774 4772 4771 +t 4775 4776 4773 +t 4776 4774 4773 +t 4777 4778 4775 +t 4778 4776 4775 +t 4641 4642 4778 +t 4777 4641 4778 +t 4779 4780 4644 +t 4643 4779 4644 +t 4781 4782 4779 +t 4782 4780 4779 +t 4783 4784 4781 +t 4784 4782 4781 +t 4785 4786 4783 +t 4786 4784 4783 +t 4787 4788 4785 +t 4788 4786 4785 +t 4789 4790 4787 +t 4790 4788 4787 +t 4791 4792 4789 +t 4792 4790 4789 +t 4793 4794 4791 +t 4794 4792 4791 +t 4795 4796 4793 +t 4796 4794 4793 +t 4797 4798 4795 +t 4798 4796 4795 +t 4799 4800 4797 +t 4800 4798 4797 +t 4801 4802 4799 +t 4802 4800 4799 +t 4803 4804 4801 +t 4804 4802 4801 +t 4805 4806 4803 +t 4806 4804 4803 +t 4807 4808 4805 +t 4808 4806 4805 +t 4809 4810 4807 +t 4810 4808 4807 +t 4811 4812 4809 +t 4812 4810 4809 +t 4813 4814 4811 +t 4814 4812 4811 +t 4744 4815 4746 +t 4815 4816 4746 +t 4748 4817 4744 +t 4817 4815 4744 +t 4750 4818 4748 +t 4818 4817 4748 +t 4752 4819 4750 +t 4819 4818 4750 +t 4754 4820 4752 +t 4820 4819 4752 +t 4756 4821 4754 +t 4821 4820 4754 +t 4758 4822 4756 +t 4822 4821 4756 +t 4760 4823 4758 +t 4823 4822 4758 +t 4762 4824 4760 +t 4824 4823 4760 +t 4764 4825 4762 +t 4825 4824 4762 +t 4766 4826 4764 +t 4826 4825 4764 +t 4768 4827 4766 +t 4827 4826 4766 +t 4770 4828 4768 +t 4828 4827 4768 +t 4772 4829 4770 +t 4829 4828 4770 +t 4774 4830 4772 +t 4830 4829 4772 +t 4776 4831 4774 +t 4831 4830 4774 +t 4778 4832 4776 +t 4832 4831 4776 +t 4642 4645 4832 +t 4778 4642 4832 +t 4780 4833 4646 +t 4644 4780 4646 +t 4782 4834 4780 +t 4834 4833 4780 +t 4784 4835 4782 +t 4835 4834 4782 +t 4786 4836 4784 +t 4836 4835 4784 +t 4788 4837 4786 +t 4837 4836 4786 +t 4790 4838 4788 +t 4838 4837 4788 +t 4792 4839 4790 +t 4839 4838 4790 +t 4794 4840 4792 +t 4840 4839 4792 +t 4796 4841 4794 +t 4841 4840 4794 +t 4798 4842 4796 +t 4842 4841 4796 +t 4800 4843 4798 +t 4843 4842 4798 +t 4802 4844 4800 +t 4844 4843 4800 +t 4804 4845 4802 +t 4845 4844 4802 +t 4806 4846 4804 +t 4846 4845 4804 +t 4808 4847 4806 +t 4847 4846 4806 +t 4810 4848 4808 +t 4848 4847 4808 +t 4812 4849 4810 +t 4849 4848 4810 +t 4814 4850 4812 +t 4850 4849 4812 +t 4815 4851 4816 +t 4851 4852 4816 +t 4817 4853 4815 +t 4853 4851 4815 +t 4818 4854 4817 +t 4854 4853 4817 +t 4819 4855 4818 +t 4855 4854 4818 +t 4820 4856 4819 +t 4856 4855 4819 +t 4821 4857 4820 +t 4857 4856 4820 +t 4822 4858 4821 +t 4858 4857 4821 +t 4823 4859 4822 +t 4859 4858 4822 +t 4824 4860 4823 +t 4860 4859 4823 +t 4825 4861 4824 +t 4861 4860 4824 +t 4826 4862 4825 +t 4862 4861 4825 +t 4827 4863 4826 +t 4863 4862 4826 +t 4828 4864 4827 +t 4864 4863 4827 +t 4829 4865 4828 +t 4865 4864 4828 +t 4830 4866 4829 +t 4866 4865 4829 +t 4831 4867 4830 +t 4867 4866 4830 +t 4832 4868 4831 +t 4868 4867 4831 +t 4645 4647 4868 +t 4832 4645 4868 +t 4833 4869 4648 +t 4646 4833 4648 +t 4834 4870 4833 +t 4870 4869 4833 +t 4835 4871 4834 +t 4871 4870 4834 +t 4836 4872 4835 +t 4872 4871 4835 +t 4837 4873 4836 +t 4873 4872 4836 +t 4838 4874 4837 +t 4874 4873 4837 +t 4839 4875 4838 +t 4875 4874 4838 +t 4840 4876 4839 +t 4876 4875 4839 +t 4841 4877 4840 +t 4877 4876 4840 +t 4842 4878 4841 +t 4878 4877 4841 +t 4843 4879 4842 +t 4879 4878 4842 +t 4844 4880 4843 +t 4880 4879 4843 +t 4845 4881 4844 +t 4881 4880 4844 +t 4846 4882 4845 +t 4882 4881 4845 +t 4847 4883 4846 +t 4883 4882 4846 +t 4848 4884 4847 +t 4884 4883 4847 +t 4849 4885 4848 +t 4885 4884 4848 +t 4850 4886 4849 +t 4886 4885 4849 +t 4851 4887 4852 +t 4887 4888 4852 +t 4853 4889 4851 +t 4889 4887 4851 +t 4854 4890 4853 +t 4890 4889 4853 +t 4855 4891 4854 +t 4891 4890 4854 +t 4856 4892 4855 +t 4892 4891 4855 +t 4857 4893 4856 +t 4893 4892 4856 +t 4858 4894 4857 +t 4894 4893 4857 +t 4859 4895 4858 +t 4895 4894 4858 +t 4860 4896 4859 +t 4896 4895 4859 +t 4861 4897 4860 +t 4897 4896 4860 +t 4862 4898 4861 +t 4898 4897 4861 +t 4863 4899 4862 +t 4899 4898 4862 +t 4864 4900 4863 +t 4900 4899 4863 +t 4865 4901 4864 +t 4901 4900 4864 +t 4866 4902 4865 +t 4902 4901 4865 +t 4867 4903 4866 +t 4903 4902 4866 +t 4868 4904 4867 +t 4904 4903 4867 +t 4647 4649 4904 +t 4868 4647 4904 +t 4869 4905 4650 +t 4648 4869 4650 +t 4870 4906 4869 +t 4906 4905 4869 +t 4871 4907 4870 +t 4907 4906 4870 +t 4872 4908 4871 +t 4908 4907 4871 +t 4873 4909 4872 +t 4909 4908 4872 +t 4874 4910 4873 +t 4910 4909 4873 +t 4875 4911 4874 +t 4911 4910 4874 +t 4876 4912 4875 +t 4912 4911 4875 +t 4877 4913 4876 +t 4913 4912 4876 +t 4878 4914 4877 +t 4914 4913 4877 +t 4879 4915 4878 +t 4915 4914 4878 +t 4880 4916 4879 +t 4916 4915 4879 +t 4881 4917 4880 +t 4917 4916 4880 +t 4882 4918 4881 +t 4918 4917 4881 +t 4883 4919 4882 +t 4919 4918 4882 +t 4884 4920 4883 +t 4920 4919 4883 +t 4885 4921 4884 +t 4921 4920 4884 +t 4886 4922 4885 +t 4922 4921 4885 +t 4887 4923 4888 +t 4923 4924 4888 +t 4889 4925 4887 +t 4925 4923 4887 +t 4890 4926 4889 +t 4926 4925 4889 +t 4891 4927 4890 +t 4927 4926 4890 +t 4892 4928 4891 +t 4928 4927 4891 +t 4893 4929 4892 +t 4929 4928 4892 +t 4894 4930 4893 +t 4930 4929 4893 +t 4895 4931 4894 +t 4931 4930 4894 +t 4896 4932 4895 +t 4932 4931 4895 +t 4897 4933 4896 +t 4933 4932 4896 +t 4898 4934 4897 +t 4934 4933 4897 +t 4899 4935 4898 +t 4935 4934 4898 +t 4900 4936 4899 +t 4936 4935 4899 +t 4901 4937 4900 +t 4937 4936 4900 +t 4902 4938 4901 +t 4938 4937 4901 +t 4903 4939 4902 +t 4939 4938 4902 +t 4904 4940 4903 +t 4940 4939 4903 +t 4649 4651 4940 +t 4904 4649 4940 +t 4905 4941 4652 +t 4650 4905 4652 +t 4906 4942 4905 +t 4942 4941 4905 +t 4907 4943 4906 +t 4943 4942 4906 +t 4908 4944 4907 +t 4944 4943 4907 +t 4909 4945 4908 +t 4945 4944 4908 +t 4910 4946 4909 +t 4946 4945 4909 +t 4911 4947 4910 +t 4947 4946 4910 +t 4912 4948 4911 +t 4948 4947 4911 +t 4913 4949 4912 +t 4949 4948 4912 +t 4914 4950 4913 +t 4950 4949 4913 +t 4915 4951 4914 +t 4951 4950 4914 +t 4916 4952 4915 +t 4952 4951 4915 +t 4917 4953 4916 +t 4953 4952 4916 +t 4918 4954 4917 +t 4954 4953 4917 +t 4919 4955 4918 +t 4955 4954 4918 +t 4920 4956 4919 +t 4956 4955 4919 +t 4921 4957 4920 +t 4957 4956 4920 +t 4922 4958 4921 +t 4958 4957 4921 +t 4923 4959 4924 +t 4959 4960 4924 +t 4925 4961 4923 +t 4961 4959 4923 +t 4926 4962 4925 +t 4962 4961 4925 +t 4927 4963 4926 +t 4963 4962 4926 +t 4928 4964 4927 +t 4964 4963 4927 +t 4929 4965 4928 +t 4965 4964 4928 +t 4930 4966 4929 +t 4966 4965 4929 +t 4931 4967 4930 +t 4967 4966 4930 +t 4932 4968 4931 +t 4968 4967 4931 +t 4933 4969 4932 +t 4969 4968 4932 +t 4934 4970 4933 +t 4970 4969 4933 +t 4935 4971 4934 +t 4971 4970 4934 +t 4936 4972 4935 +t 4972 4971 4935 +t 4937 4973 4936 +t 4973 4972 4936 +t 4938 4974 4937 +t 4974 4973 4937 +t 4939 4975 4938 +t 4975 4974 4938 +t 4940 4976 4939 +t 4976 4975 4939 +t 4651 4653 4976 +t 4940 4651 4976 +t 4941 4977 4654 +t 4652 4941 4654 +t 4942 4978 4941 +t 4978 4977 4941 +t 4943 4979 4942 +t 4979 4978 4942 +t 4944 4980 4943 +t 4980 4979 4943 +t 4945 4981 4944 +t 4981 4980 4944 +t 4946 4982 4945 +t 4982 4981 4945 +t 4947 4983 4946 +t 4983 4982 4946 +t 4948 4984 4947 +t 4984 4983 4947 +t 4949 4985 4948 +t 4985 4984 4948 +t 4950 4986 4949 +t 4986 4985 4949 +t 4951 4987 4950 +t 4987 4986 4950 +t 4952 4988 4951 +t 4988 4987 4951 +t 4953 4989 4952 +t 4989 4988 4952 +t 4954 4990 4953 +t 4990 4989 4953 +t 4955 4991 4954 +t 4991 4990 4954 +t 4956 4992 4955 +t 4992 4991 4955 +t 4957 4993 4956 +t 4993 4992 4956 +t 4958 4994 4957 +t 4994 4993 4957 +t 4959 4995 4960 +t 4995 4996 4960 +t 4961 4997 4959 +t 4997 4995 4959 +t 4962 4998 4961 +t 4998 4997 4961 +t 4963 4999 4962 +t 4999 4998 4962 +t 4964 5000 4963 +t 5000 4999 4963 +t 4965 5001 4964 +t 5001 5000 4964 +t 4966 5002 4965 +t 5002 5001 4965 +t 4967 5003 4966 +t 5003 5002 4966 +t 4968 5004 4967 +t 5004 5003 4967 +t 4969 5005 4968 +t 5005 5004 4968 +t 4970 5006 4969 +t 5006 5005 4969 +t 4971 5007 4970 +t 5007 5006 4970 +t 4972 5008 4971 +t 5008 5007 4971 +t 4973 5009 4972 +t 5009 5008 4972 +t 4974 5010 4973 +t 5010 5009 4973 +t 4975 5011 4974 +t 5011 5010 4974 +t 4976 5012 4975 +t 5012 5011 4975 +t 4653 4655 5012 +t 4976 4653 5012 +t 4977 5013 4656 +t 4654 4977 4656 +t 4978 5014 4977 +t 5014 5013 4977 +t 4979 5015 4978 +t 5015 5014 4978 +t 4980 5016 4979 +t 5016 5015 4979 +t 4981 5017 4980 +t 5017 5016 4980 +t 4982 5018 4981 +t 5018 5017 4981 +t 4983 5019 4982 +t 5019 5018 4982 +t 4984 5020 4983 +t 5020 5019 4983 +t 4985 5021 4984 +t 5021 5020 4984 +t 4986 5022 4985 +t 5022 5021 4985 +t 4987 5023 4986 +t 5023 5022 4986 +t 4988 5024 4987 +t 5024 5023 4987 +t 4989 5025 4988 +t 5025 5024 4988 +t 4990 5026 4989 +t 5026 5025 4989 +t 4991 5027 4990 +t 5027 5026 4990 +t 4992 5028 4991 +t 5028 5027 4991 +t 4993 5029 4992 +t 5029 5028 4992 +t 4994 5030 4993 +t 5030 5029 4993 +t 4995 5031 4996 +t 5031 5032 4996 +t 4997 5033 4995 +t 5033 5031 4995 +t 4998 5034 4997 +t 5034 5033 4997 +t 4999 5035 4998 +t 5035 5034 4998 +t 5000 5036 4999 +t 5036 5035 4999 +t 5001 5037 5000 +t 5037 5036 5000 +t 5002 5038 5001 +t 5038 5037 5001 +t 5003 5039 5002 +t 5039 5038 5002 +t 5004 5040 5003 +t 5040 5039 5003 +t 5005 5041 5004 +t 5041 5040 5004 +t 5006 5042 5005 +t 5042 5041 5005 +t 5007 5043 5006 +t 5043 5042 5006 +t 5008 5044 5007 +t 5044 5043 5007 +t 5009 5045 5008 +t 5045 5044 5008 +t 5010 5046 5009 +t 5046 5045 5009 +t 5011 5047 5010 +t 5047 5046 5010 +t 5012 5048 5011 +t 5048 5047 5011 +t 4655 4657 5048 +t 5012 4655 5048 +t 5013 5049 4658 +t 4656 5013 4658 +t 5014 5050 5013 +t 5050 5049 5013 +t 5015 5051 5014 +t 5051 5050 5014 +t 5016 5052 5015 +t 5052 5051 5015 +t 5017 5053 5016 +t 5053 5052 5016 +t 5018 5054 5017 +t 5054 5053 5017 +t 5019 5055 5018 +t 5055 5054 5018 +t 5020 5056 5019 +t 5056 5055 5019 +t 5021 5057 5020 +t 5057 5056 5020 +t 5022 5058 5021 +t 5058 5057 5021 +t 5023 5059 5022 +t 5059 5058 5022 +t 5024 5060 5023 +t 5060 5059 5023 +t 5025 5061 5024 +t 5061 5060 5024 +t 5026 5062 5025 +t 5062 5061 5025 +t 5027 5063 5026 +t 5063 5062 5026 +t 5028 5064 5027 +t 5064 5063 5027 +t 5029 5065 5028 +t 5065 5064 5028 +t 5030 5066 5029 +t 5066 5065 5029 +t 5031 5067 5032 +t 5067 5068 5032 +t 5033 5069 5031 +t 5069 5067 5031 +t 5034 5070 5033 +t 5070 5069 5033 +t 5035 5071 5034 +t 5071 5070 5034 +t 5036 5072 5035 +t 5072 5071 5035 +t 5037 5073 5036 +t 5073 5072 5036 +t 5038 5074 5037 +t 5074 5073 5037 +t 5039 5075 5038 +t 5075 5074 5038 +t 5040 5076 5039 +t 5076 5075 5039 +t 5041 5077 5040 +t 5077 5076 5040 +t 5042 5078 5041 +t 5078 5077 5041 +t 5043 5079 5042 +t 5079 5078 5042 +t 5044 5080 5043 +t 5080 5079 5043 +t 5045 5081 5044 +t 5081 5080 5044 +t 5046 5082 5045 +t 5082 5081 5045 +t 5047 5083 5046 +t 5083 5082 5046 +t 5048 5084 5047 +t 5084 5083 5047 +t 4657 4659 5084 +t 5048 4657 5084 +t 5049 5085 4660 +t 4658 5049 4660 +t 5050 5086 5049 +t 5086 5085 5049 +t 5051 5087 5050 +t 5087 5086 5050 +t 5052 5088 5051 +t 5088 5087 5051 +t 5053 5089 5052 +t 5089 5088 5052 +t 5054 5090 5053 +t 5090 5089 5053 +t 5055 5091 5054 +t 5091 5090 5054 +t 5056 5092 5055 +t 5092 5091 5055 +t 5057 5093 5056 +t 5093 5092 5056 +t 5058 5094 5057 +t 5094 5093 5057 +t 5059 5095 5058 +t 5095 5094 5058 +t 5060 5096 5059 +t 5096 5095 5059 +t 5061 5097 5060 +t 5097 5096 5060 +t 5062 5098 5061 +t 5098 5097 5061 +t 5063 5099 5062 +t 5099 5098 5062 +t 5064 5100 5063 +t 5100 5099 5063 +t 5065 5101 5064 +t 5101 5100 5064 +t 5066 5102 5065 +t 5102 5101 5065 +t 5067 5103 5068 +t 5103 5104 5068 +t 5069 5105 5067 +t 5105 5103 5067 +t 5070 5106 5069 +t 5106 5105 5069 +t 5071 5107 5070 +t 5107 5106 5070 +t 5072 5108 5071 +t 5108 5107 5071 +t 5073 5109 5072 +t 5109 5108 5072 +t 5074 5110 5073 +t 5110 5109 5073 +t 5075 5111 5074 +t 5111 5110 5074 +t 5076 5112 5075 +t 5112 5111 5075 +t 5077 5113 5076 +t 5113 5112 5076 +t 5078 5114 5077 +t 5114 5113 5077 +t 5079 5115 5078 +t 5115 5114 5078 +t 5080 5116 5079 +t 5116 5115 5079 +t 5081 5117 5080 +t 5117 5116 5080 +t 5082 5118 5081 +t 5118 5117 5081 +t 5083 5119 5082 +t 5119 5118 5082 +t 5084 5120 5083 +t 5120 5119 5083 +t 4659 4661 5120 +t 5084 4659 5120 +t 5085 5121 4662 +t 4660 5085 4662 +t 5086 5122 5085 +t 5122 5121 5085 +t 5087 5123 5086 +t 5123 5122 5086 +t 5088 5124 5087 +t 5124 5123 5087 +t 5089 5125 5088 +t 5125 5124 5088 +t 5090 5126 5089 +t 5126 5125 5089 +t 5091 5127 5090 +t 5127 5126 5090 +t 5092 5128 5091 +t 5128 5127 5091 +t 5093 5129 5092 +t 5129 5128 5092 +t 5094 5130 5093 +t 5130 5129 5093 +t 5095 5131 5094 +t 5131 5130 5094 +t 5096 5132 5095 +t 5132 5131 5095 +t 5097 5133 5096 +t 5133 5132 5096 +t 5098 5134 5097 +t 5134 5133 5097 +t 5099 5135 5098 +t 5135 5134 5098 +t 5100 5136 5099 +t 5136 5135 5099 +t 5101 5137 5100 +t 5137 5136 5100 +t 5102 5138 5101 +t 5138 5137 5101 +t 5103 5139 5104 +t 5139 5140 5104 +t 5105 5141 5103 +t 5141 5139 5103 +t 5106 5142 5105 +t 5142 5141 5105 +t 5107 5143 5106 +t 5143 5142 5106 +t 5108 5144 5107 +t 5144 5143 5107 +t 5109 5145 5108 +t 5145 5144 5108 +t 5110 5146 5109 +t 5146 5145 5109 +t 5111 5147 5110 +t 5147 5146 5110 +t 5112 5148 5111 +t 5148 5147 5111 +t 5113 5149 5112 +t 5149 5148 5112 +t 5114 5150 5113 +t 5150 5149 5113 +t 5115 5151 5114 +t 5151 5150 5114 +t 5116 5152 5115 +t 5152 5151 5115 +t 5117 5153 5116 +t 5153 5152 5116 +t 5118 5154 5117 +t 5154 5153 5117 +t 5119 5155 5118 +t 5155 5154 5118 +t 5120 5156 5119 +t 5156 5155 5119 +t 4661 4663 5156 +t 5120 4661 5156 +t 5121 5157 4664 +t 4662 5121 4664 +t 5122 5158 5121 +t 5158 5157 5121 +t 5123 5159 5122 +t 5159 5158 5122 +t 5124 5160 5123 +t 5160 5159 5123 +t 5125 5161 5124 +t 5161 5160 5124 +t 5126 5162 5125 +t 5162 5161 5125 +t 5127 5163 5126 +t 5163 5162 5126 +t 5128 5164 5127 +t 5164 5163 5127 +t 5129 5165 5128 +t 5165 5164 5128 +t 5130 5166 5129 +t 5166 5165 5129 +t 5131 5167 5130 +t 5167 5166 5130 +t 5132 5168 5131 +t 5168 5167 5131 +t 5133 5169 5132 +t 5169 5168 5132 +t 5134 5170 5133 +t 5170 5169 5133 +t 5135 5171 5134 +t 5171 5170 5134 +t 5136 5172 5135 +t 5172 5171 5135 +t 5137 5173 5136 +t 5173 5172 5136 +t 5138 5174 5137 +t 5174 5173 5137 +t 5139 5175 5140 +t 5175 5176 5140 +t 5141 5177 5139 +t 5177 5175 5139 +t 5142 5178 5141 +t 5178 5177 5141 +t 5143 5179 5142 +t 5179 5178 5142 +t 5144 5180 5143 +t 5180 5179 5143 +t 5145 5181 5144 +t 5181 5180 5144 +t 5146 5182 5145 +t 5182 5181 5145 +t 5147 5183 5146 +t 5183 5182 5146 +t 5148 5184 5147 +t 5184 5183 5147 +t 5149 5185 5148 +t 5185 5184 5148 +t 5150 5186 5149 +t 5186 5185 5149 +t 5151 5187 5150 +t 5187 5186 5150 +t 5152 5188 5151 +t 5188 5187 5151 +t 5153 5189 5152 +t 5189 5188 5152 +t 5154 5190 5153 +t 5190 5189 5153 +t 5155 5191 5154 +t 5191 5190 5154 +t 5156 5192 5155 +t 5192 5191 5155 +t 4663 4665 5192 +t 5156 4663 5192 +t 5157 5193 4666 +t 4664 5157 4666 +t 5158 5194 5157 +t 5194 5193 5157 +t 5159 5195 5158 +t 5195 5194 5158 +t 5160 5196 5159 +t 5196 5195 5159 +t 5161 5197 5160 +t 5197 5196 5160 +t 5162 5198 5161 +t 5198 5197 5161 +t 5163 5199 5162 +t 5199 5198 5162 +t 5164 5200 5163 +t 5200 5199 5163 +t 5165 5201 5164 +t 5201 5200 5164 +t 5166 5202 5165 +t 5202 5201 5165 +t 5167 5203 5166 +t 5203 5202 5166 +t 5168 5204 5167 +t 5204 5203 5167 +t 5169 5205 5168 +t 5205 5204 5168 +t 5170 5206 5169 +t 5206 5205 5169 +t 5171 5207 5170 +t 5207 5206 5170 +t 5172 5208 5171 +t 5208 5207 5171 +t 5173 5209 5172 +t 5209 5208 5172 +t 5174 5210 5173 +t 5210 5209 5173 +t 5175 5211 5176 +t 5211 5212 5176 +t 5177 5213 5175 +t 5213 5211 5175 +t 5178 5214 5177 +t 5214 5213 5177 +t 5179 5215 5178 +t 5215 5214 5178 +t 5180 5216 5179 +t 5216 5215 5179 +t 5181 5217 5180 +t 5217 5216 5180 +t 5182 5218 5181 +t 5218 5217 5181 +t 5183 5219 5182 +t 5219 5218 5182 +t 5184 5220 5183 +t 5220 5219 5183 +t 5185 5221 5184 +t 5221 5220 5184 +t 5186 5222 5185 +t 5222 5221 5185 +t 5187 5223 5186 +t 5223 5222 5186 +t 5188 5224 5187 +t 5224 5223 5187 +t 5189 5225 5188 +t 5225 5224 5188 +t 5190 5226 5189 +t 5226 5225 5189 +t 5191 5227 5190 +t 5227 5226 5190 +t 5192 5228 5191 +t 5228 5227 5191 +t 4665 4667 5228 +t 5192 4665 5228 +t 5193 5229 4668 +t 4666 5193 4668 +t 5194 5230 5193 +t 5230 5229 5193 +t 5195 5231 5194 +t 5231 5230 5194 +t 5196 5232 5195 +t 5232 5231 5195 +t 5197 5233 5196 +t 5233 5232 5196 +t 5198 5234 5197 +t 5234 5233 5197 +t 5199 5235 5198 +t 5235 5234 5198 +t 5200 5236 5199 +t 5236 5235 5199 +t 5201 5237 5200 +t 5237 5236 5200 +t 5202 5238 5201 +t 5238 5237 5201 +t 5203 5239 5202 +t 5239 5238 5202 +t 5204 5240 5203 +t 5240 5239 5203 +t 5205 5241 5204 +t 5241 5240 5204 +t 5206 5242 5205 +t 5242 5241 5205 +t 5207 5243 5206 +t 5243 5242 5206 +t 5208 5244 5207 +t 5244 5243 5207 +t 5209 5245 5208 +t 5245 5244 5208 +t 5210 5246 5209 +t 5246 5245 5209 +t 5211 5247 5212 +t 5247 5248 5212 +t 5213 5249 5211 +t 5249 5247 5211 +t 5214 5250 5213 +t 5250 5249 5213 +t 5215 5251 5214 +t 5251 5250 5214 +t 5216 5252 5215 +t 5252 5251 5215 +t 5217 5253 5216 +t 5253 5252 5216 +t 5218 5254 5217 +t 5254 5253 5217 +t 5219 5255 5218 +t 5255 5254 5218 +t 5220 5256 5219 +t 5256 5255 5219 +t 5221 5257 5220 +t 5257 5256 5220 +t 5222 5258 5221 +t 5258 5257 5221 +t 5223 5259 5222 +t 5259 5258 5222 +t 5224 5260 5223 +t 5260 5259 5223 +t 5225 5261 5224 +t 5261 5260 5224 +t 5226 5262 5225 +t 5262 5261 5225 +t 5227 5263 5226 +t 5263 5262 5226 +t 5228 5264 5227 +t 5264 5263 5227 +t 4667 4669 5264 +t 5228 4667 5264 +t 5229 5265 4670 +t 4668 5229 4670 +t 5230 5266 5229 +t 5266 5265 5229 +t 5231 5267 5230 +t 5267 5266 5230 +t 5232 5268 5231 +t 5268 5267 5231 +t 5233 5269 5232 +t 5269 5268 5232 +t 5234 5270 5233 +t 5270 5269 5233 +t 5235 5271 5234 +t 5271 5270 5234 +t 5236 5272 5235 +t 5272 5271 5235 +t 5237 5273 5236 +t 5273 5272 5236 +t 5238 5274 5237 +t 5274 5273 5237 +t 5239 5275 5238 +t 5275 5274 5238 +t 5240 5276 5239 +t 5276 5275 5239 +t 5241 5277 5240 +t 5277 5276 5240 +t 5242 5278 5241 +t 5278 5277 5241 +t 5243 5279 5242 +t 5279 5278 5242 +t 5244 5280 5243 +t 5280 5279 5243 +t 5245 5281 5244 +t 5281 5280 5244 +t 5246 5282 5245 +t 5282 5281 5245 +t 5247 5283 5248 +t 5283 5284 5248 +t 5249 5285 5247 +t 5285 5283 5247 +t 5250 5286 5249 +t 5286 5285 5249 +t 5251 5287 5250 +t 5287 5286 5250 +t 5252 5288 5251 +t 5288 5287 5251 +t 5253 5289 5252 +t 5289 5288 5252 +t 5254 5290 5253 +t 5290 5289 5253 +t 5255 5291 5254 +t 5291 5290 5254 +t 5256 5292 5255 +t 5292 5291 5255 +t 5257 5293 5256 +t 5293 5292 5256 +t 5258 5294 5257 +t 5294 5293 5257 +t 5259 5295 5258 +t 5295 5294 5258 +t 5260 5296 5259 +t 5296 5295 5259 +t 5261 5297 5260 +t 5297 5296 5260 +t 5262 5298 5261 +t 5298 5297 5261 +t 5263 5299 5262 +t 5299 5298 5262 +t 5264 5300 5263 +t 5300 5299 5263 +t 4669 4671 5300 +t 5264 4669 5300 +t 5265 5301 4672 +t 4670 5265 4672 +t 5266 5302 5265 +t 5302 5301 5265 +t 5267 5303 5266 +t 5303 5302 5266 +t 5268 5304 5267 +t 5304 5303 5267 +t 5269 5305 5268 +t 5305 5304 5268 +t 5270 5306 5269 +t 5306 5305 5269 +t 5271 5307 5270 +t 5307 5306 5270 +t 5272 5308 5271 +t 5308 5307 5271 +t 5273 5309 5272 +t 5309 5308 5272 +t 5274 5310 5273 +t 5310 5309 5273 +t 5275 5311 5274 +t 5311 5310 5274 +t 5276 5312 5275 +t 5312 5311 5275 +t 5277 5313 5276 +t 5313 5312 5276 +t 5278 5314 5277 +t 5314 5313 5277 +t 5279 5315 5278 +t 5315 5314 5278 +t 5280 5316 5279 +t 5316 5315 5279 +t 5281 5317 5280 +t 5317 5316 5280 +t 5282 5318 5281 +t 5318 5317 5281 +t 5283 5319 5284 +t 5319 5320 5284 +t 5285 5321 5283 +t 5321 5319 5283 +t 5286 5322 5285 +t 5322 5321 5285 +t 5287 5323 5286 +t 5323 5322 5286 +t 5288 5324 5287 +t 5324 5323 5287 +t 5289 5325 5288 +t 5325 5324 5288 +t 5290 5326 5289 +t 5326 5325 5289 +t 5291 5327 5290 +t 5327 5326 5290 +t 5292 5328 5291 +t 5328 5327 5291 +t 5293 5329 5292 +t 5329 5328 5292 +t 5294 5330 5293 +t 5330 5329 5293 +t 5295 5331 5294 +t 5331 5330 5294 +t 5296 5332 5295 +t 5332 5331 5295 +t 5297 5333 5296 +t 5333 5332 5296 +t 5298 5334 5297 +t 5334 5333 5297 +t 5299 5335 5298 +t 5335 5334 5298 +t 5300 5336 5299 +t 5336 5335 5299 +t 4671 4673 5336 +t 5300 4671 5336 +t 5301 5337 4674 +t 4672 5301 4674 +t 5302 5338 5301 +t 5338 5337 5301 +t 5303 5339 5302 +t 5339 5338 5302 +t 5304 5340 5303 +t 5340 5339 5303 +t 5305 5341 5304 +t 5341 5340 5304 +t 5306 5342 5305 +t 5342 5341 5305 +t 5307 5343 5306 +t 5343 5342 5306 +t 5308 5344 5307 +t 5344 5343 5307 +t 5309 5345 5308 +t 5345 5344 5308 +t 5310 5346 5309 +t 5346 5345 5309 +t 5311 5347 5310 +t 5347 5346 5310 +t 5312 5348 5311 +t 5348 5347 5311 +t 5313 5349 5312 +t 5349 5348 5312 +t 5314 5350 5313 +t 5350 5349 5313 +t 5315 5351 5314 +t 5351 5350 5314 +t 5316 5352 5315 +t 5352 5351 5315 +t 5317 5353 5316 +t 5353 5352 5316 +t 5318 5354 5317 +t 5354 5353 5317 +t 5319 5355 5320 +t 5355 5356 5320 +t 5321 5357 5319 +t 5357 5355 5319 +t 5322 5358 5321 +t 5358 5357 5321 +t 5323 5359 5322 +t 5359 5358 5322 +t 5324 5360 5323 +t 5360 5359 5323 +t 5325 5361 5324 +t 5361 5360 5324 +t 5326 5362 5325 +t 5362 5361 5325 +t 5327 5363 5326 +t 5363 5362 5326 +t 5328 5364 5327 +t 5364 5363 5327 +t 5329 5365 5328 +t 5365 5364 5328 +t 5330 5366 5329 +t 5366 5365 5329 +t 5331 5367 5330 +t 5367 5366 5330 +t 5332 5368 5331 +t 5368 5367 5331 +t 5333 5369 5332 +t 5369 5368 5332 +t 5334 5370 5333 +t 5370 5369 5333 +t 5335 5371 5334 +t 5371 5370 5334 +t 5336 5372 5335 +t 5372 5371 5335 +t 4673 4675 5372 +t 5336 4673 5372 +t 5337 5373 4676 +t 4674 5337 4676 +t 5338 5374 5337 +t 5374 5373 5337 +t 5339 5375 5338 +t 5375 5374 5338 +t 5340 5376 5339 +t 5376 5375 5339 +t 5341 5377 5340 +t 5377 5376 5340 +t 5342 5378 5341 +t 5378 5377 5341 +t 5343 5379 5342 +t 5379 5378 5342 +t 5344 5380 5343 +t 5380 5379 5343 +t 5345 5381 5344 +t 5381 5380 5344 +t 5346 5382 5345 +t 5382 5381 5345 +t 5347 5383 5346 +t 5383 5382 5346 +t 5348 5384 5347 +t 5384 5383 5347 +t 5349 5385 5348 +t 5385 5384 5348 +t 5350 5386 5349 +t 5386 5385 5349 +t 5351 5387 5350 +t 5387 5386 5350 +t 5352 5388 5351 +t 5388 5387 5351 +t 5353 5389 5352 +t 5389 5388 5352 +t 5354 5390 5353 +t 5390 5389 5353 +t 5355 5391 5356 +t 5391 5392 5356 +t 5357 5393 5355 +t 5393 5391 5355 +t 5358 5394 5357 +t 5394 5393 5357 +t 5359 5395 5358 +t 5395 5394 5358 +t 5360 5396 5359 +t 5396 5395 5359 +t 5361 5397 5360 +t 5397 5396 5360 +t 5362 5398 5361 +t 5398 5397 5361 +t 5363 5399 5362 +t 5399 5398 5362 +t 5364 5400 5363 +t 5400 5399 5363 +t 5365 5401 5364 +t 5401 5400 5364 +t 5366 5402 5365 +t 5402 5401 5365 +t 5367 5403 5366 +t 5403 5402 5366 +t 5368 5404 5367 +t 5404 5403 5367 +t 5369 5405 5368 +t 5405 5404 5368 +t 5370 5406 5369 +t 5406 5405 5369 +t 5371 5407 5370 +t 5407 5406 5370 +t 5372 5408 5371 +t 5408 5407 5371 +t 4675 4677 5408 +t 5372 4675 5408 +t 5373 5409 4678 +t 4676 5373 4678 +t 5374 5410 5373 +t 5410 5409 5373 +t 5375 5411 5374 +t 5411 5410 5374 +t 5376 5412 5375 +t 5412 5411 5375 +t 5377 5413 5376 +t 5413 5412 5376 +t 5378 5414 5377 +t 5414 5413 5377 +t 5379 5415 5378 +t 5415 5414 5378 +t 5380 5416 5379 +t 5416 5415 5379 +t 5381 5417 5380 +t 5417 5416 5380 +t 5382 5418 5381 +t 5418 5417 5381 +t 5383 5419 5382 +t 5419 5418 5382 +t 5384 5420 5383 +t 5420 5419 5383 +t 5385 5421 5384 +t 5421 5420 5384 +t 5386 5422 5385 +t 5422 5421 5385 +t 5387 5423 5386 +t 5423 5422 5386 +t 5388 5424 5387 +t 5424 5423 5387 +t 5389 5425 5388 +t 5425 5424 5388 +t 5390 5426 5389 +t 5426 5425 5389 +t 5391 5427 5392 +t 5427 5428 5392 +t 5393 5429 5391 +t 5429 5427 5391 +t 5394 5430 5393 +t 5430 5429 5393 +t 5395 5431 5394 +t 5431 5430 5394 +t 5396 5432 5395 +t 5432 5431 5395 +t 5397 5433 5396 +t 5433 5432 5396 +t 5398 5434 5397 +t 5434 5433 5397 +t 5399 5435 5398 +t 5435 5434 5398 +t 5400 5436 5399 +t 5436 5435 5399 +t 5401 5437 5400 +t 5437 5436 5400 +t 5402 5438 5401 +t 5438 5437 5401 +t 5403 5439 5402 +t 5439 5438 5402 +t 5404 5440 5403 +t 5440 5439 5403 +t 5405 5441 5404 +t 5441 5440 5404 +t 5406 5442 5405 +t 5442 5441 5405 +t 5407 5443 5406 +t 5443 5442 5406 +t 5408 5444 5407 +t 5444 5443 5407 +t 4677 4679 5444 +t 5408 4677 5444 +t 5409 5445 4680 +t 4678 5409 4680 +t 5410 5446 5409 +t 5446 5445 5409 +t 5411 5447 5410 +t 5447 5446 5410 +t 5412 5448 5411 +t 5448 5447 5411 +t 5413 5449 5412 +t 5449 5448 5412 +t 5414 5450 5413 +t 5450 5449 5413 +t 5415 5451 5414 +t 5451 5450 5414 +t 5416 5452 5415 +t 5452 5451 5415 +t 5417 5453 5416 +t 5453 5452 5416 +t 5418 5454 5417 +t 5454 5453 5417 +t 5419 5455 5418 +t 5455 5454 5418 +t 5420 5456 5419 +t 5456 5455 5419 +t 5421 5457 5420 +t 5457 5456 5420 +t 5422 5458 5421 +t 5458 5457 5421 +t 5423 5459 5422 +t 5459 5458 5422 +t 5424 5460 5423 +t 5460 5459 5423 +t 5425 5461 5424 +t 5461 5460 5424 +t 5426 5462 5425 +t 5462 5461 5425 +t 5427 5463 5428 +t 5463 5464 5428 +t 5429 5465 5427 +t 5465 5463 5427 +t 5430 5466 5429 +t 5466 5465 5429 +t 5431 5467 5430 +t 5467 5466 5430 +t 5432 5468 5431 +t 5468 5467 5431 +t 5433 5469 5432 +t 5469 5468 5432 +t 5434 5470 5433 +t 5470 5469 5433 +t 5435 5471 5434 +t 5471 5470 5434 +t 5436 5472 5435 +t 5472 5471 5435 +t 5437 5473 5436 +t 5473 5472 5436 +t 5438 5474 5437 +t 5474 5473 5437 +t 5439 5475 5438 +t 5475 5474 5438 +t 5440 5476 5439 +t 5476 5475 5439 +t 5441 5477 5440 +t 5477 5476 5440 +t 5442 5478 5441 +t 5478 5477 5441 +t 5443 5479 5442 +t 5479 5478 5442 +t 5444 5480 5443 +t 5480 5479 5443 +t 4679 4681 5480 +t 5444 4679 5480 +t 5445 5481 4682 +t 4680 5445 4682 +t 5446 5482 5445 +t 5482 5481 5445 +t 5447 5483 5446 +t 5483 5482 5446 +t 5448 5484 5447 +t 5484 5483 5447 +t 5449 5485 5448 +t 5485 5484 5448 +t 5450 5486 5449 +t 5486 5485 5449 +t 5451 5487 5450 +t 5487 5486 5450 +t 5452 5488 5451 +t 5488 5487 5451 +t 5453 5489 5452 +t 5489 5488 5452 +t 5454 5490 5453 +t 5490 5489 5453 +t 5455 5491 5454 +t 5491 5490 5454 +t 5456 5492 5455 +t 5492 5491 5455 +t 5457 5493 5456 +t 5493 5492 5456 +t 5458 5494 5457 +t 5494 5493 5457 +t 5459 5495 5458 +t 5495 5494 5458 +t 5460 5496 5459 +t 5496 5495 5459 +t 5461 5497 5460 +t 5497 5496 5460 +t 5462 5498 5461 +t 5498 5497 5461 +t 5463 5499 5464 +t 5499 5500 5464 +t 5465 5501 5463 +t 5501 5499 5463 +t 5466 5502 5465 +t 5502 5501 5465 +t 5467 5503 5466 +t 5503 5502 5466 +t 5468 5504 5467 +t 5504 5503 5467 +t 5469 5505 5468 +t 5505 5504 5468 +t 5470 5506 5469 +t 5506 5505 5469 +t 5471 5507 5470 +t 5507 5506 5470 +t 5472 5508 5471 +t 5508 5507 5471 +t 5473 5509 5472 +t 5509 5508 5472 +t 5474 5510 5473 +t 5510 5509 5473 +t 5475 5511 5474 +t 5511 5510 5474 +t 5476 5512 5475 +t 5512 5511 5475 +t 5477 5513 5476 +t 5513 5512 5476 +t 5478 5514 5477 +t 5514 5513 5477 +t 5479 5515 5478 +t 5515 5514 5478 +t 5480 5516 5479 +t 5516 5515 5479 +t 4681 4683 5516 +t 5480 4681 5516 +t 5481 5517 4684 +t 4682 5481 4684 +t 5482 5518 5481 +t 5518 5517 5481 +t 5483 5519 5482 +t 5519 5518 5482 +t 5484 5520 5483 +t 5520 5519 5483 +t 5485 5521 5484 +t 5521 5520 5484 +t 5486 5522 5485 +t 5522 5521 5485 +t 5487 5523 5486 +t 5523 5522 5486 +t 5488 5524 5487 +t 5524 5523 5487 +t 5489 5525 5488 +t 5525 5524 5488 +t 5490 5526 5489 +t 5526 5525 5489 +t 5491 5527 5490 +t 5527 5526 5490 +t 5492 5528 5491 +t 5528 5527 5491 +t 5493 5529 5492 +t 5529 5528 5492 +t 5494 5530 5493 +t 5530 5529 5493 +t 5495 5531 5494 +t 5531 5530 5494 +t 5496 5532 5495 +t 5532 5531 5495 +t 5497 5533 5496 +t 5533 5532 5496 +t 5498 5534 5497 +t 5534 5533 5497 +t 5499 5535 5500 +t 5535 5536 5500 +t 5501 5537 5499 +t 5537 5535 5499 +t 5502 5538 5501 +t 5538 5537 5501 +t 5503 5539 5502 +t 5539 5538 5502 +t 5504 5540 5503 +t 5540 5539 5503 +t 5505 5541 5504 +t 5541 5540 5504 +t 5506 5542 5505 +t 5542 5541 5505 +t 5507 5543 5506 +t 5543 5542 5506 +t 5508 5544 5507 +t 5544 5543 5507 +t 5509 5545 5508 +t 5545 5544 5508 +t 5510 5546 5509 +t 5546 5545 5509 +t 5511 5547 5510 +t 5547 5546 5510 +t 5512 5548 5511 +t 5548 5547 5511 +t 5513 5549 5512 +t 5549 5548 5512 +t 5514 5550 5513 +t 5550 5549 5513 +t 5515 5551 5514 +t 5551 5550 5514 +t 5516 5552 5515 +t 5552 5551 5515 +t 4683 4685 5552 +t 5516 4683 5552 +t 5517 5553 4686 +t 4684 5517 4686 +t 5518 5554 5517 +t 5554 5553 5517 +t 5519 5555 5518 +t 5555 5554 5518 +t 5520 5556 5519 +t 5556 5555 5519 +t 5521 5557 5520 +t 5557 5556 5520 +t 5522 5558 5521 +t 5558 5557 5521 +t 5523 5559 5522 +t 5559 5558 5522 +t 5524 5560 5523 +t 5560 5559 5523 +t 5525 5561 5524 +t 5561 5560 5524 +t 5526 5562 5525 +t 5562 5561 5525 +t 5527 5563 5526 +t 5563 5562 5526 +t 5528 5564 5527 +t 5564 5563 5527 +t 5529 5565 5528 +t 5565 5564 5528 +t 5530 5566 5529 +t 5566 5565 5529 +t 5531 5567 5530 +t 5567 5566 5530 +t 5532 5568 5531 +t 5568 5567 5531 +t 5533 5569 5532 +t 5569 5568 5532 +t 5534 5570 5533 +t 5570 5569 5533 +t 5535 5571 5536 +t 5571 5572 5536 +t 5537 5573 5535 +t 5573 5571 5535 +t 5538 5574 5537 +t 5574 5573 5537 +t 5539 5575 5538 +t 5575 5574 5538 +t 5540 5576 5539 +t 5576 5575 5539 +t 5541 5577 5540 +t 5577 5576 5540 +t 5542 5578 5541 +t 5578 5577 5541 +t 5543 5579 5542 +t 5579 5578 5542 +t 5544 5580 5543 +t 5580 5579 5543 +t 5545 5581 5544 +t 5581 5580 5544 +t 5546 5582 5545 +t 5582 5581 5545 +t 5547 5583 5546 +t 5583 5582 5546 +t 5548 5584 5547 +t 5584 5583 5547 +t 5549 5585 5548 +t 5585 5584 5548 +t 5550 5586 5549 +t 5586 5585 5549 +t 5551 5587 5550 +t 5587 5586 5550 +t 5552 5588 5551 +t 5588 5587 5551 +t 4685 4687 5588 +t 5552 4685 5588 +t 5553 5589 4688 +t 4686 5553 4688 +t 5554 5590 5553 +t 5590 5589 5553 +t 5555 5591 5554 +t 5591 5590 5554 +t 5556 5592 5555 +t 5592 5591 5555 +t 5557 5593 5556 +t 5593 5592 5556 +t 5558 5594 5557 +t 5594 5593 5557 +t 5559 5595 5558 +t 5595 5594 5558 +t 5560 5596 5559 +t 5596 5595 5559 +t 5561 5597 5560 +t 5597 5596 5560 +t 5562 5598 5561 +t 5598 5597 5561 +t 5563 5599 5562 +t 5599 5598 5562 +t 5564 5600 5563 +t 5600 5599 5563 +t 5565 5601 5564 +t 5601 5600 5564 +t 5566 5602 5565 +t 5602 5601 5565 +t 5567 5603 5566 +t 5603 5602 5566 +t 5568 5604 5567 +t 5604 5603 5567 +t 5569 5605 5568 +t 5605 5604 5568 +t 5570 5606 5569 +t 5606 5605 5569 +t 5571 5607 5572 +t 5607 5608 5572 +t 5573 5609 5571 +t 5609 5607 5571 +t 5574 5610 5573 +t 5610 5609 5573 +t 5575 5611 5574 +t 5611 5610 5574 +t 5576 5612 5575 +t 5612 5611 5575 +t 5577 5613 5576 +t 5613 5612 5576 +t 5578 5614 5577 +t 5614 5613 5577 +t 5579 5615 5578 +t 5615 5614 5578 +t 5580 5616 5579 +t 5616 5615 5579 +t 5581 5617 5580 +t 5617 5616 5580 +t 5582 5618 5581 +t 5618 5617 5581 +t 5583 5619 5582 +t 5619 5618 5582 +t 5584 5620 5583 +t 5620 5619 5583 +t 5585 5621 5584 +t 5621 5620 5584 +t 5586 5622 5585 +t 5622 5621 5585 +t 5587 5623 5586 +t 5623 5622 5586 +t 5588 5624 5587 +t 5624 5623 5587 +t 4687 4689 5624 +t 5588 4687 5624 +t 5589 5625 4690 +t 4688 5589 4690 +t 5590 5626 5589 +t 5626 5625 5589 +t 5591 5627 5590 +t 5627 5626 5590 +t 5592 5628 5591 +t 5628 5627 5591 +t 5593 5629 5592 +t 5629 5628 5592 +t 5594 5630 5593 +t 5630 5629 5593 +t 5595 5631 5594 +t 5631 5630 5594 +t 5596 5632 5595 +t 5632 5631 5595 +t 5597 5633 5596 +t 5633 5632 5596 +t 5598 5634 5597 +t 5634 5633 5597 +t 5599 5635 5598 +t 5635 5634 5598 +t 5600 5636 5599 +t 5636 5635 5599 +t 5601 5637 5600 +t 5637 5636 5600 +t 5602 5638 5601 +t 5638 5637 5601 +t 5603 5639 5602 +t 5639 5638 5602 +t 5604 5640 5603 +t 5640 5639 5603 +t 5605 5641 5604 +t 5641 5640 5604 +t 5606 5642 5605 +t 5642 5641 5605 +t 5607 5643 5608 +t 5643 5644 5608 +t 5609 5645 5607 +t 5645 5643 5607 +t 5610 5646 5609 +t 5646 5645 5609 +t 5611 5647 5610 +t 5647 5646 5610 +t 5612 5648 5611 +t 5648 5647 5611 +t 5613 5649 5612 +t 5649 5648 5612 +t 5614 5650 5613 +t 5650 5649 5613 +t 5615 5651 5614 +t 5651 5650 5614 +t 5616 5652 5615 +t 5652 5651 5615 +t 5617 5653 5616 +t 5653 5652 5616 +t 5618 5654 5617 +t 5654 5653 5617 +t 5619 5655 5618 +t 5655 5654 5618 +t 5620 5656 5619 +t 5656 5655 5619 +t 5621 5657 5620 +t 5657 5656 5620 +t 5622 5658 5621 +t 5658 5657 5621 +t 5623 5659 5622 +t 5659 5658 5622 +t 5624 5660 5623 +t 5660 5659 5623 +t 4689 4691 5660 +t 5624 4689 5660 +t 5625 5661 4692 +t 4690 5625 4692 +t 5626 5662 5625 +t 5662 5661 5625 +t 5627 5663 5626 +t 5663 5662 5626 +t 5628 5664 5627 +t 5664 5663 5627 +t 5629 5665 5628 +t 5665 5664 5628 +t 5630 5666 5629 +t 5666 5665 5629 +t 5631 5667 5630 +t 5667 5666 5630 +t 5632 5668 5631 +t 5668 5667 5631 +t 5633 5669 5632 +t 5669 5668 5632 +t 5634 5670 5633 +t 5670 5669 5633 +t 5635 5671 5634 +t 5671 5670 5634 +t 5636 5672 5635 +t 5672 5671 5635 +t 5637 5673 5636 +t 5673 5672 5636 +t 5638 5674 5637 +t 5674 5673 5637 +t 5639 5675 5638 +t 5675 5674 5638 +t 5640 5676 5639 +t 5676 5675 5639 +t 5641 5677 5640 +t 5677 5676 5640 +t 5642 5678 5641 +t 5678 5677 5641 +t 5643 5679 5644 +t 5679 5680 5644 +t 5645 5681 5643 +t 5681 5679 5643 +t 5646 5682 5645 +t 5682 5681 5645 +t 5647 5683 5646 +t 5683 5682 5646 +t 5648 5684 5647 +t 5684 5683 5647 +t 5649 5685 5648 +t 5685 5684 5648 +t 5650 5686 5649 +t 5686 5685 5649 +t 5651 5687 5650 +t 5687 5686 5650 +t 5652 5688 5651 +t 5688 5687 5651 +t 5653 5689 5652 +t 5689 5688 5652 +t 5654 5690 5653 +t 5690 5689 5653 +t 5655 5691 5654 +t 5691 5690 5654 +t 5656 5692 5655 +t 5692 5691 5655 +t 5657 5693 5656 +t 5693 5692 5656 +t 5658 5694 5657 +t 5694 5693 5657 +t 5659 5695 5658 +t 5695 5694 5658 +t 5660 5696 5659 +t 5696 5695 5659 +t 4691 4693 5696 +t 5660 4691 5696 +t 5661 5697 4694 +t 4692 5661 4694 +t 5662 5698 5661 +t 5698 5697 5661 +t 5663 5699 5662 +t 5699 5698 5662 +t 5664 5700 5663 +t 5700 5699 5663 +t 5665 5701 5664 +t 5701 5700 5664 +t 5666 5702 5665 +t 5702 5701 5665 +t 5667 5703 5666 +t 5703 5702 5666 +t 5668 5704 5667 +t 5704 5703 5667 +t 5669 5705 5668 +t 5705 5704 5668 +t 5670 5706 5669 +t 5706 5705 5669 +t 5671 5707 5670 +t 5707 5706 5670 +t 5672 5708 5671 +t 5708 5707 5671 +t 5673 5709 5672 +t 5709 5708 5672 +t 5674 5710 5673 +t 5710 5709 5673 +t 5675 5711 5674 +t 5711 5710 5674 +t 5676 5712 5675 +t 5712 5711 5675 +t 5677 5713 5676 +t 5713 5712 5676 +t 5678 5714 5677 +t 5714 5713 5677 +t 5679 5715 5680 +t 5715 5716 5680 +t 5681 5717 5679 +t 5717 5715 5679 +t 5682 5718 5681 +t 5718 5717 5681 +t 5683 5719 5682 +t 5719 5718 5682 +t 5684 5720 5683 +t 5720 5719 5683 +t 5685 5721 5684 +t 5721 5720 5684 +t 5686 5722 5685 +t 5722 5721 5685 +t 5687 5723 5686 +t 5723 5722 5686 +t 5688 5724 5687 +t 5724 5723 5687 +t 5689 5725 5688 +t 5725 5724 5688 +t 5690 5726 5689 +t 5726 5725 5689 +t 5691 5727 5690 +t 5727 5726 5690 +t 5692 5728 5691 +t 5728 5727 5691 +t 5693 5729 5692 +t 5729 5728 5692 +t 5694 5730 5693 +t 5730 5729 5693 +t 5695 5731 5694 +t 5731 5730 5694 +t 5696 5732 5695 +t 5732 5731 5695 +t 4693 4695 5732 +t 5696 4693 5732 +t 5697 5733 4696 +t 4694 5697 4696 +t 5698 5734 5697 +t 5734 5733 5697 +t 5699 5735 5698 +t 5735 5734 5698 +t 5700 5736 5699 +t 5736 5735 5699 +t 5701 5737 5700 +t 5737 5736 5700 +t 5702 5738 5701 +t 5738 5737 5701 +t 5703 5739 5702 +t 5739 5738 5702 +t 5704 5740 5703 +t 5740 5739 5703 +t 5705 5741 5704 +t 5741 5740 5704 +t 5706 5742 5705 +t 5742 5741 5705 +t 5707 5743 5706 +t 5743 5742 5706 +t 5708 5744 5707 +t 5744 5743 5707 +t 5709 5745 5708 +t 5745 5744 5708 +t 5710 5746 5709 +t 5746 5745 5709 +t 5711 5747 5710 +t 5747 5746 5710 +t 5712 5748 5711 +t 5748 5747 5711 +t 5713 5749 5712 +t 5749 5748 5712 +t 5714 5750 5713 +t 5750 5749 5713 +t 5715 5751 5716 +t 5751 5752 5716 +t 5717 5753 5715 +t 5753 5751 5715 +t 5718 5754 5717 +t 5754 5753 5717 +t 5719 5755 5718 +t 5755 5754 5718 +t 5720 5756 5719 +t 5756 5755 5719 +t 5721 5757 5720 +t 5757 5756 5720 +t 5722 5758 5721 +t 5758 5757 5721 +t 5723 5759 5722 +t 5759 5758 5722 +t 5724 5760 5723 +t 5760 5759 5723 +t 5725 5761 5724 +t 5761 5760 5724 +t 5726 5762 5725 +t 5762 5761 5725 +t 5727 5763 5726 +t 5763 5762 5726 +t 5728 5764 5727 +t 5764 5763 5727 +t 5729 5765 5728 +t 5765 5764 5728 +t 5730 5766 5729 +t 5766 5765 5729 +t 5731 5767 5730 +t 5767 5766 5730 +t 5732 5768 5731 +t 5768 5767 5731 +t 4695 4697 5768 +t 5732 4695 5768 +t 5733 5769 4698 +t 4696 5733 4698 +t 5734 5770 5733 +t 5770 5769 5733 +t 5735 5771 5734 +t 5771 5770 5734 +t 5736 5772 5735 +t 5772 5771 5735 +t 5737 5773 5736 +t 5773 5772 5736 +t 5738 5774 5737 +t 5774 5773 5737 +t 5739 5775 5738 +t 5775 5774 5738 +t 5740 5776 5739 +t 5776 5775 5739 +t 5741 5777 5740 +t 5777 5776 5740 +t 5742 5778 5741 +t 5778 5777 5741 +t 5743 5779 5742 +t 5779 5778 5742 +t 5744 5780 5743 +t 5780 5779 5743 +t 5745 5781 5744 +t 5781 5780 5744 +t 5746 5782 5745 +t 5782 5781 5745 +t 5747 5783 5746 +t 5783 5782 5746 +t 5748 5784 5747 +t 5784 5783 5747 +t 5749 5785 5748 +t 5785 5784 5748 +t 5750 5786 5749 +t 5786 5785 5749 +t 5751 5787 5752 +t 5787 5788 5752 +t 5753 5789 5751 +t 5789 5787 5751 +t 5754 5790 5753 +t 5790 5789 5753 +t 5755 5791 5754 +t 5791 5790 5754 +t 5756 5792 5755 +t 5792 5791 5755 +t 5757 5793 5756 +t 5793 5792 5756 +t 5758 5794 5757 +t 5794 5793 5757 +t 5759 5795 5758 +t 5795 5794 5758 +t 5760 5796 5759 +t 5796 5795 5759 +t 5761 5797 5760 +t 5797 5796 5760 +t 5762 5798 5761 +t 5798 5797 5761 +t 5763 5799 5762 +t 5799 5798 5762 +t 5764 5800 5763 +t 5800 5799 5763 +t 5765 5801 5764 +t 5801 5800 5764 +t 5766 5802 5765 +t 5802 5801 5765 +t 5767 5803 5766 +t 5803 5802 5766 +t 5768 5804 5767 +t 5804 5803 5767 +t 4697 4699 5804 +t 5768 4697 5804 +t 5769 5805 4700 +t 4698 5769 4700 +t 5770 5806 5769 +t 5806 5805 5769 +t 5771 5807 5770 +t 5807 5806 5770 +t 5772 5808 5771 +t 5808 5807 5771 +t 5773 5809 5772 +t 5809 5808 5772 +t 5774 5810 5773 +t 5810 5809 5773 +t 5775 5811 5774 +t 5811 5810 5774 +t 5776 5812 5775 +t 5812 5811 5775 +t 5777 5813 5776 +t 5813 5812 5776 +t 5778 5814 5777 +t 5814 5813 5777 +t 5779 5815 5778 +t 5815 5814 5778 +t 5780 5816 5779 +t 5816 5815 5779 +t 5781 5817 5780 +t 5817 5816 5780 +t 5782 5818 5781 +t 5818 5817 5781 +t 5783 5819 5782 +t 5819 5818 5782 +t 5784 5820 5783 +t 5820 5819 5783 +t 5785 5821 5784 +t 5821 5820 5784 +t 5786 5822 5785 +t 5822 5821 5785 +t 5787 5823 5788 +t 5823 5824 5788 +t 5789 5825 5787 +t 5825 5823 5787 +t 5790 5826 5789 +t 5826 5825 5789 +t 5791 5827 5790 +t 5827 5826 5790 +t 5792 5828 5791 +t 5828 5827 5791 +t 5793 5829 5792 +t 5829 5828 5792 +t 5794 5830 5793 +t 5830 5829 5793 +t 5795 5831 5794 +t 5831 5830 5794 +t 5796 5832 5795 +t 5832 5831 5795 +t 5797 5833 5796 +t 5833 5832 5796 +t 5798 5834 5797 +t 5834 5833 5797 +t 5799 5835 5798 +t 5835 5834 5798 +t 5800 5836 5799 +t 5836 5835 5799 +t 5801 5837 5800 +t 5837 5836 5800 +t 5802 5838 5801 +t 5838 5837 5801 +t 5803 5839 5802 +t 5839 5838 5802 +t 5804 5840 5803 +t 5840 5839 5803 +t 4699 4701 5840 +t 5804 4699 5840 +t 5805 5841 4702 +t 4700 5805 4702 +t 5806 5842 5805 +t 5842 5841 5805 +t 5807 5843 5806 +t 5843 5842 5806 +t 5808 5844 5807 +t 5844 5843 5807 +t 5809 5845 5808 +t 5845 5844 5808 +t 5810 5846 5809 +t 5846 5845 5809 +t 5811 5847 5810 +t 5847 5846 5810 +t 5812 5848 5811 +t 5848 5847 5811 +t 5813 5849 5812 +t 5849 5848 5812 +t 5814 5850 5813 +t 5850 5849 5813 +t 5815 5851 5814 +t 5851 5850 5814 +t 5816 5852 5815 +t 5852 5851 5815 +t 5817 5853 5816 +t 5853 5852 5816 +t 5818 5854 5817 +t 5854 5853 5817 +t 5819 5855 5818 +t 5855 5854 5818 +t 5820 5856 5819 +t 5856 5855 5819 +t 5821 5857 5820 +t 5857 5856 5820 +t 5822 5858 5821 +t 5858 5857 5821 +t 5823 5859 5824 +t 5859 5860 5824 +t 5825 5861 5823 +t 5861 5859 5823 +t 5826 5862 5825 +t 5862 5861 5825 +t 5827 5863 5826 +t 5863 5862 5826 +t 5828 5864 5827 +t 5864 5863 5827 +t 5829 5865 5828 +t 5865 5864 5828 +t 5830 5866 5829 +t 5866 5865 5829 +t 5831 5867 5830 +t 5867 5866 5830 +t 5832 5868 5831 +t 5868 5867 5831 +t 5833 5869 5832 +t 5869 5868 5832 +t 5834 5870 5833 +t 5870 5869 5833 +t 5835 5871 5834 +t 5871 5870 5834 +t 5836 5872 5835 +t 5872 5871 5835 +t 5837 5873 5836 +t 5873 5872 5836 +t 5838 5874 5837 +t 5874 5873 5837 +t 5839 5875 5838 +t 5875 5874 5838 +t 5840 5876 5839 +t 5876 5875 5839 +t 4701 4703 5876 +t 5840 4701 5876 +t 5841 5877 4704 +t 4702 5841 4704 +t 5842 5878 5841 +t 5878 5877 5841 +t 5843 5879 5842 +t 5879 5878 5842 +t 5844 5880 5843 +t 5880 5879 5843 +t 5845 5881 5844 +t 5881 5880 5844 +t 5846 5882 5845 +t 5882 5881 5845 +t 5847 5883 5846 +t 5883 5882 5846 +t 5848 5884 5847 +t 5884 5883 5847 +t 5849 5885 5848 +t 5885 5884 5848 +t 5850 5886 5849 +t 5886 5885 5849 +t 5851 5887 5850 +t 5887 5886 5850 +t 5852 5888 5851 +t 5888 5887 5851 +t 5853 5889 5852 +t 5889 5888 5852 +t 5854 5890 5853 +t 5890 5889 5853 +t 5855 5891 5854 +t 5891 5890 5854 +t 5856 5892 5855 +t 5892 5891 5855 +t 5857 5893 5856 +t 5893 5892 5856 +t 5858 5894 5857 +t 5894 5893 5857 +t 5859 5895 5860 +t 5895 5896 5860 +t 5861 5897 5859 +t 5897 5895 5859 +t 5862 5898 5861 +t 5898 5897 5861 +t 5863 5899 5862 +t 5899 5898 5862 +t 5864 5900 5863 +t 5900 5899 5863 +t 5865 5901 5864 +t 5901 5900 5864 +t 5866 5902 5865 +t 5902 5901 5865 +t 5867 5903 5866 +t 5903 5902 5866 +t 5868 5904 5867 +t 5904 5903 5867 +t 5869 5905 5868 +t 5905 5904 5868 +t 5870 5906 5869 +t 5906 5905 5869 +t 5871 5907 5870 +t 5907 5906 5870 +t 5872 5908 5871 +t 5908 5907 5871 +t 5873 5909 5872 +t 5909 5908 5872 +t 5874 5910 5873 +t 5910 5909 5873 +t 5875 5911 5874 +t 5911 5910 5874 +t 5876 5912 5875 +t 5912 5911 5875 +t 4703 4705 5912 +t 5876 4703 5912 +t 5877 5913 4706 +t 4704 5877 4706 +t 5878 5914 5877 +t 5914 5913 5877 +t 5879 5915 5878 +t 5915 5914 5878 +t 5880 5916 5879 +t 5916 5915 5879 +t 5881 5917 5880 +t 5917 5916 5880 +t 5882 5918 5881 +t 5918 5917 5881 +t 5883 5919 5882 +t 5919 5918 5882 +t 5884 5920 5883 +t 5920 5919 5883 +t 5885 5921 5884 +t 5921 5920 5884 +t 5886 5922 5885 +t 5922 5921 5885 +t 5887 5923 5886 +t 5923 5922 5886 +t 5888 5924 5887 +t 5924 5923 5887 +t 5889 5925 5888 +t 5925 5924 5888 +t 5890 5926 5889 +t 5926 5925 5889 +t 5891 5927 5890 +t 5927 5926 5890 +t 5892 5928 5891 +t 5928 5927 5891 +t 5893 5929 5892 +t 5929 5928 5892 +t 5894 5930 5893 +t 5930 5929 5893 +t 5895 5931 5896 +t 5931 5932 5896 +t 5897 5933 5895 +t 5933 5931 5895 +t 5898 5934 5897 +t 5934 5933 5897 +t 5899 5935 5898 +t 5935 5934 5898 +t 5900 5936 5899 +t 5936 5935 5899 +t 5901 5937 5900 +t 5937 5936 5900 +t 5902 5938 5901 +t 5938 5937 5901 +t 5903 5939 5902 +t 5939 5938 5902 +t 5904 5940 5903 +t 5940 5939 5903 +t 5905 5941 5904 +t 5941 5940 5904 +t 5906 5942 5905 +t 5942 5941 5905 +t 5907 5943 5906 +t 5943 5942 5906 +t 5908 5944 5907 +t 5944 5943 5907 +t 5909 5945 5908 +t 5945 5944 5908 +t 5910 5946 5909 +t 5946 5945 5909 +t 5911 5947 5910 +t 5947 5946 5910 +t 5912 5948 5911 +t 5948 5947 5911 +t 4705 4707 5948 +t 5912 4705 5948 +t 5913 5949 4708 +t 4706 5913 4708 +t 5914 5950 5913 +t 5950 5949 5913 +t 5915 5951 5914 +t 5951 5950 5914 +t 5916 5952 5915 +t 5952 5951 5915 +t 5917 5953 5916 +t 5953 5952 5916 +t 5918 5954 5917 +t 5954 5953 5917 +t 5919 5955 5918 +t 5955 5954 5918 +t 5920 5956 5919 +t 5956 5955 5919 +t 5921 5957 5920 +t 5957 5956 5920 +t 5922 5958 5921 +t 5958 5957 5921 +t 5923 5959 5922 +t 5959 5958 5922 +t 5924 5960 5923 +t 5960 5959 5923 +t 5925 5961 5924 +t 5961 5960 5924 +t 5926 5962 5925 +t 5962 5961 5925 +t 5927 5963 5926 +t 5963 5962 5926 +t 5928 5964 5927 +t 5964 5963 5927 +t 5929 5965 5928 +t 5965 5964 5928 +t 5930 5966 5929 +t 5966 5965 5929 +t 5931 5967 5932 +t 5967 5968 5932 +t 5933 5969 5931 +t 5969 5967 5931 +t 5934 5970 5933 +t 5970 5969 5933 +t 5935 5971 5934 +t 5971 5970 5934 +t 5936 5972 5935 +t 5972 5971 5935 +t 5937 5973 5936 +t 5973 5972 5936 +t 5938 5974 5937 +t 5974 5973 5937 +t 5939 5975 5938 +t 5975 5974 5938 +t 5940 5976 5939 +t 5976 5975 5939 +t 5941 5977 5940 +t 5977 5976 5940 +t 5942 5978 5941 +t 5978 5977 5941 +t 5943 5979 5942 +t 5979 5978 5942 +t 5944 5980 5943 +t 5980 5979 5943 +t 5945 5981 5944 +t 5981 5980 5944 +t 5946 5982 5945 +t 5982 5981 5945 +t 5947 5983 5946 +t 5983 5982 5946 +t 5948 5984 5947 +t 5984 5983 5947 +t 4707 4709 5984 +t 5948 4707 5984 +t 5949 5985 4710 +t 4708 5949 4710 +t 5950 5986 5949 +t 5986 5985 5949 +t 5951 5987 5950 +t 5987 5986 5950 +t 5952 5988 5951 +t 5988 5987 5951 +t 5953 5989 5952 +t 5989 5988 5952 +t 5954 5990 5953 +t 5990 5989 5953 +t 5955 5991 5954 +t 5991 5990 5954 +t 5956 5992 5955 +t 5992 5991 5955 +t 5957 5993 5956 +t 5993 5992 5956 +t 5958 5994 5957 +t 5994 5993 5957 +t 5959 5995 5958 +t 5995 5994 5958 +t 5960 5996 5959 +t 5996 5995 5959 +t 5961 5997 5960 +t 5997 5996 5960 +t 5962 5998 5961 +t 5998 5997 5961 +t 5963 5999 5962 +t 5999 5998 5962 +t 5964 6000 5963 +t 6000 5999 5963 +t 5965 6001 5964 +t 6001 6000 5964 +t 5966 6002 5965 +t 6002 6001 5965 +t 5967 6003 5968 +t 6003 6004 5968 +t 5969 6005 5967 +t 6005 6003 5967 +t 5970 6006 5969 +t 6006 6005 5969 +t 5971 6007 5970 +t 6007 6006 5970 +t 5972 6008 5971 +t 6008 6007 5971 +t 5973 6009 5972 +t 6009 6008 5972 +t 5974 6010 5973 +t 6010 6009 5973 +t 5975 6011 5974 +t 6011 6010 5974 +t 5976 6012 5975 +t 6012 6011 5975 +t 5977 6013 5976 +t 6013 6012 5976 +t 5978 6014 5977 +t 6014 6013 5977 +t 5979 6015 5978 +t 6015 6014 5978 +t 5980 6016 5979 +t 6016 6015 5979 +t 5981 6017 5980 +t 6017 6016 5980 +t 5982 6018 5981 +t 6018 6017 5981 +t 5983 6019 5982 +t 6019 6018 5982 +t 5984 6020 5983 +t 6020 6019 5983 +t 4709 4711 6020 +t 5984 4709 6020 +t 5985 6021 4712 +t 4710 5985 4712 +t 5986 6022 5985 +t 6022 6021 5985 +t 5987 6023 5986 +t 6023 6022 5986 +t 5988 6024 5987 +t 6024 6023 5987 +t 5989 6025 5988 +t 6025 6024 5988 +t 5990 6026 5989 +t 6026 6025 5989 +t 5991 6027 5990 +t 6027 6026 5990 +t 5992 6028 5991 +t 6028 6027 5991 +t 5993 6029 5992 +t 6029 6028 5992 +t 5994 6030 5993 +t 6030 6029 5993 +t 5995 6031 5994 +t 6031 6030 5994 +t 5996 6032 5995 +t 6032 6031 5995 +t 5997 6033 5996 +t 6033 6032 5996 +t 5998 6034 5997 +t 6034 6033 5997 +t 5999 6035 5998 +t 6035 6034 5998 +t 6000 6036 5999 +t 6036 6035 5999 +t 6001 6037 6000 +t 6037 6036 6000 +t 6002 6038 6001 +t 6038 6037 6001 +t 6003 6039 6004 +t 6039 6040 6004 +t 6005 6041 6003 +t 6041 6039 6003 +t 6006 6042 6005 +t 6042 6041 6005 +t 6007 6043 6006 +t 6043 6042 6006 +t 6008 6044 6007 +t 6044 6043 6007 +t 6009 6045 6008 +t 6045 6044 6008 +t 6010 6046 6009 +t 6046 6045 6009 +t 6011 6047 6010 +t 6047 6046 6010 +t 6012 6048 6011 +t 6048 6047 6011 +t 6013 6049 6012 +t 6049 6048 6012 +t 6014 6050 6013 +t 6050 6049 6013 +t 6015 6051 6014 +t 6051 6050 6014 +t 6016 6052 6015 +t 6052 6051 6015 +t 6017 6053 6016 +t 6053 6052 6016 +t 6018 6054 6017 +t 6054 6053 6017 +t 6019 6055 6018 +t 6055 6054 6018 +t 6020 6056 6019 +t 6056 6055 6019 +t 4711 4713 6056 +t 6020 4711 6056 +t 6021 6057 4714 +t 4712 6021 4714 +t 6022 6058 6021 +t 6058 6057 6021 +t 6023 6059 6022 +t 6059 6058 6022 +t 6024 6060 6023 +t 6060 6059 6023 +t 6025 6061 6024 +t 6061 6060 6024 +t 6026 6062 6025 +t 6062 6061 6025 +t 6027 6063 6026 +t 6063 6062 6026 +t 6028 6064 6027 +t 6064 6063 6027 +t 6029 6065 6028 +t 6065 6064 6028 +t 6030 6066 6029 +t 6066 6065 6029 +t 6031 6067 6030 +t 6067 6066 6030 +t 6032 6068 6031 +t 6068 6067 6031 +t 6033 6069 6032 +t 6069 6068 6032 +t 6034 6070 6033 +t 6070 6069 6033 +t 6035 6071 6034 +t 6071 6070 6034 +t 6036 6072 6035 +t 6072 6071 6035 +t 6037 6073 6036 +t 6073 6072 6036 +t 6038 6074 6037 +t 6074 6073 6037 +t 6039 6075 6040 +t 6075 6076 6040 +t 6041 6077 6039 +t 6077 6075 6039 +t 6042 6078 6041 +t 6078 6077 6041 +t 6043 6079 6042 +t 6079 6078 6042 +t 6044 6080 6043 +t 6080 6079 6043 +t 6045 6081 6044 +t 6081 6080 6044 +t 6046 6082 6045 +t 6082 6081 6045 +t 6047 6083 6046 +t 6083 6082 6046 +t 6048 6084 6047 +t 6084 6083 6047 +t 6049 6085 6048 +t 6085 6084 6048 +t 6050 6086 6049 +t 6086 6085 6049 +t 6051 6087 6050 +t 6087 6086 6050 +t 6052 6088 6051 +t 6088 6087 6051 +t 6053 6089 6052 +t 6089 6088 6052 +t 6054 6090 6053 +t 6090 6089 6053 +t 6055 6091 6054 +t 6091 6090 6054 +t 6056 6092 6055 +t 6092 6091 6055 +t 4713 4715 6092 +t 6056 4713 6092 +t 6057 6093 4716 +t 4714 6057 4716 +t 6058 6094 6057 +t 6094 6093 6057 +t 6059 6095 6058 +t 6095 6094 6058 +t 6060 6096 6059 +t 6096 6095 6059 +t 6061 6097 6060 +t 6097 6096 6060 +t 6062 6098 6061 +t 6098 6097 6061 +t 6063 6099 6062 +t 6099 6098 6062 +t 6064 6100 6063 +t 6100 6099 6063 +t 6065 6101 6064 +t 6101 6100 6064 +t 6066 6102 6065 +t 6102 6101 6065 +t 6067 6103 6066 +t 6103 6102 6066 +t 6068 6104 6067 +t 6104 6103 6067 +t 6069 6105 6068 +t 6105 6104 6068 +t 6070 6106 6069 +t 6106 6105 6069 +t 6071 6107 6070 +t 6107 6106 6070 +t 6072 6108 6071 +t 6108 6107 6071 +t 6073 6109 6072 +t 6109 6108 6072 +t 6074 6110 6073 +t 6110 6109 6073 +t 6075 6111 6076 +t 6111 6112 6076 +t 6077 6113 6075 +t 6113 6111 6075 +t 6078 6114 6077 +t 6114 6113 6077 +t 6079 6115 6078 +t 6115 6114 6078 +t 6080 6116 6079 +t 6116 6115 6079 +t 6081 6117 6080 +t 6117 6116 6080 +t 6082 6118 6081 +t 6118 6117 6081 +t 6083 6119 6082 +t 6119 6118 6082 +t 6084 6120 6083 +t 6120 6119 6083 +t 6085 6121 6084 +t 6121 6120 6084 +t 6086 6122 6085 +t 6122 6121 6085 +t 6087 6123 6086 +t 6123 6122 6086 +t 6088 6124 6087 +t 6124 6123 6087 +t 6089 6125 6088 +t 6125 6124 6088 +t 6090 6126 6089 +t 6126 6125 6089 +t 6091 6127 6090 +t 6127 6126 6090 +t 6092 6128 6091 +t 6128 6127 6091 +t 4715 4717 6128 +t 6092 4715 6128 +t 6093 6129 4718 +t 4716 6093 4718 +t 6094 6130 6093 +t 6130 6129 6093 +t 6095 6131 6094 +t 6131 6130 6094 +t 6096 6132 6095 +t 6132 6131 6095 +t 6097 6133 6096 +t 6133 6132 6096 +t 6098 6134 6097 +t 6134 6133 6097 +t 6099 6135 6098 +t 6135 6134 6098 +t 6100 6136 6099 +t 6136 6135 6099 +t 6101 6137 6100 +t 6137 6136 6100 +t 6102 6138 6101 +t 6138 6137 6101 +t 6103 6139 6102 +t 6139 6138 6102 +t 6104 6140 6103 +t 6140 6139 6103 +t 6105 6141 6104 +t 6141 6140 6104 +t 6106 6142 6105 +t 6142 6141 6105 +t 6107 6143 6106 +t 6143 6142 6106 +t 6108 6144 6107 +t 6144 6143 6107 +t 6109 6145 6108 +t 6145 6144 6108 +t 6110 6146 6109 +t 6146 6145 6109 +t 6111 6147 6112 +t 6147 6148 6112 +t 6113 6149 6111 +t 6149 6147 6111 +t 6114 6150 6113 +t 6150 6149 6113 +t 6115 6151 6114 +t 6151 6150 6114 +t 6116 6152 6115 +t 6152 6151 6115 +t 6117 6153 6116 +t 6153 6152 6116 +t 6118 6154 6117 +t 6154 6153 6117 +t 6119 6155 6118 +t 6155 6154 6118 +t 6120 6156 6119 +t 6156 6155 6119 +t 6121 6157 6120 +t 6157 6156 6120 +t 6122 6158 6121 +t 6158 6157 6121 +t 6123 6159 6122 +t 6159 6158 6122 +t 6124 6160 6123 +t 6160 6159 6123 +t 6125 6161 6124 +t 6161 6160 6124 +t 6126 6162 6125 +t 6162 6161 6125 +t 6127 6163 6126 +t 6163 6162 6126 +t 6128 6164 6127 +t 6164 6163 6127 +t 4717 4719 6164 +t 6128 4717 6164 +t 6129 6165 4720 +t 4718 6129 4720 +t 6130 6166 6129 +t 6166 6165 6129 +t 6131 6167 6130 +t 6167 6166 6130 +t 6132 6168 6131 +t 6168 6167 6131 +t 6133 6169 6132 +t 6169 6168 6132 +t 6134 6170 6133 +t 6170 6169 6133 +t 6135 6171 6134 +t 6171 6170 6134 +t 6136 6172 6135 +t 6172 6171 6135 +t 6137 6173 6136 +t 6173 6172 6136 +t 6138 6174 6137 +t 6174 6173 6137 +t 6139 6175 6138 +t 6175 6174 6138 +t 6140 6176 6139 +t 6176 6175 6139 +t 6141 6177 6140 +t 6177 6176 6140 +t 6142 6178 6141 +t 6178 6177 6141 +t 6143 6179 6142 +t 6179 6178 6142 +t 6144 6180 6143 +t 6180 6179 6143 +t 6145 6181 6144 +t 6181 6180 6144 +t 6146 6182 6145 +t 6182 6181 6145 +t 6147 6183 6148 +t 6183 6184 6148 +t 6149 6185 6147 +t 6185 6183 6147 +t 6150 6186 6149 +t 6186 6185 6149 +t 6151 6187 6150 +t 6187 6186 6150 +t 6152 6188 6151 +t 6188 6187 6151 +t 6153 6189 6152 +t 6189 6188 6152 +t 6154 6190 6153 +t 6190 6189 6153 +t 6155 6191 6154 +t 6191 6190 6154 +t 6156 6192 6155 +t 6192 6191 6155 +t 6157 6193 6156 +t 6193 6192 6156 +t 6158 6194 6157 +t 6194 6193 6157 +t 6159 6195 6158 +t 6195 6194 6158 +t 6160 6196 6159 +t 6196 6195 6159 +t 6161 6197 6160 +t 6197 6196 6160 +t 6162 6198 6161 +t 6198 6197 6161 +t 6163 6199 6162 +t 6199 6198 6162 +t 6164 6200 6163 +t 6200 6199 6163 +t 4719 4721 6200 +t 6164 4719 6200 +t 6165 6201 4722 +t 4720 6165 4722 +t 6166 6202 6165 +t 6202 6201 6165 +t 6167 6203 6166 +t 6203 6202 6166 +t 6168 6204 6167 +t 6204 6203 6167 +t 6169 6205 6168 +t 6205 6204 6168 +t 6170 6206 6169 +t 6206 6205 6169 +t 6171 6207 6170 +t 6207 6206 6170 +t 6172 6208 6171 +t 6208 6207 6171 +t 6173 6209 6172 +t 6209 6208 6172 +t 6174 6210 6173 +t 6210 6209 6173 +t 6175 6211 6174 +t 6211 6210 6174 +t 6176 6212 6175 +t 6212 6211 6175 +t 6177 6213 6176 +t 6213 6212 6176 +t 6178 6214 6177 +t 6214 6213 6177 +t 6179 6215 6178 +t 6215 6214 6178 +t 6180 6216 6179 +t 6216 6215 6179 +t 6181 6217 6180 +t 6217 6216 6180 +t 6182 6218 6181 +t 6218 6217 6181 +t 6183 6219 6184 +t 6219 6220 6184 +t 6185 6221 6183 +t 6221 6219 6183 +t 6186 6222 6185 +t 6222 6221 6185 +t 6187 6223 6186 +t 6223 6222 6186 +t 6188 6224 6187 +t 6224 6223 6187 +t 6189 6225 6188 +t 6225 6224 6188 +t 6190 6226 6189 +t 6226 6225 6189 +t 6191 6227 6190 +t 6227 6226 6190 +t 6192 6228 6191 +t 6228 6227 6191 +t 6193 6229 6192 +t 6229 6228 6192 +t 6194 6230 6193 +t 6230 6229 6193 +t 6195 6231 6194 +t 6231 6230 6194 +t 6196 6232 6195 +t 6232 6231 6195 +t 6197 6233 6196 +t 6233 6232 6196 +t 6198 6234 6197 +t 6234 6233 6197 +t 6199 6235 6198 +t 6235 6234 6198 +t 6200 6236 6199 +t 6236 6235 6199 +t 4721 4723 6236 +t 6200 4721 6236 +t 6201 6237 4724 +t 4722 6201 4724 +t 6202 6238 6201 +t 6238 6237 6201 +t 6203 6239 6202 +t 6239 6238 6202 +t 6204 6240 6203 +t 6240 6239 6203 +t 6205 6241 6204 +t 6241 6240 6204 +t 6206 6242 6205 +t 6242 6241 6205 +t 6207 6243 6206 +t 6243 6242 6206 +t 6208 6244 6207 +t 6244 6243 6207 +t 6209 6245 6208 +t 6245 6244 6208 +t 6210 6246 6209 +t 6246 6245 6209 +t 6211 6247 6210 +t 6247 6246 6210 +t 6212 6248 6211 +t 6248 6247 6211 +t 6213 6249 6212 +t 6249 6248 6212 +t 6214 6250 6213 +t 6250 6249 6213 +t 6215 6251 6214 +t 6251 6250 6214 +t 6216 6252 6215 +t 6252 6251 6215 +t 6217 6253 6216 +t 6253 6252 6216 +t 6218 6254 6217 +t 6254 6253 6217 +t 6219 6255 6220 +t 6255 6256 6220 +t 6221 6257 6219 +t 6257 6255 6219 +t 6222 6258 6221 +t 6258 6257 6221 +t 6223 6259 6222 +t 6259 6258 6222 +t 6224 6260 6223 +t 6260 6259 6223 +t 6225 6261 6224 +t 6261 6260 6224 +t 6226 6262 6225 +t 6262 6261 6225 +t 6227 6263 6226 +t 6263 6262 6226 +t 6228 6264 6227 +t 6264 6263 6227 +t 6229 6265 6228 +t 6265 6264 6228 +t 6230 6266 6229 +t 6266 6265 6229 +t 6231 6267 6230 +t 6267 6266 6230 +t 6232 6268 6231 +t 6268 6267 6231 +t 6233 6269 6232 +t 6269 6268 6232 +t 6234 6270 6233 +t 6270 6269 6233 +t 6235 6271 6234 +t 6271 6270 6234 +t 6236 6272 6235 +t 6272 6271 6235 +t 4723 4725 6272 +t 6236 4723 6272 +t 6237 6273 4726 +t 4724 6237 4726 +t 6238 6274 6237 +t 6274 6273 6237 +t 6239 6275 6238 +t 6275 6274 6238 +t 6240 6276 6239 +t 6276 6275 6239 +t 6241 6277 6240 +t 6277 6276 6240 +t 6242 6278 6241 +t 6278 6277 6241 +t 6243 6279 6242 +t 6279 6278 6242 +t 6244 6280 6243 +t 6280 6279 6243 +t 6245 6281 6244 +t 6281 6280 6244 +t 6246 6282 6245 +t 6282 6281 6245 +t 6247 6283 6246 +t 6283 6282 6246 +t 6248 6284 6247 +t 6284 6283 6247 +t 6249 6285 6248 +t 6285 6284 6248 +t 6250 6286 6249 +t 6286 6285 6249 +t 6251 6287 6250 +t 6287 6286 6250 +t 6252 6288 6251 +t 6288 6287 6251 +t 6253 6289 6252 +t 6289 6288 6252 +t 6254 6290 6253 +t 6290 6289 6253 +t 6255 6291 6256 +t 6291 6292 6256 +t 6257 6293 6255 +t 6293 6291 6255 +t 6258 6294 6257 +t 6294 6293 6257 +t 6259 6295 6258 +t 6295 6294 6258 +t 6260 6296 6259 +t 6296 6295 6259 +t 6261 6297 6260 +t 6297 6296 6260 +t 6262 6298 6261 +t 6298 6297 6261 +t 6263 6299 6262 +t 6299 6298 6262 +t 6264 6300 6263 +t 6300 6299 6263 +t 6265 6301 6264 +t 6301 6300 6264 +t 6266 6302 6265 +t 6302 6301 6265 +t 6267 6303 6266 +t 6303 6302 6266 +t 6268 6304 6267 +t 6304 6303 6267 +t 6269 6305 6268 +t 6305 6304 6268 +t 6270 6306 6269 +t 6306 6305 6269 +t 6271 6307 6270 +t 6307 6306 6270 +t 6272 6308 6271 +t 6308 6307 6271 +t 4725 4727 6308 +t 6272 4725 6308 +t 6273 6309 4728 +t 4726 6273 4728 +t 6274 6310 6273 +t 6310 6309 6273 +t 6275 6311 6274 +t 6311 6310 6274 +t 6276 6312 6275 +t 6312 6311 6275 +t 6277 6313 6276 +t 6313 6312 6276 +t 6278 6314 6277 +t 6314 6313 6277 +t 6279 6315 6278 +t 6315 6314 6278 +t 6280 6316 6279 +t 6316 6315 6279 +t 6281 6317 6280 +t 6317 6316 6280 +t 6282 6318 6281 +t 6318 6317 6281 +t 6283 6319 6282 +t 6319 6318 6282 +t 6284 6320 6283 +t 6320 6319 6283 +t 6285 6321 6284 +t 6321 6320 6284 +t 6286 6322 6285 +t 6322 6321 6285 +t 6287 6323 6286 +t 6323 6322 6286 +t 6288 6324 6287 +t 6324 6323 6287 +t 6289 6325 6288 +t 6325 6324 6288 +t 6290 6326 6289 +t 6326 6325 6289 +t 6291 6327 6292 +t 6327 6328 6292 +t 6293 6329 6291 +t 6329 6327 6291 +t 6294 6330 6293 +t 6330 6329 6293 +t 6295 6331 6294 +t 6331 6330 6294 +t 6296 6332 6295 +t 6332 6331 6295 +t 6297 6333 6296 +t 6333 6332 6296 +t 6298 6334 6297 +t 6334 6333 6297 +t 6299 6335 6298 +t 6335 6334 6298 +t 6300 6336 6299 +t 6336 6335 6299 +t 6301 6337 6300 +t 6337 6336 6300 +t 6302 6338 6301 +t 6338 6337 6301 +t 6303 6339 6302 +t 6339 6338 6302 +t 6304 6340 6303 +t 6340 6339 6303 +t 6305 6341 6304 +t 6341 6340 6304 +t 6306 6342 6305 +t 6342 6341 6305 +t 6307 6343 6306 +t 6343 6342 6306 +t 6308 6344 6307 +t 6344 6343 6307 +t 4727 4729 6344 +t 6308 4727 6344 +t 6309 6345 4730 +t 4728 6309 4730 +t 6310 6346 6309 +t 6346 6345 6309 +t 6311 6347 6310 +t 6347 6346 6310 +t 6312 6348 6311 +t 6348 6347 6311 +t 6313 6349 6312 +t 6349 6348 6312 +t 6314 6350 6313 +t 6350 6349 6313 +t 6315 6351 6314 +t 6351 6350 6314 +t 6316 6352 6315 +t 6352 6351 6315 +t 6317 6353 6316 +t 6353 6352 6316 +t 6318 6354 6317 +t 6354 6353 6317 +t 6319 6355 6318 +t 6355 6354 6318 +t 6320 6356 6319 +t 6356 6355 6319 +t 6321 6357 6320 +t 6357 6356 6320 +t 6322 6358 6321 +t 6358 6357 6321 +t 6323 6359 6322 +t 6359 6358 6322 +t 6324 6360 6323 +t 6360 6359 6323 +t 6325 6361 6324 +t 6361 6360 6324 +t 6326 6362 6325 +t 6362 6361 6325 +t 6327 6363 6328 +t 6363 6364 6328 +t 6329 6365 6327 +t 6365 6363 6327 +t 6330 6366 6329 +t 6366 6365 6329 +t 6331 6367 6330 +t 6367 6366 6330 +t 6332 6368 6331 +t 6368 6367 6331 +t 6333 6369 6332 +t 6369 6368 6332 +t 6334 6370 6333 +t 6370 6369 6333 +t 6335 6371 6334 +t 6371 6370 6334 +t 6336 6372 6335 +t 6372 6371 6335 +t 6337 6373 6336 +t 6373 6372 6336 +t 6338 6374 6337 +t 6374 6373 6337 +t 6339 6375 6338 +t 6375 6374 6338 +t 6340 6376 6339 +t 6376 6375 6339 +t 6341 6377 6340 +t 6377 6376 6340 +t 6342 6378 6341 +t 6378 6377 6341 +t 6343 6379 6342 +t 6379 6378 6342 +t 6344 6380 6343 +t 6380 6379 6343 +t 4729 4731 6380 +t 6344 4729 6380 +t 6345 6381 4732 +t 4730 6345 4732 +t 6346 6382 6345 +t 6382 6381 6345 +t 6347 6383 6346 +t 6383 6382 6346 +t 6348 6384 6347 +t 6384 6383 6347 +t 6349 6385 6348 +t 6385 6384 6348 +t 6350 6386 6349 +t 6386 6385 6349 +t 6351 6387 6350 +t 6387 6386 6350 +t 6352 6388 6351 +t 6388 6387 6351 +t 6353 6389 6352 +t 6389 6388 6352 +t 6354 6390 6353 +t 6390 6389 6353 +t 6355 6391 6354 +t 6391 6390 6354 +t 6356 6392 6355 +t 6392 6391 6355 +t 6357 6393 6356 +t 6393 6392 6356 +t 6358 6394 6357 +t 6394 6393 6357 +t 6359 6395 6358 +t 6395 6394 6358 +t 6360 6396 6359 +t 6396 6395 6359 +t 6361 6397 6360 +t 6397 6396 6360 +t 6362 6398 6361 +t 6398 6397 6361 +t 6363 6399 6364 +t 6399 6400 6364 +t 6365 6401 6363 +t 6401 6399 6363 +t 6366 6402 6365 +t 6402 6401 6365 +t 6367 6403 6366 +t 6403 6402 6366 +t 6368 6404 6367 +t 6404 6403 6367 +t 6369 6405 6368 +t 6405 6404 6368 +t 6370 6406 6369 +t 6406 6405 6369 +t 6371 6407 6370 +t 6407 6406 6370 +t 6372 6408 6371 +t 6408 6407 6371 +t 6373 6409 6372 +t 6409 6408 6372 +t 6374 6410 6373 +t 6410 6409 6373 +t 6375 6411 6374 +t 6411 6410 6374 +t 6376 6412 6375 +t 6412 6411 6375 +t 6377 6413 6376 +t 6413 6412 6376 +t 6378 6414 6377 +t 6414 6413 6377 +t 6379 6415 6378 +t 6415 6414 6378 +t 6380 6416 6379 +t 6416 6415 6379 +t 4731 4733 6416 +t 6380 4731 6416 +t 6381 6417 4734 +t 4732 6381 4734 +t 6382 6418 6381 +t 6418 6417 6381 +t 6383 6419 6382 +t 6419 6418 6382 +t 6384 6420 6383 +t 6420 6419 6383 +t 6385 6421 6384 +t 6421 6420 6384 +t 6386 6422 6385 +t 6422 6421 6385 +t 6387 6423 6386 +t 6423 6422 6386 +t 6388 6424 6387 +t 6424 6423 6387 +t 6389 6425 6388 +t 6425 6424 6388 +t 6390 6426 6389 +t 6426 6425 6389 +t 6391 6427 6390 +t 6427 6426 6390 +t 6392 6428 6391 +t 6428 6427 6391 +t 6393 6429 6392 +t 6429 6428 6392 +t 6394 6430 6393 +t 6430 6429 6393 +t 6395 6431 6394 +t 6431 6430 6394 +t 6396 6432 6395 +t 6432 6431 6395 +t 6397 6433 6396 +t 6433 6432 6396 +t 6398 6434 6397 +t 6434 6433 6397 +t 6399 6435 6400 +t 6435 6436 6400 +t 6401 6437 6399 +t 6437 6435 6399 +t 6402 6438 6401 +t 6438 6437 6401 +t 6403 6439 6402 +t 6439 6438 6402 +t 6404 6440 6403 +t 6440 6439 6403 +t 6405 6441 6404 +t 6441 6440 6404 +t 6406 6442 6405 +t 6442 6441 6405 +t 6407 6443 6406 +t 6443 6442 6406 +t 6408 6444 6407 +t 6444 6443 6407 +t 6409 6445 6408 +t 6445 6444 6408 +t 6410 6446 6409 +t 6446 6445 6409 +t 6411 6447 6410 +t 6447 6446 6410 +t 6412 6448 6411 +t 6448 6447 6411 +t 6413 6449 6412 +t 6449 6448 6412 +t 6414 6450 6413 +t 6450 6449 6413 +t 6415 6451 6414 +t 6451 6450 6414 +t 6416 6452 6415 +t 6452 6451 6415 +t 4733 4735 6452 +t 6416 4733 6452 +t 6417 6453 4736 +t 4734 6417 4736 +t 6418 6454 6417 +t 6454 6453 6417 +t 6419 6455 6418 +t 6455 6454 6418 +t 6420 6456 6419 +t 6456 6455 6419 +t 6421 6457 6420 +t 6457 6456 6420 +t 6422 6458 6421 +t 6458 6457 6421 +t 6423 6459 6422 +t 6459 6458 6422 +t 6424 6460 6423 +t 6460 6459 6423 +t 6425 6461 6424 +t 6461 6460 6424 +t 6426 6462 6425 +t 6462 6461 6425 +t 6427 6463 6426 +t 6463 6462 6426 +t 6428 6464 6427 +t 6464 6463 6427 +t 6429 6465 6428 +t 6465 6464 6428 +t 6430 6466 6429 +t 6466 6465 6429 +t 6431 6467 6430 +t 6467 6466 6430 +t 6432 6468 6431 +t 6468 6467 6431 +t 6433 6469 6432 +t 6469 6468 6432 +t 6434 6470 6433 +t 6470 6469 6433 +t 6435 6471 6436 +t 6471 6472 6436 +t 6437 6473 6435 +t 6473 6471 6435 +t 6438 6474 6437 +t 6474 6473 6437 +t 6439 6475 6438 +t 6475 6474 6438 +t 6440 6476 6439 +t 6476 6475 6439 +t 6441 6477 6440 +t 6477 6476 6440 +t 6442 6478 6441 +t 6478 6477 6441 +t 6443 6479 6442 +t 6479 6478 6442 +t 6444 6480 6443 +t 6480 6479 6443 +t 6445 6481 6444 +t 6481 6480 6444 +t 6446 6482 6445 +t 6482 6481 6445 +t 6447 6483 6446 +t 6483 6482 6446 +t 6448 6484 6447 +t 6484 6483 6447 +t 6449 6485 6448 +t 6485 6484 6448 +t 6450 6486 6449 +t 6486 6485 6449 +t 6451 6487 6450 +t 6487 6486 6450 +t 6452 6488 6451 +t 6488 6487 6451 +t 4735 4737 6488 +t 6452 4735 6488 +t 6453 6489 4738 +t 4736 6453 4738 +t 6454 6490 6453 +t 6490 6489 6453 +t 6455 6491 6454 +t 6491 6490 6454 +t 6456 6492 6455 +t 6492 6491 6455 +t 6457 6493 6456 +t 6493 6492 6456 +t 6458 6494 6457 +t 6494 6493 6457 +t 6459 6495 6458 +t 6495 6494 6458 +t 6460 6496 6459 +t 6496 6495 6459 +t 6461 6497 6460 +t 6497 6496 6460 +t 6462 6498 6461 +t 6498 6497 6461 +t 6463 6499 6462 +t 6499 6498 6462 +t 6464 6500 6463 +t 6500 6499 6463 +t 6465 6501 6464 +t 6501 6500 6464 +t 6466 6502 6465 +t 6502 6501 6465 +t 6467 6503 6466 +t 6503 6502 6466 +t 6468 6504 6467 +t 6504 6503 6467 +t 6469 6505 6468 +t 6505 6504 6468 +t 6470 6506 6469 +t 6506 6505 6469 +t 6471 6507 6472 +t 6507 6508 6472 +t 6473 6509 6471 +t 6509 6507 6471 +t 6474 6510 6473 +t 6510 6509 6473 +t 6475 6511 6474 +t 6511 6510 6474 +t 6476 6512 6475 +t 6512 6511 6475 +t 6477 6513 6476 +t 6513 6512 6476 +t 6478 6514 6477 +t 6514 6513 6477 +t 6479 6515 6478 +t 6515 6514 6478 +t 6480 6516 6479 +t 6516 6515 6479 +t 6481 6517 6480 +t 6517 6516 6480 +t 6482 6518 6481 +t 6518 6517 6481 +t 6483 6519 6482 +t 6519 6518 6482 +t 6484 6520 6483 +t 6520 6519 6483 +t 6485 6521 6484 +t 6521 6520 6484 +t 6486 6522 6485 +t 6522 6521 6485 +t 6487 6523 6486 +t 6523 6522 6486 +t 6488 6524 6487 +t 6524 6523 6487 +t 4737 4739 6524 +t 6488 4737 6524 +t 6489 6525 4740 +t 4738 6489 4740 +t 6490 6526 6489 +t 6526 6525 6489 +t 6491 6527 6490 +t 6527 6526 6490 +t 6492 6528 6491 +t 6528 6527 6491 +t 6493 6529 6492 +t 6529 6528 6492 +t 6494 6530 6493 +t 6530 6529 6493 +t 6495 6531 6494 +t 6531 6530 6494 +t 6496 6532 6495 +t 6532 6531 6495 +t 6497 6533 6496 +t 6533 6532 6496 +t 6498 6534 6497 +t 6534 6533 6497 +t 6499 6535 6498 +t 6535 6534 6498 +t 6500 6536 6499 +t 6536 6535 6499 +t 6501 6537 6500 +t 6537 6536 6500 +t 6502 6538 6501 +t 6538 6537 6501 +t 6503 6539 6502 +t 6539 6538 6502 +t 6504 6540 6503 +t 6540 6539 6503 +t 6505 6541 6504 +t 6541 6540 6504 +t 6506 6542 6505 +t 6542 6541 6505 +t 6507 6543 6508 +t 6543 6544 6508 +t 6509 6545 6507 +t 6545 6543 6507 +t 6510 6546 6509 +t 6546 6545 6509 +t 6511 6547 6510 +t 6547 6546 6510 +t 6512 6548 6511 +t 6548 6547 6511 +t 6513 6549 6512 +t 6549 6548 6512 +t 6514 6550 6513 +t 6550 6549 6513 +t 6515 6551 6514 +t 6551 6550 6514 +t 6516 6552 6515 +t 6552 6551 6515 +t 6517 6553 6516 +t 6553 6552 6516 +t 6518 6554 6517 +t 6554 6553 6517 +t 6519 6555 6518 +t 6555 6554 6518 +t 6520 6556 6519 +t 6556 6555 6519 +t 6521 6557 6520 +t 6557 6556 6520 +t 6522 6558 6521 +t 6558 6557 6521 +t 6523 6559 6522 +t 6559 6558 6522 +t 6524 6560 6523 +t 6560 6559 6523 +t 4739 4741 6560 +t 6524 4739 6560 +t 6525 6561 4742 +t 4740 6525 4742 +t 6526 6562 6525 +t 6562 6561 6525 +t 6527 6563 6526 +t 6563 6562 6526 +t 6528 6564 6527 +t 6564 6563 6527 +t 6529 6565 6528 +t 6565 6564 6528 +t 6530 6566 6529 +t 6566 6565 6529 +t 6531 6567 6530 +t 6567 6566 6530 +t 6532 6568 6531 +t 6568 6567 6531 +t 6533 6569 6532 +t 6569 6568 6532 +t 6534 6570 6533 +t 6570 6569 6533 +t 6535 6571 6534 +t 6571 6570 6534 +t 6536 6572 6535 +t 6572 6571 6535 +t 6537 6573 6536 +t 6573 6572 6536 +t 6538 6574 6537 +t 6574 6573 6537 +t 6539 6575 6538 +t 6575 6574 6538 +t 6540 6576 6539 +t 6576 6575 6539 +t 6541 6577 6540 +t 6577 6576 6540 +t 6542 6578 6541 +t 6578 6577 6541