From 3760e901d39a5ababb90942de7719116769dd249 Mon Sep 17 00:00:00 2001 From: Isabelle Sivignon Date: Fri, 24 May 2024 16:57:31 +0200 Subject: [PATCH 1/7] add new sample images + fix segmentation fault + fix to enable error=0 + new test --- src/DGtal/geometry/curves/FrechetShortcut.h | 58 +- src/DGtal/geometry/curves/FrechetShortcut.ih | 69 +- tests/geometry/curves/testFrechetShortcut.cpp | 130 +- tests/samples/beetle-1.dat | 5222 +++++++++++++++++ 4 files changed, 5433 insertions(+), 46 deletions(-) create mode 100755 tests/samples/beetle-1.dat diff --git a/src/DGtal/geometry/curves/FrechetShortcut.h b/src/DGtal/geometry/curves/FrechetShortcut.h index e891e63271..a126464700 100644 --- a/src/DGtal/geometry/curves/FrechetShortcut.h +++ b/src/DGtal/geometry/curves/FrechetShortcut.h @@ -52,6 +52,9 @@ #include "DGtal/geometry/curves/SegmentComputerUtils.h" + +#define PRECISION 0.00000001 + namespace DGtal { @@ -399,6 +402,24 @@ namespace DGtal double *xi, double *yi, double *xi_prime, double *yi_prime) { + // I. Sivignon 05/2024: fix to handle the case where r0=0 or + // r1=0. Enables the case where error=0. + // Other special cases where circles are tangent are treated + // below. + if(r0==0) + { + *xi = x0; *yi = y0; + *xi_prime = x0 ; *yi_prime = y0; + return 1; + } + else + if(r1==0) + { + *xi = x1; *yi = y1; + *xi_prime = x1 ; *yi_prime = y1; + return 1; + } + double a, dx, dy, d, h, rx, ry; double x2, y2; @@ -407,10 +428,21 @@ namespace DGtal */ dx = x1 - x0; dy = y1 - y0; - + /* Determine the straight-line distance between the centers. */ //d = sqrt((dy*dy) + (dx*dx)); d = hypot(dx,dy); // Suggested by Keith Briggs + + if((r0+r1)*(r0+r1)-((dy*dy)+(dx*dx)) < PRECISION) + { // I. Sivignon 05/2024: fix to handle the case where + // circles are tangent but radii are non zero. + + double alpha= r0/d; + *xi = x0 + dx*alpha; + *yi = y0 + dy*alpha; + *xi_prime = *xi; *yi_prime = *yi; + return 1; + } /* Check for solvability. */ if (d > (r0 + r1)) @@ -424,7 +456,8 @@ namespace DGtal /* no solution. one circle is contained in the other */ return 0; } - + + // } /* 'point 2' is the point where the line through the circle * intersection points crosses the line between the circle * centers. @@ -432,16 +465,17 @@ namespace DGtal /* Determine the distance from point 0 to point 2. */ a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ; - + /* Determine the coordinates of point 2. */ x2 = x0 + (dx * a/d); y2 = y0 + (dy * a/d); - + + /* Determine the distance from point 2 to either of the * intersection points. */ h = sqrt((r0*r0) - (a*a)); - + /* Now determine the offsets of the intersection points from * point 2. */ @@ -487,6 +521,7 @@ namespace DGtal int res = circle_circle_intersection(x0,y0,r0,x1,y1,r1,xi,yi,xi_prime,yi_prime); + return res; @@ -522,10 +557,13 @@ namespace DGtal } else { - if(y>0) - return M_PI_2; - else - return 3*M_PI_2; + if(y==0) + return 0; + else + if(y>0) + return M_PI_2; + else + return 3*M_PI_2; } return -1; } @@ -797,8 +835,6 @@ namespace DGtal ConstIterator end() const; - - public: /** diff --git a/src/DGtal/geometry/curves/FrechetShortcut.ih b/src/DGtal/geometry/curves/FrechetShortcut.ih index b8b53fe616..2a6c86c573 100644 --- a/src/DGtal/geometry/curves/FrechetShortcut.ih +++ b/src/DGtal/geometry/curves/FrechetShortcut.ih @@ -39,7 +39,7 @@ // Class backpath //////////////////////////////////////////////////////////////// -#define PRECISION 0.00001 +//#define PRECISION 0.00001 //creation of a backPath @@ -146,6 +146,7 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() double angle_min=0; double angle_max=M_PI_4; bool occ = false; + bool ok = true; IntegerComputer ic; @@ -157,16 +158,18 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() } else { - typename occulter_list::iterator iter, next; - bool ok = true; + typename occulter_list::iterator iter=myOcculters.begin(); + iter = myOcculters.begin(); - while(iter!=myOcculters.end() && ok) + for(int i=0; i < myOcculters.size() && ok ; ++i) + // while(iter!=myOcculters.end() && ok) { pi = Point(*(iter->first)); v = p-pi; - next = iter; - next++; + //next = iter; + //next++; + // pi is after p for all directions -> p is not an occulter if(ic.dotProduct(v,u1) < 0 && ic.dotProduct(v,u2) <0) { @@ -178,7 +181,7 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() // anymore, p is a new occulter. if(ic.dotProduct(v,u1) > 0 && ic.dotProduct(v,u2) > 0) { - myOcculters.erase(iter); + iter = myOcculters.erase(iter); occ = true; angle_min = 0; angle_max = M_PI_4; @@ -198,12 +201,13 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() angle_max = alpha; // pi's angle_min is updated iter->second.angle_min = alpha; + iter++; } else if(alpha > iter->second.angle_max) { //pi is not an occulter anymore - myOcculters.erase(iter); + iter = myOcculters.erase(iter); occ=true; angle_min = 0; angle_max = M_PI_4; @@ -225,21 +229,24 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() angle_max = M_PI_4; // pi's angle_max is updated iter->second.angle_max = alpha; + iter++; } else if(alpha < iter->second.angle_min) { //pi is not an occulter anymore - myOcculters.erase(iter); + iter = myOcculters.erase(iter); occ=true; angle_min = 0; angle_max = M_PI_4; } + else + iter++; // if(alpha > iter->second.angle_max), pi does not // change, p may be an occulter -> do nothing } - iter = next; + // iter = next; } } @@ -441,7 +448,7 @@ bool DGtal::FrechetShortcut::Cone::isEmpty() const if(myInf) return false; else - if(myMin==myMax) + if(myMin==-1) // and then myMax = -1 too: way to represent the empty intersection of two cones. return true; else return false; @@ -509,7 +516,7 @@ typename DGtal::FrechetShortcut::Cone DGtal::FrechetShortcut // first possibility: the cones are disjoint if(!Tools::isBetween(myMin, c.myMin, c.myMax, 2*M_PI) && !Tools::isBetween(myMax, c.myMin, c.myMax, 2*M_PI)) - res = Cone(0,0); + res = Cone(-1,-1); else // or the new cone includes the old one, nothing changes, the cone remains the same. res = *this; @@ -523,6 +530,8 @@ typename DGtal::FrechetShortcut::Cone DGtal::FrechetShortcut res = Cone(c.myMin, myMax); else res = Cone(myMin,c.myMax); + + //trace.info() << "res of cone intersection: " << res.myMin << " " << res.myMax << std::endl; return res; } @@ -568,6 +577,7 @@ template inline DGtal::FrechetShortcut::FrechetShortcut(double error) { + myError = error; myCone = Cone(); @@ -688,14 +698,21 @@ DGtal::FrechetShortcut::computeNewCone() Point firstP = Point(*myBegin); Point newP = Point(*(myEnd+1)); + //trace.info() << "compute new cone: " << firstP << " " << newP << std::endl; Cone newCone=myCone; + + if(firstP == newP) + return newCone; // compute the tangent points defined by the first point and the // circle C(newP,error) + + bool intersect = Tools::circleTangentPoints(firstP[0],firstP[1], newP[0], newP[1], myError/(sqrt(2.0F)), &x0, &y0, &x1, &y1); - + + //std::cout << " tangent points " << x0 << " " << y0 << " " << x1 << " " << y1 << std::endl; if(intersect) { // define a cone according to the new tangent points @@ -703,21 +720,29 @@ DGtal::FrechetShortcut::computeNewCone() // case where there is one single tangent point if(fabs(x0-x1) < PRECISION && fabs(y0-y1) < PRECISION) { + // trace.info() << "!! Single tangent point !!!" << std::endl; + //trace.info() << "points/error: " << firstP << " " << newP << " " << myError << std::endl; + double angle = Tools::computeAngle(firstP[0],firstP[1],newP[0],newP[1]); - assert(angle != -1); - double angle0 = angle - M_PI_2; - if(angle0<0) - angle0 = angle0+2*M_PI; - double angle1 = angle + M_PI_2; - if(angle1>2*M_PI) - angle1 = angle1-2*M_PI; - c = Cone(angle0,angle1); + + // assert(angle != -1); + // double angle0 = angle - M_PI_2; + // if(angle0<0) + // angle0 = angle0+2*M_PI; + // double angle1 = angle + M_PI_2; + // if(angle1>2*M_PI) + // angle1 = angle1-2*M_PI; + //c = Cone(angle0,angle1); + c = Cone(angle,angle); } else c = Cone(firstP[0],firstP[1],x0,y0,x1,y1); + + // trace.info() << "old cone: " << myCone.myMin << " " << myCone.myMax << " new cone: " << c.myMin << " " << c.myMax << std::endl; newCone.intersectCones(c); } + return newCone; @@ -873,7 +898,7 @@ inline void DGtal::FrechetShortcut::resetCone() { myCone.myMin = 0; - myCone.myMax = 0; + myCone.myMax = 2*M_PI; myCone.myInf = true; } diff --git a/tests/geometry/curves/testFrechetShortcut.cpp b/tests/geometry/curves/testFrechetShortcut.cpp index 612ea10f69..91845a7444 100644 --- a/tests/geometry/curves/testFrechetShortcut.cpp +++ b/tests/geometry/curves/testFrechetShortcut.cpp @@ -49,6 +49,7 @@ #include "DGtal/geometry/curves/GreedySegmentation.h" +#include "ConfigTest.h" /////////////////////////////////////////////////////////////////////////////// @@ -127,13 +128,8 @@ void testFrechetShortcutConceptChecking() bool testSegmentation() { - unsigned int nbok = 0; - unsigned int nb = 0; - typedef PointVector<2,int> Point; - //typedef std::vector::iterator Iterator; - //typedef FrechetShortcut SegmentComputer; - + std::vector contour; contour.push_back(Point(0,0)); contour.push_back(Point(1,0)); @@ -173,10 +169,11 @@ bool testSegmentation() board << r; board << aCurve.getArrowsRange(); - + // Test when error = 3 + double anerror = 3; - nbok =3; - + int nbok = 3; + int nb=0; trace.beginBlock ( "Greedy segmentation" ); { typedef GreedySegmentation Segmentation; @@ -184,19 +181,41 @@ bool testSegmentation() Segmentation::SegmentComputerIterator it = theSegmentation.begin(); Segmentation::SegmentComputerIterator itEnd = theSegmentation.end(); - + for ( ; it != itEnd; ++it) { SegmentComputer s(*it); trace.info() << s << std::endl; board << (*it); nb++; } + trace.info() << theSegmentation << std::endl; + board.saveEPS("FrechetShortcutGreedySegmentationTest.eps", Board2D::BoundingBox, 5000 ); + } - //board << aCurve; + // test when error = 0 + + double anerror2 = 0; + int nbok2 = 5; + int nb2=0; + trace.beginBlock ( "Greedy segmentation" ); + { + typedef GreedySegmentation Segmentation; + Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(anerror2) ); + + Segmentation::SegmentComputerIterator it = theSegmentation.begin(); + Segmentation::SegmentComputerIterator itEnd = theSegmentation.end(); + + for ( ; it != itEnd; ++it) { + SegmentComputer s(*it); + trace.info() << s << std::endl; + board << (*it); + nb2++; + } trace.info() << theSegmentation << std::endl; board.saveEPS("FrechetShortcutGreedySegmentationTest.eps", Board2D::BoundingBox, 5000 ); } + /* Saturated segmentation does not work for FrechetShortcut computer. Indeed, given two maximal Frechet shortcuts s1(begin, end) et s2(begin, end), we can have s1.begin < s2.begin < s2.end < @@ -205,11 +224,91 @@ bool testSegmentation() trace.endBlock(); - return nbok == nb; + return (nbok == nb) && (nbok2==nb2); } +bool testSegmentationLarger(const string& filename, int min, int max, double delta) +{ + // Build output filename + + std::size_t pos1 = filename.find("samples/"); + std::size_t init = pos1+8; + std::size_t pos2 = filename.find(".dat"); + std::size_t end = pos2-init; + std::string output = filename.substr(init,end); + + trace.beginBlock ( "Testing block ..." ); + + trace.beginBlock ( "Greedy segmentation on larger contours" ); + + + //std::vector contour; + + //contour = PointListReader< Z2i::Point >::getPointsFromFile(filename); + + trace.info() << "Reading input curve" << filename << std::endl; + + typedef Curve::PointsRange::ConstIterator Iterator; + + Curve aCurve; //grid curve + + ifstream instream; // input stream + instream.open (filename.c_str(), ifstream::in); + + aCurve.initFromVectorStream(instream); + + + typedef Curve::PointsRange Range; //range + Range r = aCurve.getPointsRange(); //range + + Board2D board; + board << r; + board << aCurve.getArrowsRange(); + + trace.info() << "Size of input curve = " << aCurve.size() << std::endl; + + typedef Curve::PointsRange::ConstIterator Iterator; + typedef FrechetShortcut SegmentComputer; + typedef GreedySegmentation Segmentation; + + for(double error = min; error <= max; error+=delta) + { + trace.info() << "error = " << error << "\t"; + Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(error) ); + + Segmentation::SegmentComputerIterator it = theSegmentation.begin(); + Segmentation::SegmentComputerIterator itEnd = theSegmentation.end(); + + int size = 0; + for ( ; it != itEnd; ++it) + size++; + + trace.info() << "size of simplified curve = " << size << std::endl; + + it = theSegmentation.begin(); + for ( ; it != itEnd; ++it) + { + SegmentComputer s(*it); + //trace.info() << s << std::endl; + board << (*it); + // nb++; + } + + //board << aCurve; + string outputFilename = "FrechetShortcut-"+output+".eps"; + board.saveEPS(outputFilename.c_str(), Board2D::BoundingBox, 5000 ); + //board.saveEPS("FrechetShortcutGreedySegmentationLargeTest.eps", Board2D::BoundingBox, 5000 ); + } + + trace.endBlock(); + trace.endBlock(); + + return 1; +} + + /////////////////////////////////////////////////////////////////////////////// @@ -225,7 +324,12 @@ int main( int argc, char** argv ) testFrechetShortcutConceptChecking(); - bool res = testFrechetShortcut() && testSegmentation(); // && ... other tests + + std::string Plant054 = testPath + "samples/Plant054.dat"; + std::string beetle = testPath + "samples/beetle-1.dat"; + + + bool res = testFrechetShortcut() && testSegmentation() && testSegmentationLarger(Plant054,0,20,0.5) && testSegmentationLarger(beetle,0,30,5); // && ... other tests trace.emphase() << ( res ? "Passed." : "Error." ) << endl; trace.endBlock(); return res ? 0 : 1; diff --git a/tests/samples/beetle-1.dat b/tests/samples/beetle-1.dat new file mode 100755 index 0000000000..eee731ddac --- /dev/null +++ b/tests/samples/beetle-1.dat @@ -0,0 +1,5222 @@ +244 14 +243 14 +243 15 +242 15 +242 16 +242 17 +242 18 +241 18 +241 19 +240 19 +239 19 +239 20 +239 21 +239 22 +239 23 +240 23 +241 23 +241 24 +241 25 +241 26 +242 26 +242 27 +243 27 +243 28 +244 28 +245 28 +245 29 +245 30 +246 30 +246 31 +246 32 +246 33 +246 34 +247 34 +247 35 +248 35 +249 35 +249 36 +250 36 +251 36 +252 36 +253 36 +254 36 +255 36 +255 37 +255 38 +256 38 +257 38 +257 39 +258 39 +258 40 +258 41 +258 42 +258 43 +259 43 +259 44 +260 44 +261 44 +261 45 +261 46 +261 47 +262 47 +262 48 +263 48 +263 49 +263 50 +263 51 +264 51 +265 51 +266 51 +266 52 +267 52 +267 53 +267 54 +268 54 +269 54 +270 54 +270 55 +271 55 +271 56 +271 57 +271 58 +270 58 +270 59 +270 60 +270 61 +270 62 +270 63 +271 63 +271 64 +271 65 +271 66 +271 67 +271 68 +272 68 +273 68 +273 69 +273 70 +274 70 +274 71 +275 71 +275 72 +275 73 +275 74 +276 74 +276 75 +276 76 +276 77 +276 78 +276 79 +276 80 +276 81 +276 82 +277 82 +278 82 +278 83 +278 84 +278 85 +278 86 +278 87 +278 88 +279 88 +280 88 +280 89 +280 90 +280 91 +280 92 +281 92 +282 92 +282 93 +282 94 +282 95 +282 96 +283 96 +283 97 +283 98 +283 99 +284 99 +284 100 +284 101 +285 101 +286 101 +286 102 +286 103 +285 103 +284 103 +284 104 +284 105 +284 106 +284 107 +283 107 +283 108 +283 109 +284 109 +284 110 +284 111 +284 112 +284 113 +284 114 +284 115 +284 116 +284 117 +284 118 +284 119 +284 120 +284 121 +284 122 +284 123 +285 123 +286 123 +286 124 +287 124 +287 125 +288 125 +288 126 +288 127 +288 128 +287 128 +287 129 +287 130 +287 131 +286 131 +286 132 +286 133 +286 134 +286 135 +286 136 +286 137 +286 138 +286 139 +287 139 +287 140 +288 140 +288 141 +288 142 +288 143 +289 143 +290 143 +290 144 +291 144 +291 145 +291 146 +291 147 +291 148 +291 149 +291 150 +291 151 +290 151 +290 152 +289 152 +288 152 +288 153 +288 154 +288 155 +288 156 +288 157 +289 157 +290 157 +290 158 +290 159 +290 160 +291 160 +291 161 +291 162 +291 163 +291 164 +291 165 +291 166 +291 167 +291 168 +292 168 +292 169 +292 170 +292 171 +292 172 +292 173 +291 173 +291 174 +291 175 +291 176 +291 177 +291 178 +291 179 +291 180 +291 181 +291 182 +292 182 +292 183 +292 184 +292 185 +292 186 +293 186 +294 186 +295 186 +295 187 +295 188 +296 188 +296 189 +296 190 +296 191 +296 192 +296 193 +296 194 +295 194 +295 195 +295 196 +295 197 +296 197 +296 198 +296 199 +296 200 +295 200 +295 201 +295 202 +296 202 +296 203 +296 204 +296 205 +296 206 +296 207 +296 208 +297 208 +298 208 +298 209 +298 210 +298 211 +298 212 +298 213 +299 213 +299 214 +300 214 +300 215 +300 216 +300 217 +300 218 +301 218 +302 218 +302 219 +302 220 +302 221 +302 222 +302 223 +302 224 +302 225 +301 225 +300 225 +300 226 +301 226 +302 226 +302 227 +302 228 +303 228 +303 229 +303 230 +303 231 +303 232 +303 233 +302 233 +302 234 +303 234 +303 235 +303 236 +303 237 +303 238 +304 238 +304 239 +304 240 +304 241 +305 241 +306 241 +306 242 +307 242 +307 243 +307 244 +307 245 +308 245 +309 245 +310 245 +310 246 +310 247 +310 248 +309 248 +308 248 +307 248 +306 248 +305 248 +304 248 +304 249 +303 249 +303 250 +303 251 +302 251 +302 252 +302 253 +301 253 +300 253 +300 254 +299 254 +299 255 +298 255 +298 256 +298 257 +297 257 +296 257 +296 258 +296 259 +296 260 +296 261 +295 261 +295 262 +295 263 +295 264 +295 265 +295 266 +294 266 +293 266 +292 266 +292 267 +292 268 +292 269 +291 269 +291 270 +290 270 +289 270 +288 270 +287 270 +287 269 +286 269 +286 268 +286 267 +285 267 +284 267 +283 267 +282 267 +281 267 +280 267 +279 267 +278 267 +278 266 +277 266 +276 266 +276 265 +276 264 +276 263 +276 262 +276 261 +276 260 +276 259 +275 259 +275 258 +275 257 +274 257 +274 256 +274 255 +274 254 +273 254 +273 253 +273 252 +273 251 +273 250 +273 249 +272 249 +271 249 +271 248 +271 247 +271 246 +270 246 +270 245 +269 245 +269 244 +268 244 +267 244 +267 243 +267 242 +267 241 +266 241 +266 240 +265 240 +264 240 +263 240 +263 239 +263 238 +262 238 +262 237 +263 237 +263 236 +263 235 +263 234 +263 233 +263 232 +263 231 +263 230 +264 230 +265 230 +266 230 +266 229 +266 228 +267 228 +267 227 +267 226 +267 225 +267 224 +267 223 +267 222 +267 221 +267 220 +268 220 +269 220 +269 219 +269 218 +269 217 +269 216 +269 215 +269 214 +270 214 +270 213 +270 212 +270 211 +270 210 +271 210 +271 209 +271 208 +272 208 +273 208 +273 207 +273 206 +273 205 +273 204 +273 203 +273 202 +273 201 +273 200 +274 200 +274 199 +274 198 +274 197 +273 197 +273 196 +274 196 +274 195 +274 194 +274 193 +275 193 +275 192 +275 191 +275 190 +275 189 +275 188 +274 188 +274 187 +274 186 +274 185 +275 185 +275 184 +275 183 +275 182 +275 181 +275 180 +274 180 +274 179 +274 178 +273 178 +272 178 +271 178 +270 178 +270 177 +270 176 +269 176 +269 175 +269 174 +269 173 +269 172 +268 172 +267 172 +267 171 +267 170 +268 170 +269 170 +269 169 +269 168 +268 168 +267 168 +267 167 +267 166 +267 165 +266 165 +266 164 +266 163 +266 162 +266 161 +266 160 +266 159 +266 158 +266 157 +265 157 +264 157 +263 157 +263 156 +262 156 +262 155 +262 154 +262 153 +262 152 +262 151 +262 150 +262 149 +261 149 +260 149 +259 149 +259 148 +259 147 +258 147 +258 146 +258 145 +257 145 +256 145 +255 145 +255 144 +254 144 +253 144 +252 144 +251 144 +251 143 +250 143 +249 143 +249 142 +249 141 +249 140 +248 140 +247 140 +247 139 +247 138 +247 137 +248 137 +249 137 +249 136 +249 135 +249 134 +249 133 +249 132 +248 132 +247 132 +247 131 +246 131 +246 130 +246 129 +245 129 +244 129 +243 129 +242 129 +242 130 +242 131 +241 131 +240 131 +239 131 +239 132 +239 133 +239 134 +239 135 +238 135 +237 135 +237 136 +236 136 +235 136 +234 136 +234 137 +233 137 +233 138 +233 139 +232 139 +231 139 +231 140 +230 140 +230 141 +229 141 +229 142 +229 143 +229 144 +230 144 +230 145 +230 146 +230 147 +230 148 +230 149 +231 149 +231 150 +231 151 +232 151 +233 151 +234 151 +235 151 +236 151 +237 151 +238 151 +239 151 +240 151 +241 151 +241 152 +241 153 +241 154 +241 155 +241 156 +241 157 +241 158 +241 159 +241 160 +242 160 +242 161 +242 162 +242 163 +242 164 +243 164 +244 164 +245 164 +245 165 +245 166 +246 166 +246 167 +246 168 +247 168 +247 169 +248 169 +249 169 +249 170 +249 171 +249 172 +249 173 +249 174 +249 175 +249 176 +249 177 +249 178 +250 178 +251 178 +251 179 +251 180 +251 181 +251 182 +252 182 +253 182 +253 183 +253 184 +253 185 +252 185 +251 185 +251 186 +252 186 +253 186 +253 187 +253 188 +254 188 +254 189 +255 189 +255 190 +255 191 +255 192 +255 193 +255 194 +254 194 +254 195 +254 196 +254 197 +254 198 +255 198 +255 199 +255 200 +255 201 +255 202 +254 202 +254 203 +254 204 +254 205 +254 206 +254 207 +254 208 +254 209 +254 210 +253 210 +253 211 +253 212 +253 213 +253 214 +252 214 +251 214 +251 215 +251 216 +251 217 +251 218 +251 219 +251 220 +251 221 +251 222 +251 223 +251 224 +250 224 +249 224 +249 225 +249 226 +250 226 +251 226 +251 227 +251 228 +251 229 +250 229 +249 229 +249 230 +249 231 +249 232 +248 232 +247 232 +247 233 +247 234 +248 234 +249 234 +249 235 +249 236 +249 237 +249 238 +249 239 +249 240 +249 241 +249 242 +249 243 +249 244 +249 245 +249 246 +249 247 +249 248 +249 249 +249 250 +249 251 +249 252 +249 253 +249 254 +250 254 +251 254 +251 255 +251 256 +251 257 +251 258 +251 259 +251 260 +251 261 +252 261 +253 261 +253 262 +253 263 +253 264 +253 265 +253 266 +253 267 +253 268 +253 269 +254 269 +254 270 +254 271 +254 272 +254 273 +254 274 +255 274 +255 275 +256 275 +257 275 +257 276 +257 277 +257 278 +257 279 +257 280 +257 281 +257 282 +258 282 +258 283 +258 284 +258 285 +259 285 +259 286 +259 287 +260 287 +261 287 +261 288 +261 289 +261 290 +261 291 +260 291 +259 291 +259 292 +259 293 +258 293 +258 292 +258 291 +257 291 +257 292 +257 293 +256 293 +255 293 +254 293 +253 293 +252 293 +251 293 +250 293 +249 293 +249 294 +249 295 +249 296 +249 297 +248 297 +247 297 +246 297 +245 297 +245 298 +244 298 +243 298 +242 298 +242 299 +241 299 +241 298 +240 298 +239 298 +239 297 +238 297 +238 296 +238 295 +237 295 +237 294 +237 293 +236 293 +235 293 +234 293 +233 293 +232 293 +231 293 +230 293 +229 293 +229 292 +229 291 +228 291 +227 291 +226 291 +225 291 +224 291 +223 291 +223 290 +222 290 +221 290 +220 290 +219 290 +218 290 +217 290 +216 290 +215 290 +215 289 +214 289 +214 290 +213 290 +212 290 +211 290 +210 290 +209 290 +208 290 +207 290 +207 291 +206 291 +205 291 +204 291 +203 291 +202 291 +201 291 +200 291 +200 292 +200 293 +199 293 +198 293 +198 294 +198 295 +197 295 +196 295 +196 296 +196 297 +195 297 +194 297 +193 297 +193 298 +192 298 +191 298 +190 298 +189 298 +189 299 +188 299 +188 300 +188 301 +187 301 +186 301 +185 301 +184 301 +184 302 +183 302 +182 302 +182 303 +182 304 +182 305 +181 305 +181 306 +180 306 +179 306 +178 306 +178 307 +177 307 +176 307 +175 307 +174 307 +174 308 +174 309 +174 310 +173 310 +172 310 +172 311 +171 311 +170 311 +170 312 +170 313 +170 314 +169 314 +169 315 +168 315 +168 316 +168 317 +167 317 +166 317 +165 317 +164 317 +164 318 +163 318 +162 318 +161 318 +161 319 +160 319 +160 320 +160 321 +159 321 +158 321 +158 322 +157 322 +156 322 +156 323 +156 324 +156 325 +155 325 +154 325 +154 326 +153 326 +152 326 +151 326 +150 326 +149 326 +148 326 +147 326 +146 326 +146 327 +145 327 +145 328 +145 329 +144 329 +143 329 +142 329 +142 330 +141 330 +141 331 +140 331 +140 332 +140 333 +140 334 +140 335 +140 336 +141 336 +141 337 +141 338 +140 338 +139 338 +138 338 +137 338 +136 338 +135 338 +135 339 +135 340 +135 341 +135 342 +134 342 +133 342 +132 342 +131 342 +131 343 +130 343 +129 343 +128 343 +128 344 +127 344 +127 345 +127 346 +126 346 +125 346 +125 347 +124 347 +124 348 +123 348 +122 348 +121 348 +120 348 +119 348 +118 348 +117 348 +116 348 +116 349 +116 350 +115 350 +115 351 +114 351 +113 351 +113 352 +112 352 +112 353 +112 354 +112 355 +111 355 +111 356 +111 357 +111 358 +110 358 +109 358 +109 359 +108 359 +108 360 +107 360 +106 360 +105 360 +104 360 +103 360 +103 361 +103 362 +102 362 +101 362 +101 363 +100 363 +100 364 +100 365 +100 366 +99 366 +99 367 +98 367 +97 367 +96 367 +95 367 +95 368 +95 369 +95 370 +94 370 +93 370 +93 371 +93 372 +93 373 +93 374 +93 375 +94 375 +95 375 +95 376 +96 376 +97 376 +97 377 +97 378 +98 378 +99 378 +99 379 +100 379 +100 380 +101 380 +101 381 +101 382 +101 383 +101 384 +102 384 +103 384 +103 385 +103 386 +104 386 +105 386 +106 386 +107 386 +108 386 +108 385 +108 384 +109 384 +109 383 +109 382 +109 381 +109 380 +110 380 +111 380 +111 379 +111 378 +110 378 +109 378 +109 377 +109 376 +109 375 +109 374 +109 373 +109 372 +110 372 +111 372 +111 371 +112 371 +112 370 +113 370 +113 369 +113 368 +113 367 +114 367 +115 367 +116 367 +117 367 +118 367 +119 367 +120 367 +120 368 +120 369 +120 370 +121 370 +121 371 +122 371 +123 371 +124 371 +124 370 +125 370 +125 369 +125 368 +125 367 +126 367 +127 367 +127 366 +128 366 +128 365 +128 364 +128 363 +129 363 +129 362 +130 362 +131 362 +132 362 +133 362 +134 362 +135 362 +135 361 +135 360 +136 360 +136 359 +137 359 +137 358 +138 358 +138 357 +138 356 +139 356 +140 356 +140 357 +140 358 +141 358 +142 358 +142 357 +142 356 +142 355 +143 355 +144 355 +144 354 +144 353 +144 352 +144 351 +145 351 +146 351 +147 351 +148 351 +149 351 +150 351 +150 352 +151 352 +152 352 +153 352 +154 352 +154 351 +155 351 +156 351 +156 350 +157 350 +157 349 +157 348 +158 348 +158 347 +159 347 +160 347 +160 346 +160 345 +160 344 +160 343 +161 343 +161 342 +162 342 +163 342 +164 342 +164 341 +164 340 +165 340 +166 340 +166 339 +166 338 +167 338 +168 338 +168 337 +168 336 +169 336 +169 335 +169 334 +170 334 +170 333 +170 332 +171 332 +172 332 +172 331 +173 331 +174 331 +174 330 +175 330 +176 330 +176 329 +177 329 +178 329 +178 328 +178 327 +179 327 +180 327 +180 326 +181 326 +182 326 +183 326 +184 326 +184 325 +185 325 +185 324 +185 323 +185 322 +185 321 +186 321 +186 320 +186 319 +186 318 +187 318 +188 318 +188 317 +189 317 +189 316 +189 315 +190 315 +191 315 +192 315 +193 315 +194 315 +195 315 +196 315 +196 314 +197 314 +197 313 +198 313 +198 312 +198 311 +198 310 +199 310 +200 310 +200 309 +200 308 +200 307 +201 307 +202 307 +203 307 +204 307 +204 306 +205 306 +206 306 +207 306 +208 306 +209 306 +209 307 +210 307 +210 308 +210 309 +210 310 +211 310 +212 310 +213 310 +213 311 +214 311 +215 311 +215 312 +215 313 +216 313 +217 313 +217 314 +218 314 +219 314 +219 315 +220 315 +221 315 +222 315 +223 315 +223 316 +223 317 +224 317 +225 317 +225 318 +224 318 +223 318 +223 319 +223 320 +223 321 +222 321 +222 322 +222 323 +222 324 +222 325 +221 325 +220 325 +219 325 +219 326 +218 326 +218 327 +217 327 +216 327 +215 327 +215 328 +215 329 +215 330 +214 330 +214 331 +214 332 +213 332 +213 333 +213 334 +212 334 +211 334 +210 334 +210 335 +209 335 +209 336 +208 336 +207 336 +207 337 +207 338 +206 338 +205 338 +205 339 +205 340 +204 340 +204 341 +204 342 +203 342 +202 342 +202 343 +201 343 +201 344 +200 344 +200 345 +200 346 +199 346 +198 346 +198 347 +197 347 +197 348 +197 349 +197 350 +196 350 +196 351 +195 351 +194 351 +194 352 +193 352 +193 353 +193 354 +193 355 +192 355 +191 355 +190 355 +190 356 +190 357 +190 358 +189 358 +189 359 +188 359 +188 360 +187 360 +186 360 +186 361 +186 362 +185 362 +185 363 +184 363 +184 364 +183 364 +182 364 +182 365 +182 366 +181 366 +181 367 +181 368 +181 369 +181 370 +180 370 +180 371 +179 371 +178 371 +178 372 +177 372 +176 372 +176 373 +176 374 +175 374 +174 374 +174 375 +174 376 +173 376 +172 376 +172 377 +172 378 +172 379 +171 379 +170 379 +169 379 +169 380 +168 380 +167 380 +166 380 +166 381 +166 382 +165 382 +164 382 +163 382 +162 382 +161 382 +160 382 +159 382 +158 382 +158 383 +158 384 +157 384 +156 384 +155 384 +154 384 +153 384 +153 385 +153 386 +152 386 +151 386 +150 386 +149 386 +148 386 +147 386 +146 386 +146 387 +145 387 +144 387 +143 387 +142 387 +142 388 +141 388 +140 388 +140 389 +140 390 +139 390 +138 390 +137 390 +136 390 +136 391 +135 391 +135 392 +134 392 +133 392 +132 392 +132 393 +132 394 +131 394 +131 395 +130 395 +129 395 +128 395 +128 396 +128 397 +128 398 +128 399 +127 399 +127 400 +127 401 +127 402 +126 402 +125 402 +125 403 +124 403 +123 403 +122 403 +121 403 +121 404 +120 404 +120 405 +120 406 +119 406 +118 406 +117 406 +117 407 +116 407 +116 408 +116 409 +116 410 +115 410 +115 411 +114 411 +113 411 +112 411 +112 412 +112 413 +111 413 +111 414 +111 415 +110 415 +109 415 +109 416 +108 416 +108 417 +107 417 +107 418 +107 419 +107 420 +106 420 +105 420 +105 421 +104 421 +103 421 +103 422 +103 423 +102 423 +101 423 +100 423 +100 424 +100 425 +99 425 +99 426 +99 427 +99 428 +99 429 +98 429 +97 429 +97 430 +97 431 +96 431 +95 431 +95 432 +94 432 +93 432 +93 433 +93 434 +93 435 +92 435 +92 436 +92 437 +91 437 +91 438 +91 439 +90 439 +89 439 +88 439 +88 440 +87 440 +87 441 +87 442 +87 443 +86 443 +85 443 +85 444 +84 444 +84 445 +83 445 +83 446 +83 447 +82 447 +81 447 +81 448 +80 448 +80 449 +79 449 +79 450 +79 451 +78 451 +77 451 +77 452 +77 453 +76 453 +76 454 +76 455 +76 456 +76 457 +75 457 +74 457 +73 457 +73 458 +73 459 +72 459 +72 460 +71 460 +71 461 +70 461 +69 461 +69 462 +69 463 +68 463 +67 463 +67 464 +66 464 +65 464 +64 464 +64 465 +63 465 +62 465 +62 466 +62 467 +61 467 +60 467 +59 467 +59 468 +58 468 +58 469 +57 469 +56 469 +55 469 +54 469 +54 468 +53 468 +52 468 +52 469 +51 469 +51 470 +51 471 +51 472 +50 472 +49 472 +48 472 +48 473 +47 473 +47 472 +46 472 +45 472 +44 472 +43 472 +42 472 +42 473 +41 473 +40 473 +39 473 +38 473 +38 474 +38 475 +37 475 +36 475 +36 476 +35 476 +35 477 +34 477 +34 478 +34 479 +33 479 +32 479 +31 479 +30 479 +30 480 +29 480 +28 480 +27 480 +27 481 +26 481 +25 481 +24 481 +23 481 +23 482 +23 483 +22 483 +22 484 +21 484 +20 484 +19 484 +18 484 +17 484 +16 484 +15 484 +14 484 +13 484 +12 484 +11 484 +11 485 +11 486 +11 487 +10 487 +10 488 +9 488 +8 488 +8 489 +8 490 +8 491 +8 492 +8 493 +8 494 +8 495 +9 495 +10 495 +10 496 +11 496 +11 497 +12 497 +12 498 +13 498 +14 498 +14 499 +14 500 +14 501 +15 501 +16 501 +17 501 +18 501 +18 502 +19 502 +20 502 +20 503 +20 504 +21 504 +22 504 +22 503 +22 502 +23 502 +24 502 +24 501 +25 501 +26 501 +26 500 +26 499 +26 498 +27 498 +27 497 +27 496 +28 496 +28 495 +29 495 +30 495 +30 494 +30 493 +31 493 +32 493 +33 493 +34 493 +34 492 +35 492 +36 492 +37 492 +38 492 +39 492 +39 493 +40 493 +41 493 +42 493 +42 494 +42 495 +43 495 +44 495 +44 494 +44 493 +45 493 +46 493 +47 493 +48 493 +48 492 +49 492 +50 492 +51 492 +51 491 +52 491 +53 491 +54 491 +54 490 +54 489 +55 489 +56 489 +56 488 +57 488 +58 488 +58 487 +59 487 +59 486 +59 485 +59 484 +60 484 +61 484 +62 484 +63 484 +63 483 +64 483 +65 483 +66 483 +67 483 +68 483 +68 482 +68 481 +69 481 +70 481 +71 481 +71 480 +72 480 +72 479 +73 479 +73 478 +73 477 +73 476 +74 476 +75 476 +76 476 +76 477 +77 477 +77 478 +77 479 +78 479 +79 479 +79 480 +80 480 +80 481 +81 481 +81 482 +81 483 +82 483 +83 483 +84 483 +84 482 +84 481 +85 481 +85 480 +85 479 +85 478 +85 477 +86 477 +87 477 +87 476 +87 475 +88 475 +88 474 +88 473 +88 472 +88 471 +88 470 +88 469 +88 468 +89 468 +90 468 +91 468 +91 467 +91 466 +91 465 +92 465 +92 464 +92 463 +93 463 +93 462 +93 461 +93 460 +93 459 +94 459 +95 459 +95 458 +95 457 +95 456 +95 455 +96 455 +97 455 +97 454 +97 453 +98 453 +99 453 +99 452 +99 451 +100 451 +100 450 +100 449 +100 448 +100 447 +101 447 +101 446 +101 445 +101 444 +102 444 +103 444 +103 443 +104 443 +105 443 +105 442 +105 441 +105 440 +106 440 +107 440 +107 439 +108 439 +108 438 +108 437 +109 437 +109 436 +110 436 +111 436 +111 435 +111 434 +111 433 +112 433 +112 432 +113 432 +113 431 +114 431 +115 431 +115 430 +115 429 +116 429 +116 428 +116 427 +116 426 +116 425 +117 425 +117 424 +118 424 +119 424 +120 424 +121 424 +122 424 +123 424 +123 423 +124 423 +124 422 +124 421 +125 421 +125 420 +126 420 +127 420 +127 419 +127 418 +127 417 +128 417 +128 416 +128 415 +129 415 +130 415 +131 415 +131 414 +131 413 +132 413 +132 412 +132 411 +133 411 +134 411 +135 411 +135 410 +136 410 +136 409 +136 408 +137 408 +138 408 +139 408 +140 408 +141 408 +142 408 +143 408 +144 408 +145 408 +145 409 +145 410 +145 411 +145 412 +145 413 +144 413 +144 414 +144 415 +143 415 +142 415 +142 416 +142 417 +141 417 +140 417 +140 418 +140 419 +140 420 +139 420 +138 420 +138 421 +137 421 +137 422 +137 423 +136 423 +136 424 +135 424 +135 425 +135 426 +135 427 +135 428 +134 428 +133 428 +132 428 +132 429 +131 429 +131 430 +131 431 +130 431 +129 431 +129 432 +128 432 +128 433 +127 433 +127 434 +127 435 +127 436 +126 436 +125 436 +125 437 +124 437 +124 438 +124 439 +124 440 +123 440 +123 441 +123 442 +123 443 +123 444 +122 444 +121 444 +121 445 +120 445 +120 446 +120 447 +120 448 +119 448 +118 448 +117 448 +117 449 +116 449 +116 450 +116 451 +116 452 +116 453 +115 453 +115 454 +115 455 +114 455 +113 455 +113 456 +113 457 +112 457 +112 458 +112 459 +112 460 +111 460 +111 461 +111 462 +111 463 +110 463 +109 463 +109 464 +109 465 +108 465 +108 466 +108 467 +107 467 +107 468 +107 469 +107 470 +107 471 +107 472 +106 472 +105 472 +105 473 +104 473 +103 473 +103 474 +103 475 +103 476 +102 476 +101 476 +101 477 +101 478 +101 479 +101 480 +101 481 +101 482 +101 483 +101 484 +101 485 +101 486 +101 487 +101 488 +101 489 +101 490 +101 491 +101 492 +102 492 +103 492 +103 493 +103 494 +103 495 +103 496 +103 497 +103 498 +104 498 +105 498 +105 499 +105 500 +105 501 +106 501 +107 501 +108 501 +108 502 +109 502 +109 503 +109 504 +109 505 +109 506 +110 506 +111 506 +111 507 +111 508 +112 508 +112 509 +113 509 +113 510 +114 510 +115 510 +115 511 +115 512 +116 512 +116 513 +116 514 +116 515 +116 516 +116 517 +116 518 +117 518 +117 519 +117 520 +117 521 +118 521 +119 521 +120 521 +120 522 +121 522 +121 523 +121 524 +122 524 +123 524 +124 524 +124 525 +125 525 +126 525 +127 525 +128 525 +129 525 +130 525 +131 525 +131 526 +132 526 +133 526 +134 526 +135 526 +135 527 +135 528 +136 528 +137 528 +137 529 +137 530 +138 530 +139 530 +140 530 +141 530 +141 531 +141 532 +142 532 +142 533 +143 533 +144 533 +145 533 +145 534 +146 534 +147 534 +148 534 +149 534 +150 534 +151 534 +152 534 +153 534 +154 534 +155 534 +156 534 +157 534 +157 535 +157 536 +158 536 +159 536 +160 536 +161 536 +162 536 +163 536 +164 536 +165 536 +166 536 +166 535 +166 534 +167 534 +168 534 +169 534 +169 533 +170 533 +171 533 +172 533 +172 532 +172 531 +172 530 +173 530 +174 530 +174 529 +174 528 +175 528 +176 528 +177 528 +178 528 +178 527 +178 526 +179 526 +180 526 +181 526 +182 526 +183 526 +184 526 +184 525 +185 525 +185 524 +185 523 +185 522 +186 522 +186 521 +186 520 +187 520 +188 520 +188 519 +188 518 +189 518 +189 517 +190 517 +190 516 +191 516 +192 516 +193 516 +193 515 +193 514 +193 513 +194 513 +195 513 +196 513 +196 512 +197 512 +197 511 +197 510 +198 510 +198 509 +199 509 +200 509 +200 508 +201 508 +201 507 +201 506 +202 506 +202 505 +203 505 +204 505 +204 504 +205 504 +205 503 +205 502 +206 502 +207 502 +207 501 +208 501 +209 501 +209 500 +209 499 +209 498 +210 498 +211 498 +211 497 +212 497 +213 497 +213 496 +213 495 +214 495 +214 494 +214 493 +215 493 +215 492 +215 491 +216 491 +217 491 +217 490 +217 489 +218 489 +218 488 +219 488 +219 487 +220 487 +221 487 +222 487 +222 486 +222 485 +222 484 +223 484 +223 483 +224 483 +225 483 +225 482 +225 481 +225 480 +226 480 +226 479 +227 479 +227 478 +227 477 +228 477 +229 477 +229 478 +229 479 +230 479 +230 480 +230 481 +231 481 +231 482 +231 483 +231 484 +231 485 +231 486 +231 487 +231 488 +231 489 +231 490 +231 491 +231 492 +231 493 +230 493 +230 494 +230 495 +230 496 +230 497 +229 497 +229 498 +228 498 +227 498 +227 499 +227 500 +227 501 +226 501 +226 502 +225 502 +225 503 +225 504 +224 504 +223 504 +223 505 +223 506 +222 506 +222 507 +222 508 +221 508 +220 508 +219 508 +218 508 +217 508 +217 509 +216 509 +215 509 +215 510 +214 510 +214 511 +214 512 +214 513 +213 513 +213 514 +213 515 +213 516 +213 517 +212 517 +211 517 +211 518 +210 518 +210 519 +210 520 +209 520 +208 520 +207 520 +207 521 +207 522 +206 522 +205 522 +205 523 +205 524 +204 524 +204 525 +204 526 +203 526 +202 526 +202 527 +202 528 +201 528 +201 529 +201 530 +200 530 +200 531 +200 532 +199 532 +198 532 +198 533 +197 533 +197 534 +196 534 +196 535 +196 536 +195 536 +194 536 +193 536 +192 536 +191 536 +190 536 +190 537 +189 537 +189 538 +189 539 +189 540 +189 541 +188 541 +187 541 +186 541 +186 542 +185 542 +184 542 +184 543 +184 544 +184 545 +183 545 +182 545 +182 546 +181 546 +180 546 +180 547 +180 548 +179 548 +178 548 +178 549 +177 549 +176 549 +175 549 +174 549 +174 550 +173 550 +172 550 +172 551 +172 552 +171 552 +170 552 +169 552 +169 553 +168 553 +167 553 +166 553 +166 554 +165 554 +165 555 +165 556 +164 556 +164 557 +164 558 +164 559 +164 560 +165 560 +165 561 +166 561 +167 561 +168 561 +169 561 +170 561 +171 561 +172 561 +172 560 +173 560 +174 560 +175 560 +176 560 +177 560 +178 560 +178 561 +178 562 +178 563 +178 564 +177 564 +176 564 +176 565 +175 565 +174 565 +174 566 +173 566 +173 567 +173 568 +173 569 +172 569 +172 570 +172 571 +172 572 +171 572 +170 572 +170 573 +170 574 +170 575 +170 576 +170 577 +170 578 +170 579 +170 580 +170 581 +169 581 +169 582 +169 583 +169 584 +169 585 +169 586 +169 587 +169 588 +169 589 +169 590 +168 590 +168 591 +167 591 +166 591 +166 592 +166 593 +165 593 +165 594 +165 595 +165 596 +165 597 +165 598 +166 598 +166 599 +167 599 +168 599 +168 600 +168 601 +169 601 +169 602 +169 603 +169 604 +169 605 +169 606 +169 607 +169 608 +169 609 +168 609 +168 610 +168 611 +167 611 +166 611 +166 612 +166 613 +165 613 +164 613 +163 613 +162 613 +161 613 +161 612 +161 611 +160 611 +159 611 +158 611 +158 612 +158 613 +157 613 +157 614 +157 615 +157 616 +157 617 +157 618 +157 619 +157 620 +157 621 +158 621 +158 622 +159 622 +160 622 +161 622 +162 622 +163 622 +164 622 +164 623 +165 623 +166 623 +166 624 +166 625 +167 625 +168 625 +168 626 +169 626 +169 627 +169 628 +169 629 +170 629 +170 630 +171 630 +172 630 +172 631 +172 632 +172 633 +173 633 +174 633 +175 633 +176 633 +176 632 +176 631 +176 630 +177 630 +178 630 +179 630 +180 630 +180 629 +180 628 +180 627 +181 627 +181 626 +180 626 +180 625 +179 625 +178 625 +178 624 +178 623 +178 622 +179 622 +180 622 +180 621 +180 620 +180 619 +181 619 +181 618 +181 617 +181 616 +181 615 +181 614 +181 613 +181 612 +181 611 +181 610 +181 609 +181 608 +181 607 +181 606 +181 605 +182 605 +182 604 +182 603 +183 603 +184 603 +184 602 +184 601 +185 601 +185 600 +185 599 +185 598 +186 598 +186 597 +186 596 +186 595 +186 594 +186 593 +185 593 +185 592 +185 591 +185 590 +185 589 +185 588 +185 587 +185 586 +185 585 +186 585 +186 584 +186 583 +186 582 +186 581 +186 580 +186 579 +186 578 +187 578 +188 578 +188 577 +188 576 +188 575 +188 574 +189 574 +189 573 +189 572 +189 571 +189 570 +189 569 +189 568 +190 568 +190 567 +190 566 +191 566 +192 566 +193 566 +193 565 +194 565 +194 564 +195 564 +196 564 +196 563 +196 562 +196 561 +197 561 +197 560 +197 559 +197 558 +197 557 +197 556 +198 556 +198 555 +198 554 +199 554 +200 554 +200 553 +201 553 +202 553 +202 552 +203 552 +204 552 +204 551 +204 550 +205 550 +205 549 +205 548 +206 548 +207 548 +207 547 +207 546 +207 545 +208 545 +209 545 +210 545 +210 544 +210 543 +210 542 +211 542 +211 541 +212 541 +213 541 +213 540 +213 539 +213 538 +214 538 +214 537 +214 536 +215 536 +215 535 +215 534 +216 534 +217 534 +217 533 +218 533 +219 533 +219 532 +220 532 +221 532 +222 532 +222 531 +222 530 +222 529 +222 528 +223 528 +223 527 +223 526 +223 525 +224 525 +225 525 +225 524 +226 524 +226 523 +226 522 +227 522 +227 521 +228 521 +229 521 +229 520 +230 520 +230 519 +230 518 +231 518 +231 517 +231 516 +232 516 +233 516 +233 515 +233 514 +233 513 +233 512 +234 512 +234 511 +234 510 +234 509 +235 509 +236 509 +237 509 +237 508 +238 508 +238 507 +238 506 +239 506 +239 505 +239 504 +240 504 +241 504 +241 503 +241 502 +242 502 +242 501 +242 500 +242 499 +242 498 +243 498 +243 497 +243 496 +244 496 +245 496 +245 495 +246 495 +246 494 +246 493 +246 492 +247 492 +247 491 +247 490 +247 489 +248 489 +249 489 +249 488 +249 487 +250 487 +251 487 +251 486 +251 485 +251 484 +251 483 +252 483 +253 483 +253 482 +253 481 +253 480 +252 480 +251 480 +251 479 +251 478 +251 477 +252 477 +253 477 +253 476 +253 475 +253 474 +253 473 +253 472 +253 471 +253 470 +253 469 +253 468 +253 467 +252 467 +251 467 +251 466 +251 465 +251 464 +251 463 +252 463 +253 463 +253 462 +253 461 +253 460 +253 459 +253 458 +253 457 +253 456 +253 455 +253 454 +253 453 +254 453 +254 452 +255 452 +255 451 +255 450 +255 449 +256 449 +257 449 +257 448 +257 447 +258 447 +258 446 +258 445 +258 444 +259 444 +260 444 +261 444 +262 444 +262 443 +263 443 +263 442 +263 441 +263 440 +263 439 +264 439 +265 439 +266 439 +266 438 +266 437 +266 436 +267 436 +267 435 +268 435 +269 435 +269 434 +269 433 +270 433 +270 432 +270 431 +271 431 +271 430 +271 429 +272 429 +273 429 +273 428 +274 428 +274 427 +274 426 +274 425 +275 425 +275 424 +276 424 +276 423 +277 423 +278 423 +278 422 +278 421 +278 420 +279 420 +280 420 +280 419 +280 418 +280 417 +281 417 +282 417 +282 416 +283 416 +283 415 +284 415 +284 414 +284 413 +285 413 +286 413 +286 412 +286 411 +286 410 +287 410 +287 409 +287 408 +288 408 +288 407 +289 407 +290 407 +290 406 +291 406 +291 405 +291 404 +291 403 +292 403 +292 402 +292 401 +292 400 +292 399 +293 399 +294 399 +295 399 +295 398 +295 397 +295 396 +296 396 +296 395 +297 395 +298 395 +298 394 +299 394 +300 394 +300 393 +300 392 +300 391 +301 391 +302 391 +302 390 +302 389 +302 388 +303 388 +303 387 +303 386 +304 386 +305 386 +306 386 +306 387 +307 387 +307 388 +308 388 +309 388 +310 388 +310 389 +310 390 +311 390 +311 391 +311 392 +312 392 +312 393 +312 394 +313 394 +314 394 +314 395 +315 395 +315 396 +316 396 +317 396 +318 396 +318 397 +318 398 +318 399 +318 400 +319 400 +319 401 +319 402 +319 403 +319 404 +319 405 +319 406 +319 407 +318 407 +318 408 +318 409 +318 410 +318 411 +318 412 +318 413 +317 413 +316 413 +316 414 +316 415 +315 415 +315 416 +314 416 +314 417 +313 417 +312 417 +312 418 +312 419 +312 420 +311 420 +311 421 +311 422 +311 423 +310 423 +310 424 +309 424 +308 424 +307 424 +307 425 +307 426 +307 427 +307 428 +307 429 +306 429 +306 430 +306 431 +305 431 +304 431 +304 432 +303 432 +303 433 +303 434 +303 435 +303 436 +302 436 +302 437 +302 438 +302 439 +301 439 +300 439 +300 440 +300 441 +300 442 +300 443 +299 443 +299 444 +298 444 +298 445 +297 445 +296 445 +296 446 +296 447 +295 447 +295 448 +295 449 +294 449 +293 449 +292 449 +292 450 +292 451 +291 451 +291 452 +290 452 +290 453 +289 453 +288 453 +288 454 +288 455 +287 455 +287 456 +287 457 +287 458 +287 459 +288 459 +288 460 +289 460 +290 460 +291 460 +291 461 +291 462 +291 463 +291 464 +291 465 +290 465 +290 466 +290 467 +289 467 +288 467 +288 468 +287 468 +287 469 +286 469 +286 470 +286 471 +286 472 +286 473 +285 473 +284 473 +284 474 +284 475 +284 476 +284 477 +284 478 +284 479 +284 480 +283 480 +283 481 +282 481 +282 482 +282 483 +282 484 +281 484 +280 484 +280 485 +280 486 +280 487 +280 488 +279 488 +278 488 +278 489 +277 489 +276 489 +276 490 +276 491 +275 491 +275 492 +275 493 +275 494 +275 495 +275 496 +275 497 +276 497 +276 498 +276 499 +276 500 +276 501 +277 501 +278 501 +278 502 +277 502 +276 502 +276 503 +276 504 +276 505 +276 506 +275 506 +275 507 +275 508 +275 509 +274 509 +274 510 +273 510 +272 510 +271 510 +270 510 +270 509 +269 509 +269 510 +268 510 +267 510 +266 510 +266 511 +266 512 +266 513 +265 513 +264 513 +263 513 +263 514 +263 515 +263 516 +263 517 +264 517 +265 517 +266 517 +266 518 +267 518 +267 519 +267 520 +268 520 +269 520 +269 521 +270 521 +270 522 +271 522 +272 522 +273 522 +274 522 +274 523 +274 524 +275 524 +275 525 +276 525 +277 525 +278 525 +278 526 +279 526 +280 526 +281 526 +282 526 +283 526 +283 525 +284 525 +284 524 +285 524 +286 524 +286 523 +286 522 +286 521 +286 520 +285 520 +284 520 +284 519 +284 518 +285 518 +286 518 +286 517 +287 517 +287 516 +288 516 +288 515 +288 514 +288 513 +289 513 +290 513 +290 512 +291 512 +291 511 +291 510 +291 509 +291 508 +292 508 +292 507 +292 506 +293 506 +294 506 +295 506 +295 505 +296 505 +296 504 +297 504 +298 504 +298 503 +298 502 +299 502 +299 501 +299 500 +299 499 +299 498 +299 497 +300 497 +300 496 +299 496 +299 495 +298 495 +298 494 +298 493 +297 493 +296 493 +296 492 +297 492 +298 492 +298 491 +299 491 +299 490 +299 489 +300 489 +300 488 +300 487 +299 487 +299 486 +299 485 +299 484 +299 483 +300 483 +300 482 +300 481 +300 480 +301 480 +302 480 +302 479 +302 478 +302 477 +303 477 +303 476 +303 475 +303 474 +303 473 +304 473 +304 472 +304 471 +304 470 +304 469 +305 469 +306 469 +306 468 +307 468 +307 467 +308 467 +309 467 +310 467 +310 466 +310 465 +310 464 +310 463 +311 463 +311 462 +311 461 +311 460 +311 459 +312 459 +312 458 +312 457 +312 456 +312 455 +313 455 +314 455 +314 454 +314 453 +314 452 +314 451 +315 451 +315 450 +315 449 +315 448 +316 448 +316 447 +316 446 +316 445 +317 445 +318 445 +318 444 +318 443 +319 443 +319 442 +319 441 +319 440 +320 440 +320 439 +320 438 +320 437 +320 436 +321 436 +322 436 +322 435 +322 434 +322 433 +322 432 +323 432 +324 432 +324 431 +325 431 +326 431 +326 430 +326 429 +327 429 +327 428 +327 427 +327 426 +327 425 +327 424 +327 423 +328 423 +328 422 +328 421 +328 420 +329 420 +330 420 +330 419 +330 418 +330 417 +330 416 +331 416 +331 415 +331 414 +331 413 +332 413 +332 412 +332 411 +333 411 +334 411 +334 410 +335 410 +335 409 +335 408 +335 407 +335 406 +334 406 +334 405 +334 404 +335 404 +335 403 +335 402 +335 401 +335 400 +335 399 +335 398 +335 397 +335 396 +335 395 +335 394 +335 393 +335 392 +335 391 +335 390 +334 390 +334 389 +334 388 +334 387 +333 387 +332 387 +332 386 +332 385 +332 384 +331 384 +331 383 +331 382 +331 381 +331 380 +330 380 +330 379 +330 378 +329 378 +328 378 +328 377 +328 376 +328 375 +327 375 +327 374 +326 374 +326 373 +326 372 +326 371 +325 371 +324 371 +323 371 +322 371 +322 370 +322 369 +322 368 +322 367 +321 367 +320 367 +320 366 +320 365 +320 364 +320 363 +320 362 +320 361 +320 360 +321 360 +322 360 +322 359 +322 358 +322 357 +322 356 +322 355 +322 354 +322 353 +322 352 +322 351 +322 350 +322 349 +322 348 +322 347 +322 346 +323 346 +324 346 +324 345 +324 344 +325 344 +326 344 +326 343 +327 343 +328 343 +328 344 +329 344 +330 344 +331 344 +332 344 +333 344 +334 344 +335 344 +336 344 +336 345 +336 346 +337 346 +338 346 +339 346 +340 346 +341 346 +342 346 +343 346 +344 346 +344 347 +345 347 +345 348 +346 348 +347 348 +347 349 +347 350 +348 350 +349 350 +350 350 +351 350 +352 350 +353 350 +354 350 +355 350 +356 350 +357 350 +358 350 +359 350 +360 350 +361 350 +362 350 +363 350 +364 350 +365 350 +366 350 +367 350 +368 350 +369 350 +370 350 +371 350 +372 350 +373 350 +374 350 +375 350 +375 349 +375 348 +376 348 +377 348 +378 348 +379 348 +380 348 +380 347 +381 347 +382 347 +383 347 +383 346 +384 346 +384 345 +384 344 +385 344 +386 344 +387 344 +388 344 +389 344 +390 344 +391 344 +391 343 +392 343 +393 343 +394 343 +395 343 +396 343 +397 343 +397 342 +398 342 +399 342 +400 342 +401 342 +402 342 +403 342 +404 342 +404 341 +404 340 +405 340 +405 339 +405 338 +406 338 +407 338 +408 338 +409 338 +410 338 +411 338 +412 338 +412 337 +412 336 +413 336 +413 335 +414 335 +415 335 +416 335 +416 334 +417 334 +418 334 +419 334 +420 334 +421 334 +422 334 +423 334 +424 334 +424 333 +424 332 +425 332 +426 332 +427 332 +428 332 +429 332 +430 332 +431 332 +432 332 +432 333 +432 334 +433 334 +433 333 +433 332 +434 332 +435 332 +436 332 +437 332 +438 332 +439 332 +440 332 +441 332 +441 333 +441 334 +442 334 +443 334 +444 334 +444 335 +445 335 +445 334 +446 334 +447 334 +448 334 +448 335 +449 335 +450 335 +451 335 +452 335 +452 336 +453 336 +454 336 +455 336 +456 336 +456 337 +456 338 +457 338 +457 339 +457 340 +458 340 +458 341 +458 342 +459 342 +460 342 +461 342 +461 341 +461 340 +462 340 +463 340 +464 340 +464 339 +464 338 +465 338 +465 339 +465 340 +466 340 +466 341 +466 342 +467 342 +468 342 +468 343 +468 344 +468 345 +468 346 +467 346 +466 346 +466 347 +466 348 +467 348 +468 348 +468 349 +468 350 +469 350 +470 350 +470 351 +471 351 +472 351 +472 352 +473 352 +474 352 +474 351 +475 351 +476 351 +476 350 +477 350 +478 350 +478 349 +478 348 +479 348 +480 348 +481 348 +481 347 +482 347 +482 346 +483 346 +484 346 +485 346 +485 345 +485 344 +486 344 +486 343 +487 343 +487 342 +488 342 +489 342 +489 341 +489 340 +489 339 +489 338 +489 337 +489 336 +488 336 +487 336 +487 335 +486 335 +486 334 +485 334 +484 334 +483 334 +482 334 +482 335 +481 335 +480 335 +479 335 +479 334 +478 334 +478 333 +478 332 +477 332 +477 331 +476 331 +476 330 +475 330 +474 330 +474 329 +473 329 +473 328 +473 327 +472 327 +472 326 +471 326 +470 326 +470 325 +470 324 +470 323 +470 322 +469 322 +468 322 +468 321 +467 321 +466 321 +466 320 +466 319 +465 319 +465 318 +464 318 +463 318 +462 318 +461 318 +460 318 +459 318 +458 318 +458 317 +457 317 +456 317 +455 317 +454 317 +453 317 +452 317 +451 317 +450 317 +450 316 +450 315 +449 315 +448 315 +448 314 +447 314 +446 314 +445 314 +445 315 +444 315 +443 315 +442 315 +441 315 +440 315 +439 315 +438 315 +437 315 +436 315 +435 315 +434 315 +433 315 +433 314 +432 314 +431 314 +430 314 +430 313 +429 313 +429 312 +429 311 +428 311 +427 311 +426 311 +425 311 +424 311 +423 311 +422 311 +422 312 +422 313 +422 314 +421 314 +421 315 +420 315 +419 315 +418 315 +417 315 +417 316 +417 317 +416 317 +415 317 +414 317 +414 318 +413 318 +412 318 +412 319 +412 320 +412 321 +411 321 +410 321 +409 321 +408 321 +407 321 +406 321 +405 321 +405 322 +404 322 +403 322 +402 322 +401 322 +401 323 +401 324 +401 325 +400 325 +400 326 +399 326 +398 326 +397 326 +396 326 +395 326 +394 326 +393 326 +392 326 +392 327 +391 327 +391 328 +391 329 +390 329 +389 329 +388 329 +388 330 +387 330 +386 330 +385 330 +385 331 +384 331 +384 332 +383 332 +382 332 +381 332 +380 332 +379 332 +378 332 +377 332 +377 333 +377 334 +376 334 +375 334 +375 333 +375 332 +374 332 +373 332 +373 331 +372 331 +371 331 +371 330 +370 330 +369 330 +368 330 +368 329 +367 329 +366 329 +365 329 +365 328 +365 327 +364 327 +363 327 +362 327 +361 327 +360 327 +359 327 +358 327 +357 327 +357 326 +356 326 +355 326 +355 325 +354 325 +353 325 +352 325 +351 325 +350 325 +349 325 +348 325 +347 325 +347 324 +347 323 +347 322 +346 322 +345 322 +345 321 +345 320 +345 319 +345 318 +345 317 +345 316 +345 315 +344 315 +344 314 +343 314 +343 313 +343 312 +343 311 +343 310 +344 310 +345 310 +346 310 +347 310 +347 309 +347 308 +347 307 +348 307 +349 307 +350 307 +351 307 +351 306 +352 306 +353 306 +353 305 +353 304 +353 303 +353 302 +354 302 +355 302 +355 301 +356 301 +356 300 +356 299 +357 299 +357 298 +358 298 +359 298 +359 297 +359 296 +359 295 +360 295 +360 294 +360 293 +359 293 +359 292 +359 291 +359 290 +359 289 +360 289 +361 289 +361 288 +361 287 +362 287 +363 287 +363 288 +363 289 +364 289 +365 289 +365 290 +366 290 +367 290 +368 290 +369 290 +369 291 +370 291 +371 291 +372 291 +373 291 +374 291 +375 291 +375 292 +375 293 +376 293 +377 293 +378 293 +379 293 +380 293 +380 294 +380 295 +381 295 +382 295 +383 295 +384 295 +385 295 +385 294 +385 293 +386 293 +387 293 +388 293 +388 292 +388 291 +389 291 +390 291 +391 291 +392 291 +392 292 +392 293 +393 293 +394 293 +395 293 +396 293 +397 293 +398 293 +399 293 +400 293 +401 293 +402 293 +403 293 +404 293 +405 293 +406 293 +407 293 +407 294 +407 295 +408 295 +409 295 +410 295 +411 295 +412 295 +412 294 +412 293 +413 293 +414 293 +415 293 +416 293 +417 293 +418 293 +419 293 +420 293 +421 293 +422 293 +423 293 +424 293 +424 294 +424 295 +425 295 +426 295 +427 295 +428 295 +428 294 +428 293 +429 293 +430 293 +431 293 +432 293 +433 293 +434 293 +434 294 +434 295 +435 295 +436 295 +437 295 +437 296 +437 297 +438 297 +438 296 +438 295 +439 295 +440 295 +441 295 +441 294 +441 293 +442 293 +443 293 +444 293 +445 293 +446 293 +447 293 +448 293 +448 294 +448 295 +449 295 +450 295 +451 295 +452 295 +452 294 +452 293 +453 293 +454 293 +455 293 +456 293 +457 293 +458 293 +458 292 +458 291 +459 291 +460 291 +461 291 +462 291 +463 291 +464 291 +465 291 +466 291 +467 291 +468 291 +469 291 +470 291 +471 291 +472 291 +473 291 +474 291 +475 291 +476 291 +477 291 +478 291 +479 291 +480 291 +481 291 +482 291 +483 291 +484 291 +485 291 +485 290 +486 290 +487 290 +488 290 +489 290 +490 290 +491 290 +491 291 +492 291 +493 291 +494 291 +495 291 +495 292 +495 293 +496 293 +497 293 +498 293 +499 293 +500 293 +501 293 +501 292 +501 291 +502 291 +503 291 +504 291 +505 291 +506 291 +507 291 +508 291 +509 291 +510 291 +511 291 +512 291 +513 291 +514 291 +515 291 +515 292 +515 293 +516 293 +517 293 +518 293 +519 293 +520 293 +521 293 +522 293 +522 294 +522 295 +523 295 +524 295 +525 295 +525 294 +525 293 +526 293 +527 293 +528 293 +529 293 +530 293 +531 293 +532 293 +533 293 +534 293 +535 293 +535 294 +535 295 +536 295 +537 295 +538 295 +538 296 +538 297 +539 297 +540 297 +541 297 +542 297 +543 297 +544 297 +545 297 +546 297 +546 298 +547 298 +548 298 +549 298 +550 298 +551 298 +552 298 +552 299 +553 299 +554 299 +555 299 +556 299 +557 299 +558 299 +559 299 +559 300 +559 301 +560 301 +561 301 +562 301 +562 300 +562 299 +563 299 +564 299 +564 300 +564 301 +565 301 +566 301 +566 302 +567 302 +567 303 +568 303 +568 304 +568 305 +569 305 +570 305 +571 305 +572 305 +572 306 +573 306 +574 306 +574 307 +575 307 +576 307 +577 307 +578 307 +578 308 +578 309 +578 310 +579 310 +580 310 +580 311 +580 312 +580 313 +581 313 +582 313 +582 314 +583 314 +583 315 +584 315 +584 316 +584 317 +585 317 +586 317 +587 317 +588 317 +588 318 +589 318 +590 318 +591 318 +592 318 +592 319 +593 319 +594 319 +594 320 +594 321 +595 321 +596 321 +597 321 +598 321 +598 320 +598 319 +599 319 +600 319 +601 319 +602 319 +602 318 +603 318 +603 317 +603 316 +603 315 +603 314 +602 314 +602 313 +602 312 +602 311 +602 310 +602 309 +602 308 +602 307 +601 307 +600 307 +599 307 +599 306 +598 306 +598 305 +598 304 +598 303 +597 303 +596 303 +595 303 +595 302 +594 302 +594 301 +593 301 +592 301 +591 301 +591 300 +591 299 +590 299 +589 299 +588 299 +588 298 +587 298 +586 298 +585 298 +584 298 +583 298 +583 297 +583 296 +583 295 +582 295 +582 294 +582 293 +581 293 +580 293 +580 292 +580 291 +579 291 +579 290 +578 290 +577 290 +576 290 +575 290 +574 290 +573 290 +572 290 +572 289 +571 289 +570 289 +569 289 +568 289 +568 288 +568 287 +567 287 +567 286 +566 286 +566 285 +565 285 +564 285 +563 285 +563 284 +563 283 +562 283 +561 283 +560 283 +559 283 +558 283 +558 284 +558 285 +557 285 +556 285 +555 285 +555 284 +555 283 +554 283 +553 283 +552 283 +551 283 +550 283 +549 283 +548 283 +548 282 +547 282 +546 282 +545 282 +544 282 +543 282 +542 282 +541 282 +541 281 +540 281 +539 281 +538 281 +537 281 +536 281 +535 281 +535 280 +535 279 +535 278 +534 278 +533 278 +533 277 +532 277 +531 277 +530 277 +529 277 +528 277 +527 277 +526 277 +525 277 +524 277 +523 277 +522 277 +521 277 +520 277 +519 277 +518 277 +518 278 +517 278 +517 277 +516 277 +515 277 +514 277 +514 276 +514 275 +513 275 +512 275 +511 275 +510 275 +510 274 +509 274 +508 274 +507 274 +506 274 +506 275 +505 275 +504 275 +503 275 +502 275 +502 274 +501 274 +500 274 +499 274 +498 274 +497 274 +496 274 +495 274 +495 275 +494 275 +493 275 +493 274 +492 274 +491 274 +490 274 +489 274 +489 273 +488 273 +487 273 +486 273 +485 273 +485 274 +484 274 +483 274 +482 274 +481 274 +480 274 +479 274 +478 274 +477 274 +476 274 +475 274 +474 274 +473 274 +472 274 +471 274 +470 274 +469 274 +468 274 +467 274 +466 274 +465 274 +464 274 +463 274 +462 274 +462 273 +461 273 +460 273 +460 274 +459 274 +458 274 +457 274 +457 275 +456 275 +455 275 +454 275 +453 275 +452 275 +451 275 +450 275 +449 275 +448 275 +447 275 +446 275 +445 275 +445 276 +445 277 +444 277 +443 277 +442 277 +442 276 +442 275 +441 275 +441 274 +440 274 +439 274 +438 274 +438 273 +437 273 +437 274 +436 274 +435 274 +434 274 +434 275 +433 275 +432 275 +431 275 +430 275 +429 275 +428 275 +428 276 +428 277 +427 277 +426 277 +425 277 +424 277 +423 277 +422 277 +421 277 +420 277 +419 277 +418 277 +418 276 +418 275 +417 275 +417 274 +416 274 +415 274 +414 274 +413 274 +413 275 +412 275 +411 275 +410 275 +409 275 +409 274 +408 274 +407 274 +406 274 +405 274 +404 274 +404 275 +403 275 +402 275 +401 275 +401 274 +400 274 +399 274 +398 274 +397 274 +396 274 +395 274 +394 274 +393 274 +392 274 +391 274 +390 274 +389 274 +389 273 +388 273 +387 273 +386 273 +385 273 +384 273 +384 272 +384 271 +383 271 +382 271 +381 271 +380 271 +380 270 +379 270 +378 270 +377 270 +377 269 +376 269 +376 268 +376 267 +375 267 +374 267 +373 267 +372 267 +371 267 +371 266 +371 265 +371 264 +371 263 +372 263 +373 263 +373 262 +374 262 +375 262 +375 261 +376 261 +376 260 +376 259 +377 259 +377 258 +377 257 +378 257 +379 257 +379 256 +379 255 +379 254 +379 253 +379 252 +379 251 +378 251 +377 251 +377 250 +377 249 +376 249 +376 248 +375 248 +374 248 +373 248 +373 247 +373 246 +372 246 +371 246 +371 247 +371 248 +370 248 +369 248 +368 248 +368 249 +367 249 +366 249 +365 249 +365 250 +365 251 +364 251 +364 252 +364 253 +364 254 +363 254 +362 254 +361 254 +361 255 +360 255 +360 256 +360 257 +359 257 +358 257 +357 257 +357 256 +357 255 +356 255 +356 254 +356 253 +356 252 +356 251 +357 251 +357 250 +357 249 +356 249 +356 248 +355 248 +355 247 +355 246 +354 246 +353 246 +353 245 +352 245 +351 245 +351 244 +350 244 +349 244 +348 244 +347 244 +347 243 +347 242 +346 242 +345 242 +345 241 +345 240 +345 239 +345 238 +345 237 +346 237 +347 237 +347 236 +347 235 +347 234 +347 233 +348 233 +348 232 +349 232 +349 231 +349 230 +350 230 +351 230 +351 229 +350 229 +349 229 +349 228 +348 228 +348 227 +348 226 +347 226 +347 225 +347 224 +347 223 +347 222 +346 222 +345 222 +345 221 +345 220 +344 220 +343 220 +342 220 +341 220 +340 220 +340 221 +340 222 +339 222 +339 223 +339 224 +338 224 +337 224 +336 224 +336 225 +336 226 +336 227 +336 228 +335 228 +335 229 +335 230 +334 230 +334 231 +334 232 +333 232 +332 232 +332 233 +331 233 +330 233 +329 233 +328 233 +328 232 +328 231 +328 230 +328 229 +328 228 +327 228 +327 227 +327 226 +326 226 +326 225 +326 224 +325 224 +324 224 +324 223 +324 222 +323 222 +322 222 +322 221 +322 220 +321 220 +320 220 +320 219 +320 218 +319 218 +319 217 +318 217 +318 216 +318 215 +318 214 +318 213 +318 212 +319 212 +319 211 +319 210 +319 209 +318 209 +318 208 +318 207 +318 206 +318 205 +318 204 +318 203 +318 202 +318 201 +318 200 +318 199 +318 198 +318 197 +318 196 +318 195 +318 194 +317 194 +316 194 +316 193 +316 192 +316 191 +316 190 +316 189 +315 189 +315 188 +314 188 +314 187 +314 186 +313 186 +312 186 +312 185 +312 184 +312 183 +312 182 +312 181 +312 180 +312 179 +312 178 +312 177 +312 176 +312 175 +312 174 +312 173 +311 173 +311 172 +311 171 +311 170 +311 169 +312 169 +312 168 +312 167 +312 166 +311 166 +311 165 +311 164 +310 164 +310 163 +310 162 +310 161 +310 160 +310 159 +310 158 +310 157 +310 156 +310 155 +310 154 +310 153 +310 152 +310 151 +310 150 +310 149 +310 148 +310 147 +310 146 +310 145 +310 144 +309 144 +308 144 +307 144 +307 143 +306 143 +306 142 +306 141 +305 141 +304 141 +304 140 +304 139 +303 139 +303 138 +303 137 +303 136 +304 136 +304 135 +304 134 +304 133 +304 132 +304 131 +304 130 +304 129 +303 129 +303 128 +303 127 +304 127 +304 126 +304 125 +304 124 +303 124 +303 123 +303 122 +303 121 +302 121 +302 120 +302 119 +302 118 +302 117 +302 116 +301 116 +300 116 +300 115 +301 115 +302 115 +302 114 +302 113 +301 113 +300 113 +300 112 +300 111 +300 110 +300 109 +300 108 +300 107 +300 106 +300 105 +300 104 +300 103 +300 102 +300 101 +300 100 +299 100 +299 99 +298 99 +298 98 +298 97 +297 97 +296 97 +296 96 +297 96 +298 96 +298 95 +298 94 +298 93 +298 92 +297 92 +296 92 +296 91 +296 90 +296 89 +296 88 +295 88 +295 87 +295 86 +295 85 +295 84 +295 83 +295 82 +294 82 +293 82 +292 82 +292 81 +292 80 +292 79 +293 79 +294 79 +295 79 +295 78 +295 77 +295 76 +295 75 +295 74 +294 74 +293 74 +292 74 +292 73 +292 72 +291 72 +291 71 +290 71 +290 70 +290 69 +290 68 +290 67 +289 67 +288 67 +288 66 +288 65 +288 64 +287 64 +287 63 +286 63 +286 62 +286 61 +286 60 +286 59 +286 58 +286 57 +286 56 +286 55 +285 55 +284 55 +284 54 +284 53 +284 52 +283 52 +283 51 +282 51 +282 50 +281 50 +280 50 +280 49 +280 48 +279 48 +278 48 +278 47 +277 47 +276 47 +276 46 +276 45 +276 44 +276 43 +275 43 +275 42 +274 42 +274 41 +274 40 +274 39 +274 38 +273 38 +273 37 +273 36 +273 35 +272 35 +271 35 +271 34 +270 34 +270 33 +270 32 +269 32 +269 31 +269 30 +268 30 +267 30 +267 29 +267 28 +266 28 +266 27 +265 27 +264 27 +263 27 +263 26 +262 26 +261 26 +261 25 +261 24 +260 24 +259 24 +259 23 +258 23 +258 22 +257 22 +257 21 +257 20 +256 20 +255 20 +255 19 +254 19 +253 19 +253 18 +252 18 +251 18 +251 17 +251 16 +251 15 +250 15 +249 15 +249 14 +248 14 +247 14 +246 14 +245 14 From 93ce419d8829cb5ab821ae0883a10d175dee94cc Mon Sep 17 00:00:00 2001 From: Isabelle Sivignon Date: Fri, 24 May 2024 17:04:58 +0200 Subject: [PATCH 2/7] add new sample contour --- tests/samples/Plant054.dat | 1966 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1966 insertions(+) create mode 100644 tests/samples/Plant054.dat diff --git a/tests/samples/Plant054.dat b/tests/samples/Plant054.dat new file mode 100644 index 0000000000..dfbf1833db --- /dev/null +++ b/tests/samples/Plant054.dat @@ -0,0 +1,1966 @@ +75 10 +74 10 +74 9 +74 8 +75 8 +75 9 +76 9 +76 8 +76 7 +76 6 +77 6 +77 7 +77 8 +77 9 +77 10 +78 10 +79 10 +79 9 +79 8 +79 7 +80 7 +80 6 +80 5 +81 5 +81 6 +82 6 +83 6 +83 5 +84 5 +84 4 +84 3 +85 3 +85 4 +85 5 +85 6 +85 7 +85 8 +86 8 +86 9 +86 10 +85 10 +85 11 +85 12 +85 13 +86 13 +86 12 +87 12 +87 11 +87 10 +88 10 +88 9 +88 8 +89 8 +89 7 +89 6 +90 6 +90 7 +91 7 +91 8 +91 9 +91 10 +90 10 +90 11 +90 12 +90 13 +89 13 +89 14 +90 14 +90 13 +91 13 +91 14 +91 15 +90 15 +90 16 +90 17 +89 17 +89 18 +88 18 +88 19 +87 19 +87 20 +87 21 +88 21 +88 22 +87 22 +87 23 +86 23 +86 24 +86 25 +87 25 +87 24 +88 24 +88 23 +89 23 +89 22 +90 22 +91 22 +92 22 +92 23 +92 24 +91 24 +91 25 +90 25 +89 25 +89 26 +88 26 +88 27 +89 27 +90 27 +90 26 +91 26 +91 27 +92 27 +92 26 +93 26 +93 27 +93 28 +92 28 +92 29 +91 29 +91 30 +92 30 +93 30 +93 31 +92 31 +92 32 +91 32 +91 33 +90 33 +90 34 +89 34 +89 35 +88 35 +88 36 +87 36 +87 37 +88 37 +89 37 +89 36 +90 36 +90 35 +91 35 +92 35 +92 34 +93 34 +93 33 +94 33 +94 32 +95 32 +95 31 +96 31 +96 30 +97 30 +97 29 +98 29 +98 30 +99 30 +99 31 +98 31 +98 32 +97 32 +97 33 +97 34 +96 34 +96 35 +95 35 +94 35 +94 36 +94 37 +95 37 +95 38 +94 38 +94 39 +93 39 +93 40 +92 40 +91 40 +90 40 +90 41 +90 42 +91 42 +91 41 +92 41 +93 41 +93 40 +94 40 +95 40 +96 40 +96 41 +95 41 +94 41 +94 42 +93 42 +92 42 +92 43 +91 43 +90 43 +89 43 +88 43 +87 43 +87 44 +86 44 +85 44 +85 45 +86 45 +87 45 +88 45 +89 45 +90 45 +90 44 +91 44 +92 44 +92 45 +93 45 +93 46 +92 46 +92 47 +91 47 +90 47 +89 47 +88 47 +87 47 +87 46 +86 46 +85 46 +84 46 +84 47 +84 48 +85 48 +86 48 +87 48 +88 48 +89 48 +90 48 +90 49 +91 49 +91 50 +90 50 +89 50 +88 50 +88 51 +87 51 +87 52 +87 53 +86 53 +86 54 +85 54 +85 55 +85 56 +84 56 +84 57 +84 58 +83 58 +83 59 +83 60 +82 60 +82 61 +82 62 +82 63 +81 63 +81 64 +81 65 +80 65 +80 66 +80 67 +80 68 +79 68 +79 69 +79 70 +79 71 +80 71 +80 70 +80 69 +80 68 +81 68 +81 67 +82 67 +82 66 +82 65 +83 65 +83 64 +83 63 +84 63 +84 62 +85 62 +85 61 +86 61 +86 60 +87 60 +87 61 +87 62 +86 62 +86 63 +85 63 +85 64 +85 65 +84 65 +84 66 +83 66 +83 67 +83 68 +84 68 +84 67 +85 67 +85 66 +85 65 +86 65 +86 64 +87 64 +87 63 +88 63 +88 62 +88 61 +89 61 +90 61 +90 60 +90 59 +91 59 +92 59 +92 60 +91 60 +91 61 +91 62 +92 62 +92 61 +93 61 +93 60 +94 60 +94 59 +95 59 +95 58 +96 58 +97 58 +97 59 +96 59 +96 60 +95 60 +95 61 +94 61 +94 62 +93 62 +93 63 +92 63 +92 64 +91 64 +91 65 +90 65 +90 66 +90 67 +90 68 +91 68 +91 67 +92 67 +93 67 +93 66 +94 66 +95 66 +95 67 +94 67 +94 68 +95 68 +96 68 +96 67 +97 67 +98 67 +98 66 +99 66 +100 66 +101 66 +101 67 +100 67 +99 67 +99 68 +98 68 +97 68 +97 69 +96 69 +95 69 +95 70 +94 70 +94 71 +93 71 +92 71 +92 72 +93 72 +94 72 +94 71 +95 71 +96 71 +97 71 +98 71 +98 70 +99 70 +99 69 +100 69 +100 70 +100 71 +100 72 +99 72 +98 72 +97 72 +97 73 +96 73 +96 74 +95 74 +94 74 +94 75 +93 75 +93 76 +92 76 +91 76 +90 76 +90 77 +89 77 +88 77 +88 78 +87 78 +86 78 +86 79 +85 79 +85 80 +86 80 +86 79 +87 79 +88 79 +89 79 +89 78 +90 78 +91 78 +92 78 +92 77 +93 77 +94 77 +94 76 +95 76 +96 76 +97 76 +97 77 +97 78 +98 78 +99 78 +100 78 +101 78 +102 78 +102 79 +101 79 +100 79 +100 80 +99 80 +98 80 +98 81 +99 81 +100 81 +100 82 +99 82 +98 82 +97 82 +96 82 +95 82 +94 82 +93 82 +92 82 +92 83 +91 83 +90 83 +89 83 +88 83 +87 83 +87 84 +88 84 +89 84 +90 84 +91 84 +92 84 +92 83 +93 83 +94 83 +95 83 +96 83 +97 83 +97 84 +98 84 +99 84 +100 84 +101 84 +102 84 +102 85 +103 85 +104 85 +105 85 +105 86 +104 86 +103 86 +102 86 +101 86 +100 86 +100 85 +99 85 +98 85 +97 85 +96 85 +95 85 +94 85 +93 85 +92 85 +91 85 +90 85 +90 86 +89 86 +88 86 +87 86 +86 86 +85 86 +84 86 +83 86 +83 87 +84 87 +85 87 +86 87 +86 88 +87 88 +88 88 +89 88 +89 89 +90 89 +91 89 +92 89 +93 89 +94 89 +95 89 +96 89 +97 89 +98 89 +99 89 +99 90 +98 90 +97 90 +96 90 +95 90 +94 90 +93 90 +93 91 +94 91 +94 92 +95 92 +96 92 +96 93 +97 93 +98 93 +98 94 +99 94 +99 95 +98 95 +97 95 +97 94 +96 94 +95 94 +95 93 +94 93 +93 93 +93 92 +92 92 +91 92 +90 92 +89 92 +89 91 +88 91 +87 91 +86 91 +85 91 +85 90 +84 90 +84 91 +84 92 +83 92 +82 92 +82 91 +81 91 +81 92 +82 92 +82 93 +83 93 +83 94 +84 94 +84 95 +85 95 +85 96 +86 96 +86 97 +87 97 +88 97 +88 98 +89 98 +89 99 +90 99 +91 99 +92 99 +92 100 +93 100 +94 100 +94 101 +93 101 +92 101 +91 101 +91 100 +90 100 +89 100 +88 100 +87 100 +87 99 +86 99 +85 99 +85 100 +86 100 +86 101 +87 101 +87 102 +88 102 +88 103 +89 103 +90 103 +90 104 +91 104 +91 105 +90 105 +89 105 +88 105 +88 104 +87 104 +87 103 +86 103 +86 102 +85 102 +85 101 +84 101 +84 100 +83 100 +83 99 +82 99 +82 98 +82 97 +81 97 +81 96 +80 96 +80 95 +80 94 +79 94 +79 93 +78 93 +78 92 +77 92 +77 91 +76 91 +76 90 +75 90 +75 89 +74 89 +74 88 +73 88 +72 88 +71 88 +71 89 +70 89 +70 90 +69 90 +68 90 +68 91 +68 92 +67 92 +67 93 +67 94 +67 95 +68 95 +68 96 +69 96 +70 96 +71 96 +71 95 +72 95 +72 96 +73 96 +74 96 +75 96 +76 96 +77 96 +77 97 +77 98 +78 98 +78 99 +78 100 +78 101 +79 101 +80 101 +80 102 +81 102 +81 103 +81 104 +81 105 +81 106 +80 106 +80 107 +81 107 +82 107 +83 107 +84 107 +85 107 +86 107 +86 108 +85 108 +84 108 +83 108 +82 108 +82 109 +81 109 +81 110 +82 110 +82 111 +83 111 +84 111 +85 111 +85 112 +84 112 +83 112 +82 112 +81 112 +80 112 +79 112 +78 112 +78 113 +78 114 +79 114 +80 114 +81 114 +82 114 +82 115 +81 115 +80 115 +79 115 +78 115 +77 115 +76 115 +75 115 +75 116 +76 116 +76 117 +77 117 +78 117 +79 117 +80 117 +81 117 +81 118 +82 118 +83 118 +84 118 +85 118 +85 119 +86 119 +87 119 +88 119 +89 119 +90 119 +91 119 +91 120 +90 120 +89 120 +88 120 +87 120 +86 120 +85 120 +85 121 +86 121 +86 122 +87 122 +87 123 +86 123 +85 123 +85 122 +84 122 +83 122 +82 122 +82 121 +81 121 +80 121 +80 120 +79 120 +78 120 +77 120 +77 119 +76 119 +75 119 +74 119 +73 119 +73 120 +74 120 +74 121 +75 121 +76 121 +76 122 +77 122 +77 123 +78 123 +79 123 +80 123 +80 124 +81 124 +81 125 +82 125 +83 125 +84 125 +84 126 +85 126 +86 126 +86 127 +87 127 +88 127 +89 127 +89 128 +90 128 +91 128 +92 128 +92 129 +93 129 +94 129 +95 129 +95 130 +94 130 +93 130 +92 130 +91 130 +91 129 +90 129 +89 129 +88 129 +88 128 +87 128 +86 128 +85 128 +85 129 +86 129 +87 129 +87 130 +86 130 +85 130 +84 130 +83 130 +83 129 +82 129 +81 129 +81 128 +80 128 +79 128 +79 127 +78 127 +77 127 +77 126 +76 126 +76 125 +75 125 +74 125 +74 124 +73 124 +73 123 +72 123 +71 123 +71 124 +72 124 +72 125 +71 125 +70 125 +70 124 +69 124 +69 123 +68 123 +68 122 +67 122 +67 121 +66 121 +65 121 +65 122 +64 122 +64 121 +63 121 +63 120 +62 120 +62 121 +62 122 +63 122 +63 123 +64 123 +64 124 +64 125 +65 125 +65 126 +66 126 +66 127 +67 127 +67 128 +67 129 +68 129 +68 130 +68 131 +69 131 +69 132 +69 133 +70 133 +70 134 +71 134 +71 135 +72 135 +72 136 +71 136 +70 136 +69 136 +69 135 +69 134 +68 134 +68 133 +67 133 +67 132 +66 132 +65 132 +65 131 +65 130 +64 130 +64 129 +63 129 +63 128 +63 127 +63 126 +62 126 +62 125 +62 124 +62 123 +61 123 +61 122 +61 121 +60 121 +60 120 +60 119 +59 119 +59 118 +59 117 +58 117 +58 118 +58 119 +58 120 +59 120 +59 121 +59 122 +59 123 +58 123 +58 122 +58 121 +57 121 +57 120 +57 119 +57 118 +56 118 +56 117 +56 116 +56 115 +55 115 +54 115 +53 115 +53 116 +53 117 +52 117 +52 118 +51 118 +51 119 +51 120 +50 120 +50 121 +49 121 +49 122 +49 123 +48 123 +48 124 +47 124 +47 125 +47 126 +46 126 +46 127 +45 127 +45 128 +44 128 +44 129 +44 130 +43 130 +43 131 +42 131 +42 130 +41 130 +40 130 +40 129 +41 129 +41 128 +41 127 +42 127 +42 126 +42 125 +42 124 +42 123 +43 123 +43 122 +43 121 +44 121 +44 120 +44 119 +44 118 +44 117 +45 117 +45 116 +45 115 +46 115 +46 114 +46 113 +46 112 +47 112 +47 111 +47 110 +46 110 +45 110 +44 110 +43 110 +43 111 +42 111 +41 111 +40 111 +39 111 +39 112 +38 112 +37 112 +36 112 +36 113 +35 113 +34 113 +33 113 +33 114 +32 114 +31 114 +31 115 +30 115 +29 115 +28 115 +28 116 +27 116 +26 116 +26 115 +27 115 +27 114 +28 114 +29 114 +29 113 +30 113 +31 113 +31 112 +32 112 +33 112 +34 112 +34 111 +35 111 +36 111 +37 111 +38 111 +38 110 +39 110 +40 110 +41 110 +42 110 +42 109 +43 109 +43 108 +42 108 +41 108 +40 108 +39 108 +38 108 +37 108 +37 109 +36 109 +35 109 +34 109 +33 109 +33 110 +32 110 +31 110 +30 110 +29 110 +29 111 +28 111 +27 111 +26 111 +25 111 +24 111 +23 111 +23 110 +22 110 +21 110 +20 110 +19 110 +18 110 +17 110 +16 110 +16 109 +16 108 +15 108 +14 108 +14 107 +15 107 +16 107 +17 107 +18 107 +19 107 +19 108 +20 108 +21 108 +22 108 +22 107 +23 107 +24 107 +25 107 +26 107 +27 107 +28 107 +29 107 +30 107 +31 107 +32 107 +33 107 +34 107 +35 107 +36 107 +37 107 +38 107 +39 107 +39 106 +39 105 +38 105 +37 105 +36 105 +35 105 +34 105 +33 105 +32 105 +32 104 +31 104 +30 104 +29 104 +28 104 +27 104 +26 104 +25 104 +24 104 +23 104 +22 104 +21 104 +21 103 +20 103 +19 103 +18 103 +17 103 +17 102 +16 102 +15 102 +14 102 +14 101 +13 101 +12 101 +12 100 +11 100 +10 100 +10 99 +9 99 +8 99 +7 99 +7 98 +6 98 +6 97 +7 97 +8 97 +9 97 +9 98 +10 98 +11 98 +11 99 +12 99 +13 99 +14 99 +15 99 +15 100 +16 100 +17 100 +18 100 +18 101 +19 101 +20 101 +21 101 +22 101 +23 101 +23 102 +24 102 +25 102 +26 102 +27 102 +28 102 +29 102 +30 102 +31 102 +31 103 +32 103 +33 103 +34 103 +35 103 +35 104 +36 104 +37 104 +38 104 +39 104 +39 103 +38 103 +37 103 +37 102 +36 102 +35 102 +34 102 +33 102 +33 101 +32 101 +31 101 +30 101 +29 101 +29 100 +28 100 +27 100 +26 100 +25 100 +25 99 +24 99 +23 99 +22 99 +22 98 +21 98 +20 98 +20 97 +19 97 +18 97 +18 96 +17 96 +17 95 +16 95 +15 95 +15 94 +14 94 +14 93 +15 93 +16 93 +16 94 +17 94 +18 94 +18 95 +19 95 +20 95 +20 96 +21 96 +22 96 +22 97 +23 97 +24 97 +25 97 +25 98 +26 98 +27 98 +28 98 +29 98 +29 97 +28 97 +27 97 +27 96 +26 96 +25 96 +24 96 +24 95 +23 95 +22 95 +22 94 +21 94 +20 94 +20 93 +19 93 +19 92 +18 92 +17 92 +17 91 +16 91 +16 90 +15 90 +14 90 +14 89 +13 89 +13 88 +12 88 +12 87 +11 87 +11 86 +12 86 +13 86 +13 87 +14 87 +14 88 +15 88 +15 89 +16 89 +17 89 +17 90 +18 90 +18 91 +19 91 +20 91 +20 90 +19 90 +19 89 +18 89 +17 89 +17 88 +16 88 +16 87 +15 87 +15 86 +14 86 +14 85 +13 85 +13 84 +12 84 +12 83 +11 83 +11 82 +10 82 +10 81 +11 81 +12 81 +12 82 +13 82 +13 83 +14 83 +14 84 +15 84 +16 84 +16 85 +17 85 +17 86 +18 86 +19 86 +19 87 +20 87 +20 88 +21 88 +22 88 +23 88 +24 88 +24 87 +24 86 +24 85 +23 85 +23 84 +22 84 +22 83 +21 83 +20 83 +20 82 +19 82 +19 81 +20 81 +21 81 +21 82 +22 82 +23 82 +23 83 +24 83 +25 83 +25 82 +24 82 +24 81 +23 81 +23 80 +23 79 +22 79 +22 78 +21 78 +21 77 +21 76 +20 76 +20 75 +19 75 +19 74 +19 73 +20 73 +20 74 +21 74 +21 75 +22 75 +22 76 +22 77 +23 77 +23 78 +24 78 +24 79 +25 79 +25 80 +26 80 +26 81 +27 81 +27 82 +27 83 +28 83 +28 84 +29 84 +29 85 +30 85 +30 84 +30 83 +29 83 +29 82 +29 81 +28 81 +28 80 +28 79 +27 79 +27 78 +27 77 +26 77 +26 76 +25 76 +24 76 +24 75 +24 74 +25 74 +25 75 +26 75 +26 74 +26 73 +27 73 +27 74 +27 75 +28 75 +28 76 +28 77 +29 77 +29 78 +30 78 +30 79 +31 79 +31 80 +32 80 +32 81 +33 81 +33 82 +34 82 +34 83 +34 84 +35 84 +35 85 +36 85 +36 86 +37 86 +37 87 +37 88 +38 88 +38 89 +39 89 +39 90 +39 91 +40 91 +40 92 +40 93 +41 93 +41 94 +42 94 +42 93 +42 92 +41 92 +41 91 +41 90 +40 90 +40 89 +39 89 +39 88 +39 87 +39 86 +38 86 +38 85 +37 85 +37 84 +37 83 +37 82 +36 82 +36 81 +35 81 +35 80 +35 79 +34 79 +34 78 +33 78 +33 77 +32 77 +32 76 +32 75 +33 75 +33 76 +34 76 +34 77 +35 77 +35 76 +35 75 +35 74 +35 73 +35 72 +35 71 +35 70 +36 70 +36 71 +37 71 +37 72 +37 73 +38 73 +38 74 +39 74 +39 73 +39 72 +39 71 +39 70 +39 69 +39 68 +39 67 +40 67 +40 68 +40 69 +40 70 +40 71 +41 71 +41 72 +41 73 +41 74 +41 75 +41 76 +42 76 +42 77 +42 78 +42 79 +42 80 +42 81 +43 81 +43 82 +43 83 +43 84 +44 84 +44 85 +44 86 +45 86 +45 87 +45 88 +46 88 +46 89 +46 90 +47 90 +47 89 +47 88 +47 87 +46 87 +46 86 +46 85 +45 85 +45 84 +45 83 +44 83 +44 82 +44 81 +44 80 +43 80 +43 79 +43 78 +43 77 +43 76 +42 76 +42 75 +42 74 +42 73 +42 72 +42 71 +42 70 +42 69 +42 68 +43 68 +43 67 +43 66 +43 65 +43 64 +43 63 +43 62 +43 61 +44 61 +44 62 +44 63 +44 64 +44 65 +44 66 +44 67 +44 68 +44 69 +44 70 +44 71 +44 72 +44 73 +45 73 +45 74 +45 75 +45 76 +45 77 +45 78 +46 78 +46 79 +46 80 +46 81 +47 81 +47 82 +47 83 +47 84 +47 85 +47 86 +48 86 +48 87 +48 88 +48 89 +49 89 +49 90 +49 91 +49 92 +49 93 +50 93 +50 92 +50 91 +51 91 +51 90 +51 89 +51 88 +51 87 +51 86 +51 85 +51 84 +51 83 +51 82 +51 81 +51 80 +51 79 +50 79 +50 78 +50 77 +50 76 +50 75 +50 74 +50 73 +49 73 +49 72 +49 71 +49 70 +50 70 +50 71 +50 72 +51 72 +51 73 +51 74 +52 74 +52 73 +52 72 +53 72 +53 71 +52 71 +52 70 +52 69 +52 68 +53 68 +53 67 +52 67 +52 66 +52 65 +52 64 +53 64 +54 64 +54 63 +55 63 +56 63 +56 62 +55 62 +55 61 +56 61 +57 61 +58 61 +58 60 +59 60 +59 59 +58 59 +57 59 +56 59 +55 59 +55 58 +54 58 +53 58 +53 57 +54 57 +55 57 +56 57 +56 58 +57 58 +58 58 +59 58 +60 58 +61 58 +62 58 +62 57 +61 57 +60 57 +60 56 +59 56 +58 56 +57 56 +56 56 +55 56 +55 55 +54 55 +53 55 +52 55 +51 55 +51 54 +52 54 +53 54 +54 54 +55 54 +56 54 +56 53 +55 53 +55 52 +54 52 +54 51 +55 51 +56 51 +56 52 +57 52 +57 53 +58 53 +59 53 +59 54 +60 54 +61 54 +61 55 +62 55 +63 55 +64 55 +64 56 +65 56 +65 55 +65 54 +64 54 +64 53 +63 53 +62 53 +62 52 +61 52 +61 51 +60 51 +60 50 +59 50 +58 50 +58 49 +57 49 +56 49 +56 48 +55 48 +54 48 +54 47 +53 47 +52 47 +52 46 +53 46 +54 46 +55 46 +55 47 +56 47 +57 47 +57 48 +58 48 +58 47 +57 47 +57 46 +56 46 +56 45 +57 45 +57 44 +57 43 +58 43 +59 43 +59 44 +60 44 +60 43 +60 42 +60 41 +60 40 +59 40 +59 39 +59 38 +59 37 +60 37 +60 38 +61 38 +61 37 +62 37 +62 38 +62 39 +62 40 +63 40 +63 41 +64 41 +65 41 +65 40 +64 40 +64 39 +64 38 +63 38 +63 37 +63 36 +64 36 +64 37 +65 37 +65 38 +65 39 +66 39 +66 38 +66 37 +66 36 +67 36 +67 37 +67 38 +67 39 +67 40 +68 40 +69 40 +69 39 +69 38 +69 37 +69 36 +69 35 +68 35 +68 34 +68 33 +68 32 +67 32 +67 31 +67 30 +67 29 +66 29 +66 28 +66 27 +66 26 +65 26 +65 25 +64 25 +64 24 +63 24 +63 23 +64 23 +65 23 +65 24 +66 24 +66 23 +65 23 +65 22 +65 21 +64 21 +64 20 +64 19 +65 19 +65 20 +66 20 +66 21 +66 22 +67 22 +67 23 +68 23 +69 23 +69 24 +70 24 +70 23 +69 23 +69 22 +68 22 +68 21 +67 21 +67 20 +67 19 +67 18 +68 18 +68 19 +68 20 +69 20 +69 21 +70 21 +70 22 +71 22 +71 23 +71 24 +72 24 +72 23 +72 22 +71 22 +71 21 +71 20 +70 20 +70 19 +70 18 +69 18 +69 17 +69 16 +70 16 +70 15 +70 14 +70 13 +70 12 +71 12 +71 13 +71 14 +71 15 +71 16 +71 17 +72 17 +72 18 +72 19 +73 19 +73 20 +73 21 +74 21 +74 22 +75 22 +75 21 +75 20 +75 19 +74 19 +74 18 +74 17 +74 16 +74 15 +73 15 +73 14 +73 13 +73 12 +73 11 +72 11 +72 10 +72 9 +72 8 +73 8 +73 9 +73 10 +74 10 +74 11 +74 12 +75 12 +75 11 From 4b86121d06255d38a8ee3760cad1491c3e9867a5 Mon Sep 17 00:00:00 2001 From: Isabelle Sivignon Date: Mon, 27 May 2024 16:00:29 +0200 Subject: [PATCH 3/7] clean code and add comments --- src/DGtal/geometry/curves/FrechetShortcut.ih | 30 ++++--------------- tests/geometry/curves/testFrechetShortcut.cpp | 13 ++------ 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/src/DGtal/geometry/curves/FrechetShortcut.ih b/src/DGtal/geometry/curves/FrechetShortcut.ih index 2a6c86c573..682f59b916 100644 --- a/src/DGtal/geometry/curves/FrechetShortcut.ih +++ b/src/DGtal/geometry/curves/FrechetShortcut.ih @@ -162,14 +162,10 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() iter = myOcculters.begin(); for(int i=0; i < myOcculters.size() && ok ; ++i) - // while(iter!=myOcculters.end() && ok) { pi = Point(*(iter->first)); v = p-pi; - //next = iter; - //next++; - // pi is after p for all directions -> p is not an occulter if(ic.dotProduct(v,u1) < 0 && ic.dotProduct(v,u2) <0) { @@ -246,7 +242,6 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() // change, p may be an occulter -> do nothing } - // iter = next; } } @@ -376,7 +371,7 @@ DGtal::FrechetShortcut::Cone::Cone() { myInf = true; myMin = 0; - myMax = 0; + myMax = 2*M_PI; } @@ -448,6 +443,7 @@ bool DGtal::FrechetShortcut::Cone::isEmpty() const if(myInf) return false; else + // Fix 05/2024 to enable error = 0: a cone may be defined by two values myMin=myMax --> check for empty cone by setting myMin=myMax= -1 instead if(myMin==-1) // and then myMax = -1 too: way to represent the empty intersection of two cones. return true; else @@ -516,7 +512,7 @@ typename DGtal::FrechetShortcut::Cone DGtal::FrechetShortcut // first possibility: the cones are disjoint if(!Tools::isBetween(myMin, c.myMin, c.myMax, 2*M_PI) && !Tools::isBetween(myMax, c.myMin, c.myMax, 2*M_PI)) - res = Cone(-1,-1); + res = Cone(-1,-1); // empty cone: both angles are set to -1 else // or the new cone includes the old one, nothing changes, the cone remains the same. res = *this; @@ -531,7 +527,6 @@ typename DGtal::FrechetShortcut::Cone DGtal::FrechetShortcut else res = Cone(myMin,c.myMax); - //trace.info() << "res of cone intersection: " << res.myMin << " " << res.myMax << std::endl; return res; } @@ -698,8 +693,6 @@ DGtal::FrechetShortcut::computeNewCone() Point firstP = Point(*myBegin); Point newP = Point(*(myEnd+1)); - //trace.info() << "compute new cone: " << firstP << " " << newP << std::endl; - Cone newCone=myCone; if(firstP == newP) @@ -712,7 +705,6 @@ DGtal::FrechetShortcut::computeNewCone() bool intersect = Tools::circleTangentPoints(firstP[0],firstP[1], newP[0], newP[1], myError/(sqrt(2.0F)), &x0, &y0, &x1, &y1); - //std::cout << " tangent points " << x0 << " " << y0 << " " << x1 << " " << y1 << std::endl; if(intersect) { // define a cone according to the new tangent points @@ -720,26 +712,14 @@ DGtal::FrechetShortcut::computeNewCone() // case where there is one single tangent point if(fabs(x0-x1) < PRECISION && fabs(y0-y1) < PRECISION) { - // trace.info() << "!! Single tangent point !!!" << std::endl; - //trace.info() << "points/error: " << firstP << " " << newP << " " << myError << std::endl; - double angle = Tools::computeAngle(firstP[0],firstP[1],newP[0],newP[1]); - // assert(angle != -1); - // double angle0 = angle - M_PI_2; - // if(angle0<0) - // angle0 = angle0+2*M_PI; - // double angle1 = angle + M_PI_2; - // if(angle1>2*M_PI) - // angle1 = angle1-2*M_PI; - //c = Cone(angle0,angle1); + // the cone is reduced to a line c = Cone(angle,angle); } else c = Cone(firstP[0],firstP[1],x0,y0,x1,y1); - // trace.info() << "old cone: " << myCone.myMin << " " << myCone.myMax << " new cone: " << c.myMin << " " << c.myMax << std::endl; - newCone.intersectCones(c); } @@ -898,7 +878,7 @@ inline void DGtal::FrechetShortcut::resetCone() { myCone.myMin = 0; - myCone.myMax = 2*M_PI; + myCone.myMax = 2*M_PI; // default cone is the whole space myCone.myInf = true; } diff --git a/tests/geometry/curves/testFrechetShortcut.cpp b/tests/geometry/curves/testFrechetShortcut.cpp index 91845a7444..ecb55990a5 100644 --- a/tests/geometry/curves/testFrechetShortcut.cpp +++ b/tests/geometry/curves/testFrechetShortcut.cpp @@ -243,11 +243,6 @@ bool testSegmentationLarger(const string& filename, int min, int max, double del trace.beginBlock ( "Greedy segmentation on larger contours" ); - - //std::vector contour; - - //contour = PointListReader< Z2i::Point >::getPointsFromFile(filename); - trace.info() << "Reading input curve" << filename << std::endl; typedef Curve::PointsRange::ConstIterator Iterator; @@ -258,7 +253,7 @@ bool testSegmentationLarger(const string& filename, int min, int max, double del instream.open (filename.c_str(), ifstream::in); aCurve.initFromVectorStream(instream); - + typedef Curve::PointsRange Range; //range Range r = aCurve.getPointsRange(); //range @@ -291,15 +286,11 @@ bool testSegmentationLarger(const string& filename, int min, int max, double del for ( ; it != itEnd; ++it) { SegmentComputer s(*it); - //trace.info() << s << std::endl; board << (*it); - // nb++; } - - //board << aCurve; + // save simplified curves in eps file string outputFilename = "FrechetShortcut-"+output+".eps"; board.saveEPS(outputFilename.c_str(), Board2D::BoundingBox, 5000 ); - //board.saveEPS("FrechetShortcutGreedySegmentationLargeTest.eps", Board2D::BoundingBox, 5000 ); } trace.endBlock(); From 7e0568dd4e226d09ea209fb40fdf0ab2b2e8ce5c Mon Sep 17 00:00:00 2001 From: Isabelle Sivignon Date: Mon, 27 May 2024 16:05:25 +0200 Subject: [PATCH 4/7] update changelog --- ChangeLog.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 881ee5a7df..f6f665ecff 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -80,7 +80,10 @@ - *Geometry package* - Fix Issue #1676 in testStabbingCircleComputer (Tristan Roussillon, - [#1688](https://github.com/DGtal-team/DGtal/pull/1688) + [#1688](https://github.com/DGtal-team/DGtal/pull/1688) + - Fix seg fault due to recent compilers in FrechetShortcut (Bertrand Kerautret, Isabelle Sivignon) + - Fix FrechetShortcut to enable the parameter error to be equal to 0 and add new tests in testFrechetShortcut (Isabelle Sivignon) + - *IO* - Fix of the `getHSV` method in the `Color` class. (David Coeurjolly, From d459203b4c597d04c9892548b541e183e63d4031 Mon Sep 17 00:00:00 2001 From: Isabelle Sivignon Date: Mon, 27 May 2024 16:14:33 +0200 Subject: [PATCH 5/7] update changelog --- ChangeLog.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index f6f665ecff..72223ba66e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -76,11 +76,11 @@ - *Topology package* - Fix KhalimskySpaceND to get it work with BigInteger (Tristan Roussillon, - [#1681](https://github.com/DGtal-team/DGtal/pull/1681) + [#1681](https://github.com/DGtal-team/DGtal/pull/1681)) - *Geometry package* - Fix Issue #1676 in testStabbingCircleComputer (Tristan Roussillon, - [#1688](https://github.com/DGtal-team/DGtal/pull/1688) + [#1688](https://github.com/DGtal-team/DGtal/pull/1688)) - Fix seg fault due to recent compilers in FrechetShortcut (Bertrand Kerautret, Isabelle Sivignon) - Fix FrechetShortcut to enable the parameter error to be equal to 0 and add new tests in testFrechetShortcut (Isabelle Sivignon) From 1b44a783a5873e350d81ac948f1d796fd4c374c4 Mon Sep 17 00:00:00 2001 From: isivigno Date: Tue, 28 May 2024 14:04:12 +0200 Subject: [PATCH 6/7] Update testFrechetShortcut.cpp - remove useless variables --- tests/geometry/curves/testFrechetShortcut.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/geometry/curves/testFrechetShortcut.cpp b/tests/geometry/curves/testFrechetShortcut.cpp index ecb55990a5..53c42efd31 100644 --- a/tests/geometry/curves/testFrechetShortcut.cpp +++ b/tests/geometry/curves/testFrechetShortcut.cpp @@ -171,13 +171,13 @@ bool testSegmentation() // Test when error = 3 - double anerror = 3; + int nbok = 3; int nb=0; trace.beginBlock ( "Greedy segmentation" ); { typedef GreedySegmentation Segmentation; - Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(anerror) ); + Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(3) ); Segmentation::SegmentComputerIterator it = theSegmentation.begin(); Segmentation::SegmentComputerIterator itEnd = theSegmentation.end(); @@ -194,13 +194,13 @@ bool testSegmentation() // test when error = 0 - double anerror2 = 0; + int nbok2 = 5; int nb2=0; trace.beginBlock ( "Greedy segmentation" ); { typedef GreedySegmentation Segmentation; - Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(anerror2) ); + Segmentation theSegmentation( r.begin(), r.end(), SegmentComputer(0) ); Segmentation::SegmentComputerIterator it = theSegmentation.begin(); Segmentation::SegmentComputerIterator itEnd = theSegmentation.end(); From 95a2b7dc4d62d62f58d78cecb3c071d7ff9d0bd3 Mon Sep 17 00:00:00 2001 From: Bertrand Kerautret Date: Mon, 10 Jun 2024 17:11:24 +0200 Subject: [PATCH 7/7] fix CI compile (type) --- src/DGtal/geometry/curves/FrechetShortcut.ih | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DGtal/geometry/curves/FrechetShortcut.ih b/src/DGtal/geometry/curves/FrechetShortcut.ih index 682f59b916..af20530c12 100644 --- a/src/DGtal/geometry/curves/FrechetShortcut.ih +++ b/src/DGtal/geometry/curves/FrechetShortcut.ih @@ -161,7 +161,7 @@ void DGtal::FrechetShortcut::Backpath::updateOcculters() typename occulter_list::iterator iter=myOcculters.begin(); iter = myOcculters.begin(); - for(int i=0; i < myOcculters.size() && ok ; ++i) + for(typename occulter_list::size_type i=0; i < myOcculters.size() && ok ; ++i) { pi = Point(*(iter->first)); v = p-pi;